diff options
Diffstat (limited to 'Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp')
-rw-r--r-- | Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp b/Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp new file mode 100644 index 0000000..0cf6181 --- /dev/null +++ b/Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp @@ -0,0 +1,204 @@ +/* + Copyright (C) 2007 Eric Seidel <eric@webkit.org> + Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#if ENABLE(SVG) +#include "CSSComputedStyleDeclaration.h" + +#include "CSSPrimitiveValueMappings.h" +#include "CSSPropertyNames.h" +#include "Document.h" +#include "RenderStyle.h" + +namespace WebCore { + +static PassRefPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveValue(EGlyphOrientation orientation) +{ + switch (orientation) { + case GO_0DEG: + return CSSPrimitiveValue::create(0.0f, CSSPrimitiveValue::CSS_DEG); + case GO_90DEG: + return CSSPrimitiveValue::create(90.0f, CSSPrimitiveValue::CSS_DEG); + case GO_180DEG: + return CSSPrimitiveValue::create(180.0f, CSSPrimitiveValue::CSS_DEG); + case GO_270DEG: + return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG); + default: + return 0; + } +} + +static PassRefPtr<CSSValue> strokeDashArrayToCSSValueList(const Vector<SVGLength>& dashes) +{ + if (dashes.isEmpty()) + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + + RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); + const Vector<SVGLength>::const_iterator end = dashes.end(); + for (Vector<SVGLength>::const_iterator it = dashes.begin(); it != end; ++it) + list->append(SVGLength::toCSSPrimitiveValue(*it)); + + return list.release(); +} + +PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const +{ + Node* node = m_node.get(); + if (!node) + return 0; + + // Make sure our layout is up to date before we allow a query on these attributes. + if (updateLayout) + node->document()->updateLayout(); + + RenderStyle* style = node->computedStyle(); + if (!style) + return 0; + + const SVGRenderStyle* svgStyle = style->svgStyle(); + if (!svgStyle) + return 0; + + switch (static_cast<CSSPropertyID>(propertyID)) { + case CSSPropertyClipRule: + return CSSPrimitiveValue::create(svgStyle->clipRule()); + case CSSPropertyFloodOpacity: + return CSSPrimitiveValue::create(svgStyle->floodOpacity(), CSSPrimitiveValue::CSS_NUMBER); + case CSSPropertyStopOpacity: + return CSSPrimitiveValue::create(svgStyle->stopOpacity(), CSSPrimitiveValue::CSS_NUMBER); + case CSSPropertyColorInterpolation: + return CSSPrimitiveValue::create(svgStyle->colorInterpolation()); + case CSSPropertyColorInterpolationFilters: + return CSSPrimitiveValue::create(svgStyle->colorInterpolationFilters()); + case CSSPropertyFillOpacity: + return CSSPrimitiveValue::create(svgStyle->fillOpacity(), CSSPrimitiveValue::CSS_NUMBER); + case CSSPropertyFillRule: + return CSSPrimitiveValue::create(svgStyle->fillRule()); + case CSSPropertyColorRendering: + return CSSPrimitiveValue::create(svgStyle->colorRendering()); + case CSSPropertyImageRendering: + return CSSPrimitiveValue::create(svgStyle->imageRendering()); + case CSSPropertyShapeRendering: + return CSSPrimitiveValue::create(svgStyle->shapeRendering()); + case CSSPropertyStrokeLinecap: + return CSSPrimitiveValue::create(svgStyle->capStyle()); + case CSSPropertyStrokeLinejoin: + return CSSPrimitiveValue::create(svgStyle->joinStyle()); + case CSSPropertyStrokeMiterlimit: + return CSSPrimitiveValue::create(svgStyle->strokeMiterLimit(), CSSPrimitiveValue::CSS_NUMBER); + case CSSPropertyStrokeOpacity: + return CSSPrimitiveValue::create(svgStyle->strokeOpacity(), CSSPrimitiveValue::CSS_NUMBER); + case CSSPropertyAlignmentBaseline: + return CSSPrimitiveValue::create(svgStyle->alignmentBaseline()); + case CSSPropertyDominantBaseline: + return CSSPrimitiveValue::create(svgStyle->dominantBaseline()); + case CSSPropertyTextAnchor: + return CSSPrimitiveValue::create(svgStyle->textAnchor()); + case CSSPropertyWritingMode: + return CSSPrimitiveValue::create(svgStyle->writingMode()); + case CSSPropertyClipPath: + if (!svgStyle->clipperResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->clipperResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyMask: + if (!svgStyle->maskerResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->maskerResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyFilter: + if (!svgStyle->filterResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->filterResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyFloodColor: + return CSSPrimitiveValue::createColor(svgStyle->floodColor().rgb()); + case CSSPropertyLightingColor: + return CSSPrimitiveValue::createColor(svgStyle->lightingColor().rgb()); + case CSSPropertyStopColor: + return CSSPrimitiveValue::createColor(svgStyle->stopColor().rgb()); + case CSSPropertyFill: + return svgStyle->fillPaint(); + case CSSPropertyKerning: + return SVGLength::toCSSPrimitiveValue(svgStyle->kerning()); + case CSSPropertyMarkerEnd: + if (!svgStyle->markerEndResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->markerEndResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyMarkerMid: + if (!svgStyle->markerMidResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->markerMidResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyMarkerStart: + if (!svgStyle->markerStartResource().isEmpty()) + return CSSPrimitiveValue::create(svgStyle->markerStartResource(), CSSPrimitiveValue::CSS_URI); + return CSSPrimitiveValue::createIdentifier(CSSValueNone); + case CSSPropertyStroke: + return svgStyle->strokePaint(); + case CSSPropertyStrokeDasharray: + return strokeDashArrayToCSSValueList(svgStyle->strokeDashArray()); + case CSSPropertyStrokeDashoffset: + return SVGLength::toCSSPrimitiveValue(svgStyle->strokeDashOffset()); + case CSSPropertyStrokeWidth: + return SVGLength::toCSSPrimitiveValue(svgStyle->strokeWidth()); + case CSSPropertyBaselineShift: { + switch (svgStyle->baselineShift()) { + case BS_BASELINE: + return CSSPrimitiveValue::createIdentifier(CSSValueBaseline); + case BS_SUPER: + return CSSPrimitiveValue::createIdentifier(CSSValueSuper); + case BS_SUB: + return CSSPrimitiveValue::createIdentifier(CSSValueSub); + case BS_LENGTH: + return SVGLength::toCSSPrimitiveValue(svgStyle->baselineShiftValue()); + } + } + case CSSPropertyGlyphOrientationHorizontal: + return glyphOrientationToCSSPrimitiveValue(svgStyle->glyphOrientationHorizontal()); + case CSSPropertyGlyphOrientationVertical: { + if (RefPtr<CSSPrimitiveValue> value = glyphOrientationToCSSPrimitiveValue(svgStyle->glyphOrientationVertical())) + return value.release(); + + if (svgStyle->glyphOrientationVertical() == GO_AUTO) + return CSSPrimitiveValue::createIdentifier(CSSValueAuto); + + return 0; + } + case CSSPropertyWebkitSvgShadow: + return valueForShadow(svgStyle->shadow(), propertyID, style); + case CSSPropertyVectorEffect: + return CSSPrimitiveValue::create(svgStyle->vectorEffect()); + case CSSPropertyMarker: + case CSSPropertyEnableBackground: + case CSSPropertyColorProfile: + // the above properties are not yet implemented in the engine + break; + default: + // If you crash here, it's because you added a css property and are not handling it + // in either this switch statement or the one in CSSComputedStyleDelcaration::getPropertyCSSValue + ASSERT_WITH_MESSAGE(0, "unimplemented propertyID: %d", propertyID); + } + LOG_ERROR("unimplemented propertyID: %d", propertyID); + return 0; +} + +} + +#endif // ENABLE(SVG) + +// vim:ts=4:noet |