Saver cleanups

- Do exit cleanups at exit.
- Use LOAD_FAIL/SUCCESS/BREAK for save() exit code.
- Cosmetics.
This commit is contained in:
Kim Woelders 2019-12-04 17:25:16 +01:00
parent bd3aa88242
commit 6a7eb67f46
9 changed files with 136 additions and 185 deletions

View File

@ -96,6 +96,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
FILE *f; FILE *f;
DATA32 *ptr; DATA32 *ptr;
int y, pl = 0, alpha = 0; int y, pl = 0, alpha = 0;
@ -105,15 +106,17 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
DATA32 *buf = (DATA32 *) malloc(im->w * 4); DATA32 *buf = (DATA32 *) malloc(im->w * 4);
#endif #endif
/* no image data? abort */
if (!im->data)
return 0;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
return 0; return LOAD_FAIL;
rc = LOAD_FAIL;
if (im->flags & F_HAS_ALPHA) if (im->flags & F_HAS_ALPHA)
alpha = 1; alpha = 1;
fprintf(f, "ARGB %i %i %i\n", im->w, im->h, alpha); fprintf(f, "ARGB %i %i %i\n", im->w, im->h, alpha);
ptr = im->data; ptr = im->data;
for (y = 0; y < im->h; y++) for (y = 0; y < im->h; y++)
{ {
@ -141,25 +144,26 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
l = y - pl; l = y - pl;
if (!progress(im, per, 0, (y - l), im->w, l)) if (!progress(im, per, 0, (y - l), im->w, l))
{ {
#ifdef WORDS_BIGENDIAN rc = LOAD_BREAK;
if (buf) goto quit;
free(buf);
#endif
fclose(f);
return 2;
} }
pper = per; pper = per;
pl = y; pl = y;
} }
} }
} }
rc = LOAD_SUCCESS;
quit:
/* finish off */ /* finish off */
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (buf) if (buf)
free(buf); free(buf);
#endif #endif
fclose(f); fclose(f);
return 1;
return rc;
} }
void void

View File

@ -904,16 +904,16 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
FILE *f; FILE *f;
int i, j, pad; int i, j, pad;
DATA32 pixel; DATA32 pixel;
if (!im->data)
return 0;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
return 0; return LOAD_FAIL;
rc = LOAD_SUCCESS;
/* calculate number of bytes to pad on end of each row */ /* calculate number of bytes to pad on end of each row */
pad = (4 - ((im->w * 3) % 4)) & 0x03; pad = (4 - ((im->w * 3) % 4)) & 0x03;
@ -951,7 +951,8 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
} }
fclose(f); fclose(f);
return 1;
return rc;
} }
void void

View File

