Index: Source/core/svg/SVGLengthContext.cpp |
diff --git a/Source/core/svg/SVGLengthContext.cpp b/Source/core/svg/SVGLengthContext.cpp |
index d141761e87c8578f805b95bd1c72ee7de4832846..b1991a5b27eeedcf715ac2bf9a643df72d48b4da 100644 |
--- a/Source/core/svg/SVGLengthContext.cpp |
+++ b/Source/core/svg/SVGLengthContext.cpp |
@@ -41,10 +41,12 @@ SVGLengthContext::SVGLengthContext(const SVGElement* context) |
{ |
} |
-SVGLengthContext::SVGLengthContext(const SVGElement* context, const FloatRect& viewport) |
- : m_context(context) |
- , m_overridenViewport(viewport) |
+static float valueInSpecifiedUnitsWithPercentAdjustment(const SVGLength& length) |
{ |
+ // 100% = 100.0 instead of 1.0 for historical reasons. |
+ if (length.unitType() == LengthTypePercentage) |
+ return length.valueInSpecifiedUnits() / 100; |
+ return length.valueInSpecifiedUnits(); |
} |
FloatRect SVGLengthContext::resolveRectangle(const SVGElement* context, SVGUnitTypes::SVGUnitType type, const FloatRect& viewport, PassRefPtrWillBeRawPtr<SVGLength> passX, PassRefPtrWillBeRawPtr<SVGLength> passY, PassRefPtrWillBeRawPtr<SVGLength> passWidth, PassRefPtrWillBeRawPtr<SVGLength> passHeight) |
@@ -55,17 +57,17 @@ FloatRect SVGLengthContext::resolveRectangle(const SVGElement* context, SVGUnitT |
RefPtrWillBeRawPtr<SVGLength> height = passHeight; |
ASSERT(type != SVGUnitTypes::SVG_UNIT_TYPE_UNKNOWN); |
- if (type == SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) { |
- SVGLengthContext lengthContext(context); |
- return FloatRect(x->value(lengthContext), y->value(lengthContext), width->value(lengthContext), height->value(lengthContext)); |
+ if (type != SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE && !viewport.isEmpty()) { |
+ const FloatSize& viewportSize = viewport.size(); |
+ return FloatRect( |
+ convertValueFromPercentageToUserUnits(valueInSpecifiedUnitsWithPercentAdjustment(*x), x->unitMode(), viewportSize) + viewport.x(), |
+ convertValueFromPercentageToUserUnits(valueInSpecifiedUnitsWithPercentAdjustment(*y), y->unitMode(), viewportSize) + viewport.y(), |
+ convertValueFromPercentageToUserUnits(valueInSpecifiedUnitsWithPercentAdjustment(*width), width->unitMode(), viewportSize), |
+ convertValueFromPercentageToUserUnits(valueInSpecifiedUnitsWithPercentAdjustment(*height), height->unitMode(), viewportSize)); |
} |
- SVGLengthContext lengthContext(context, viewport); |
- return FloatRect( |
- x->value(lengthContext) + viewport.x(), |
- y->value(lengthContext) + viewport.y(), |
- width->value(lengthContext), |
- height->value(lengthContext)); |
+ SVGLengthContext lengthContext(context); |
+ return FloatRect(x->value(lengthContext), y->value(lengthContext), width->value(lengthContext), height->value(lengthContext)); |
} |
FloatPoint SVGLengthContext::resolvePoint(const SVGElement* context, SVGUnitTypes::SVGUnitType type, PassRefPtrWillBeRawPtr<SVGLength> passX, PassRefPtrWillBeRawPtr<SVGLength> passY) |
@@ -99,14 +101,6 @@ float SVGLengthContext::resolveLength(const SVGElement* context, SVGUnitTypes::S |
float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode, SVGLengthType fromUnit, ExceptionState& exceptionState) const |
{ |
- // If the SVGLengthContext carries a custom viewport, force resolving against it. |
- if (!m_overridenViewport.isEmpty()) { |
- // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed |
- if (fromUnit == LengthTypePercentage) |
- value /= 100; |
- return convertValueFromPercentageToUserUnits(value, mode, exceptionState); |
- } |
- |
switch (fromUnit) { |
case LengthTypeUnknown: |
exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::argumentNullOrIncorrectType(3, "SVGLengthType")); |
@@ -197,7 +191,11 @@ float SVGLengthContext::convertValueFromPercentageToUserUnits(float value, SVGLe |
exceptionState.throwDOMException(NotSupportedError, "The viewport could not be determined."); |
return 0; |
} |
+ return convertValueFromPercentageToUserUnits(value, mode, viewportSize); |
+} |
+float SVGLengthContext::convertValueFromPercentageToUserUnits(float value, SVGLengthMode mode, const FloatSize& viewportSize) |
+{ |
switch (mode) { |
case LengthModeWidth: |
return value * viewportSize.width(); |
@@ -293,12 +291,6 @@ bool SVGLengthContext::determineViewport(FloatSize& viewportSize) const |
if (!m_context) |
return false; |
- // If an overriden viewport is given, it has precedence. |
- if (!m_overridenViewport.isEmpty()) { |
- viewportSize = m_overridenViewport.size(); |
- return true; |
- } |
- |
// Root <svg> element lengths are resolved against the top level viewport. |
if (m_context->isOutermostSVGSVGElement()) { |
viewportSize = toSVGSVGElement(m_context)->currentViewportSize(); |