2009-03-19 Jeremy Moskovich <jeremy@chromium.org>
authordglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Mar 2009 16:43:30 +0000 (16:43 +0000)
committerdglazkov@chromium.org <dglazkov@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Mar 2009 16:43:30 +0000 (16:43 +0000)
        Reviewed by Dimitri Glazkov.

        https://bugs.webkit.org/show_bug.cgi?id=24456
        Split ColorChromium.cpp into Mac & Windows variants.
        Remove Chromium Dependency on platform/graphics/mac/ColorMac.mm since we
        ultimately need to take a different approach.  For now, createCGColor()
        is copied from ColorMac.mm.

        No observable change in behavior, so no test.

        * platform/graphics/chromium/ColorChromium.cpp:
        (WebCore::focusRingColor):
        * platform/graphics/chromium/ColorChromiumMac.mm: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@41839 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/graphics/chromium/ColorChromium.cpp
WebCore/platform/graphics/chromium/ColorChromiumMac.mm [new file with mode: 0644]

index 4277069..67c3e81 100644 (file)
@@ -1,3 +1,19 @@
+2009-03-19  Jeremy Moskovich  <jeremy@chromium.org>
+
+        Reviewed by Dimitri Glazkov.
+
+        https://bugs.webkit.org/show_bug.cgi?id=24456
+        Split ColorChromium.cpp into Mac & Windows variants.
+        Remove Chromium Dependency on platform/graphics/mac/ColorMac.mm since we
+        ultimately need to take a different approach.  For now, createCGColor()
+        is copied from ColorMac.mm.
+
+        No observable change in behavior, so no test.
+
+        * platform/graphics/chromium/ColorChromium.cpp:
+        (WebCore::focusRingColor):
+        * platform/graphics/chromium/ColorChromiumMac.mm: Added.
+
 2009-03-19  Pavel Feldman  <pfeldman@chromium.org>
 
         Reviewed by Dimitri Glazkov.
index 16ca17d..647169c 100644 (file)
 
 namespace WebCore {
 
+#if !PLATFORM(DARWIN)
+// On OS X, there's code to monitor changes in the focus color system setting.
+// On Windows/Linux there is no equivalent system setting and therefore a static
+// color is all we need.
 Color focusRingColor()
 {
-// FIXME: This should be split up to ColorChromiumWin and ColorChromiumMac.
-#if PLATFORM(DARWIN)
-    // To avoid the Mac Chromium build having to rebasline 500+ layout tests and
-    // continue to do this w/ new tests that get landed in WebKit, we want to
-    // run the layout tests w/ the same color that stock WebKit uses.
-    // 
-    // TODO: For now we've hard coded the color that WebKit uses for layout
-    // tests.  We need to revisit this and do either of the following:
-    //  A. Fully honor the color from the UI, which means collecting the color
-    //     (and change notifications) in the browser process, and messaging the
-    //     color to the render process.
-    //  B. Adding a "layout tests" flag, to control the orage vs. blue colors
-    //     depending if we're running layout tests.
-    // To see the WebKit implementation of using the UI color and/or a flag for
-    // layout tests see WebKit/WebCore/platform/graphics/mac/ColorMac.mm.
-    // (Reality is we just need an api to override the focus color and both
-    // of the above are covered for what this file needs to provide, the
-    // two options would be details that happen in other places.)
-
-    // From WebKit:
-    // static RGBA32 oldAquaFocusRingColorRGBA = 0xFF7DADD9;
-    static Color oldAquaFocusRingColor(0x7D, 0xAD, 0xD9, 0xFF);
-    return oldAquaFocusRingColor;
-#else
     static Color focusRingColor(229, 151, 0, 255);
     return focusRingColor;
-#endif
 }
+#endif
 
 } // namespace WebCore
