Chromium Code Reviews| Index: ui/gfx/color_profile_mac.mm |
| diff --git a/ui/gfx/color_profile_mac.mm b/ui/gfx/color_profile_mac.mm |
| index c36072d93308cee51a90ff71121c3201c9e84dcf..ac877c0fb6754f5f2bc171edb8c2f5f5bd5fc05a 100644 |
| --- a/ui/gfx/color_profile_mac.mm |
| +++ b/ui/gfx/color_profile_mac.mm |
| @@ -4,16 +4,53 @@ |
| #include "ui/gfx/color_profile.h" |
| +#import <Cocoa/Cocoa.h> |
| + |
| #include "base/mac/mac_util.h" |
| +#include "ui/gfx/mac/coordinate_conversion.h" |
| + |
| +namespace { |
| + |
| +NSScreen* GetNSScreenFromBounds(const gfx::Rect& bounds) { |
| + NSScreen* screen = nil; |
| + int overlap = 0; |
| + |
| + for (NSScreen* monitor in [NSScreen screens]) { |
| + gfx::Rect monitor_rect = gfx::ScreenRectFromNSRect([monitor frame]); |
| + gfx::Rect overlap_rect = gfx::IntersectRects(monitor_rect, bounds); |
| + int overlap_size = overlap_rect.width() * overlap_rect.height(); |
| + if (overlap_size > overlap) { |
| + overlap = overlap_size; |
| + screen = monitor; |
| + } |
| + } |
| + |
| + return screen; |
| +} |
| + |
| +} // namespace |
| namespace gfx { |
| bool GetDisplayColorProfile(const gfx::Rect& bounds, |
| std::vector<char>* profile) { |
| - if (bounds.IsEmpty()) |
| + DCHECK(profile->empty()); |
| + |
| + NSScreen* screen = GetNSScreenFromBounds(bounds); |
| + if (!screen || bounds.IsEmpty()) |
| return false; |
| - // TODO(noel): implement. |
| - return false; |
| + NSColorSpace* color_space = [screen colorSpace]; |
| + if (!color_space) |
| + return false; |
| + |
| + if ([color_space isEqual:[NSColorSpace sRGBColorSpace]]) |
| + return true; |
| + NSData* profile_data = [color_space ICCProfileData]; |
| + const char* data = static_cast<const char*>([profile_data bytes]); |
| + size_t length = [profile_data length]; |
| + if (data && !gfx::InvalidColorProfileLength(length)) |
| + profile->assign(data, data + length); |
|
sky
2014/10/10 02:36:10
I'm curious, what does this get mapped to? Does da
Noel Gordon
2014/10/12 01:31:00
I believe that plain-old-data pointers satisfy the
|
| + return true; |
| } |
| void ReadColorProfile(std::vector<char>* profile) { |