JavaScriptCore:
[WebKit-https.git] / WebCore / ksvg2 / css / 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
6      This file is part of the KDE project
7
8     This library is free software; you can redistribute it and/or
9     modify it under the terms of the GNU Library General Public
10     License as published by the Free Software Foundation; either
11     version 2 of the License, or (at your option) any later version.
12
13     This library is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16     Library General Public License for more details.
17
18     You should have received a copy of the GNU Library General Public License
19     along with this library; see the file COPYING.LIB.  If not, write to
20     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21     Boston, MA 02111-1307, USA.
22 */
23
24 #ifndef SVGRenderStyle_h
25 #define SVGRenderStyle_h
26
27 #if ENABLE(SVG)
28
29 #include "CSSValueList.h"
30 #include "DataRef.h"
31 #include "GraphicsTypes.h"
32 #include "SVGPaint.h"
33 #include "SVGRenderStyleDefs.h"
34 #include <wtf/Platform.h>
35
36 #if PLATFORM(WIN_OS)
37 typedef unsigned long long uint64_t;
38 #endif
39
40 namespace WebCore {
41
42     class SVGRenderStyle : public Shared<SVGRenderStyle> {    
43     public:
44         SVGRenderStyle();
45         SVGRenderStyle(bool); // Used to create the default style.
46         SVGRenderStyle(const SVGRenderStyle&);
47         ~SVGRenderStyle();
48
49         bool inheritedNotEqual(const SVGRenderStyle*) const;
50         void inheritFrom(const SVGRenderStyle*);
51         
52         bool operator==(const SVGRenderStyle&) const;
53         bool operator!=(const SVGRenderStyle& o) const { return !(*this == o); }
54
55         // SVG CSS Properties
56         SVG_RS_DEFINE_ATTRIBUTE(EAlignmentBaseline, AlignmentBaseline, alignmentBaseline, AB_AUTO)
57         SVG_RS_DEFINE_ATTRIBUTE(EDominantBaseline, DominantBaseline, dominantBaseline, DB_AUTO)
58         SVG_RS_DEFINE_ATTRIBUTE(EBaselineShift, BaselineShift, baselineShift, BS_BASELINE)
59
60         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(LineCap, CapStyle, capStyle, ButtCap)
61         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(WindRule, ClipRule, clipRule, RULE_NONZERO)
62         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EColorInterpolation, ColorInterpolation, colorInterpolation, CI_SRGB)
63         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EColorInterpolation, ColorInterpolationFilters, colorInterpolationFilters, CI_LINEARRGB)
64         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EColorRendering, ColorRendering, colorRendering, CR_AUTO)
65         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(WindRule, FillRule, fillRule, RULE_NONZERO)
66         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EImageRendering, ImageRendering, imageRendering, IR_AUTO)
67         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(LineJoin, JoinStyle, joinStyle, MiterJoin)
68         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EPointerEvents, PointerEvents, pointerEvents, PE_VISIBLE_PAINTED)
69         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EShapeRendering, ShapeRendering, shapeRendering, SR_AUTO)
70         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(ETextAnchor, TextAnchor, textAnchor, TA_START)
71         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(ETextRendering, TextRendering, textRendering, TR_AUTO)
72         SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EWritingMode, WritingMode, writingMode, WM_LRTB)
73  
74         // SVG CSS Properties (using DataRef's)
75         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(float, fill, opacity, FillOpacity, fillOpacity, 1.0f)
76         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(SVGPaint, fill, paint, FillPaint, fillPaint, SVGPaint::defaultFill())
77
78         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(float, stroke, opacity, StrokeOpacity, strokeOpacity, 1.0f)
79         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(SVGPaint, stroke, paint, StrokePaint, strokePaint, SVGPaint::defaultStroke())
80         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(CSSValueList, stroke, dashArray, StrokeDashArray, strokeDashArray, 0)
81         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(float, stroke, miterLimit, StrokeMiterLimit, strokeMiterLimit, 4.0f)
82         
83         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(CSSValue, stroke, width, StrokeWidth, strokeWidth, 0)
84         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(CSSValue, stroke, dashOffset, StrokeDashOffset, strokeDashOffset, 0);
85
86         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(CSSValue, text, kerning, Kerning, kerning, 0)
87
88         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(float, stops, opacity, StopOpacity, stopOpacity, 1.0f)
89         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(Color, stops, color, StopColor, stopColor, Color(0, 0, 0))    
90         
91         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, clip, clipPath, ClipPath, clipPath, String())
92         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, mask, maskElement, MaskElement, maskElement, String())
93         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, markers, startMarker, StartMarker, startMarker, String())
94         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, markers, midMarker, MidMarker, midMarker, String())
95         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, markers, endMarker, EndMarker, endMarker, String())
96
97         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(String, misc, filter, Filter, filter, String())
98         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(float, misc, floodOpacity, FloodOpacity, floodOpacity, 1.0f)
99         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(Color, misc, floodColor, FloodColor, floodColor, Color(0, 0, 0))
100         SVG_RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL_REFCOUNTED(CSSValue, misc, baselineShiftValue, BaselineShiftValue, baselineShiftValue, 0)
101
102         // convenience
103         bool hasStroke() const { return (strokePaint()->paintType() != SVGPaint::SVG_PAINTTYPE_NONE); }
104         bool hasFill() const { return (fillPaint()->paintType() != SVGPaint::SVG_PAINTTYPE_NONE); }
105
106     protected:
107         // inherit
108         struct InheritedFlags {
109             // 64 bit inherited, don't add to the struct, or the operator will break.
110             bool operator==(const InheritedFlags &other) const { return _iflags == other._iflags; }
111             bool operator!=(const InheritedFlags &other) const { return _iflags != other._iflags; }
112
113             union {
114                 struct {
115                     unsigned _colorRendering : 2; // EColorRendering
116                     unsigned _imageRendering : 2; // EImageRendering 
117                     unsigned _shapeRendering : 2; // EShapeRendering 
118                     unsigned _textRendering : 2; // ETextRendering
119                     unsigned _clipRule : 1; // WindRule
120                     unsigned _fillRule : 1; // WindRule
121                     unsigned _capStyle : 2; // LineCap
122                     unsigned _joinStyle : 2; // LineJoin
123                     unsigned _textAnchor : 2; // ETextAnchor
124                     unsigned _colorInterpolation : 2; // EColorInterpolation
125                     unsigned _colorInterpolationFilters : 2; // EColorInterpolation
126                     unsigned _pointerEvents : 4; // EPointerEvents
127                     unsigned _writingMode : 3; // EWritingMode
128                     // 5 bits unused
129                 } f;
130                 uint32_t _iflags;
131             };
132         } svg_inherited_flags;
133
134         // don't inherit
135         struct NonInheritedFlags {
136             // 64 bit non-inherited, don't add to the struct, or the operator will break.
137             bool operator==(const NonInheritedFlags &other) const { return _niflags == other._niflags; }
138             bool operator!=(const NonInheritedFlags &other) const { return _niflags != other._niflags; }
139
140             union {
141                 struct {
142                     unsigned _alignmentBaseline : 4; // EAlignmentBaseline 
143                     unsigned _dominantBaseline : 4; // EDominantBaseline
144                     unsigned _baselineShift : 2; // EBaselineShift
145                     // 22 bits unused
146                 } f;
147                 uint32_t _niflags;
148             };
149         } svg_noninherited_flags;
150
151         // inherited attributes
152         DataRef<StyleFillData> fill;
153         DataRef<StyleStrokeData> stroke;
154         DataRef<StyleMarkerData> markers;
155         DataRef<StyleTextData> text;
156
157         // non-inherited attributes
158         DataRef<StyleStopData> stops;
159         DataRef<StyleClipData> clip;
160         DataRef<StyleMaskData> mask;
161         DataRef<StyleMiscData> misc;
162
163         // static default style
164         static SVGRenderStyle *s_defaultStyle;
165
166     private:
167         SVGRenderStyle(const SVGRenderStyle*) { }
168
169         void setBitDefaults()
170         {
171             svg_inherited_flags.f._clipRule = initialClipRule();
172             svg_inherited_flags.f._colorRendering = initialColorRendering();
173             svg_inherited_flags.f._fillRule = initialFillRule();
174             svg_inherited_flags.f._imageRendering = initialImageRendering();
175             svg_inherited_flags.f._shapeRendering = initialShapeRendering();
176             svg_inherited_flags.f._textRendering = initialTextRendering();
177             svg_inherited_flags.f._textAnchor = initialTextAnchor();
178             svg_inherited_flags.f._capStyle = initialCapStyle();
179             svg_inherited_flags.f._joinStyle = initialJoinStyle();
180             svg_inherited_flags.f._colorInterpolation = initialColorInterpolation();
181             svg_inherited_flags.f._colorInterpolationFilters = initialColorInterpolationFilters();
182             svg_inherited_flags.f._pointerEvents = initialPointerEvents();
183             svg_inherited_flags.f._writingMode = initialWritingMode();
184
185             svg_noninherited_flags.f._alignmentBaseline = initialAlignmentBaseline();
186             svg_noninherited_flags.f._dominantBaseline = initialDominantBaseline();
187             svg_noninherited_flags.f._baselineShift = initialBaselineShift();
188         }
189     };
190
191 } // namespace WebCore
192
193 #endif // ENABLE(SVG)
194 #endif // SVGRenderStyle_h
195
196 // vim:ts=4:noet