From: Chong Yidong Date: Fri, 9 May 2008 02:37:31 +0000 (+0000) Subject: (png_load): Use correct bit-depth for setting background color. X-Git-Tag: emacs-pretest-23.0.90~5694 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c4f13f44fbeb917916f71ac0fa9e7a100ed8b643;p=emacs.git (png_load): Use correct bit-depth for setting background color. --- diff --git a/src/image.c b/src/image.c index 48b223c6c76..3a972197293 100644 --- a/src/image.c +++ b/src/image.c @@ -6542,7 +6542,6 @@ png_load (f, img) 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 @@ png_load (f, img) || 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_load (f, img) /* 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_load (f, img) 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 @@ png_load (f, img) 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