diff options
Diffstat (limited to 'Source/WebCore/html/canvas/CanvasStyle.h')
-rw-r--r-- | Source/WebCore/html/canvas/CanvasStyle.h | 214 |
1 files changed, 90 insertions, 124 deletions
diff --git a/Source/WebCore/html/canvas/CanvasStyle.h b/Source/WebCore/html/canvas/CanvasStyle.h index a5d3e5166..d78030ac9 100644 --- a/Source/WebCore/html/canvas/CanvasStyle.h +++ b/Source/WebCore/html/canvas/CanvasStyle.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2008, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2006-2017 Apple Inc. All rights reserved. * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) * * Redistribution and use in source and binary forms, with or without @@ -11,10 +11,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -24,136 +24,102 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef CanvasStyle_h -#define CanvasStyle_h +#pragma once +#include "CanvasGradient.h" +#include "CanvasPattern.h" #include "Color.h" -#include <wtf/Assertions.h> -#include <wtf/RefCounted.h> -#include <wtf/text/WTFString.h> +#include <wtf/Variant.h> namespace WebCore { - class CanvasGradient; - class CanvasPattern; - class Document; - class GraphicsContext; - class HTMLCanvasElement; - - class CanvasStyle { - public: - CanvasStyle(); - explicit CanvasStyle(RGBA32); - CanvasStyle(float grayLevel, float alpha); - CanvasStyle(float r, float g, float b, float alpha); - CanvasStyle(float c, float m, float y, float k, float alpha); - explicit CanvasStyle(PassRefPtr<CanvasGradient>); - explicit CanvasStyle(PassRefPtr<CanvasPattern>); - ~CanvasStyle(); - - static CanvasStyle createFromString(const String& color, Document* = 0); - static CanvasStyle createFromStringWithOverrideAlpha(const String& color, float alpha); - - bool isValid() const { return m_type != Invalid; } - bool isCurrentColor() const { return m_type == CurrentColor || m_type == CurrentColorWithOverrideAlpha; } - bool hasOverrideAlpha() const { return m_type == CurrentColorWithOverrideAlpha; } - float overrideAlpha() const { ASSERT(m_type == CurrentColorWithOverrideAlpha); return m_overrideAlpha; } - - String color() const; - CanvasGradient* canvasGradient() const; - CanvasPattern* canvasPattern() const; - - void applyFillColor(GraphicsContext*) const; - void applyStrokeColor(GraphicsContext*) const; - - bool isEquivalentColor(const CanvasStyle&) const; - bool isEquivalentRGBA(float r, float g, float b, float a) const; - bool isEquivalentCMYKA(float c, float m, float y, float k, float a) const; - - CanvasStyle(const CanvasStyle&); - CanvasStyle& operator=(const CanvasStyle&); - CanvasStyle(CanvasStyle&&); - CanvasStyle& operator=(CanvasStyle&&); - - private: - enum Type { RGBA, CMYKA, Gradient, ImagePattern, CurrentColor, CurrentColorWithOverrideAlpha, Invalid }; - struct CMYKAValues { - WTF_MAKE_FAST_ALLOCATED; - WTF_MAKE_NONCOPYABLE(CMYKAValues); - public: - CMYKAValues() : rgba(0), c(0), m(0), y(0), k(0), a(0) { } - CMYKAValues(RGBA32 rgba, float cyan, float magenta, float yellow, float black, float alpha) : rgba(rgba), c(cyan), m(magenta), y(yellow), k(black), a(alpha) { } - RGBA32 rgba; - float c; - float m; - float y; - float k; - float a; - }; - - enum ConstructCurrentColorTag { ConstructCurrentColor }; - CanvasStyle(ConstructCurrentColorTag) : m_type(CurrentColor) { } - CanvasStyle(Type type, float overrideAlpha) - : m_overrideAlpha(overrideAlpha) - , m_type(type) +class Document; +class GraphicsContext; +class HTMLCanvasElement; + +class CanvasStyle { +public: + CanvasStyle(); + CanvasStyle(Color); + CanvasStyle(float grayLevel, float alpha); + CanvasStyle(float r, float g, float b, float alpha); + CanvasStyle(float c, float m, float y, float k, float alpha); + CanvasStyle(CanvasGradient&); + CanvasStyle(CanvasPattern&); + + static CanvasStyle createFromString(const String& color, Document* = nullptr); + static CanvasStyle createFromStringWithOverrideAlpha(const String& color, float alpha); + + bool isValid() const { return !WTF::holds_alternative<Invalid>(m_style); } + bool isCurrentColor() const { return WTF::holds_alternative<CurrentColor>(m_style); } + bool hasOverrideAlpha() const { return isCurrentColor() && WTF::get<CurrentColor>(m_style).overrideAlpha; } + float overrideAlpha() const { return WTF::get<CurrentColor>(m_style).overrideAlpha.value(); } + + String color() const; + CanvasGradient* canvasGradient() const; + CanvasPattern* canvasPattern() const; + + void applyFillColor(GraphicsContext&) const; + void applyStrokeColor(GraphicsContext&) const; + + bool isEquivalentColor(const CanvasStyle&) const; + bool isEquivalentRGBA(float red, float green, float blue, float alpha) const; + bool isEquivalentCMYKA(float cyan, float magenta, float yellow, float black, float alpha) const; + +private: + struct Invalid { }; + + struct CMYKAColor { + CMYKAColor() = default; + + CMYKAColor(Color color, float cyan, float magenta, float yellow, float black, float alpha) + : color(color), c(cyan), m(magenta), y(yellow), k(black), a(alpha) { } - union { - RGBA32 m_rgba; - float m_overrideAlpha; - CanvasGradient* m_gradient; - CanvasPattern* m_pattern; - CMYKAValues* m_cmyka; - }; - Type m_type; + Color color; + float c { 0 }; + float m { 0 }; + float y { 0 }; + float k { 0 }; + float a { 0 }; }; - RGBA32 currentColor(HTMLCanvasElement*); - bool parseColorOrCurrentColor(RGBA32& parsedColor, const String& colorString, HTMLCanvasElement*); - - inline CanvasStyle::CanvasStyle() - : m_type(Invalid) - { - } - - inline CanvasGradient* CanvasStyle::canvasGradient() const - { - if (m_type == Gradient) - return m_gradient; - return 0; - } - - inline CanvasPattern* CanvasStyle::canvasPattern() const - { - if (m_type == ImagePattern) - return m_pattern; - return 0; - } - - inline String CanvasStyle::color() const - { - ASSERT(m_type == RGBA || m_type == CMYKA); - if (m_type == RGBA) - return Color(m_rgba).serialized(); - return Color(m_cmyka->rgba).serialized(); - } - - inline CanvasStyle::CanvasStyle(CanvasStyle&& other) - { - memcpy(this, &other, sizeof(CanvasStyle)); - other.m_type = Invalid; - } - - inline CanvasStyle& CanvasStyle::operator=(CanvasStyle&& other) - { - if (this != &other) { - memcpy(this, &other, sizeof(CanvasStyle)); - other.m_type = Invalid; - } - return *this; - } + struct CurrentColor { + std::optional<float> overrideAlpha; + }; -} // namespace WebCore + CanvasStyle(CurrentColor); + + Variant<Invalid, Color, CMYKAColor, RefPtr<CanvasGradient>, RefPtr<CanvasPattern>, CurrentColor> m_style; +}; + +Color currentColor(HTMLCanvasElement*); +Color parseColorOrCurrentColor(const String& colorString, HTMLCanvasElement*); + +inline CanvasStyle::CanvasStyle() + : m_style(Invalid { }) +{ +} -#endif +inline CanvasGradient* CanvasStyle::canvasGradient() const +{ + if (!WTF::holds_alternative<RefPtr<CanvasGradient>>(m_style)) + return nullptr; + return WTF::get<RefPtr<CanvasGradient>>(m_style).get(); +} + +inline CanvasPattern* CanvasStyle::canvasPattern() const +{ + if (!WTF::holds_alternative<RefPtr<CanvasPattern>>(m_style)) + return nullptr; + return WTF::get<RefPtr<CanvasPattern>>(m_style).get(); +} + +inline String CanvasStyle::color() const +{ + auto& color = WTF::holds_alternative<Color>(m_style) ? WTF::get<Color>(m_style) : WTF::get<CMYKAColor>(m_style).color; + return color.serialized(); +} + +} // namespace WebCore |