2011-05-19 Mike Lawther <mikelawther@chromium.org>
[WebKit-https.git] / Source / WebCore / rendering / style / SVGRenderStyle.h
1 /*
2     Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3                   2004, 2005 Rob Buis <buis@kde.org>
4     Copyright (C) 2005, 2006 Apple Computer, Inc.
5     Copyright (C) Research In Motion Limited 2010. All rights reserved.
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20     Boston, MA 02110-1301, USA.
21 */
22
23 #ifndef SVGRenderStyle_h
24 #define SVGRenderStyle_h
25
26 #if ENABLE(SVG)
27 #include "CSSValueList.h"
28 #include "DataRef.h"
29 #include "GraphicsTypes.h"
30 #include "Path.h"
31 #include "RenderStyleConstants.h"
32 #include "SVGPaint.h"
33 #include "SVGRenderStyleDefs.h"
34
35 namespace WebCore {
36
37 class FloatRect;
38 class IntRect;
39 class RenderObject;
40
41 class SVGRenderStyle : public RefCounted<SVGRenderStyle> {    
42 public:
43     static PassRefPtr<SVGRenderStyle> create() { return adoptRef(new SVGRenderStyle); }
44     PassRefPtr<SVGRenderStyle> copy() const { return adoptRef(new SVGRenderStyle(*this));}
45     ~SVGRenderStyle();
46
47     bool inheritedNotEqual(const SVGRenderStyle*) const;
48     void inheritFrom(const SVGRenderStyle*);
49
50     StyleDifference diff(const SVGRenderStyle*) const;
51
52     bool operator==(const SVGRenderStyle&) const;
53     bool operator!=(const SVGRenderStyle& o) const { return !(*this == o); }
54
55     // Initial values for all the properties
56     static EAlignmentBaseline initialAlignmentBaseline() { return AB_AUTO; }
57     static EDominantBaseline initialDominantBaseline() { return DB_AUTO; }
58     static EBaselineShift initialBaselineShift() { return BS_BASELINE; }
59     static EVectorEffect initialVectorEffect() { return VE_NONE; }
60     static LineCap initialCapStyle() { return ButtCap; }
61     static WindRule initialClipRule() { return RULE_NONZERO; }
62     static EColorInterpolation initialColorInterpolation() { return CI_SRGB; }
63     static EColorInterpolation initialColorInterpolationFilters() { return CI_LINEARRGB; }
64     static EColorRendering initialColorRendering() { return CR_AUTO; }
65     static WindRule initialFillRule() { return RULE_NONZERO; }
66     static LineJoin initialJoinStyle() { return MiterJoin; }
67     static EShapeRendering initialShapeRendering() { return SR_AUTO; }
68     static ETextAnchor initialTextAnchor() { return TA_START; }
69     static SVGWritingMode initialWritingMode() { return WM_LRTB; }
70     static EGlyphOrientation initialGlyphOrientationHorizontal() { return GO_0DEG; }
71     static EGlyphOrientation initialGlyphOrientationVertical() { return GO_AUTO; }
72     static float initialFillOpacity() { return 1; }
73     static SVGPaint::SVGPaintType initialFillPaintType() { return SVGPaint::SVG_PAINTTYPE_RGBCOLOR; }
74     static Color initialFillPaintColor() { return Color::black; }
75     static String initialFillPaintUri() { return String(); }
76     static float initialStrokeOpacity() { return 1; }
77     static SVGPaint::SVGPaintType initialStrokePaintType() { return SVGPaint::SVG_PAINTTYPE_NONE; }
78     static Color initialStrokePaintColor() { return Color(); }
79     static String initialStrokePaintUri() { return String(); }
80     static Vector<SVGLength> initialStrokeDashArray() { return Vector<SVGLength>(); }
81     static float initialStrokeMiterLimit() { return 4; }
82     static float initialStopOpacity() { return 1; }
83     static Color initialStopColor() { return Color(0, 0, 0); }
84     static float initialFloodOpacity() { return 1; }
85     static Color initialFloodColor() { return Color(0, 0, 0); }
86     static Color initialLightingColor() { return Color(255, 255, 255); }
87     static ShadowData* initialShadow() { return 0; }
88     static String initialClipperResource() { return String(); }
89     static String initialFilterResource() { return String(); }
90     static String initialMaskerResource() { return String(); }
91     static String initialMarkerStartResource() { return String(); }
92     static String initialMarkerMidResource() { return String(); }
93     static String initialMarkerEndResource() { return String(); }
94
95     static SVGLength initialBaselineShiftValue()
96     {
97         SVGLength length;
98         ExceptionCode ec = 0;
99         length.newValueSpecifiedUnits(LengthTypeNumber, 0, ec);
100         ASSERT(!ec);
101         return length;
102     }
103
104     static SVGLength initialKerning()
105     {
106         SVGLength length;
107         ExceptionCode ec = 0;
108         length.newValueSpecifiedUnits(LengthTypeNumber, 0, ec);
109         ASSERT(!ec);
110         return length;
111     }
112
113     static SVGLength initialStrokeDashOffset()
114     {
115         SVGLength length;
116         ExceptionCode ec = 0;
117         length.newValueSpecifiedUnits(LengthTypeNumber, 0, ec);
118         ASSERT(!ec);
119         return length;
120     }
121
122     static SVGLength initialStrokeWidth()
123     {
124         SVGLength length;
125         ExceptionCode ec = 0;
126         length.newValueSpecifiedUnits(LengthTypeNumber, 1, ec);
127         ASSERT(!ec);
128         return length;
129     }
130
131     // SVG CSS Property setters
132     void setAlignmentBaseline(EAlignmentBaseline val) { svg_noninherited_flags.f._alignmentBaseline = val; }
133     void setDominantBaseline(EDominantBaseline val) { svg_noninherited_flags.f._dominantBaseline = val; }
134     void setBaselineShift(EBaselineShift val) { svg_noninherited_flags.f._baselineShift = val; }
135     void setVectorEffect(EVectorEffect val) { svg_noninherited_flags.f._vectorEffect = val; }
136     void setCapStyle(LineCap val) { svg_inherited_flags._capStyle = val; }
137     void setClipRule(WindRule val) { svg_inherited_flags._clipRule = val; }
138     void setColorInterpolation(EColorInterpolation val) { svg_inherited_flags._colorInterpolation = val; }
139     void setColorInterpolationFilters(EColorInterpolation val) { svg_inherited_flags._colorInterpolationFilters = val; }
140     void setColorRendering(EColorRendering val) { svg_inherited_flags._colorRendering = val; }
141     void setFillRule(WindRule val) { svg_inherited_flags._fillRule = val; }
142     void setJoinStyle(LineJoin val) { svg_inherited_flags._joinStyle = val; }
143     void setShapeRendering(EShapeRendering val) { svg_inherited_flags._shapeRendering = val; }
144     void setTextAnchor(ETextAnchor val) { svg_inherited_flags._textAnchor = val; }
145     void setWritingMode(SVGWritingMode val) { svg_inherited_flags._writingMode = val; }
146     void setGlyphOrientationHorizontal(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationHorizontal = val; }
147     void setGlyphOrientationVertical(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationVertical = val; }
148     
149     void setFillOpacity(float obj)
150     {
151         if (!(fill->opacity == obj))
152             fill.access()->opacity = obj;
153     }
154
155     void setFillPaint(SVGPaint::SVGPaintType type, const Color& color, const String& uri)
156     {
157         if (!(fill->paintType == type))
158             fill.access()->paintType = type;
159         if (!(fill->paintColor == color))
160             fill.access()->paintColor = color;
161         if (!(fill->paintUri == uri))
162             fill.access()->paintUri = uri;
163     }
164
165     void setStrokeOpacity(float obj)
166     {
167         if (!(stroke->opacity == obj))
168             stroke.access()->opacity = obj;
169     }
170
171     void setStrokePaint(SVGPaint::SVGPaintType type, const Color& color, const String& uri)
172     {
173         if (!(stroke->paintType == type))
174             stroke.access()->paintType = type;
175         if (!(stroke->paintColor == color))
176             stroke.access()->paintColor = color;
177         if (!(stroke->paintUri == uri))
178             stroke.access()->paintUri = uri;
179     }
180
181     void setStrokeDashArray(const Vector<SVGLength>& obj)
182     {
183         if (!(stroke->dashArray == obj))
184             stroke.access()->dashArray = obj;
185     }
186
187     void setStrokeMiterLimit(float obj)
188     {
189         if (!(stroke->miterLimit == obj))
190             stroke.access()->miterLimit = obj;
191     }
192
193     void setStrokeWidth(const SVGLength& obj)
194     {
195         if (!(stroke->width == obj))
196             stroke.access()->width = obj;
197     }
198
199     void setStrokeDashOffset(const SVGLength& obj)
200     {
201         if (!(stroke->dashOffset == obj))
202             stroke.access()->dashOffset = obj;
203     }
204
205     void setKerning(const SVGLength& obj)
206     {
207         if (!(text->kerning == obj))
208             text.access()->kerning = obj;
209     }
210
211     void setStopOpacity(float obj)
212     {
213         if (!(stops->opacity == obj))
214             stops.access()->opacity = obj;
215     }
216
217     void setStopColor(const Color& obj)
218     {
219         if (!(stops->color == obj))
220             stops.access()->color = obj;
221     }
222
223     void setFloodOpacity(float obj)
224     {
225         if (!(misc->floodOpacity == obj))
226             misc.access()->floodOpacity = obj;
227     }
228
229     void setFloodColor(const Color& obj)
230     {
231         if (!(misc->floodColor == obj))
232             misc.access()->floodColor = obj;
233     }
234
235     void setLightingColor(const Color& obj)
236     {
237         if (!(misc->lightingColor == obj))
238             misc.access()->lightingColor = obj;
239     }
240
241     void setBaselineShiftValue(const SVGLength& obj)
242     {
243         if (!(misc->baselineShiftValue == obj))
244             misc.access()->baselineShiftValue = obj;
245     }
246
247     void setShadow(PassOwnPtr<ShadowData> obj) { shadowSVG.access()->shadow = obj; }
248
249     // Setters for non-inherited resources
250     void setClipperResource(const String& obj)
251     {
252         if (!(resources->clipper == obj))
253             resources.access()->clipper = obj;
254     }
255
256     void setFilterResource(const String& obj)
257     {
258         if (!(resources->filter == obj))
259             resources.access()->filter = obj;
260     }
261
262     void setMaskerResource(const String& obj)
263     {
264         if (!(resources->masker == obj))
265             resources.access()->masker = obj;
266     }
267
268     // Setters for inherited resources
269     void setMarkerStartResource(const String& obj)
270     {
271         if (!(inheritedResources->markerStart == obj))
272             inheritedResources.access()->markerStart = obj;
273     }
274
275     void setMarkerMidResource(const String& obj)
276     {
277         if (!(inheritedResources->markerMid == obj))
278             inheritedResources.access()->markerMid = obj;
279     }
280
281     void setMarkerEndResource(const String& obj)
282     {
283         if (!(inheritedResources->markerEnd == obj))
284             inheritedResources.access()->markerEnd = obj;
285     }
286
287     // Read accessors for all the properties
288     EAlignmentBaseline alignmentBaseline() const { return (EAlignmentBaseline) svg_noninherited_flags.f._alignmentBaseline; }
289     EDominantBaseline dominantBaseline() const { return (EDominantBaseline) svg_noninherited_flags.f._dominantBaseline; }
290     EBaselineShift baselineShift() const { return (EBaselineShift) svg_noninherited_flags.f._baselineShift; }
291     EVectorEffect vectorEffect() const { return (EVectorEffect) svg_noninherited_flags.f._vectorEffect; }
292     LineCap capStyle() const { return (LineCap) svg_inherited_flags._capStyle; }
293     WindRule clipRule() const { return (WindRule) svg_inherited_flags._clipRule; }
294     EColorInterpolation colorInterpolation() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolation; }
295     EColorInterpolation colorInterpolationFilters() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolationFilters; }
296     EColorRendering colorRendering() const { return (EColorRendering) svg_inherited_flags._colorRendering; }
297     WindRule fillRule() const { return (WindRule) svg_inherited_flags._fillRule; }
298     LineJoin joinStyle() const { return (LineJoin) svg_inherited_flags._joinStyle; }
299     EShapeRendering shapeRendering() const { return (EShapeRendering) svg_inherited_flags._shapeRendering; }
300     ETextAnchor textAnchor() const { return (ETextAnchor) svg_inherited_flags._textAnchor; }
301     SVGWritingMode writingMode() const { return (SVGWritingMode) svg_inherited_flags._writingMode; }
302     EGlyphOrientation glyphOrientationHorizontal() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationHorizontal; }
303     EGlyphOrientation glyphOrientationVertical() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationVertical; }
304     float fillOpacity() const { return fill->opacity; }
305     const SVGPaint::SVGPaintType& fillPaintType() const { return fill->paintType; }
306     const Color& fillPaintColor() const { return fill->paintColor; }
307     const String& fillPaintUri() const { return fill->paintUri; }    
308     float strokeOpacity() const { return stroke->opacity; }
309     const SVGPaint::SVGPaintType& strokePaintType() const { return stroke->paintType; }
310     const Color& strokePaintColor() const { return stroke->paintColor; }
311     const String& strokePaintUri() const { return stroke->paintUri; }
312     Vector<SVGLength> strokeDashArray() const { return stroke->dashArray; }
313     float strokeMiterLimit() const { return stroke->miterLimit; }
314     SVGLength strokeWidth() const { return stroke->width; }
315     SVGLength strokeDashOffset() const { return stroke->dashOffset; }
316     SVGLength kerning() const { return text->kerning; }
317     float stopOpacity() const { return stops->opacity; }
318     Color stopColor() const { return stops->color; }
319     float floodOpacity() const { return misc->floodOpacity; }
320     Color floodColor() const { return misc->floodColor; }
321     Color lightingColor() const { return misc->lightingColor; }
322     SVGLength baselineShiftValue() const { return misc->baselineShiftValue; }
323     ShadowData* shadow() const { return shadowSVG->shadow.get(); }
324     String clipperResource() const { return resources->clipper; }
325     String filterResource() const { return resources->filter; }
326     String maskerResource() const { return resources->masker; }
327     String markerStartResource() const { return inheritedResources->markerStart; }
328     String markerMidResource() const { return inheritedResources->markerMid; }
329     String markerEndResource() const { return inheritedResources->markerEnd; }
330
331     // convenience
332     bool hasClipper() const { return !clipperResource().isEmpty(); }
333     bool hasMasker() const { return !maskerResource().isEmpty(); }
334     bool hasFilter() const { return !filterResource().isEmpty(); }
335     bool hasMarkers() const { return !markerStartResource().isEmpty() || !markerMidResource().isEmpty() || !markerEndResource().isEmpty(); }
336     bool hasStroke() const { return strokePaintType() != SVGPaint::SVG_PAINTTYPE_NONE; }
337     bool hasFill() const { return fillPaintType() != SVGPaint::SVG_PAINTTYPE_NONE; }
338     bool isVerticalWritingMode() const { return writingMode() == WM_TBRL || writingMode() == WM_TB; }
339
340 protected:
341     // inherit
342     struct InheritedFlags {
343         bool operator==(const InheritedFlags& other) const
344         {
345             return (_colorRendering == other._colorRendering)
346                 && (_shapeRendering == other._shapeRendering)
347                 && (_clipRule == other._clipRule)
348                 && (_fillRule == other._fillRule)
349                 && (_capStyle == other._capStyle)
350                 && (_joinStyle == other._joinStyle)
351                 && (_textAnchor == other._textAnchor)
352                 && (_colorInterpolation == other._colorInterpolation)
353                 && (_colorInterpolationFilters == other._colorInterpolationFilters)
354                 && (_writingMode == other._writingMode)
355                 && (_glyphOrientationHorizontal == other._glyphOrientationHorizontal)
356                 && (_glyphOrientationVertical == other._glyphOrientationVertical);
357         }
358
359         bool operator!=(const InheritedFlags& other) const
360         {
361             return !(*this == other);
362         }
363
364         unsigned _colorRendering : 2; // EColorRendering
365         unsigned _shapeRendering : 2; // EShapeRendering 
366         unsigned _clipRule : 1; // WindRule
367         unsigned _fillRule : 1; // WindRule
368         unsigned _capStyle : 2; // LineCap
369         unsigned _joinStyle : 2; // LineJoin
370         unsigned _textAnchor : 2; // ETextAnchor
371         unsigned _colorInterpolation : 2; // EColorInterpolation
372         unsigned _colorInterpolationFilters : 2; // EColorInterpolation
373         unsigned _writingMode : 3; // SVGWritingMode
374         unsigned _glyphOrientationHorizontal : 3; // EGlyphOrientation
375         unsigned _glyphOrientationVertical : 3; // EGlyphOrientation
376     } svg_inherited_flags;
377
378     // don't inherit
379     struct NonInheritedFlags {
380         // 32 bit non-inherited, don't add to the struct, or the operator will break.
381         bool operator==(const NonInheritedFlags &other) const { return _niflags == other._niflags; }
382         bool operator!=(const NonInheritedFlags &other) const { return _niflags != other._niflags; }
383
384         union {
385             struct {
386                 unsigned _alignmentBaseline : 4; // EAlignmentBaseline 
387                 unsigned _dominantBaseline : 4; // EDominantBaseline
388                 unsigned _baselineShift : 2; // EBaselineShift
389                 unsigned _vectorEffect: 1; // EVectorEffect
390                 // 21 bits unused
391             } f;
392             uint32_t _niflags;
393         };
394     } svg_noninherited_flags;
395
396     // inherited attributes
397     DataRef<StyleFillData> fill;
398     DataRef<StyleStrokeData> stroke;
399     DataRef<StyleTextData> text;
400     DataRef<StyleInheritedResourceData> inheritedResources;
401
402     // non-inherited attributes
403     DataRef<StyleStopData> stops;
404     DataRef<StyleMiscData> misc;
405     DataRef<StyleShadowSVGData> shadowSVG;
406     DataRef<StyleResourceData> resources;
407
408 private:
409     enum CreateDefaultType { CreateDefault };
410         
411     SVGRenderStyle();
412     SVGRenderStyle(const SVGRenderStyle&);
413     SVGRenderStyle(CreateDefaultType); // Used to create the default style.
414
415     void setBitDefaults()
416     {
417         svg_inherited_flags._clipRule = initialClipRule();
418         svg_inherited_flags._colorRendering = initialColorRendering();
419         svg_inherited_flags._fillRule = initialFillRule();
420         svg_inherited_flags._shapeRendering = initialShapeRendering();
421         svg_inherited_flags._textAnchor = initialTextAnchor();
422         svg_inherited_flags._capStyle = initialCapStyle();
423         svg_inherited_flags._joinStyle = initialJoinStyle();
424         svg_inherited_flags._colorInterpolation = initialColorInterpolation();
425         svg_inherited_flags._colorInterpolationFilters = initialColorInterpolationFilters();
426         svg_inherited_flags._writingMode = initialWritingMode();
427         svg_inherited_flags._glyphOrientationHorizontal = initialGlyphOrientationHorizontal();
428         svg_inherited_flags._glyphOrientationVertical = initialGlyphOrientationVertical();
429
430         svg_noninherited_flags._niflags = 0;
431         svg_noninherited_flags.f._alignmentBaseline = initialAlignmentBaseline();
432         svg_noninherited_flags.f._dominantBaseline = initialDominantBaseline();
433         svg_noninherited_flags.f._baselineShift = initialBaselineShift();
434         svg_noninherited_flags.f._vectorEffect = initialVectorEffect();
435     }
436 };
437
438 } // namespace WebCore
439
440 #endif // ENABLE(SVG)
441 #endif // SVGRenderStyle_h