A crash reproducible in Path::isEmpty() under RenderSVGShape::paint()
[WebKit-https.git] / Source / WebCore / rendering / svg / SVGResources.h
1 /*
2  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #ifndef SVGResources_h
21 #define SVGResources_h
22
23 #include <memory>
24 #include <wtf/HashSet.h>
25 #include <wtf/Noncopyable.h>
26
27 namespace WebCore {
28
29 class Document;
30 class RenderElement;
31 class RenderObject;
32 class RenderStyle;
33 class RenderSVGResourceClipper;
34 class RenderSVGResourceContainer;
35 class RenderSVGResourceFilter;
36 class RenderSVGResourceMarker;
37 class RenderSVGResourceMasker;
38 class RenderSVGRoot;
39 class SVGRenderStyle;
40
41 // Holds a set of resources associated with a RenderObject
42 class SVGResources {
43     WTF_MAKE_NONCOPYABLE(SVGResources); WTF_MAKE_FAST_ALLOCATED;
44 public:
45     SVGResources();
46
47     bool buildCachedResources(const RenderElement&, const RenderStyle&);
48     void layoutDifferentRootIfNeeded(const RenderSVGRoot*);
49
50     // Ordinary resources
51     RenderSVGResourceClipper* clipper() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->clipper : nullptr; }
52     RenderSVGResourceMarker* markerStart() const { return m_markerData ? m_markerData->markerStart : nullptr; }
53     RenderSVGResourceMarker* markerMid() const { return m_markerData ? m_markerData->markerMid : nullptr; }
54     RenderSVGResourceMarker* markerEnd() const { return m_markerData ? m_markerData->markerEnd : nullptr; }
55     RenderSVGResourceMasker* masker() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->masker : nullptr; }
56     RenderSVGResourceFilter* filter() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->filter : nullptr; }
57
58     // Paint servers
59     RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData->fill : nullptr; }
60     RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData->stroke : nullptr; }
61
62     // Chainable resources - linked through xlink:href
63     RenderSVGResourceContainer* linkedResource() const { return m_linkedResource; }
64
65     void buildSetOfResources(HashSet<RenderSVGResourceContainer*>&);
66
67     // Methods operating on all cached resources
68     void removeClientFromCache(RenderElement&, bool markForInvalidation = true) const;
69     void resourceDestroyed(RenderSVGResourceContainer&);
70
71 #if ENABLE(TREE_DEBUGGING)
72     void dump(const RenderObject*);
73 #endif
74
75 private:
76     friend class SVGResourcesCycleSolver;
77
78     // Only used by SVGResourcesCache cycle detection logic
79     void resetClipper();
80     void resetFilter();
81     void resetMarkerStart();
82     void resetMarkerMid();
83     void resetMarkerEnd();
84     void resetMasker();
85     void resetFill();
86     void resetStroke();
87     void resetLinkedResource();
88
89 private:
90     bool setClipper(RenderSVGResourceClipper*);
91     bool setFilter(RenderSVGResourceFilter*);
92     bool setMarkerStart(RenderSVGResourceMarker*);
93     bool setMarkerMid(RenderSVGResourceMarker*);
94     bool setMarkerEnd(RenderSVGResourceMarker*);
95     bool setMasker(RenderSVGResourceMasker*);
96     bool setFill(RenderSVGResourceContainer*);
97     bool setStroke(RenderSVGResourceContainer*);
98     bool setLinkedResource(RenderSVGResourceContainer*);
99
100     // From SVG 1.1 2nd Edition
101     // clipper: 'container elements' and 'graphics elements'
102     // filter:  'container elements' and 'graphics elements'
103     // masker:  'container elements' and 'graphics elements'
104     // -> a, circle, defs, ellipse, glyph, g, image, line, marker, mask, missing-glyph, path, pattern, polygon, polyline, rect, svg, switch, symbol, text, use
105     struct ClipperFilterMaskerData {
106         WTF_MAKE_FAST_ALLOCATED;
107     public:
108         ClipperFilterMaskerData()
109             : clipper(0)
110             , filter(0)
111             , masker(0)
112         {
113         }
114
115         RenderSVGResourceClipper* clipper;
116         RenderSVGResourceFilter* filter;
117         RenderSVGResourceMasker* masker;
118     };
119
120     // From SVG 1.1 2nd Edition
121     // marker: line, path, polygon, polyline
122     struct MarkerData {
123         WTF_MAKE_FAST_ALLOCATED;
124     public:
125         MarkerData()
126             : markerStart(0)
127             , markerMid(0)
128             , markerEnd(0)
129         {
130         }
131
132         RenderSVGResourceMarker* markerStart;
133         RenderSVGResourceMarker* markerMid;
134         RenderSVGResourceMarker* markerEnd;
135     };
136
137     // From SVG 1.1 2nd Edition
138     // fill:       'shapes' and 'text content elements'
139     // stroke:     'shapes' and 'text content elements'
140     // -> altGlyph, circle, ellipse, line, path, polygon, polyline, rect, text, textPath, tref, tspan
141     struct FillStrokeData {
142         WTF_MAKE_FAST_ALLOCATED;
143     public:
144         FillStrokeData()
145             : fill(0)
146             , stroke(0)
147         {
148         }
149
150         RenderSVGResourceContainer* fill;
151         RenderSVGResourceContainer* stroke;
152     };
153
154     std::unique_ptr<ClipperFilterMaskerData> m_clipperFilterMaskerData;
155     std::unique_ptr<MarkerData> m_markerData;
156     std::unique_ptr<FillStrokeData> m_fillStrokeData;
157     RenderSVGResourceContainer* m_linkedResource;
158 };
159
160 }
161
162 #endif