18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
3e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alp Toker <alp@atoker.com>
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CanvasStyle.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h"
33a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "CSSPropertyNames.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CanvasGradient.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CanvasPattern.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
37a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLCanvasElement.h"
38967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include <wtf/Assertions.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/PassRefPtr.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CoreGraphics/CGContext.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(QT)
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QPainter>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QBrush>
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QPen>
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QColor>
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockenum ColorParseResult { ParsedRGBA, ParsedCurrentColor, ParsedSystemColor, ParseFailed };
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic ColorParseResult parseColor(RGBA32& parsedColor, const String& colorString, Document* document = 0)
57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
58a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (equalIgnoringCase(colorString, "currentcolor"))
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return ParsedCurrentColor;
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (CSSParser::parseColor(parsedColor, colorString))
61a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return ParsedRGBA;
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (CSSParser::parseSystemColor(parsedColor, colorString, document))
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return ParsedSystemColor;
64a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return ParseFailed;
65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
67a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochRGBA32 currentColor(HTMLCanvasElement* canvas)
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!canvas || !canvas->inDocument())
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return Color::black;
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    RGBA32 rgba = Color::black;
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CSSParser::parseColor(rgba, canvas->style()->getPropertyValue(CSSPropertyColor));
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return rgba;
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool parseColorOrCurrentColor(RGBA32& parsedColor, const String& colorString, HTMLCanvasElement* canvas)
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ColorParseResult parseResult = parseColor(parsedColor, colorString, canvas ? canvas->document() : 0);
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    switch (parseResult) {
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedRGBA:
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case ParsedSystemColor:
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return true;
83a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedCurrentColor:
84a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        parsedColor = currentColor(canvas);
85a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return true;
86a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParseFailed:
87a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
88a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    default:
89a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT_NOT_REACHED();
90a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
91a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
92a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
93a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
94a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochCanvasStyle::CanvasStyle(Type type, float overrideAlpha)
95a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    : m_type(type)
96a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_overrideAlpha(overrideAlpha)
97a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
98a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
99a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
100e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockCanvasStyle::CanvasStyle(RGBA32 rgba)
101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    : m_type(RGBA)
102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_rgba(rgba)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCanvasStyle::CanvasStyle(float grayLevel, float alpha)
107e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    : m_type(RGBA)
108e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_rgba(makeRGBA32FromFloats(grayLevel, grayLevel, grayLevel, alpha))
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCanvasStyle::CanvasStyle(float r, float g, float b, float a)
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    : m_type(RGBA)
114e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_rgba(makeRGBA32FromFloats(r, g, b, a))
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCanvasStyle::CanvasStyle(float c, float m, float y, float k, float a)
1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    : m_type(CMYKA)
120e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_rgba(makeRGBAFromCMYKA(c, m, y, k, a))
121e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_cmyka(c, m, y, k, a)
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCanvasStyle::CanvasStyle(PassRefPtr<CanvasGradient> gradient)
126e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    : m_type(Gradient)
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_gradient(gradient)
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCanvasStyle::CanvasStyle(PassRefPtr<CanvasPattern> pattern)
132e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    : m_type(ImagePattern)
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_pattern(pattern)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<CanvasStyle> CanvasStyle::createFromString(const String& color, Document* document)
138e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
139e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    RGBA32 rgba;
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ColorParseResult parseResult = parseColor(rgba, color, document);
141a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    switch (parseResult) {
142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedRGBA:
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case ParsedSystemColor:
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return adoptRef(new CanvasStyle(rgba));
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedCurrentColor:
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return adoptRef(new CanvasStyle(CurrentColor));
147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParseFailed:
148e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return 0;
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    default:
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT_NOT_REACHED();
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 0;
152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
153e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
154e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
155f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickPassRefPtr<CanvasStyle> CanvasStyle::createFromStringWithOverrideAlpha(const String& color, float alpha)
156e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
157e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    RGBA32 rgba;
158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ColorParseResult parseResult = parseColor(rgba, color);
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    switch (parseResult) {
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedRGBA:
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return adoptRef(new CanvasStyle(colorWithOverrideAlpha(rgba, alpha)));
162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParsedCurrentColor:
163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return adoptRef(new CanvasStyle(CurrentColorWithOverrideAlpha, alpha));
164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ParseFailed:
165a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 0;
166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    default:
167a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT_NOT_REACHED();
168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return 0;
169a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
172f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickPassRefPtr<CanvasStyle> CanvasStyle::createFromGradient(PassRefPtr<CanvasGradient> gradient)
173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!gradient)
175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return 0;
176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return adoptRef(new CanvasStyle(gradient));
177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
178f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickPassRefPtr<CanvasStyle> CanvasStyle::createFromPattern(PassRefPtr<CanvasPattern> pattern)
179e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
180e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!pattern)
181e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return 0;
182e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return adoptRef(new CanvasStyle(pattern));
183e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
184e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
185967717af5423377c967781471ee106e2bb4e11c8Ben Murdochbool CanvasStyle::isEquivalentColor(const CanvasStyle& other) const
186967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
187967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (m_type != other.m_type)
188967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return false;
189967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
190967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    switch (m_type) {
191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case RGBA:
192967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return m_rgba == other.m_rgba;
193a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CMYKA:
194967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return m_cmyka.c == other.m_cmyka.c
195967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            && m_cmyka.m == other.m_cmyka.m
196967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            && m_cmyka.y == other.m_cmyka.y
197967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            && m_cmyka.k == other.m_cmyka.k
198967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            && m_cmyka.a == other.m_cmyka.a;
199a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case Gradient:
200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case ImagePattern:
201a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColor:
202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColorWithOverrideAlpha:
203967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return false;
204967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
205967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
206967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ASSERT_NOT_REACHED();
207967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return false;
208967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
210f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool CanvasStyle::isEquivalentRGBA(float r, float g, float b, float a) const
211dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_type != RGBA)
213dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return false;
214dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
215dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return m_rgba == makeRGBA32FromFloats(r, g, b, a);
216dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
217dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
218f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool CanvasStyle::isEquivalentCMYKA(float c, float m, float y, float k, float a) const
219dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
220dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_type != CMYKA)
221dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return false;
222dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
223dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return c == m_cmyka.c
224dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        && m == m_cmyka.m
225dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        && y == m_cmyka.y
226dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        && k == m_cmyka.k
227dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        && a == m_cmyka.a;
228dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
229dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CanvasStyle::applyStrokeColor(GraphicsContext* context)
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!context)
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
235e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case RGBA:
236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        context->setStrokeColor(m_rgba, ColorSpaceDeviceRGB);
237e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
238e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CMYKA: {
239e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // FIXME: Do this through platform-independent GraphicsContext API.
240e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // We'll need a fancier Color abstraction to support CMYKA correctly
2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
242e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CGContextSetCMYKStrokeColor(context->platformContext(), m_cmyka.c, m_cmyka.m, m_cmyka.y, m_cmyka.k, m_cmyka.a);
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#elif PLATFORM(QT)
244e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        QPen currentPen = context->platformContext()->pen();
245e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        QColor clr;
246e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        clr.setCmykF(m_cmyka.c, m_cmyka.m, m_cmyka.y, m_cmyka.k, m_cmyka.a);
247e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        currentPen.setColor(clr);
248e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->platformContext()->setPen(currentPen);
2498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else
250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        context->setStrokeColor(m_rgba, ColorSpaceDeviceRGB);
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
252e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
253e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
254e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Gradient:
255e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->setStrokeGradient(canvasGradient()->gradient());
256e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
257e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case ImagePattern:
258e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->setStrokePattern(canvasPattern()->pattern());
259e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
260a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColor:
261a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColorWithOverrideAlpha:
262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT_NOT_REACHED();
263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        break;
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CanvasStyle::applyFillColor(GraphicsContext* context)
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!context)
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (m_type) {
272e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case RGBA:
273a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        context->setFillColor(m_rgba, ColorSpaceDeviceRGB);
274e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
275e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CMYKA: {
276e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // FIXME: Do this through platform-independent GraphicsContext API.
277e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // We'll need a fancier Color abstraction to support CMYKA correctly
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
279e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CGContextSetCMYKFillColor(context->platformContext(), m_cmyka.c, m_cmyka.m, m_cmyka.y, m_cmyka.k, m_cmyka.a);
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#elif PLATFORM(QT)
281e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        QBrush currentBrush = context->platformContext()->brush();
282e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        QColor clr;
283e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        clr.setCmykF(m_cmyka.c, m_cmyka.m, m_cmyka.y, m_cmyka.k, m_cmyka.a);
284e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        currentBrush.setColor(clr);
285e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->platformContext()->setBrush(currentBrush);
2868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else
287a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        context->setFillColor(m_rgba, ColorSpaceDeviceRGB);
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
289e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
290e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
291e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Gradient:
292e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->setFillGradient(canvasGradient()->gradient());
293e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
294e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case ImagePattern:
295e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        context->setFillPattern(canvasPattern()->pattern());
296e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        break;
297a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColor:
298a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CurrentColorWithOverrideAlpha:
299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT_NOT_REACHED();
300a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        break;
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
305