Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / gfx / color_profile_mac.mm
index c36072d..ac877c0 100644 (file)
@@ -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);
+  return true;
 }
 
 void ReadColorProfile(std::vector<char>* profile) {