15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Alp Toker <alp@atoker.com> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/canvas/CanvasStyle.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StylePropertySet.h" 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/css/parser/CSSParser.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCanvasElement.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/canvas/CanvasGradient.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/canvas/CanvasPattern.h" 38a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h" 39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassRefPtr.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ColorParseResult { ParsedRGBA, ParsedCurrentColor, ParsedSystemColor, ParseFailed }; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static ColorParseResult parseColor(RGBA32& parsedColor, const String& colorString) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (equalIgnoringCase(colorString, "currentcolor")) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ParsedCurrentColor; 4910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch const bool useStrictParsing = true; 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (CSSParser::parseColor(parsedColor, colorString, useStrictParsing)) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ParsedRGBA; 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (CSSParser::parseSystemColor(parsedColor, colorString)) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ParsedSystemColor; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ParseFailed; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RGBA32 currentColor(HTMLCanvasElement* canvas) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!canvas || !canvas->inDocument() || !canvas->inlineStyle()) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Color::black; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RGBA32 rgba = Color::black; 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CSSParser::parseColor(rgba, canvas->inlineStyle()->getPropertyValue(CSSPropertyColor)); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return rgba; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool parseColorOrCurrentColor(RGBA32& parsedColor, const String& colorString, HTMLCanvasElement* canvas) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ColorParseResult parseResult = parseColor(parsedColor, colorString); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (parseResult) { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedRGBA: 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedSystemColor: 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedCurrentColor: 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parsedColor = currentColor(canvas); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParseFailed: 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CanvasStyle::CanvasStyle(Type type, float overrideAlpha) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(type) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_overrideAlpha(overrideAlpha) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CanvasStyle::CanvasStyle(RGBA32 rgba) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(RGBA) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rgba(rgba) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CanvasStyle::CanvasStyle(float grayLevel, float alpha) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(RGBA) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rgba(makeRGBA32FromFloats(grayLevel, grayLevel, grayLevel, alpha)) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CanvasStyle::CanvasStyle(float r, float g, float b, float a) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(RGBA) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rgba(makeRGBA32FromFloats(r, g, b, a)) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CanvasStyle::CanvasStyle(float c, float m, float y, float k, float a) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(CMYKA) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rgba(makeRGBAFromCMYKA(c, m, y, k, a)) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cmyka(c, m, y, k, a) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)CanvasStyle::CanvasStyle(PassRefPtrWillBeRawPtr<CanvasGradient> gradient) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(Gradient) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_gradient(gradient) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)CanvasStyle::CanvasStyle(PassRefPtrWillBeRawPtr<CanvasPattern> pattern) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(ImagePattern) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_pattern(pattern) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<CanvasStyle> CanvasStyle::createFromString(const String& color) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RGBA32 rgba; 130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ColorParseResult parseResult = parseColor(rgba, color); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (parseResult) { 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedRGBA: 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedSystemColor: 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(rgba)); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedCurrentColor: 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(CurrentColor)); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParseFailed: 138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<CanvasStyle> CanvasStyle::createFromStringWithOverrideAlpha(const String& color, float alpha) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RGBA32 rgba; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ColorParseResult parseResult = parseColor(rgba, color); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (parseResult) { 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedRGBA: 151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(colorWithOverrideAlpha(rgba, alpha))); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParsedCurrentColor: 153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(CurrentColorWithOverrideAlpha, alpha)); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ParseFailed: 155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<CanvasStyle> CanvasStyle::createFromGradient(PassRefPtrWillBeRawPtr<CanvasGradient> gradient) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!gradient) 165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(gradient)); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<CanvasStyle> CanvasStyle::createFromPattern(PassRefPtrWillBeRawPtr<CanvasPattern> pattern) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!pattern) 172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new CanvasStyle(pattern)); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CanvasStyle::isEquivalentColor(const CanvasStyle& other) const 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_type != other.m_type) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_type) { 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RGBA: 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_rgba == other.m_rgba; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CMYKA: 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_cmyka.c == other.m_cmyka.c 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_cmyka.m == other.m_cmyka.m 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_cmyka.y == other.m_cmyka.y 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_cmyka.k == other.m_cmyka.k 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_cmyka.a == other.m_cmyka.a; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Gradient: 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ImagePattern: 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColor: 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColorWithOverrideAlpha: 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CanvasStyle::isEquivalentRGBA(float r, float g, float b, float a) const 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_type != RGBA) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_rgba == makeRGBA32FromFloats(r, g, b, a); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool CanvasStyle::isEquivalentCMYKA(float c, float m, float y, float k, float a) const 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_type != CMYKA) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return c == m_cmyka.c 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m == m_cmyka.m 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && y == m_cmyka.y 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && k == m_cmyka.k 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && a == m_cmyka.a; 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CanvasStyle::applyStrokeColor(GraphicsContext* context) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!context) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_type) { 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RGBA: 2275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->setStrokeColor(m_rgba); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CMYKA: { 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Do this through platform-independent GraphicsContext API. 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We'll need a fancier Color abstraction to support CMYKA correctly 2325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->setStrokeColor(m_rgba); 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Gradient: 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->setStrokeGradient(canvasGradient()->gradient()); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ImagePattern: 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->setStrokePattern(canvasPattern()->pattern()); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColor: 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColorWithOverrideAlpha: 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CanvasStyle::applyFillColor(GraphicsContext* context) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!context) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_type) { 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RGBA: 2545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->setFillColor(m_rgba); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CMYKA: { 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Do this through platform-independent GraphicsContext API. 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We'll need a fancier Color abstraction to support CMYKA correctly 2595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->setFillColor(m_rgba); 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case Gradient: 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->setFillGradient(canvasGradient()->gradient()); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ImagePattern: 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->setFillPattern(canvasPattern()->pattern()); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColor: 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CurrentColorWithOverrideAlpha: 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void CanvasStyle::trace(Visitor* visitor) 276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_gradient); 278c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_pattern); 279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 282