1/* 2 * Copyright (C) 2003, 2004, 2005, 2006 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#import "config.h" 27#import "ColorMac.h" 28 29#import <WebCore/BlockExceptions.h> 30#import <wtf/RetainPtr.h> 31#import <wtf/StdLibExtras.h> 32 33namespace WebCore { 34 35static bool useOldAquaFocusRingColor; 36 37RGBA32 oldAquaFocusRingColor() 38{ 39 return 0xFF7DADD9; 40} 41 42void setUsesTestModeFocusRingColor(bool newValue) 43{ 44 useOldAquaFocusRingColor = newValue; 45} 46 47bool usesTestModeFocusRingColor() 48{ 49 return useOldAquaFocusRingColor; 50} 51 52static RGBA32 makeRGBAFromNSColor(NSColor *c) 53{ 54 CGFloat redComponent; 55 CGFloat greenComponent; 56 CGFloat blueComponent; 57 CGFloat alpha; 58 59 BEGIN_BLOCK_OBJC_EXCEPTIONS; 60 NSColor *rgbColor = [c colorUsingColorSpaceName:NSDeviceRGBColorSpace]; 61 if (!rgbColor) 62 return makeRGBA(0, 0, 0, 0); 63 64 [rgbColor getRed:&redComponent green:&greenComponent blue:&blueComponent alpha:&alpha]; 65 END_BLOCK_OBJC_EXCEPTIONS; 66 67 return makeRGBA(255 * redComponent, 255 * greenComponent, 255 * blueComponent, 255 * alpha); 68} 69 70Color colorFromNSColor(NSColor *c) 71{ 72 return Color(makeRGBAFromNSColor(c)); 73} 74 75NSColor *nsColor(const Color& color) 76{ 77 RGBA32 c = color.rgb(); 78 switch (c) { 79 case 0: { 80 // Need this to avoid returning nil because cachedRGBAValues will default to 0. 81 static NSColor *clearColor = [[NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:0] retain]; 82 return clearColor; 83 } 84 case Color::black: { 85 static NSColor *blackColor = [[NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:1] retain]; 86 return blackColor; 87 } 88 case Color::white: { 89 static NSColor *whiteColor = [[NSColor colorWithDeviceRed:1 green:1 blue:1 alpha:1] retain]; 90 return whiteColor; 91 } 92 default: { 93 const int cacheSize = 32; 94 static unsigned cachedRGBAValues[cacheSize]; 95 static RetainPtr<NSColor>* cachedColors = new RetainPtr<NSColor>[cacheSize]; 96 97 for (int i = 0; i != cacheSize; ++i) { 98 if (cachedRGBAValues[i] == c) 99 return cachedColors[i].get(); 100 } 101 102 NSColor *result = [NSColor colorWithDeviceRed:static_cast<CGFloat>(color.red()) / 255 103 green:static_cast<CGFloat>(color.green()) / 255 104 blue:static_cast<CGFloat>(color.blue()) / 255 105 alpha:static_cast<CGFloat>(color.alpha()) / 255]; 106 107 static int cursor; 108 cachedRGBAValues[cursor] = c; 109 cachedColors[cursor] = result; 110 if (++cursor == cacheSize) 111 cursor = 0; 112 return result; 113 } 114 } 115} 116 117 118} // namespace WebCore 119