diff --git a/WebCore/platform/graphics/chromium/ColorChromiumMac.mm b/WebCore/platform/graphics/chromium/ColorChromiumMac.mm
new file mode 100644 (file)
index 0000000..9ded7af
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "Color.h"
+
+#import <wtf/Assertions.h>
+#import <wtf/StdLibExtras.h>
+#import <wtf/RetainPtr.h>
+
+namespace WebCore {
+
+Color focusRingColor()
+{
+    // To avoid the Mac Chromium build having to rebasline 500+ layout tests and
+    // continue to do this w/ new tests that get landed in WebKit, we want to
+    // run the layout tests w/ the same color that stock WebKit uses.
+    //
+    // FIXME: For now we've hard coded the color that WebKit uses for layout
+    // tests.  We need to revisit this and do either of the following:
+    //  A. Fully honor the color from the UI, which means collecting the color
+    //     (and change notifications) in the browser process, and messaging the
+    //     color to the render process.
+    //  B. Adding a "layout tests" flag, to control the orage vs. blue colors
+    //     depending if we're running layout tests.
+    // To see the WebKit implementation of using the UI color and/or a flag for
+    // layout tests see WebKit/WebCore/platform/graphics/mac/ColorMac.mm.
+    // (Reality is we just need an api to override the focus color and both
+    // of the above are covered for what this file needs to provide, the
+    // two options would be details that happen in other places.)
+
+    // From WebKit:
+    // static RGBA32 oldAquaFocusRingColorRGBA = 0xFF7DADD9;
+    static Color oldAquaFocusRingColor(0x7D, 0xAD, 0xD9, 0xFF);
+    return oldAquaFocusRingColor;
+}
+
+// createCGColor() and the functions it calls are verbatum copies of
+// graphics/mac/ColorMac.mm.  These are copied here so that we don't need to
+// include ColorMac.mm in the Chromium build.
+// FIXME: Check feasibility of using pure CG calls and unifying this copy with
+// ColorMac.mm's under graphics/cg.
+
+NSColor* nsColor(const Color& color)
+{
+    unsigned c = color.rgb();
+    switch (c) {
+        case 0: {
+            // Need this to avoid returning nil because cachedRGBAValues will default to 0.
+            DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, clearColor, ([NSColor colorWithDeviceRed:0.0f green:0.0f blue:0.0f alpha:0.0f]));
+            return clearColor.get();
+        }
+        case Color::black: {
+            DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, blackColor, ([NSColor colorWithDeviceRed:0.0f green:0.0f blue:0.0f alpha:1.0f]));
+            return blackColor.get();
+        }
+        case Color::white: {
+            DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, whiteColor, ([NSColor colorWithDeviceRed:1.0f green:1.0f blue:1.0f alpha:1.0f]));
+            return whiteColor.get();
+        }
+        default: {
+            const int cacheSize = 32;
+            static unsigned cachedRGBAValues[cacheSize];
+            static RetainPtr<NSColor>* cachedColors = new RetainPtr<NSColor>[cacheSize];
+
+            for (int i = 0; i != cacheSize; ++i)
+                if (cachedRGBAValues[i] == c)
+                    return cachedColors[i].get();
+
+            NSColor* result = [NSColor colorWithDeviceRed:color.red() / 255.0f
+                                                    green:color.green() / 255.0f
+                                                     blue:color.blue() / 255.0f
+                                                    alpha:color.alpha() /255.0f];
+
+            static int cursor;
+            cachedRGBAValues[cursor] = c;
+            cachedColors[cursor] = result;
+            if (++cursor == cacheSize)
+                cursor = 0;
+            return result;
+        }
+    }
+}
+
+static CGColorRef CGColorFromNSColor(NSColor* color)
+{
+    // This needs to always use device colorspace so it can de-calibrate the color for
+    // CGColor to possibly recalibrate it.
+    NSColor* deviceColor = [color colorUsingColorSpaceName:NSDeviceRGBColorSpace];
+    CGFloat red = [deviceColor redComponent];
+    CGFloat green = [deviceColor greenComponent];
+    CGFloat blue = [deviceColor blueComponent];
+    CGFloat alpha = [deviceColor alphaComponent];
+    const CGFloat components[4] = { red, green, blue, alpha };
+    static CGColorSpaceRef deviceRGBColorSpace = CGColorSpaceCreateDeviceRGB();
+    CGColorRef cgColor = CGColorCreate(deviceRGBColorSpace, components);
+    return cgColor;
+}
+
+CGColorRef createCGColor(const Color& c)
+{
+    // We could directly create a CGColor here, but that would
+    // skip any RGB caching the nsColor method does. A direct
+    // creation could be investigated for a possible performance win.
+    return CGColorFromNSColor(nsColor(c));
+}
+
+} // namespace WebCore