d78030ac9ef067981eca0e8ede6d4b72486f5bcf
[WebKit-https.git] / Source / WebCore / html / canvas / CanvasStyle.h
1 /*
2  * Copyright (C) 2006-2017 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #pragma once
28
29 #include "CanvasGradient.h"
30 #include "CanvasPattern.h"
31 #include "Color.h"
32 #include <wtf/Variant.h>
33
34 namespace WebCore {
35
36 class Document;
37 class GraphicsContext;
38 class HTMLCanvasElement;
39
40 class CanvasStyle {
41 public:
42     CanvasStyle();
43     CanvasStyle(Color);
44     CanvasStyle(float grayLevel, float alpha);
45     CanvasStyle(float r, float g, float b, float alpha);
46     CanvasStyle(float c, float m, float y, float k, float alpha);
47     CanvasStyle(CanvasGradient&);
48     CanvasStyle(CanvasPattern&);
49
50     static CanvasStyle createFromString(const String& color, Document* = nullptr);
51     static CanvasStyle createFromStringWithOverrideAlpha(const String& color, float alpha);
52
53     bool isValid() const { return !WTF::holds_alternative<Invalid>(m_style); }
54     bool isCurrentColor() const { return WTF::holds_alternative<CurrentColor>(m_style); }
55     bool hasOverrideAlpha() const { return isCurrentColor() && WTF::get<CurrentColor>(m_style).overrideAlpha; }
56     float overrideAlpha() const { return WTF::get<CurrentColor>(m_style).overrideAlpha.value(); }
57
58     String color() const;
59     CanvasGradient* canvasGradient() const;
60     CanvasPattern* canvasPattern() const;
61
62     void applyFillColor(GraphicsContext&) const;
63     void applyStrokeColor(GraphicsContext&) const;
64
65     bool isEquivalentColor(const CanvasStyle&) const;
66     bool isEquivalentRGBA(float red, float green, float blue, float alpha) const;
67     bool isEquivalentCMYKA(float cyan, float magenta, float yellow, float black, float alpha) const;
68
69 private:
70     struct Invalid { };
71
72     struct CMYKAColor {
73         CMYKAColor() = default;
74
75         CMYKAColor(Color color, float cyan, float magenta, float yellow, float black, float alpha)
76             : color(color), c(cyan), m(magenta), y(yellow), k(black), a(alpha)
77         {
78         }
79
80         Color color;
81         float c { 0 };
82         float m { 0 };
83         float y { 0 };
84         float k { 0 };
85         float a { 0 };
86     };
87
88     struct CurrentColor {
89         std::optional<float> overrideAlpha;
90     };
91
92     CanvasStyle(CurrentColor);
93
94     Variant<Invalid, Color, CMYKAColor, RefPtr<CanvasGradient>, RefPtr<CanvasPattern>, CurrentColor> m_style;
95 };
96
97 Color currentColor(HTMLCanvasElement*);
98 Color parseColorOrCurrentColor(const String& colorString, HTMLCanvasElement*);
99
100 inline CanvasStyle::CanvasStyle()
101     : m_style(Invalid { })
102 {
103 }
104
105 inline CanvasGradient* CanvasStyle::canvasGradient() const
106 {
107     if (!WTF::holds_alternative<RefPtr<CanvasGradient>>(m_style))
108         return nullptr;
109     return WTF::get<RefPtr<CanvasGradient>>(m_style).get();
110 }
111
112 inline CanvasPattern* CanvasStyle::canvasPattern() const
113 {
114     if (!WTF::holds_alternative<RefPtr<CanvasPattern>>(m_style))
115         return nullptr;
116     return WTF::get<RefPtr<CanvasPattern>>(m_style).get();
117 }
118
119 inline String CanvasStyle::color() const
120 {
121     auto& color = WTF::holds_alternative<Color>(m_style) ? WTF::get<Color>(m_style) : WTF::get<CMYKAColor>(m_style).color;
122     return color.serialized();
123 }
124
125 } // namespace WebCore