@ -89,42 +89,39 @@ load(ImlibImage * im, ImlibProgressFunction progress,
} }
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_gran) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
FILE *f; FILE *f;
size_t rowlen, i, j; size_t rowlen, i, j;
uint32_t tmp32; uint32_t tmp32;
uint16_t *row; uint16_t *row;
uint8_t *dat; uint8_t *dat;
/* open the file for writing */ f = fopen(im->real_file, "wb");
if (!(f = fopen(im->real_file, "wb"))) if (!f)
{ return LOAD_FAIL;
return 0;
} rc = LOAD_FAIL;
row = NULL;
/* write header */ /* write header */
fputs("farbfeld", f); fputs("farbfeld", f);
tmp32 = htonl(im->w); tmp32 = htonl(im->w);
if (fwrite(&tmp32, sizeof(uint32_t), 1, f) != 1) if (fwrite(&tmp32, sizeof(uint32_t), 1, f) != 1)
{ goto quit;
fclose(f);
return 0;
}
tmp32 = htonl(im->h); tmp32 = htonl(im->h);
if (fwrite(&tmp32, sizeof(uint32_t), 1, f) != 1) if (fwrite(&tmp32, sizeof(uint32_t), 1, f) != 1)
{ goto quit;
fclose(f);
return 0;
}
/* write data */ /* write data */
rowlen = im->w * (sizeof("RGBA") - 1); rowlen = im->w * (sizeof("RGBA") - 1);
if (!(row = malloc(rowlen * sizeof(uint16_t)))) row = malloc(rowlen * sizeof(uint16_t));
{ if (!row)
fclose(f); goto quit;
return 0;
}
dat = (uint8_t *) im->data; dat = (uint8_t *) im->data;
for (i = 0; i < (uint32_t) im->h; ++i, dat += rowlen) for (i = 0; i < (uint32_t) im->h; ++i, dat += rowlen)
{ {
@ -140,20 +137,21 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_gran)
row[j + 3] = htons(dat[j + 3] * 257); row[j + 3] = htons(dat[j + 3] * 257);
} }
if (fwrite(row, sizeof(uint16_t), rowlen, f) != rowlen) if (fwrite(row, sizeof(uint16_t), rowlen, f) != rowlen)
{ goto quit;
free(row);
fclose(f);
return 0;
}
} }
if (progress) if (progress)
{ {
progress(im, 100, 0, 0, im->w, im->h); progress(im, 100, 0, 0, im->w, im->h);
} }
rc = LOAD_SUCCESS;
quit:
free(row); free(row);
fclose(f); fclose(f);
return 1;
return rc;
} }
void void

View File

@ -202,6 +202,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
ImLib_JPEG_data jdata; ImLib_JPEG_data jdata;
FILE *f; FILE *f;
@ -213,31 +214,21 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
int i, j, pl; int i, j, pl;
char pper; char pper;
/* no image data? abort */
if (!im->data)
return 0;
/* allocate a small buffer to convert image data */ /* allocate a small buffer to convert image data */
buf = malloc(im->w * 3 * sizeof(DATA8)); buf = malloc(im->w * 3 * sizeof(DATA8));
if (!buf) if (!buf)
return 0; return LOAD_FAIL;
rc = LOAD_FAIL;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
{ goto quit;
free(buf);
return 0;
}
/* set up error handling */ /* set up error handling */
cinfo.err = _jdata_init(&jdata); cinfo.err = _jdata_init(&jdata);
if (sigsetjmp(jdata.setjmp_buffer, 1)) if (sigsetjmp(jdata.setjmp_buffer, 1))
{ goto quit;
jpeg_destroy_compress(&cinfo);
free(buf);
fclose(f);
return 0;
}
/* setup compress params */ /* setup compress params */
jpeg_create_compress(&cinfo); jpeg_create_compress(&cinfo);
@ -310,24 +301,25 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
l = y - pl; l = y - pl;
if (!progress(im, per, 0, (y - l), im->w, l)) if (!progress(im, per, 0, (y - l), im->w, l))
{ {
jpeg_finish_compress(&cinfo); rc = LOAD_BREAK;
jpeg_destroy_compress(&cinfo); goto quit;
free(buf);
fclose(f);
return 2;
} }
pper = per; pper = per;
pl = y; pl = y;
} }
} }
} }
rc = LOAD_SUCCESS;
quit:
/* finish off */ /* finish off */
jpeg_finish_compress(&cinfo); jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo); jpeg_destroy_compress(&cinfo);
free(buf); free(buf);
fclose(f); fclose(f);
return 1;
progress = NULL; return rc;
} }
void void

View File

