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