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..ce8023d8a6401252a099c966453f57fbe7234f07 100644 |
| --- a/ui/gfx/color_profile_mac.mm |
| +++ b/ui/gfx/color_profile_mac.mm |
| @@ -5,15 +5,51 @@ |
| #include "ui/gfx/color_profile.h" |
| #include "base/mac/mac_util.h" |
| +#include "base/mac/sdk_forward_declarations.h" |
|
Robert Sesek
2014/10/08 01:33:17
Do you need this #include?
Noel Gordon
2014/10/08 01:58:58
Yes, code won't compile otherwise.
Robert Sesek
2014/10/08 02:03:13
What's the error? I don't see you using any SDK fo
|
| +#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); |
| + return true; |
| } |
| void ReadColorProfile(std::vector<char>* profile) { |