@ -206,6 +206,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
FILE *f; FILE *f;
png_structp png_ptr; png_structp png_ptr;
png_infop info_ptr; png_infop info_ptr;
@ -216,32 +217,24 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ImlibImageTag *tag; ImlibImageTag *tag;
int quality = 75, compression = 3, num_passes = 1, pass; int quality = 75, compression = 3, num_passes = 1, pass;
if (!im->data)
return 0;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
return 0; return LOAD_FAIL;
rc = LOAD_FAIL;
info_ptr = NULL;
data = NULL;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) if (!png_ptr)
{ goto quit;
fclose(f);
return 0;
}
info_ptr = png_create_info_struct(png_ptr); info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) if (!info_ptr)
{ goto quit;
fclose(f);
png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
return 0;
}
if (setjmp(png_jmpbuf(png_ptr))) if (setjmp(png_jmpbuf(png_ptr)))
{ goto quit;
fclose(f);
png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
return 0;
}
/* check whether we should use interlacing */ /* check whether we should use interlacing */
interlace = PNG_INTERLACE_NONE; interlace = PNG_INTERLACE_NONE;
@ -252,7 +245,6 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
#endif #endif
} }
data = NULL;
png_init_io(png_ptr, f); png_init_io(png_ptr, f);
if (im->flags & F_HAS_ALPHA) if (im->flags & F_HAS_ALPHA)
{ {
@ -352,15 +344,8 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
l = y - pl; l = y - pl;
if (!progress(im, per, 0, (y - l), im->w, l)) if (!progress(im, per, 0, (y - l), im->w, l))
{ {
if (data) rc = LOAD_BREAK;
free(data); goto quit;
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr,
(png_infopp) & info_ptr);
png_destroy_info_struct(png_ptr,
(png_infopp) & info_ptr);
fclose(f);
return 2;
} }
pper = per; pper = per;
pl = y; pl = y;
@ -369,14 +354,21 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ptr += im->w; ptr += im->w;
} }
} }
if (data)
free(data); rc = LOAD_SUCCESS;
quit:
free(data);
png_write_end(png_ptr, info_ptr); png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); if (info_ptr)
png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
if (png_ptr)
png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
fclose(f); fclose(f);
return 1;
return rc;
} }
/* fills the ImlibLoader struct with a string array of format file */ /* fills the ImlibLoader struct with a string array of format file */

View File

@ -421,24 +421,22 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
int x, y, pl = 0; int x, y, pl = 0;
char pper = 0; char pper = 0;
/* no image data? abort */
if (!im->data)
return 0;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
return 0; return LOAD_FAIL;
rc = 0; /* Error */ rc = LOAD_FAIL;
/* allocate a small buffer to convert image data */
buf = malloc(im->w * 4 * sizeof(DATA8));
if (!buf)
goto quit;
ptr = im->data;
/* if the image has a useful alpha channel */ /* if the image has a useful alpha channel */
if (im->flags & F_HAS_ALPHA) if (im->flags & F_HAS_ALPHA)
{ {
/* allocate a small buffer to convert image data */
buf = malloc(im->w * 4 * sizeof(DATA8));
if (!buf)
goto quit;
ptr = im->data;
fprintf(f, "P8\n" "# PNM File written by Imlib2\n" "%i %i\n" "255\n", fprintf(f, "P8\n" "# PNM File written by Imlib2\n" "%i %i\n" "255\n",
im->w, im->h); im->w, im->h);
for (y = 0; y < im->h; y++) for (y = 0; y < im->h; y++)
@ -462,12 +460,6 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
} }
else else
{ {
/* allocate a small buffer to convert image data */
buf = malloc(im->w * 3 * sizeof(DATA8));
if (!buf)
goto quit;
ptr = im->data;
fprintf(f, "P6\n" "# PNM File written by Imlib2\n" "%i %i\n" "255\n", fprintf(f, "P6\n" "# PNM File written by Imlib2\n" "%i %i\n" "255\n",
im->w, im->h); im->w, im->h);
for (y = 0; y < im->h; y++) for (y = 0; y < im->h; y++)
@ -489,15 +481,17 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
} }
} }
rc = 1; /* Ok */ rc = LOAD_SUCCESS;
quit:
/* finish off */ /* finish off */
free(buf); free(buf);
quit:
fclose(f); fclose(f);
return rc; return rc;
quit_progress: quit_progress:
rc = 2; rc = LOAD_BREAK;
goto quit; goto quit;
} }

