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