18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
3e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CanvasStyle_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CanvasStyle_h
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Color.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
32a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/Assertions.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class CanvasGradient;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class CanvasPattern;
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    class Document;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class GraphicsContext;
40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    class HTMLCanvasElement;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class CanvasStyle : public RefCounted<CanvasStyle> {
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromRGBA(RGBA32 rgba) { return adoptRef(new CanvasStyle(rgba)); }
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        static PassRefPtr<CanvasStyle> createFromString(const String& color, Document* = 0);
46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromStringWithOverrideAlpha(const String& color, float alpha);
47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromGrayLevelWithAlpha(float grayLevel, float alpha) { return adoptRef(new CanvasStyle(grayLevel, alpha)); }
48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromRGBAChannels(float r, float g, float b, float a) { return adoptRef(new CanvasStyle(r, g, b, a)); }
49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromCMYKAChannels(float c, float m, float y, float k, float a) { return adoptRef(new CanvasStyle(c, m, y, k, a)); }
50f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromGradient(PassRefPtr<CanvasGradient>);
51f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        static PassRefPtr<CanvasStyle> createFromPattern(PassRefPtr<CanvasPattern>);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool isCurrentColor() const { return m_type == CurrentColor || m_type == CurrentColorWithOverrideAlpha; }
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool hasOverrideAlpha() const { return m_type == CurrentColorWithOverrideAlpha; }
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        float overrideAlpha() const { ASSERT(m_type == CurrentColorWithOverrideAlpha); return m_overrideAlpha; }
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        String color() const { ASSERT(m_type == RGBA || m_type == CMYKA); return Color(m_rgba).serialized(); }
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasGradient* canvasGradient() const { return m_gradient.get(); }
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasPattern* canvasPattern() const { return m_pattern.get(); }
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void applyFillColor(GraphicsContext*);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void applyStrokeColor(GraphicsContext*);
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bool isEquivalentColor(const CanvasStyle&) const;
65f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        bool isEquivalentRGBA(float r, float g, float b, float a) const;
66f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        bool isEquivalentCMYKA(float c, float m, float y, float k, float a) const;
67967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        enum Type { RGBA, CMYKA, Gradient, ImagePattern, CurrentColor, CurrentColorWithOverrideAlpha };
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        CanvasStyle(Type, float overrideAlpha = 0);
72e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CanvasStyle(RGBA32 rgba);
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasStyle(float grayLevel, float alpha);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasStyle(float r, float g, float b, float a);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasStyle(float c, float m, float y, float k, float a);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasStyle(PassRefPtr<CanvasGradient>);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CanvasStyle(PassRefPtr<CanvasPattern>);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Type m_type;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        union {
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            RGBA32 m_rgba;
83a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            float m_overrideAlpha;
84a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        };
85e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CanvasGradient> m_gradient;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<CanvasPattern> m_pattern;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
89e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        struct CMYKAValues {
90e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            CMYKAValues() {}
91e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            CMYKAValues(float cyan, float magenta, float yellow, float black, float alpha) : c(cyan), m(magenta), y(yellow), k(black), a(alpha) {}
92e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            float c;
93e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            float m;
94e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            float y;
95e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            float k;
96e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            float a;
97e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        } m_cmyka;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    RGBA32 currentColor(HTMLCanvasElement*);
101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool parseColorOrCurrentColor(RGBA32& parsedColor, const String& colorString, HTMLCanvasElement*);
102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
106