forked from old/legacy-imlib2
Saver cleanups
- Do exit cleanups at exit. - Use LOAD_FAIL/SUCCESS/BREAK for save() exit code. - Cosmetics.
This commit is contained in:
parent
bd3aa88242
commit
6a7eb67f46
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue