0079b7309dceec4a3f7fbf75e65da7b6cbaabd9c
[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 #if ENABLE(SVG)
24 #include <wtf/HashSet.h>
25 #include <wtf/Noncopyable.h>
26 #include <wtf/OwnPtr.h>
27 #include <wtf/PassOwnPtr.h>
28
29 namespace WebCore {
30
31 class Document;
32 class RenderObject;
33 class RenderSVGResourceClipper;
34 class RenderSVGResourceContainer;
35 class RenderSVGResourceFilter;
36 class RenderSVGResourceMarker;
37 class RenderSVGResourceMasker;
38 class SVGRenderStyle;
39
40 // Holds a set of resources associated with a RenderObject
41 class SVGResources {
42     WTF_MAKE_NONCOPYABLE(SVGResources); WTF_MAKE_FAST_ALLOCATED;
43 public:
44     SVGResources();
45
46     bool buildCachedResources(const RenderObject*, const SVGRenderStyle*);
47
48     // Ordinary resources
49     RenderSVGResourceClipper* clipper() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->clipper : 0; }
50     RenderSVGResourceMarker* markerStart() const { return m_markerData ? m_markerData->markerStart : 0; }
51     RenderSVGResourceMarker* markerMid() const { return m_markerData ? m_markerData->markerMid : 0; }
52     RenderSVGResourceMarker* markerEnd() const { return m_markerData ? m_markerData->markerEnd : 0; }
53     RenderSVGResourceMasker* masker() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->masker : 0; }
54
55     RenderSVGResourceFilter* filter() const
56     {
57 #if ENABLE(FILTERS)
58         if (m_clipperFilterMaskerData)
59             return m_clipperFilterMaskerData->filter;
60 #endif
61         return 0;
62     }
63
64     // Paint servers
65     RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData->fill : 0; }
66     RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData->stroke : 0; }
67
68     // Chainable resources - linked through xlink:href
69     RenderSVGResourceContainer* linkedResource() const { return m_linkedResource; }
70
71     void buildSetOfResources(HashSet<RenderSVGResourceContainer*>&);
72
73     // Methods operating on all cached resources
74     void removeClientFromCache(RenderObject*, bool markForInvalidation = true) const;
75     void resourceDestroyed(RenderSVGResourceContainer*);
76
77 #ifndef NDEBUG
78     void dump(const RenderObject*);
79 #endif
80
81 private:
82     friend class SVGResourcesCycleSolver;
83
84     // Only used by SVGResourcesCache cycle detection logic
85     void resetClipper();
86 #if ENABLE(FILTERS)
87     void resetFilter();
88 #endif
89     void resetMarkerStart();
90     void resetMarkerMid();
91     void resetMarkerEnd();
92     void resetMasker();
93     void resetFill();
94     void resetStroke();
95     void resetLinkedResource();
96
97 private:
98     bool setClipper(RenderSVGResourceClipper*);
99 #if ENABLE(FILTERS)
100     bool setFilter(RenderSVGResourceFilter*);
101 #endif
102     bool setMarkerStart(RenderSVGResourceMarker*);
103     bool setMarkerMid(RenderSVGResourceMarker*);
104     bool setMarkerEnd(RenderSVGResourceMarker*);
105     bool setMasker(RenderSVGResourceMasker*);
106     bool setFill(RenderSVGResourceContainer*);
107     bool setStroke(RenderSVGResourceContainer*);
108     bool setLinkedResource(RenderSVGResourceContainer*);
109
110     // From SVG 1.1 2nd Edition
111     // clipper: 'container elements' and 'graphics elements'
112     // filter:  'container elements' and 'graphics elements'
113     // masker:  'container elements' and 'graphics elements'
114     // -> a, circle, defs, ellipse, glyph, g, image, line, marker, mask, missing-glyph, path, pattern, polygon, polyline, rect, svg, switch, symbol, text, use
115     struct ClipperFilterMaskerData {
116         WTF_MAKE_FAST_ALLOCATED;
117     public:
118         ClipperFilterMaskerData()
119             : clipper(0)
120 #if ENABLE(FILTERS)
121             , filter(0)
122 #endif
123             , masker(0)
124         {
125         }
126
127         static PassOwnPtr<ClipperFilterMaskerData> create()
128         {
129             return adoptPtr(new ClipperFilterMaskerData);
130         }
131
132         RenderSVGResourceClipper* clipper;
133 #if ENABLE(FILTERS)
134         RenderSVGResourceFilter* filter;
135 #endif
136         RenderSVGResourceMasker* masker;
137     };
138
139     // From SVG 1.1 2nd Edition
140     // marker: line, path, polygon, polyline
141     struct MarkerData {
142         WTF_MAKE_FAST_ALLOCATED;
143     public:
144         MarkerData()
145             : markerStart(0)
146             , markerMid(0)
147             , markerEnd(0)
148         {
149         }
150
151         static PassOwnPtr<MarkerData> create()
152         {
153             return adoptPtr(new MarkerData);
154         }
155
156         RenderSVGResourceMarker* markerStart;
157         RenderSVGResourceMarker* markerMid;
158         RenderSVGResourceMarker* markerEnd;
159     };
160
161     // From SVG 1.1 2nd Edition
162     // fill:       'shapes' and 'text content elements'
163     // stroke:     'shapes' and 'text content elements'
164     // -> altGlyph, circle, ellipse, line, path, polygon, polyline, rect, text, textPath, tref, tspan
165     struct FillStrokeData {
166         WTF_MAKE_FAST_ALLOCATED;
167     public:
168         FillStrokeData()
169             : fill(0)
170             , stroke(0)
171         {
172         }
173
174         static PassOwnPtr<FillStrokeData> create()
175         {
176             return adoptPtr(new FillStrokeData);
177         }
178
179         RenderSVGResourceContainer* fill;
180         RenderSVGResourceContainer* stroke;
181     };
182
183     OwnPtr<ClipperFilterMaskerData> m_clipperFilterMaskerData;
184     OwnPtr<MarkerData> m_markerData;
185     OwnPtr<FillStrokeData> m_fillStrokeData;
186     RenderSVGResourceContainer* m_linkedResource;
187 };
188
189 }
190
191 #endif
192 #endif