| Index: ui/gfx/image/image.cc
|
| diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc
|
| index 875ca2044245326315d6d0e07ef322efff736ba3..b0733b7ccda5dc877e56c3d0656b2e89acfa23cd 100644
|
| --- a/ui/gfx/image/image.cc
|
| +++ b/ui/gfx/image/image.cc
|
| @@ -124,7 +124,8 @@ gfx::Size UIImageSize(UIImage* image);
|
| scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage(
|
| NSImage* nsimage);
|
| // Caller takes ownership of the returned NSImage.
|
| -NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps);
|
| +NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps,
|
| + CGColorSpaceRef color_space);
|
| gfx::Size NSImageSize(NSImage* image);
|
| #endif // defined(OS_MACOSX)
|
|
|
| @@ -472,6 +473,10 @@ class ImageStorage : public base::RefCounted<ImageStorage> {
|
| public:
|
| ImageStorage(gfx::Image::RepresentationType default_type)
|
| : default_representation_type_(default_type),
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + default_representation_color_space_(
|
| + base::mac::GetGenericRGBColorSpace()),
|
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| representations_deleter_(&representations_) {
|
| }
|
|
|
| @@ -480,6 +485,15 @@ class ImageStorage : public base::RefCounted<ImageStorage> {
|
| }
|
| gfx::Image::RepresentationMap& representations() { return representations_; }
|
|
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + void set_default_representation_color_space(CGColorSpaceRef color_space) {
|
| + default_representation_color_space_ = color_space;
|
| + }
|
| + CGColorSpaceRef default_representation_color_space() {
|
| + return default_representation_color_space_;
|
| + }
|
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| +
|
| private:
|
| friend class base::RefCounted<ImageStorage>;
|
|
|
| @@ -489,6 +503,14 @@ class ImageStorage : public base::RefCounted<ImageStorage> {
|
| // exist in the |representations_| map.
|
| gfx::Image::RepresentationType default_representation_type_;
|
|
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + // The default representation's colorspace. This is used for converting to
|
| + // NSImage. This field exists to compensate for PNGCodec not writing or
|
| + // reading colorspace ancillary chunks. (sRGB, iCCP).
|
| + // Not owned.
|
| + CGColorSpaceRef default_representation_color_space_;
|
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| +
|
| // All the representations of an Image. Size will always be at least one, with
|
| // more for any converted representations.
|
| gfx::Image::RepresentationMap representations_;
|
| @@ -710,18 +732,22 @@ UIImage* Image::ToUIImage() const {
|
| NSImage* Image::ToNSImage() const {
|
| internal::ImageRep* rep = GetRepresentation(kImageRepCocoa, false);
|
| if (!rep) {
|
| + CGColorSpaceRef default_representation_color_space =
|
| + storage_->default_representation_color_space();
|
| +
|
| switch (DefaultRepresentationType()) {
|
| case kImageRepPNG: {
|
| internal::ImageRepPNG* png_rep =
|
| GetRepresentation(kImageRepPNG, true)->AsImageRepPNG();
|
| rep = new internal::ImageRepCocoa(internal::NSImageFromPNG(
|
| - png_rep->image_reps()));
|
| + png_rep->image_reps(), default_representation_color_space));
|
| break;
|
| }
|
| case kImageRepSkia: {
|
| internal::ImageRepSkia* skia_rep =
|
| GetRepresentation(kImageRepSkia, true)->AsImageRepSkia();
|
| - NSImage* image = NSImageFromImageSkia(*skia_rep->image());
|
| + NSImage* image = NSImageFromImageSkiaWithColorSpace(*skia_rep->image(),
|
| + default_representation_color_space);
|
| base::mac::NSObjectRetain(image);
|
| rep = new internal::ImageRepCocoa(image);
|
| break;
|
| @@ -896,6 +922,13 @@ void Image::SwapRepresentations(gfx::Image* other) {
|
| storage_.swap(other->storage_);
|
| }
|
|
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| +void Image::SetSourceColorSpace(CGColorSpaceRef color_space) {
|
| + if (storage_.get())
|
| + storage_->set_default_representation_color_space(color_space);
|
| +}
|
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| +
|
| Image::RepresentationType Image::DefaultRepresentationType() const {
|
| CHECK(storage_.get());
|
| RepresentationType default_type = storage_->default_representation_type();
|
|
|