Move Source/WebCore/rendering/ code to std::unique_ptr
[WebKit-https.git] / Source / WebCore / rendering / svg / RenderSVGShape.h
1 /*
2  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
4  * Copyright (C) 2005 Eric Seidel <eric@webkit.org>
5  * Copyright (C) 2006 Apple Inc.
6  * Copyright (C) 2009 Google, Inc.
7  * Copyright (C) 2011 Renata Hodovan <reni@webkit.org>
8  * Copyright (C) 2011 University of Szeged
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  */
25
26 #ifndef RenderSVGShape_h
27 #define RenderSVGShape_h
28
29 #include "AffineTransform.h"
30 #include "FloatRect.h"
31 #include "RenderSVGModelObject.h"
32 #include "SVGGraphicsElement.h"
33 #include "SVGMarkerData.h"
34 #include <memory>
35 #include <wtf/Vector.h>
36
37 namespace WebCore {
38
39 class FloatPoint;
40 class GraphicsContextStateSaver;
41 class RenderSVGContainer;
42 class RenderSVGPath;
43 class RenderSVGResource;
44 class SVGGraphicsElement;
45
46 class RenderSVGShape : public RenderSVGModelObject {
47 public:
48     RenderSVGShape(SVGGraphicsElement&, PassRef<RenderStyle>);
49     RenderSVGShape(SVGGraphicsElement&, PassRef<RenderStyle>, Path*, bool);
50     virtual ~RenderSVGShape();
51
52     SVGGraphicsElement& graphicsElement() const { return toSVGGraphicsElement(RenderSVGModelObject::element()); }
53
54     void setNeedsShapeUpdate() { m_needsShapeUpdate = true; }
55     virtual void setNeedsBoundariesUpdate() override final { m_needsBoundariesUpdate = true; }
56     virtual bool needsBoundariesUpdate() override final { return m_needsBoundariesUpdate; }
57     virtual void setNeedsTransformUpdate() override final { m_needsTransformUpdate = true; }
58     virtual void fillShape(GraphicsContext*) const;
59     virtual void strokeShape(GraphicsContext*) const;
60
61     bool hasPath() const { return m_path.get(); }
62     Path& path() const
63     {
64         ASSERT(m_path);
65         return *m_path;
66     }
67
68 protected:
69     void element() const = delete;
70
71     virtual void updateShapeFromElement();
72     virtual bool isEmpty() const override;
73     virtual bool shapeDependentStrokeContains(const FloatPoint&);
74     virtual bool shapeDependentFillContains(const FloatPoint&, const WindRule) const;
75     float strokeWidth() const;
76     bool hasSmoothStroke() const;
77
78     bool hasNonScalingStroke() const { return style().svgStyle().vectorEffect() == VE_NON_SCALING_STROKE; }
79     AffineTransform nonScalingStrokeTransform() const;
80     Path* nonScalingStrokePath(const Path*, const AffineTransform&) const;
81
82     FloatRect m_fillBoundingBox;
83     FloatRect m_strokeBoundingBox;
84
85 private:
86     // Hit-detection separated for the fill and the stroke
87     bool fillContains(const FloatPoint&, bool requiresFill = true, const WindRule fillRule = RULE_NONZERO);
88     bool strokeContains(const FloatPoint&, bool requiresStroke = true);
89
90     virtual FloatRect repaintRectInLocalCoordinates() const override final { return m_repaintBoundingBox; }
91     virtual FloatRect repaintRectInLocalCoordinatesExcludingSVGShadow() const override final { return m_repaintBoundingBoxExcludingShadow; }
92     virtual const AffineTransform& localToParentTransform() const override final { return m_localTransform; }
93     virtual AffineTransform localTransform() const override final { return m_localTransform; }
94
95     virtual bool isSVGShape() const override final { return true; }
96     virtual bool canHaveChildren() const override final { return false; }
97     virtual const char* renderName() const override { return "RenderSVGShape"; }
98
99     virtual void layout() override final;
100     virtual void paint(PaintInfo&, const LayoutPoint&) override final;
101     virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer = 0) override final;
102
103     virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction) override final;
104
105     virtual FloatRect objectBoundingBox() const override final { return m_fillBoundingBox; }
106     virtual FloatRect strokeBoundingBox() const override final { return m_strokeBoundingBox; }
107     FloatRect calculateObjectBoundingBox() const;
108     FloatRect calculateStrokeBoundingBox() const;
109     void updateRepaintBoundingBox();
110
111     bool setupNonScalingStrokeContext(AffineTransform&, GraphicsContextStateSaver&);
112
113     bool shouldGenerateMarkerPositions() const;
114     FloatRect markerRect(float strokeWidth) const;
115     void processMarkerPositions();
116
117     void fillShape(const RenderStyle&, GraphicsContext*);
118     void strokeShape(const RenderStyle&, GraphicsContext*);
119     void strokeShape(GraphicsContext*);
120     void fillStrokeMarkers(PaintInfo&);
121     void drawMarkers(PaintInfo&);
122
123 private:
124     FloatRect m_repaintBoundingBox;
125     FloatRect m_repaintBoundingBoxExcludingShadow;
126     AffineTransform m_localTransform;
127     std::unique_ptr<Path> m_path;
128     Vector<MarkerPosition> m_markerPositions;
129
130     bool m_needsBoundariesUpdate : 1;
131     bool m_needsShapeUpdate : 1;
132     bool m_needsTransformUpdate : 1;
133 };
134
135 RENDER_OBJECT_TYPE_CASTS(RenderSVGShape, isSVGShape())
136
137 }
138
139 #endif