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

View File

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

View File

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

View File

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

View File

@ -206,6 +206,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
char
save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
{
int rc;
FILE *f;
png_structp png_ptr;
png_infop info_ptr;
@ -216,32 +217,24 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ImlibImageTag *tag;
int quality = 75, compression = 3, num_passes = 1, pass;
if (!im->data)
return 0;
f = fopen(im->real_file, "wb");
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);
if (!png_ptr)
{
fclose(f);
return 0;
}
goto quit;
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
fclose(f);
png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
return 0;
}
goto quit;
if (setjmp(png_jmpbuf(png_ptr)))
{
fclose(f);
png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr);
png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr);
return 0;
}
goto quit;
/* check whether we should use interlacing */
interlace = PNG_INTERLACE_NONE;
@ -252,7 +245,6 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
#endif
}
data = NULL;
png_init_io(png_ptr, f);
if (im->flags & F_HAS_ALPHA)
{
@ -352,15 +344,8 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
l = y - pl;
if (!progress(im, per, 0, (y - l), im->w, l))
{
if (data)
free(data);
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;
rc = LOAD_BREAK;
goto quit;
}
pper = per;
pl = y;
@ -369,14 +354,21 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ptr += im->w;
}
}
if (data)
free(data);
rc = LOAD_SUCCESS;
quit:
free(data);
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);
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);
return 1;
return rc;
}
/* 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;
char pper = 0;
/* no image data? abort */
if (!im->data)
return 0;
f = fopen(im->real_file, "wb");
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 (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",
im->w, im->h);
for (y = 0; y < im->h; y++)
@ -462,12 +460,6 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
}
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",
im->w, im->h);
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 */
free(buf);
quit:
fclose(f);
return rc;
quit_progress:
rc = 2;
rc = LOAD_BREAK;
goto quit;
}

View File

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

View File

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

View File

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