00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include "wtf/Platform.h"
00025
00026 #if ENABLE(SVG)
00027 #include "SVGEllipseElement.h"
00028
00029 #include "FloatPoint.h"
00030 #include "RenderPath.h"
00031 #include "SVGLength.h"
00032 #include "SVGNames.h"
00033
00034 namespace WebCore {
00035
00036 SVGEllipseElement::SVGEllipseElement(const QualifiedName& tagName, Document* doc)
00037 : SVGStyledTransformableElement(tagName, doc)
00038 , SVGTests()
00039 , SVGLangSpace()
00040 , SVGExternalResourcesRequired()
00041 , m_cx(this, LengthModeWidth)
00042 , m_cy(this, LengthModeHeight)
00043 , m_rx(this, LengthModeWidth)
00044 , m_ry(this, LengthModeHeight)
00045 {
00046 }
00047
00048 SVGEllipseElement::~SVGEllipseElement()
00049 {
00050 }
00051
00052 ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Cx, cx, SVGNames::cxAttr, m_cx)
00053 ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Cy, cy, SVGNames::cyAttr, m_cy)
00054 ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Rx, rx, SVGNames::rxAttr, m_rx)
00055 ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Ry, ry, SVGNames::ryAttr, m_ry)
00056
00057 void SVGEllipseElement::parseMappedAttribute(MappedAttribute* attr)
00058 {
00059 if (attr->name() == SVGNames::cxAttr)
00060 setCxBaseValue(SVGLength(this, LengthModeWidth, attr->value()));
00061 else if (attr->name() == SVGNames::cyAttr)
00062 setCyBaseValue(SVGLength(this, LengthModeHeight, attr->value()));
00063 else if (attr->name() == SVGNames::rxAttr) {
00064 setRxBaseValue(SVGLength(this, LengthModeWidth, attr->value()));
00065 if (rx().value() < 0.0)
00066 document()->accessSVGExtensions()->reportError("A negative value for ellipse <rx> is not allowed");
00067 } else if (attr->name() == SVGNames::ryAttr) {
00068 setRyBaseValue(SVGLength(this, LengthModeHeight, attr->value()));
00069 if (ry().value() < 0.0)
00070 document()->accessSVGExtensions()->reportError("A negative value for ellipse <ry> is not allowed");
00071 } else {
00072 if (SVGTests::parseMappedAttribute(attr))
00073 return;
00074 if (SVGLangSpace::parseMappedAttribute(attr))
00075 return;
00076 if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
00077 return;
00078 SVGStyledTransformableElement::parseMappedAttribute(attr);
00079 }
00080 }
00081
00082 void SVGEllipseElement::svgAttributeChanged(const QualifiedName& attrName)
00083 {
00084 SVGStyledTransformableElement::svgAttributeChanged(attrName);
00085
00086 if (!renderer())
00087 return;
00088
00089 if (attrName == SVGNames::cxAttr || attrName == SVGNames::cyAttr ||
00090 attrName == SVGNames::rxAttr || attrName == SVGNames::ryAttr ||
00091 SVGTests::isKnownAttribute(attrName) ||
00092 SVGLangSpace::isKnownAttribute(attrName) ||
00093 SVGExternalResourcesRequired::isKnownAttribute(attrName) ||
00094 SVGStyledTransformableElement::isKnownAttribute(attrName))
00095 renderer()->setNeedsLayout(true);
00096 }
00097
00098 Path SVGEllipseElement::toPathData() const
00099 {
00100 return Path::createEllipse(FloatPoint(cx().value(), cy().value()),
00101 rx().value(), ry().value());
00102 }
00103
00104 bool SVGEllipseElement::hasRelativeValues() const
00105 {
00106 return (cx().isRelative() || cy().isRelative() ||
00107 rx().isRelative() || ry().isRelative());
00108 }
00109
00110
00111 quint32 SVGEllipseElement::id() const
00112 {
00113 return SVGNames::ellipseTag.id();
00114 }
00115
00116 }
00117
00118 #endif // ENABLE(SVG)