From e7d7187e750512470e6927c4b836d351e51484b9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 29 Nov 2014 12:06:05 -0800 Subject: [PATCH] Fixed bug 2788 - color space fix for ImageIO backend (OS X, iOS) Jeffrey Carpenter Test case resources (should be able to be replaced with your own as long as the pixel format and file encoding matches): test.bmp RGB8888 (24-bit, BMP) test.png ARGB8888 (32-bit, PNG) This patch reverts [revision 292](https://hg.libsdl.org/SDL_image/log?rev=292) back to the original author's implementation (Eric Wing). The comments made in this revision seem to contradict what is intended; see CGColorSpaceCreateCalibratedRGB [1] and CGColorSpaceCreateDeviceRGB [2] for Apple's API notes. Also note that the revision comments by "Albert" use a test case that is for use with SDL1 -- how this may change things is unknown to me. 1. https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGColorSpace/index.html#//apple_ref/c/func/CGColorSpaceCreateCalibratedRGB 2. https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGColorSpace/index.html#//apple_ref/c/func/CGColorSpaceCreateDeviceRGB Additional notes * Tested on Mac OS X 10.10 "Yosemite". * Has not been tested against iOS, SDL1 or images that have been processed with pre-multiplied alpha. Build test case: clang++ sdl2_image-colorspace-fix.cpp -o sdl2_image-colorspace-fix -framework SDL2 -framework SDL2_image Run test case to generate my existing data (my baseline / reference): (output in diag_main.txt, using test.bmp and test.png) bitmap(0, 0) = ff6e8fbd png(0, 0) = ff6e8fbd sdlbmp(0, 0) = 6e90be bitmap(31, 0) = ff6e8fbd png(31, 0) = ff6e8fbd sdlbmp(31, 0) = 6e90be NOTE: ff6e8fbd = R(110) G(143) B(189) The actual pixel value is 110, 144, 190. SDL_LoadBMP gets it right in both cases, whereas IMG_Load (ImageIO backend) gets it wrong on both counts. Apply revert-rev-292.patch: hg import revert-rev-292.patch Rebuild test case, ensuring that we compile and **run** with the proper runtime search paths for our patched SDL2_image library (I built mine using Xcode project files): ```sh # man dyld (1) DYLD_FRAMEWORK_PATH= ./sdl2_image-colorspace-fix ``` Comparison output of reference data with patched library: (output in diag_main.txt, using test.bmp and test.png) bitmap(0, 0) = ff6e90be png(0, 0) = ff6e90be sdlbmp(0, 0) = 6e90be bitmap(31, 0) = ff6e90be png(31, 0) = ff6e90be sdlbmp(31, 0) = 6e90be NOTE: ff6e90be = R(110) G(144) B(190) The actual pixel values match using both SDL_LoadBMP and IMG_Load. This is the expected behavior. References 1. [Introduction of ImageIO backend](https://forums.libsdl.org/viewtopic.php?p=14777) 2. [Pixel bug in Mac OS X](https://forums.libsdl.org/viewtopic.php?p=30317) 3. [Perhaps again? Pixel bug in Mac OS X](https://forums.libsdl.org/viewtopic.php?t=10013&sid=34e8ef7cf74074039495037c1a077025) --- IMG_ImageIO.m | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/IMG_ImageIO.m b/IMG_ImageIO.m index 9f82706a..0b2662da 100644 --- a/IMG_ImageIO.m +++ b/IMG_ImageIO.m @@ -211,24 +211,7 @@ static CFDictionaryRef CreateHintDictionary(CFStringRef uti_string_hint) CGContextRef bitmap_context; CGBitmapInfo bitmap_info; - - /* This sets up a color space that results in identical values - * as the image data itself, which is the same as the standalone - * libpng loader. - * Thanks to Allegro. :) - */ - CGFloat whitePoint[3] = { 0.950, 1.000, 1.089 }; - CGFloat blackPoint[3] = { 0.000, 0.000, 0.000 }; - CGFloat gamma[3] = { 2.2, 2.2, 2.2 }; - CGFloat matrix[9] = { - 0.412, 0.213, 0.019, - 0.358, 0.715, 0.119, - 0.180, 0.072, 0.950 - }; - CGColorSpaceRef color_space = - CGColorSpaceCreateCalibratedRGB( - whitePoint, blackPoint, gamma, matrix - ); + CGColorSpaceRef color_space = CGColorSpaceCreateDeviceRGB(); if (alpha == kCGImageAlphaNone || alpha == kCGImageAlphaNoneSkipFirst ||