OSDN Git Service

resolved conflicts for merge of da53ac10 to master
[android-x86/external-webkit.git] / WebCore / css / SVGCSSComputedStyleDeclaration.cpp
1 /*
2     Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3     Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22
23 #if ENABLE(SVG)
24 #include "CSSComputedStyleDeclaration.h"
25
26 #include "CSSPrimitiveValueMappings.h"
27 #include "CSSPropertyNames.h"
28 #include "Document.h"
29 #include "RenderStyle.h"
30
31 namespace WebCore {
32
33 static PassRefPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveValue(EGlyphOrientation orientation)
34 {
35     switch (orientation) {
36         case GO_0DEG:
37             return CSSPrimitiveValue::create(0.0f, CSSPrimitiveValue::CSS_DEG);
38         case GO_90DEG:
39             return CSSPrimitiveValue::create(90.0f, CSSPrimitiveValue::CSS_DEG);
40         case GO_180DEG:
41             return CSSPrimitiveValue::create(180.0f, CSSPrimitiveValue::CSS_DEG);
42         case GO_270DEG:
43             return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG);
44         default:
45             return 0;
46     }
47 }
48
49 PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
50 {
51     Node* node = m_node.get();
52     if (!node)
53         return 0;
54     
55     // Make sure our layout is up to date before we allow a query on these attributes.
56     if (updateLayout)
57         node->document()->updateLayout();
58         
59     RenderStyle* style = node->computedStyle();
60     if (!style)
61         return 0;
62     
63     const SVGRenderStyle* svgStyle = style->svgStyle();
64     if (!svgStyle)
65         return 0;
66     
67     switch (static_cast<CSSPropertyID>(propertyID)) {
68         case CSSPropertyClipRule:
69             return CSSPrimitiveValue::create(svgStyle->clipRule());
70         case CSSPropertyFloodOpacity:
71             return CSSPrimitiveValue::create(svgStyle->floodOpacity(), CSSPrimitiveValue::CSS_NUMBER);
72         case CSSPropertyStopOpacity:
73             return CSSPrimitiveValue::create(svgStyle->stopOpacity(), CSSPrimitiveValue::CSS_NUMBER);
74         case CSSPropertyColorInterpolation:
75             return CSSPrimitiveValue::create(svgStyle->colorInterpolation());
76         case CSSPropertyColorInterpolationFilters:
77             return CSSPrimitiveValue::create(svgStyle->colorInterpolationFilters());
78         case CSSPropertyFillOpacity:
79             return CSSPrimitiveValue::create(svgStyle->fillOpacity(), CSSPrimitiveValue::CSS_NUMBER);
80         case CSSPropertyFillRule:
81             return CSSPrimitiveValue::create(svgStyle->fillRule());
82         case CSSPropertyColorRendering:
83             return CSSPrimitiveValue::create(svgStyle->colorRendering());
84         case CSSPropertyImageRendering:
85             return CSSPrimitiveValue::create(svgStyle->imageRendering());
86         case CSSPropertyShapeRendering:
87             return CSSPrimitiveValue::create(svgStyle->shapeRendering());
88         case CSSPropertyStrokeLinecap:
89             return CSSPrimitiveValue::create(svgStyle->capStyle());
90         case CSSPropertyStrokeLinejoin:
91             return CSSPrimitiveValue::create(svgStyle->joinStyle());
92         case CSSPropertyStrokeMiterlimit:
93             return CSSPrimitiveValue::create(svgStyle->strokeMiterLimit(), CSSPrimitiveValue::CSS_NUMBER);
94         case CSSPropertyStrokeOpacity:
95             return CSSPrimitiveValue::create(svgStyle->strokeOpacity(), CSSPrimitiveValue::CSS_NUMBER);
96         case CSSPropertyAlignmentBaseline:
97             return CSSPrimitiveValue::create(svgStyle->alignmentBaseline());
98         case CSSPropertyDominantBaseline:
99             return CSSPrimitiveValue::create(svgStyle->dominantBaseline());
100         case CSSPropertyTextAnchor:
101             return CSSPrimitiveValue::create(svgStyle->textAnchor());
102         case CSSPropertyWritingMode:
103             return CSSPrimitiveValue::create(svgStyle->writingMode());
104         case CSSPropertyClipPath:
105             if (!svgStyle->clipperResource().isEmpty())
106                 return CSSPrimitiveValue::create(svgStyle->clipperResource(), CSSPrimitiveValue::CSS_URI);
107             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
108         case CSSPropertyMask:
109             if (!svgStyle->maskerResource().isEmpty())
110                 return CSSPrimitiveValue::create(svgStyle->maskerResource(), CSSPrimitiveValue::CSS_URI);
111             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
112         case CSSPropertyFilter:
113             if (!svgStyle->filterResource().isEmpty())
114                 return CSSPrimitiveValue::create(svgStyle->filterResource(), CSSPrimitiveValue::CSS_URI);
115             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
116         case CSSPropertyFloodColor:
117             return CSSPrimitiveValue::createColor(svgStyle->floodColor().rgb());
118         case CSSPropertyLightingColor:
119             return CSSPrimitiveValue::createColor(svgStyle->lightingColor().rgb());
120         case CSSPropertyStopColor:
121             return CSSPrimitiveValue::createColor(svgStyle->stopColor().rgb());
122         case CSSPropertyFill:
123             return svgStyle->fillPaint();
124         case CSSPropertyKerning:
125             return svgStyle->kerning();
126         case CSSPropertyMarkerEnd:
127             if (!svgStyle->markerEndResource().isEmpty())
128                 return CSSPrimitiveValue::create(svgStyle->markerEndResource(), CSSPrimitiveValue::CSS_URI);
129             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
130         case CSSPropertyMarkerMid:
131             if (!svgStyle->markerMidResource().isEmpty())
132                 return CSSPrimitiveValue::create(svgStyle->markerMidResource(), CSSPrimitiveValue::CSS_URI);
133             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
134         case CSSPropertyMarkerStart:
135             if (!svgStyle->markerStartResource().isEmpty())
136                 return CSSPrimitiveValue::create(svgStyle->markerStartResource(), CSSPrimitiveValue::CSS_URI);
137             return CSSPrimitiveValue::createIdentifier(CSSValueNone);
138         case CSSPropertyStroke:
139             return svgStyle->strokePaint();
140         case CSSPropertyStrokeDasharray:
141             return svgStyle->strokeDashArray();
142         case CSSPropertyStrokeDashoffset:
143             return svgStyle->strokeDashOffset();
144         case CSSPropertyStrokeWidth:
145             return svgStyle->strokeWidth();
146         case CSSPropertyBaselineShift: {
147             switch (svgStyle->baselineShift()) {
148                 case BS_BASELINE:
149                     return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
150                 case BS_SUPER:
151                     return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
152                 case BS_SUB:
153                     return CSSPrimitiveValue::createIdentifier(CSSValueSub);
154                 case BS_LENGTH:
155                     return svgStyle->baselineShiftValue();
156             }
157         }
158         case CSSPropertyGlyphOrientationHorizontal:
159             return glyphOrientationToCSSPrimitiveValue(svgStyle->glyphOrientationHorizontal());
160         case CSSPropertyGlyphOrientationVertical: {
161             if (RefPtr<CSSPrimitiveValue> value = glyphOrientationToCSSPrimitiveValue(svgStyle->glyphOrientationVertical()))
162                 return value.release();
163
164             if (svgStyle->glyphOrientationVertical() == GO_AUTO)
165                 return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
166
167             return 0;
168         }
169         case CSSPropertyWebkitSvgShadow:
170             return valueForShadow(svgStyle->shadow(), propertyID);
171         case CSSPropertyVectorEffect:
172             return CSSPrimitiveValue::create(svgStyle->vectorEffect());
173         case CSSPropertyMarker:
174         case CSSPropertyEnableBackground:
175         case CSSPropertyColorProfile:
176             // the above properties are not yet implemented in the engine
177             break;
178     default:
179         // If you crash here, it's because you added a css property and are not handling it
180         // in either this switch statement or the one in CSSComputedStyleDelcaration::getPropertyCSSValue
181         ASSERT_WITH_MESSAGE(0, "unimplemented propertyID: %d", propertyID);
182     }
183     LOG_ERROR("unimplemented propertyID: %d", propertyID);
184     return 0;
185 }
186
187 }
188
189 #endif // ENABLE(SVG)
190
191 // vim:ts=4:noet