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