18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "ColorMac.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/RetainPtr.h> 305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#import <wtf/StdLibExtras.h> 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// NSColor calls don't throw, so no need to block Cocoa exceptions in this file 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool useOldAquaFocusRingColor; 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRGBA32 oldAquaFocusRingColor() 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0xFF7DADD9; 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid setUsesTestModeFocusRingColor(bool newValue) 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch useOldAquaFocusRingColor = newValue; 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool usesTestModeFocusRingColor() 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return useOldAquaFocusRingColor; 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic RGBA32 makeRGBAFromNSColor(NSColor *c) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CGFloat redComponent; 565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CGFloat greenComponent; 575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CGFloat blueComponent; 585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CGFloat alpha; 595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian [c getRed:&redComponent green:&greenComponent blue:&blueComponent alpha:&alpha]; 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return makeRGBA(255 * redComponent, 255 * greenComponent, 255 * blueComponent, 255 * alpha); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor colorFromNSColor(NSColor *c) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Color(makeRGBAFromNSColor(c)); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 695f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNSColor *nsColor(const Color& color) 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RGBA32 c = color.rgb(); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (c) { 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case 0: { 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Need this to avoid returning nil because cachedRGBAValues will default to 0. 755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, clearColor, ([NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:0])); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return clearColor.get(); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case Color::black: { 795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, blackColor, ([NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:1])); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return blackColor.get(); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case Color::white: { 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, whiteColor, ([NSColor colorWithDeviceRed:1 green:1 blue:1 alpha:1])); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return whiteColor.get(); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: { 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const int cacheSize = 32; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static unsigned cachedRGBAValues[cacheSize]; 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static RetainPtr<NSColor>* cachedColors = new RetainPtr<NSColor>[cacheSize]; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 91a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch for (int i = 0; i != cacheSize; ++i) { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedRGBAValues[i] == c) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cachedColors[i].get(); 94a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NSColor *result = [NSColor colorWithDeviceRed:static_cast<CGFloat>(color.red()) / 255 975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian green:static_cast<CGFloat>(color.green()) / 255 985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian blue:static_cast<CGFloat>(color.blue()) / 255 99a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch alpha:static_cast<CGFloat>(color.alpha()) / 255]; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static int cursor; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cachedRGBAValues[cursor] = c; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cachedColors[cursor] = result; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (++cursor == cacheSize) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cursor = 0; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 113