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