Index: ui/gfx/image/image_mac.mm |
diff --git a/ui/gfx/image/image_mac.mm b/ui/gfx/image/image_mac.mm |
index c79100c408592f48e0029fdf13b0c30553aea42d..0158521d007f97cee5f26e454f5987c660192340 100644 |
--- a/ui/gfx/image/image_mac.mm |
+++ b/ui/gfx/image/image_mac.mm |
@@ -48,7 +48,8 @@ scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage( |
return refcounted_bytes; |
} |
-NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps) { |
+NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps, |
+ CGColorSpaceRef color_space) { |
if (image_png_reps.empty()) { |
LOG(ERROR) << "Unable to decode PNG."; |
return GetErrorNSImage(); |
@@ -69,6 +70,23 @@ NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps) { |
return GetErrorNSImage(); |
} |
+ // PNGCodec ignores colorspace related ancillary chunks (sRGB, iCCP). Ignore |
+ // colorspace information when decoding directly from PNG to an NSImage so |
+ // that the conversions: PNG -> SkBitmap -> NSImage and PNG -> NSImage |
+ // produce visually similar results. |
+ CGColorSpaceModel decoded_color_space_model = CGColorSpaceGetModel( |
+ [[ns_image_rep colorSpace] CGColorSpace]); |
+ CGColorSpaceModel color_space_model = CGColorSpaceGetModel(color_space); |
+ if (decoded_color_space_model == color_space_model) { |
+ scoped_nsobject<NSColorSpace> ns_color_space( |
+ [[NSColorSpace alloc] initWithCGColorSpace:color_space]); |
+ NSBitmapImageRep* ns_retagged_image_rep = |
+ [ns_image_rep |
+ bitmapImageRepByRetaggingWithColorSpace:ns_color_space]; |
+ if (ns_retagged_image_rep && ns_retagged_image_rep != ns_image_rep) |
+ ns_image_rep.reset([ns_retagged_image_rep retain]); |
+ } |
+ |
if (!image.get()) { |
float scale = ui::GetScaleFactorScale(image_png_reps[i].scale_factor); |
NSSize image_size = NSMakeSize([ns_image_rep pixelsWide] / scale, |