jpeg loader stays quiet - png loader handles grayscale + alpha images correctly
SVN revision: 1637
This commit is contained in:
parent
876c57bbf7
commit
e4d5926978
|
@ -19,6 +19,8 @@ struct ImLib_JPEG_error_mgr
|
|||
typedef struct ImLib_JPEG_error_mgr *emptr;
|
||||
|
||||
void _JPEGFatalErrorHandler(j_common_ptr cinfo);
|
||||
void _JPEGErrorHandler(j_common_ptr cinfo);
|
||||
void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level);
|
||||
char load (ImlibImage *im,
|
||||
void (*progress)(ImlibImage *im, char percent,
|
||||
int update_x, int update_y,
|
||||
|
@ -42,6 +44,29 @@ _JPEGFatalErrorHandler(j_common_ptr cinfo)
|
|||
return;
|
||||
}
|
||||
|
||||
void
|
||||
_JPEGErrorHandler(j_common_ptr cinfo)
|
||||
{
|
||||
emptr errmgr;
|
||||
|
||||
errmgr = (emptr) cinfo->err;
|
||||
/* cinfo->err->output_message(cinfo);*/
|
||||
siglongjmp(errmgr->setjmp_buffer, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
_JPEGErrorHandler2(j_common_ptr cinfo, int msg_level)
|
||||
{
|
||||
emptr errmgr;
|
||||
|
||||
errmgr = (emptr) cinfo->err;
|
||||
/* cinfo->err->output_message(cinfo);*/
|
||||
siglongjmp(errmgr->setjmp_buffer, 1);
|
||||
return;
|
||||
msg_level = 0;
|
||||
}
|
||||
|
||||
char
|
||||
load (ImlibImage *im,
|
||||
void (*progress)(ImlibImage *im, char percent,
|
||||
|
@ -59,8 +84,10 @@ load (ImlibImage *im,
|
|||
f = fopen(im->file, "rb");
|
||||
if (!f)
|
||||
return 0;
|
||||
cinfo.err = jpeg_std_error(&(jerr.pub));
|
||||
jerr.pub.error_exit = _JPEGFatalErrorHandler;
|
||||
jerr.pub.emit_message = _JPEGErrorHandler2;
|
||||
jerr.pub.output_message = _JPEGErrorHandler;
|
||||
cinfo.err = jpeg_std_error(&(jerr.pub));
|
||||
if (sigsetjmp(jerr.setjmp_buffer, 1))
|
||||
{
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
|
@ -230,8 +257,10 @@ save (ImlibImage *im,
|
|||
return 0;
|
||||
}
|
||||
/* set up error handling */
|
||||
cinfo.err = jpeg_std_error(&(jerr.pub));
|
||||
jerr.pub.error_exit = _JPEGFatalErrorHandler;
|
||||
jerr.pub.emit_message = _JPEGErrorHandler2;
|
||||
jerr.pub.output_message = _JPEGErrorHandler;
|
||||
cinfo.err = jpeg_std_error(&(jerr.pub));
|
||||
if (sigsetjmp(jerr.setjmp_buffer, 1))
|
||||
{
|
||||
jpeg_destroy_compress(&cinfo);
|
||||
|
|
|
@ -36,7 +36,7 @@ load (ImlibImage *im,
|
|||
{
|
||||
png_uint_32 w32, h32;
|
||||
int w, h;
|
||||
char hasa = 0;
|
||||
char hasa = 0, hasg = 0;
|
||||
FILE *f;
|
||||
png_structp png_ptr = NULL;
|
||||
png_infop info_ptr = NULL;
|
||||
|
@ -91,8 +91,8 @@ load (ImlibImage *im,
|
|||
im->h = (int)h32;
|
||||
if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
hasa = 1;
|
||||
else
|
||||
hasa = 0;
|
||||
if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
|
||||
hasg = 1;
|
||||
if (hasa)
|
||||
SET_FLAG(im->flags, F_HAS_ALPHA);
|
||||
else
|
||||
|
@ -151,12 +151,21 @@ load (ImlibImage *im,
|
|||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < h; i++)
|
||||
lines[i] = ((unsigned char *)(im->data)) + (i * w * sizeof(DATA32));
|
||||
if (progress)
|
||||
if (hasg)
|
||||
{
|
||||
DATA8 *line;
|
||||
int y, count, prevy, pass, number_passes, per, nrows = 1;
|
||||
|
||||
|
||||
line = malloc(w * 2);
|
||||
if (!line)
|
||||
{
|
||||
free(lines);
|
||||
im->data = NULL;
|
||||
png_read_end(png_ptr, info_ptr);
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
count = 0;
|
||||
number_passes = png_set_interlace_handling(png_ptr);
|
||||
for (pass = 0; pass < number_passes; pass++)
|
||||
|
@ -165,21 +174,68 @@ load (ImlibImage *im,
|
|||
per = 0;
|
||||
for (y = 0; y < h; y += nrows)
|
||||
{
|
||||
png_read_rows(png_ptr, &lines[y], NULL, nrows);
|
||||
|
||||
per = (((pass * h) + y) * 100) / (h * number_passes);
|
||||
if ((per - count) >= progress_granularity)
|
||||
DATA32 *ptr;
|
||||
|
||||
lines[0] = line;
|
||||
png_read_rows(png_ptr, &lines[0], NULL, nrows);
|
||||
ptr = ((unsigned char *)(im->data)) + (y * w * sizeof(DATA32));
|
||||
for (i = 0; i < w; i++)
|
||||
{
|
||||
count = per;
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
prevy = y + 1;
|
||||
}
|
||||
ptr[0] =
|
||||
(line[i << 1] << 16) |
|
||||
(line[i << 1] << 8) |
|
||||
(line[i << 1]) |
|
||||
(line[(i << 1) + 1] << 24);
|
||||
ptr++;
|
||||
}
|
||||
if (progress)
|
||||
{
|
||||
per = (((pass * h) + y) * 100) / (h * number_passes);
|
||||
if ((per - count) >= progress_granularity)
|
||||
{
|
||||
count = per;
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
prevy = y + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
if (progress)
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
}
|
||||
free(line);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < h; i++)
|
||||
lines[i] = ((unsigned char *)(im->data)) + (i * w * sizeof(DATA32));
|
||||
if (progress)
|
||||
{
|
||||
int y, count, prevy, pass, number_passes, per, nrows = 1;
|
||||
|
||||
count = 0;
|
||||
number_passes = png_set_interlace_handling(png_ptr);
|
||||
for (pass = 0; pass < number_passes; pass++)
|
||||
{
|
||||
prevy = 0;
|
||||
per = 0;
|
||||
for (y = 0; y < h; y += nrows)
|
||||
{
|
||||
png_read_rows(png_ptr, &lines[y], NULL, nrows);
|
||||
|
||||
per = (((pass * h) + y) * 100) / (h * number_passes);
|
||||
if ((per - count) >= progress_granularity)
|
||||
{
|
||||
count = per;
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
prevy = y + 1;
|
||||
}
|
||||
}
|
||||
progress(im, per, 0, prevy, w, y - prevy + 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
png_read_image(png_ptr, lines);
|
||||
}
|
||||
else
|
||||
png_read_image(png_ptr, lines);
|
||||
free(lines);
|
||||
png_read_end(png_ptr, info_ptr);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue