From e4d592697874f630a3ab5e0553224425fa3161d6 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 16 Dec 1999 16:24:51 +0000 Subject: [PATCH] jpeg loader stays quiet - png loader handles grayscale + alpha images correctly SVN revision: 1637 --- loaders/loader_jpeg.c | 33 +++++++++++++++- loaders/loader_png.c | 92 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 105 insertions(+), 20 deletions(-) diff --git a/loaders/loader_jpeg.c b/loaders/loader_jpeg.c index 0d5b8c1..ffcc06b 100644 --- a/loaders/loader_jpeg.c +++ b/loaders/loader_jpeg.c @@ -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); diff --git a/loaders/loader_png.c b/loaders/loader_png.c index 6f5f480..cccac2a 100644 --- a/loaders/loader_png.c +++ b/loaders/loader_png.c @@ -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); }