View File

@ -65,20 +65,19 @@ typedef struct {
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
FILE *f; FILE *f;
DATA32 *dataptr; DATA32 *dataptr;
unsigned char *buf, *bufptr; unsigned char *buf, *bufptr;
int y, pl = 0; int y, pl = 0;
char pper = 0; char pper = 0;
tga_header header; tga_header header;
if (!im->data)
return 0;
f = fopen(im->real_file, "wb"); f = fopen(im->real_file, "wb");
if (!f) if (!f)
return 0; return LOAD_FAIL;
rc = LOAD_FAIL;
/* assemble the TGA header information */ /* assemble the TGA header information */
@ -109,10 +108,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
/* allocate a buffer to receive the BGRA-swapped pixel values */ /* allocate a buffer to receive the BGRA-swapped pixel values */
buf = malloc(im->w * im->h * ((im->flags & F_HAS_ALPHA) ? 4 : 3)); buf = malloc(im->w * im->h * ((im->flags & F_HAS_ALPHA) ? 4 : 3));
if (!buf) if (!buf)
{ goto quit;
fclose(f);
return 0;
}
/* now we have to read from im->data into buf, swapping RGBA to BGRA */ /* now we have to read from im->data into buf, swapping RGBA to BGRA */
dataptr = im->data; dataptr = im->data;
@ -147,9 +143,8 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
l = y - pl; l = y - pl;
if (!progress(im, per, 0, (y - l), im->w, l)) if (!progress(im, per, 0, (y - l), im->w, l))
{ {
free(buf); rc = LOAD_BREAK;
fclose(f); goto quit;
return 2;
} }
pper = per; pper = per;
pl = y; pl = y;
@ -163,9 +158,13 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
/* write the image data */ /* write the image data */
fwrite(buf, 1, im->w * im->h * ((im->flags & F_HAS_ALPHA) ? 4 : 3), f); fwrite(buf, 1, im->w * im->h * ((im->flags & F_HAS_ALPHA) ? 4 : 3), f);
rc = LOAD_SUCCESS;
quit:
free(buf); free(buf);
fclose(f); fclose(f);
return 1;
return rc;
} }
/* Load up a TGA file /* Load up a TGA file

View File

@ -400,6 +400,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
TIFF *tif = NULL; TIFF *tif = NULL;
uint8 *buf = NULL; uint8 *buf = NULL;
DATA32 pixel, *data = im->data; DATA32 pixel, *data = im->data;
@ -415,13 +416,11 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ImlibImageTag *tag; ImlibImageTag *tag;
int compression_type = COMPRESSION_DEFLATE; int compression_type = COMPRESSION_DEFLATE;
if (!im->data)
return 0;
tif = TIFFOpen(im->real_file, "w"); tif = TIFFOpen(im->real_file, "w");
if (!tif) if (!tif)
return 0; return LOAD_FAIL;
rc = LOAD_FAIL;
/* None of the TIFFSetFields are checked for errors, but since they */ /* None of the TIFFSetFields are checked for errors, but since they */
/* shouldn't fail, this shouldn't be a problem */ /* shouldn't fail, this shouldn't be a problem */
@ -445,49 +444,27 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
switch (compression_type) switch (compression_type)
{ {
case COMPRESSION_NONE: case COMPRESSION_NONE:
break;
case COMPRESSION_CCITTRLE: case COMPRESSION_CCITTRLE:
break;
case COMPRESSION_CCITTFAX3: case COMPRESSION_CCITTFAX3:
break;
case COMPRESSION_CCITTFAX4: case COMPRESSION_CCITTFAX4:
break;
case COMPRESSION_LZW: case COMPRESSION_LZW:
break;
case COMPRESSION_OJPEG: case COMPRESSION_OJPEG:
break;
case COMPRESSION_JPEG: case COMPRESSION_JPEG:
break;
case COMPRESSION_NEXT: case COMPRESSION_NEXT:
break;
case COMPRESSION_CCITTRLEW: case COMPRESSION_CCITTRLEW:
break;
case COMPRESSION_PACKBITS: case COMPRESSION_PACKBITS:
break;
case COMPRESSION_THUNDERSCAN: case COMPRESSION_THUNDERSCAN:
break;
case COMPRESSION_IT8CTPAD: case COMPRESSION_IT8CTPAD:
break;
case COMPRESSION_IT8LW: case COMPRESSION_IT8LW:
break;
case COMPRESSION_IT8MP: case COMPRESSION_IT8MP:
break;
case COMPRESSION_IT8BL: case COMPRESSION_IT8BL:
break;
case COMPRESSION_PIXARFILM: case COMPRESSION_PIXARFILM:
break;
case COMPRESSION_PIXARLOG: case COMPRESSION_PIXARLOG:
break;
case COMPRESSION_DEFLATE: case COMPRESSION_DEFLATE:
break;
case COMPRESSION_ADOBE_DEFLATE: case COMPRESSION_ADOBE_DEFLATE:
break;
case COMPRESSION_DCS: case COMPRESSION_DCS:
break;
case COMPRESSION_JBIG: case COMPRESSION_JBIG:
break;
case COMPRESSION_SGILOG: case COMPRESSION_SGILOG:
break;
case COMPRESSION_SGILOG24: case COMPRESSION_SGILOG24:
break; break;
default: default:
@ -511,12 +488,8 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0)); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0));
buf = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif)); buf = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif));
if (!buf) if (!buf)
{ goto quit;
TIFFClose(tif);
return 0;
}
for (y = 0; y < im->h; y++) for (y = 0; y < im->h; y++)
{ {
@ -547,11 +520,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
} }
if (!TIFFWriteScanline(tif, buf, y, 0)) if (!TIFFWriteScanline(tif, buf, y, 0))
{ goto quit;
_TIFFfree(buf);
TIFFClose(tif);
return 0;
}
if (progress) if (progress)
{ {
@ -569,10 +538,15 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
} }
} }
_TIFFfree(buf); rc = LOAD_SUCCESS;
TIFFClose(tif);
return 1; quit:
if (buf)
_TIFFfree(buf);
if (tif)
TIFFClose(tif);
return rc;
} }
void void

