diff options
Diffstat (limited to 'Source/WebCore/css/CSSBasicShapes.h')
| -rw-r--r-- | Source/WebCore/css/CSSBasicShapes.h | 217 |
1 files changed, 114 insertions, 103 deletions
diff --git a/Source/WebCore/css/CSSBasicShapes.h b/Source/WebCore/css/CSSBasicShapes.h index 006a0c538..8373e9dfa 100644 --- a/Source/WebCore/css/CSSBasicShapes.h +++ b/Source/WebCore/css/CSSBasicShapes.h @@ -33,116 +33,104 @@ #include "CSSPrimitiveValue.h" #include "WindRule.h" #include <wtf/RefPtr.h> +#include <wtf/TypeCasts.h> #include <wtf/Vector.h> #include <wtf/text/WTFString.h> namespace WebCore { +class SVGPathByteStream; + class CSSBasicShape : public RefCounted<CSSBasicShape> { public: enum Type { - CSSBasicShapeRectangleType = 1, - CSSBasicShapeCircleType = 2, - CSSBasicShapeEllipseType = 3, - CSSBasicShapePolygonType = 4, - CSSBasicShapeInsetRectangleType = 5 + CSSBasicShapePolygonType, + CSSBasicShapeCircleType, + CSSBasicShapeEllipseType, + CSSBasicShapeInsetType, + CSSBasicShapePathType }; virtual Type type() const = 0; virtual String cssText() const = 0; virtual bool equals(const CSSBasicShape&) const = 0; -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const = 0; - virtual bool hasVariableReference() const = 0; -#endif - public: virtual ~CSSBasicShape() { } protected: CSSBasicShape() { } + RefPtr<CSSPrimitiveValue> m_referenceBox; }; -class CSSBasicShapeRectangle : public CSSBasicShape { +class CSSBasicShapeInset final : public CSSBasicShape { public: - static PassRefPtr<CSSBasicShapeRectangle> create() { return adoptRef(new CSSBasicShapeRectangle); } - - CSSPrimitiveValue* x() const { return m_x.get(); } - CSSPrimitiveValue* y() const { return m_y.get(); } - CSSPrimitiveValue* width() const { return m_width.get(); } - CSSPrimitiveValue* height() const { return m_height.get(); } - CSSPrimitiveValue* radiusX() const { return m_radiusX.get(); } - CSSPrimitiveValue* radiusY() const { return m_radiusY.get(); } - - void setX(PassRefPtr<CSSPrimitiveValue> x) { m_x = x; } - void setY(PassRefPtr<CSSPrimitiveValue> y) { m_y = y; } - void setWidth(PassRefPtr<CSSPrimitiveValue> width) { m_width = width; } - void setHeight(PassRefPtr<CSSPrimitiveValue> height) { m_height = height; } - void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; } - void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; } - - virtual Type type() const { return CSSBasicShapeRectangleType; } - virtual String cssText() const; - virtual bool equals(const CSSBasicShape&) const; - -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const; - virtual bool hasVariableReference() const; -#endif - -private: - CSSBasicShapeRectangle() { } - - RefPtr<CSSPrimitiveValue> m_y; - RefPtr<CSSPrimitiveValue> m_x; - RefPtr<CSSPrimitiveValue> m_width; - RefPtr<CSSPrimitiveValue> m_height; - RefPtr<CSSPrimitiveValue> m_radiusX; - RefPtr<CSSPrimitiveValue> m_radiusY; -}; - -class CSSBasicShapeInsetRectangle : public CSSBasicShape { -public: - static PassRefPtr<CSSBasicShapeInsetRectangle> create() { return adoptRef(new CSSBasicShapeInsetRectangle); } + static Ref<CSSBasicShapeInset> create() { return adoptRef(*new CSSBasicShapeInset); } CSSPrimitiveValue* top() const { return m_top.get(); } CSSPrimitiveValue* right() const { return m_right.get(); } CSSPrimitiveValue* bottom() const { return m_bottom.get(); } CSSPrimitiveValue* left() const { return m_left.get(); } - CSSPrimitiveValue* radiusX() const { return m_radiusX.get(); } - CSSPrimitiveValue* radiusY() const { return m_radiusY.get(); } + + CSSPrimitiveValue* topLeftRadius() const { return m_topLeftRadius.get(); } + CSSPrimitiveValue* topRightRadius() const { return m_topRightRadius.get(); } + CSSPrimitiveValue* bottomRightRadius() const { return m_bottomRightRadius.get(); } + CSSPrimitiveValue* bottomLeftRadius() const { return m_bottomLeftRadius.get(); } void setTop(PassRefPtr<CSSPrimitiveValue> top) { m_top = top; } void setRight(PassRefPtr<CSSPrimitiveValue> right) { m_right = right; } void setBottom(PassRefPtr<CSSPrimitiveValue> bottom) { m_bottom = bottom; } void setLeft(PassRefPtr<CSSPrimitiveValue> left) { m_left = left; } - void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; } - void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; } - virtual Type type() const { return CSSBasicShapeInsetRectangleType; } - virtual String cssText() const; - virtual bool equals(const CSSBasicShape&) const; + void updateShapeSize4Values(CSSPrimitiveValue* top, CSSPrimitiveValue* right, CSSPrimitiveValue* bottom, CSSPrimitiveValue* left) + { + setTop(top); + setRight(right); + setBottom(bottom); + setLeft(left); + } + + void updateShapeSize1Value(CSSPrimitiveValue* value1) + { + updateShapeSize4Values(value1, value1, value1, value1); + } + + void updateShapeSize2Values(CSSPrimitiveValue* value1, CSSPrimitiveValue* value2) + { + updateShapeSize4Values(value1, value2, value1, value2); + } + + void updateShapeSize3Values(CSSPrimitiveValue* value1, CSSPrimitiveValue* value2, CSSPrimitiveValue* value3) + { + updateShapeSize4Values(value1, value2, value3, value2); + } -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const; - virtual bool hasVariableReference() const; -#endif + void setTopLeftRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_topLeftRadius = radius; } + void setTopRightRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_topRightRadius = radius; } + void setBottomRightRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_bottomRightRadius = radius; } + void setBottomLeftRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_bottomLeftRadius = radius; } private: - CSSBasicShapeInsetRectangle() { } + CSSBasicShapeInset() { } + + virtual Type type() const override { return CSSBasicShapeInsetType; } + virtual String cssText() const override; + virtual bool equals(const CSSBasicShape&) const override; - RefPtr<CSSPrimitiveValue> m_right; RefPtr<CSSPrimitiveValue> m_top; + RefPtr<CSSPrimitiveValue> m_right; RefPtr<CSSPrimitiveValue> m_bottom; RefPtr<CSSPrimitiveValue> m_left; - RefPtr<CSSPrimitiveValue> m_radiusX; - RefPtr<CSSPrimitiveValue> m_radiusY; + + RefPtr<CSSPrimitiveValue> m_topLeftRadius; + RefPtr<CSSPrimitiveValue> m_topRightRadius; + RefPtr<CSSPrimitiveValue> m_bottomRightRadius; + RefPtr<CSSPrimitiveValue> m_bottomLeftRadius; }; -class CSSBasicShapeCircle : public CSSBasicShape { +class CSSBasicShapeCircle final : public CSSBasicShape { public: - static PassRefPtr<CSSBasicShapeCircle> create() { return adoptRef(new CSSBasicShapeCircle); } + static Ref<CSSBasicShapeCircle> create() { return adoptRef(*new CSSBasicShapeCircle); } CSSPrimitiveValue* centerX() const { return m_centerX.get(); } CSSPrimitiveValue* centerY() const { return m_centerY.get(); } @@ -152,26 +140,21 @@ public: void setCenterY(PassRefPtr<CSSPrimitiveValue> centerY) { m_centerY = centerY; } void setRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_radius = radius; } - virtual Type type() const { return CSSBasicShapeCircleType; } - virtual String cssText() const; - virtual bool equals(const CSSBasicShape&) const; - -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const; - virtual bool hasVariableReference() const; -#endif - private: CSSBasicShapeCircle() { } - RefPtr<CSSPrimitiveValue> m_centerY; + virtual Type type() const override { return CSSBasicShapeCircleType; } + virtual String cssText() const override; + virtual bool equals(const CSSBasicShape&) const override; + RefPtr<CSSPrimitiveValue> m_centerX; + RefPtr<CSSPrimitiveValue> m_centerY; RefPtr<CSSPrimitiveValue> m_radius; }; -class CSSBasicShapeEllipse : public CSSBasicShape { +class CSSBasicShapeEllipse final : public CSSBasicShape { public: - static PassRefPtr<CSSBasicShapeEllipse> create() { return adoptRef(new CSSBasicShapeEllipse); } + static Ref<CSSBasicShapeEllipse> create() { return adoptRef(*new CSSBasicShapeEllipse); } CSSPrimitiveValue* centerX() const { return m_centerX.get(); } CSSPrimitiveValue* centerY() const { return m_centerY.get(); } @@ -183,27 +166,22 @@ public: void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; } void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; } - virtual Type type() const { return CSSBasicShapeEllipseType; } - virtual String cssText() const; - virtual bool equals(const CSSBasicShape&) const; - -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const; - virtual bool hasVariableReference() const; -#endif - private: CSSBasicShapeEllipse() { } + virtual Type type() const override { return CSSBasicShapeEllipseType; } + virtual String cssText() const override; + virtual bool equals(const CSSBasicShape&) const override; + RefPtr<CSSPrimitiveValue> m_centerX; RefPtr<CSSPrimitiveValue> m_centerY; RefPtr<CSSPrimitiveValue> m_radiusX; RefPtr<CSSPrimitiveValue> m_radiusY; }; -class CSSBasicShapePolygon : public CSSBasicShape { +class CSSBasicShapePolygon final : public CSSBasicShape { public: - static PassRefPtr<CSSBasicShapePolygon> create() { return adoptRef(new CSSBasicShapePolygon); } + static Ref<CSSBasicShapePolygon> create() { return adoptRef(*new CSSBasicShapePolygon); } void appendPoint(PassRefPtr<CSSPrimitiveValue> x, PassRefPtr<CSSPrimitiveValue> y) { @@ -211,31 +189,64 @@ public: m_values.append(y); } - PassRefPtr<CSSPrimitiveValue> getXAt(unsigned i) const { return m_values.at(i * 2); } - PassRefPtr<CSSPrimitiveValue> getYAt(unsigned i) const { return m_values.at(i * 2 + 1); } - const Vector<RefPtr<CSSPrimitiveValue> >& values() const { return m_values; } + RefPtr<CSSPrimitiveValue> getXAt(unsigned i) const { return m_values.at(i * 2); } + RefPtr<CSSPrimitiveValue> getYAt(unsigned i) const { return m_values.at(i * 2 + 1); } + const Vector<RefPtr<CSSPrimitiveValue>>& values() const { return m_values; } - void setWindRule(WindRule w) { m_windRule = w; } + void setWindRule(WindRule rule) { m_windRule = rule; } WindRule windRule() const { return m_windRule; } - virtual Type type() const { return CSSBasicShapePolygonType; } - virtual String cssText() const; - virtual bool equals(const CSSBasicShape&) const; -#if ENABLE(CSS_VARIABLES) - virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const; - virtual bool hasVariableReference() const; -#endif - private: CSSBasicShapePolygon() : m_windRule(RULE_NONZERO) { } - Vector<RefPtr<CSSPrimitiveValue> > m_values; + virtual Type type() const override { return CSSBasicShapePolygonType; } + virtual String cssText() const override; + virtual bool equals(const CSSBasicShape&) const override; + + Vector<RefPtr<CSSPrimitiveValue>> m_values; WindRule m_windRule; }; +class CSSBasicShapePath final : public CSSBasicShape { +public: + static Ref<CSSBasicShapePath> create(std::unique_ptr<SVGPathByteStream>&& pathData) + { + return adoptRef(*new CSSBasicShapePath(WTFMove(pathData))); + } + + const SVGPathByteStream& pathData() const + { + return *m_byteStream; + } + + void setWindRule(WindRule rule) { m_windRule = rule; } + WindRule windRule() const { return m_windRule; } + +private: + CSSBasicShapePath(std::unique_ptr<SVGPathByteStream>&&); + + virtual Type type() const override { return CSSBasicShapePathType; } + virtual String cssText() const override; + virtual bool equals(const CSSBasicShape&) const override; + + std::unique_ptr<SVGPathByteStream> m_byteStream; + WindRule m_windRule { RULE_NONZERO }; +}; + } // namespace WebCore +#define SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(ToValueTypeName) \ +SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \ + static bool isType(const WebCore::CSSBasicShape& basicShape) { return basicShape.type() == WebCore::CSSBasicShape::ToValueTypeName##Type; } \ +SPECIALIZE_TYPE_TRAITS_END() + +SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(CSSBasicShapeInset) +SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(CSSBasicShapeCircle) +SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(CSSBasicShapeEllipse) +SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(CSSBasicShapePolygon) +SPECIALIZE_TYPE_TRAITS_CSS_BASIC_SHAPES(CSSBasicShapePath) + #endif // CSSBasicShapes_h |
