27312c7d0e1ba710fee31744f2428486d3931cdb
[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 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 RenderElement&, const RenderStyle&);
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 (m_clipperFilterMaskerData)
58             return m_clipperFilterMaskerData->filter;
59         return 0;
60     }
61
62     // Paint servers
63     RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData->fill : 0; }
64     RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData->stroke : 0; }
65
66     // Chainable resources - linked through xlink:href
67     RenderSVGResourceContainer* linkedResource() const { return m_linkedResource; }
68
69     void buildSetOfResources(HashSet<RenderSVGResourceContainer*>&);
70
71     // Methods operating on all cached resources
72     void removeClientFromCache(RenderElement&, bool markForInvalidation = true) const;
73     void resourceDestroyed(RenderSVGResourceContainer&);
74
75 #if ENABLE(TREE_DEBUGGING)
76     void dump(const RenderObject*);
77 #endif
78
79 private:
80     friend class SVGResourcesCycleSolver;
81
82     // Only used by SVGResourcesCache cycle detection logic
83     void resetClipper();
84     void resetFilter();
85     void resetMarkerStart();
86     void resetMarkerMid();
87     void resetMarkerEnd();
88     void resetMasker();
89     void resetFill();
90     void resetStroke();
91     void resetLinkedResource();
92
93 private:
94     bool setClipper(RenderSVGResourceClipper*);
95     bool setFilter(RenderSVGResourceFilter*);
96     bool setMarkerStart(RenderSVGResourceMarker*);
97     bool setMarkerMid(RenderSVGResourceMarker*);
98     bool setMarkerEnd(RenderSVGResourceMarker*);
99     bool setMasker(RenderSVGResourceMasker*);
100     bool setFill(RenderSVGResourceContainer*);
101     bool setStroke(RenderSVGResourceContainer*);
102     bool setLinkedResource(RenderSVGResourceContainer*);
103
104     // From SVG 1.1 2nd Edition
105     // clipper: 'container elements' and 'graphics elements'
106     // filter:  'container elements' and 'graphics elements'
107     // masker:  'container elements' and 'graphics elements'
108     // -> a, circle, defs, ellipse, glyph, g, image, line, marker, mask, missing-glyph, path, pattern, polygon, polyline, rect, svg, switch, symbol, text, use
109     struct ClipperFilterMaskerData {
110         WTF_MAKE_FAST_ALLOCATED;
111     public:
112         ClipperFilterMaskerData()
113             : clipper(0)
114             , filter(0)
115             , masker(0)
116         {
117         }
118
119         RenderSVGResourceClipper* clipper;
120         RenderSVGResourceFilter* filter;
121         RenderSVGResourceMasker* masker;
122     };
123
124     // From SVG 1.1 2nd Edition
125     // marker: line, path, polygon, polyline
126     struct MarkerData {
127         WTF_MAKE_FAST_ALLOCATED;
128     public:
129         MarkerData()
130             : markerStart(0)
131             , markerMid(0)
132             , markerEnd(0)
133         {
134         }
135
136         RenderSVGResourceMarker* markerStart;
137         RenderSVGResourceMarker* markerMid;
138         RenderSVGResourceMarker* markerEnd;
139     };
140
141     // From SVG 1.1 2nd Edition
142     // fill:       'shapes' and 'text content elements'
143     // stroke:     'shapes' and 'text content elements'
144     // -> altGlyph, circle, ellipse, line, path, polygon, polyline, rect, text, textPath, tref, tspan
145     struct FillStrokeData {
146         WTF_MAKE_FAST_ALLOCATED;
147     public:
148         FillStrokeData()
149             : fill(0)
150             , stroke(0)
151         {
152         }
153
154         RenderSVGResourceContainer* fill;
155         RenderSVGResourceContainer* stroke;
156     };
157
158     std::unique_ptr<ClipperFilterMaskerData> m_clipperFilterMaskerData;
159     std::unique_ptr<MarkerData> m_markerData;
160     std::unique_ptr<FillStrokeData> m_fillStrokeData;
161     RenderSVGResourceContainer* m_linkedResource;
162 };
163
164 }
165
166 #endif