View File

@ -113,23 +113,20 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity) save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{ {
int rc;
int encoded_fd; int encoded_fd;
ImlibImageTag *quality_tag; ImlibImageTag *quality_tag;
float quality; float quality;
uint8_t *encoded_data; uint8_t *encoded_data;
ssize_t encoded_size; ssize_t encoded_size;
if (!im->data)
return 0;
encoded_fd = open(im->real_file, encoded_fd = open(im->real_file,
O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (encoded_fd < 0) if (encoded_fd < 0)
{ return LOAD_FAIL;
perror(im->real_file);
return 0; rc = LOAD_FAIL;
} encoded_data = NULL;
quality = 75; quality = 75;
quality_tag = __imlib_GetTag(im, "quality"); quality_tag = __imlib_GetTag(im, "quality");
@ -157,16 +154,16 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
im->w * 4, quality, &encoded_data); im->w * 4, quality, &encoded_data);
if (write(encoded_fd, encoded_data, encoded_size) < encoded_size) if (write(encoded_fd, encoded_data, encoded_size) < encoded_size)
{ goto quit;
close(encoded_fd);
WebPFree(encoded_data);
perror(im->real_file);
return 0;
}
rc = LOAD_SUCCESS;
quit:
if (encoded_data)
WebPFree(encoded_data);
close(encoded_fd); close(encoded_fd);
WebPFree(encoded_data);
return 1; return rc;
} }
void void