| Index: Source/core/svg/SVGLengthContext.cpp
|
| diff --git a/Source/core/svg/SVGLengthContext.cpp b/Source/core/svg/SVGLengthContext.cpp
|
| index 3bf1f9a27ad61ef7e4abb842f82c4149cb6ceb4b..0464f26affd2d14ada7b70961359f5f142525276 100644
|
| --- a/Source/core/svg/SVGLengthContext.cpp
|
| +++ b/Source/core/svg/SVGLengthContext.cpp
|
| @@ -53,6 +53,54 @@ static float convertValueFromPercentageToUserUnits(const SVGLength& value, const
|
| return CSSPrimitiveValue::clampToCSSLengthRange(value.scaleByPercentage(dimensionForLengthMode(value.unitMode(), viewportSize)));
|
| }
|
|
|
| +static const ComputedStyle* computedStyleForLengthResolving(const SVGElement* context)
|
| +{
|
| + if (!context)
|
| + return 0;
|
| +
|
| + const ContainerNode* currentContext = context;
|
| + do {
|
| + if (currentContext->layoutObject())
|
| + return currentContext->layoutObject()->style();
|
| + currentContext = currentContext->parentNode();
|
| + } while (currentContext);
|
| +
|
| + // There must be at least a LayoutSVGRoot renderer, carrying a style.
|
| + ASSERT_NOT_REACHED();
|
| + return 0;
|
| +}
|
| +
|
| +static const ComputedStyle* rootElementStyle(const Node* context)
|
| +{
|
| + if (!context)
|
| + return 0;
|
| +
|
| + const Document& document = context->document();
|
| + Node* documentElement = document.documentElement();
|
| + const ComputedStyle* documentStyle = document.computedStyle();
|
| + const ComputedStyle* style = documentElement && context != documentElement ? documentElement->computedStyle() : documentStyle;
|
| + if (!style)
|
| + style = documentStyle;
|
| + return style;
|
| +}
|
| +
|
| +static float convertValueFromUserUnitsToEMS(const ComputedStyle* style, float value)
|
| +{
|
| + if (!style)
|
| + return 0;
|
| + float fontSize = style->specifiedFontSize();
|
| + if (!fontSize)
|
| + return 0;
|
| + return value / fontSize;
|
| +}
|
| +
|
| +static float convertValueFromEMSToUserUnits(const ComputedStyle* style, float value)
|
| +{
|
| + if (!style)
|
| + return 0;
|
| + return value * style->specifiedFontSize();
|
| +}
|
| +
|
| SVGLengthContext::SVGLengthContext(const SVGElement* context)
|
| : m_context(context)
|
| {
|
| @@ -149,7 +197,7 @@ float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode,
|
| break;
|
| }
|
| case LengthTypeEMS:
|
| - userUnits = convertValueFromEMSToUserUnits(value);
|
| + userUnits = convertValueFromEMSToUserUnits(computedStyleForLengthResolving(m_context), value);
|
| break;
|
| case LengthTypeEXS:
|
| userUnits = convertValueFromEXSToUserUnits(value);
|
| @@ -170,7 +218,7 @@ float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode,
|
| userUnits = value * cssPixelsPerPica;
|
| break;
|
| case LengthTypeREMS:
|
| - userUnits = convertValueFromREMSToUserUnits(value);
|
| + userUnits = convertValueFromEMSToUserUnits(rootElementStyle(m_context), value);
|
| break;
|
| default:
|
| ASSERT_NOT_REACHED();
|
| @@ -199,11 +247,11 @@ float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mod
|
| return value * 100 / dimensionForLengthMode(mode, viewportSize);
|
| }
|
| case LengthTypeEMS:
|
| - return convertValueFromUserUnitsToEMS(value);
|
| + return convertValueFromUserUnitsToEMS(computedStyleForLengthResolving(m_context), value);
|
| case LengthTypeEXS:
|
| return convertValueFromUserUnitsToEXS(value);
|
| case LengthTypeREMS:
|
| - return convertValueFromUserUnitsToREMS(value);
|
| + return convertValueFromUserUnitsToEMS(rootElementStyle(m_context), value);
|
| case LengthTypePX:
|
| return value;
|
| case LengthTypeCM:
|
| @@ -222,86 +270,6 @@ float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mod
|
| return 0;
|
| }
|
|
|
| -static inline const ComputedStyle* computedStyleForLengthResolving(const SVGElement* context)
|
| -{
|
| - if (!context)
|
| - return 0;
|
| -
|
| - const ContainerNode* currentContext = context;
|
| - do {
|
| - if (currentContext->layoutObject())
|
| - return currentContext->layoutObject()->style();
|
| - currentContext = currentContext->parentNode();
|
| - } while (currentContext);
|
| -
|
| - // There must be at least a LayoutSVGRoot renderer, carrying a style.
|
| - ASSERT_NOT_REACHED();
|
| - return 0;
|
| -}
|
| -
|
| -float SVGLengthContext::convertValueFromUserUnitsToEMS(float value) const
|
| -{
|
| - const ComputedStyle* style = computedStyleForLengthResolving(m_context);
|
| - if (!style)
|
| - return 0;
|
| -
|
| - float fontSize = style->specifiedFontSize();
|
| - if (!fontSize)
|
| - return 0;
|
| -
|
| - return value / fontSize;
|
| -}
|
| -
|
| -float SVGLengthContext::convertValueFromEMSToUserUnits(float value) const
|
| -{
|
| - const ComputedStyle* style = computedStyleForLengthResolving(m_context);
|
| - if (!style)
|
| - return 0;
|
| - return value * style->specifiedFontSize();
|
| -}
|
| -
|
| -float SVGLengthContext::convertValueFromUserUnitsToREMS(float value) const
|
| -{
|
| - if (!m_context)
|
| - return 0;
|
| -
|
| - const ComputedStyle* style = 0;
|
| - const Document& document = m_context->document();
|
| - Node* documentElement = document.documentElement();
|
| - const ComputedStyle* documentStyle = document.computedStyle();
|
| - style = documentElement && (static_cast<const Node*>(m_context.get()) != documentElement) ? documentElement->computedStyle() : documentStyle;
|
| - if (!style)
|
| - style = documentStyle;
|
| -
|
| - if (!style)
|
| - return 0;
|
| -
|
| - float fontSize = style->specifiedFontSize();
|
| - if (!fontSize)
|
| - return 0;
|
| -
|
| - return value / fontSize;
|
| -}
|
| -
|
| -float SVGLengthContext::convertValueFromREMSToUserUnits(float value) const
|
| -{
|
| - if (!m_context)
|
| - return 0;
|
| -
|
| - const ComputedStyle* style = 0;
|
| - const Document& document = m_context->document();
|
| - Node* documentElement = document.documentElement();
|
| - const ComputedStyle* documentStyle = document.computedStyle();
|
| - style = documentElement && (static_cast<const Node*>(m_context.get()) != documentElement) ? documentElement->computedStyle() : documentStyle;
|
| - if (!style)
|
| - style = documentStyle;
|
| -
|
| - if (!style)
|
| - return 0;
|
| -
|
| - return value * style->specifiedFontSize();
|
| -}
|
| -
|
| float SVGLengthContext::convertValueFromUserUnitsToEXS(float value) const
|
| {
|
| const ComputedStyle* style = computedStyleForLengthResolving(m_context);
|
|
|