Index: Source/core/svg/SVGLengthContext.cpp |
diff --git a/Source/core/svg/SVGLengthContext.cpp b/Source/core/svg/SVGLengthContext.cpp |
index f1b5ffceebe4232d09b09d7adb8a71706b85bf90..023cf5645ee4ac3725ee24d81d9a4b78f5a46f36 100644 |
--- a/Source/core/svg/SVGLengthContext.cpp |
+++ b/Source/core/svg/SVGLengthContext.cpp |
@@ -24,6 +24,7 @@ |
#include "core/svg/SVGLengthContext.h" |
#include "core/css/CSSHelper.h" |
+#include "core/css/CSSPrimitiveValue.h" |
#include "core/layout/LayoutObject.h" |
#include "core/layout/style/LayoutStyle.h" |
#include "core/svg/SVGSVGElement.h" |
@@ -48,7 +49,7 @@ static inline float dimensionForLengthMode(SVGLengthMode mode, const FloatSize& |
static float convertValueFromPercentageToUserUnits(const SVGLength& value, const FloatSize& viewportSize) |
{ |
- return value.scaleByPercentage(dimensionForLengthMode(value.unitMode(), viewportSize)); |
+ return CSSPrimitiveValue::clampToCSSLengthRange(value.scaleByPercentage(dimensionForLengthMode(value.unitMode(), viewportSize))); |
} |
SVGLengthContext::SVGLengthContext(const SVGElement* context) |
@@ -131,37 +132,51 @@ float SVGLengthContext::valueForLength(const Length& length, float zoom, float d |
float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode, SVGLengthType fromUnit) const |
{ |
+ float userUnits = value; |
switch (fromUnit) { |
case LengthTypeUnknown: |
return 0; |
- case LengthTypeNumber: |
- return value; |
case LengthTypePX: |
- return value; |
+ case LengthTypeNumber: |
+ userUnits = value; |
+ break; |
case LengthTypePercentage: { |
FloatSize viewportSize; |
if (!determineViewport(viewportSize)) |
return 0; |
- return value * dimensionForLengthMode(mode, viewportSize) / 100; |
+ userUnits = value * dimensionForLengthMode(mode, viewportSize) / 100; |
+ break; |
} |
case LengthTypeEMS: |
- return convertValueFromEMSToUserUnits(value); |
+ userUnits = convertValueFromEMSToUserUnits(value); |
+ break; |
case LengthTypeEXS: |
- return convertValueFromEXSToUserUnits(value); |
+ userUnits = convertValueFromEXSToUserUnits(value); |
+ break; |
case LengthTypeCM: |
- return value * cssPixelsPerCentimeter; |
+ userUnits = value * cssPixelsPerCentimeter; |
+ break; |
case LengthTypeMM: |
- return value * cssPixelsPerMillimeter; |
+ userUnits = value * cssPixelsPerMillimeter; |
+ break; |
case LengthTypeIN: |
- return value * cssPixelsPerInch; |
+ userUnits = value * cssPixelsPerInch; |
+ break; |
case LengthTypePT: |
- return value * cssPixelsPerPoint; |
+ userUnits = value * cssPixelsPerPoint; |
+ break; |
case LengthTypePC: |
- return value * cssPixelsPerPica; |
+ userUnits = value * cssPixelsPerPica; |
+ break; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ break; |
} |
- ASSERT_NOT_REACHED(); |
- return 0; |
+ // Since we mix css <length> values with svg's length values we need to |
+ // clamp values to the narrowest range, otherwise it can result in |
+ // rendering issues. |
+ return CSSPrimitiveValue::clampToCSSLengthRange(userUnits); |
} |
float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mode, SVGLengthType toUnit) const |