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