Mercurial > emacs
changeset 94780:80207eb81324
(png_load): Use correct bit-depth for setting background color.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Fri, 09 May 2008 02:37:31 +0000 |
parents | 6d637951ccf0 |
children | 9a85583ee23c |
files | src/image.c |
diffstat | 1 files changed, 9 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/src/image.c Fri May 09 02:37:19 2008 +0000 +++ b/src/image.c Fri May 09 02:37:31 2008 +0000 @@ -6542,7 +6542,6 @@ png_byte channels; png_uint_32 row_bytes; int transparent_p; - double screen_gamma; struct png_memory_storage tbr; /* Data to be read */ /* Find out what file to load. */ @@ -6684,27 +6683,6 @@ || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) fn_png_set_gray_to_rgb (png_ptr); - screen_gamma = (f->gamma ? 1 / f->gamma / 0.45455 : 2.2); - -#if 0 /* Avoid double gamma correction for PNG images. */ - { /* Tell the PNG lib to handle gamma correction for us. */ - int intent; - double image_gamma; -#if defined(PNG_READ_sRGB_SUPPORTED) || defined(PNG_WRITE_sRGB_SUPPORTED) - if (png_get_sRGB (png_ptr, info_ptr, &intent)) - /* The libpng documentation says this is right in this case. */ - png_set_gamma (png_ptr, screen_gamma, 0.45455); - else -#endif - if (png_get_gAMA (png_ptr, info_ptr, &image_gamma)) - /* Image contains gamma information. */ - png_set_gamma (png_ptr, screen_gamma, image_gamma); - else - /* Use the standard default for the image gamma. */ - png_set_gamma (png_ptr, screen_gamma, 0.45455); - } -#endif /* if 0 */ - /* Handle alpha channel by combining the image with a background color. Do this only if a real alpha channel is supplied. For simple transparency, we prefer a clipping mask. */ @@ -6713,6 +6691,7 @@ /* png_color_16 *image_bg; */ Lisp_Object specified_bg = image_spec_value (img->spec, QCbackground, NULL); + int shift = (bit_depth == 16) ? 0 : 8; if (STRINGP (specified_bg)) /* The user specified `:background', use that. */ @@ -6724,27 +6703,18 @@ png_color_16 user_bg; bzero (&user_bg, sizeof user_bg); - user_bg.red = color.red >> 8; - user_bg.green = color.green >> 8; - user_bg.blue = color.blue >> 8; + user_bg.red = color.red >> shift; + user_bg.green = color.green >> shift; + user_bg.blue = color.blue >> shift; fn_png_set_background (png_ptr, &user_bg, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); } } - /* The commented-out code checked if the png specifies a default - background color, and uses that. Since we use the current - frame background, it is OK for us to ignore this. - - else if (fn_png_get_bKGD (png_ptr, info_ptr, &image_bg)) - fn_png_set_background (png_ptr, image_bg, - PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); - */ else { - /* Image does not contain a background color with which - to combine the image data via an alpha channel. Use - the frame's background instead. */ + /* We use the current frame background, ignoring any default + background color set by the image. */ #ifdef HAVE_X_WINDOWS XColor color; png_color_16 frame_background; @@ -6753,9 +6723,9 @@ x_query_color (f, &color); bzero (&frame_background, sizeof frame_background); - frame_background.red = color.red >> 8; - frame_background.green = color.green >> 8; - frame_background.blue = color.blue >> 8; + frame_background.red = color.red >> shift; + frame_background.green = color.green >> shift; + frame_background.blue = color.blue >> shift; #endif /* HAVE_X_WINDOWS */ #ifdef HAVE_NTGUI