| Index: Source/core/css/CSSGradientValue.cpp
|
| diff --git a/Source/core/css/CSSGradientValue.cpp b/Source/core/css/CSSGradientValue.cpp
|
| index 11c8c2b53ea29f91c3c0ec9d24f94537af17ceb0..f46cbf59f0fe2534b06b0aa5f60a27bdfa8c6b98 100644
|
| --- a/Source/core/css/CSSGradientValue.cpp
|
| +++ b/Source/core/css/CSSGradientValue.cpp
|
| @@ -30,7 +30,7 @@
|
| #include "core/CSSValueKeywords.h"
|
| #include "core/css/CSSCalculationValue.h"
|
| #include "core/css/CSSToLengthConversionData.h"
|
| -#include "core/css/Pair.h"
|
| +#include "core/css/CSSValuePair.h"
|
| #include "core/dom/NodeComputedStyle.h"
|
| #include "core/dom/TextLinkColors.h"
|
| #include "core/layout/LayoutObject.h"
|
| @@ -480,7 +480,7 @@ void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD
|
| }
|
| }
|
|
|
| -static float positionFromValue(CSSPrimitiveValue* value, const CSSToLengthConversionData& conversionData, const IntSize& size, bool isHorizontal)
|
| +static float positionFromValue(CSSValue* value, const CSSToLengthConversionData& conversionData, const IntSize& size, bool isHorizontal)
|
| {
|
| int origin = 0;
|
| int sign = 1;
|
| @@ -488,8 +488,9 @@ static float positionFromValue(CSSPrimitiveValue* value, const CSSToLengthConver
|
|
|
| // In this case the center of the gradient is given relative to an edge in the form of:
|
| // [ top | bottom | right | left ] [ <percentage> | <length> ].
|
| - if (Pair* pair = value->getPairValue()) {
|
| - CSSValueID originID = pair->first()->getValueID();
|
| + if (value->isValuePair()) {
|
| + CSSValuePair* pair = toCSSValuePair(value);
|
| + CSSValueID originID = toCSSPrimitiveValue(pair->first())->getValueID();
|
| value = pair->second();
|
|
|
| if (originID == CSSValueRight || originID == CSSValueBottom) {
|
| @@ -499,16 +500,18 @@ static float positionFromValue(CSSPrimitiveValue* value, const CSSToLengthConver
|
| }
|
| }
|
|
|
| - if (value->isNumber())
|
| - return origin + sign * value->getFloatValue() * conversionData.zoom();
|
| + CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
|
|
|
| - if (value->isPercentage())
|
| - return origin + sign * value->getFloatValue() / 100.f * edgeDistance;
|
| + if (primitiveValue->isNumber())
|
| + return origin + sign * primitiveValue->getFloatValue() * conversionData.zoom();
|
|
|
| - if (value->isCalculatedPercentageWithLength())
|
| - return origin + sign * value->cssCalcValue()->toCalcValue(conversionData)->evaluate(edgeDistance);
|
| + if (primitiveValue->isPercentage())
|
| + return origin + sign * primitiveValue->getFloatValue() / 100.f * edgeDistance;
|
|
|
| - switch (value->getValueID()) {
|
| + if (primitiveValue->isCalculatedPercentageWithLength())
|
| + return origin + sign * primitiveValue->cssCalcValue()->toCalcValue(conversionData)->evaluate(edgeDistance);
|
| +
|
| + switch (primitiveValue->getValueID()) {
|
| case CSSValueTop:
|
| ASSERT(!isHorizontal);
|
| return 0;
|
| @@ -525,10 +528,10 @@ static float positionFromValue(CSSPrimitiveValue* value, const CSSToLengthConver
|
| break;
|
| }
|
|
|
| - return origin + sign * value->computeLength<float>(conversionData);
|
| + return origin + sign * primitiveValue->computeLength<float>(conversionData);
|
| }
|
|
|
| -FloatPoint CSSGradientValue::computeEndPoint(CSSPrimitiveValue* horizontal, CSSPrimitiveValue* vertical, const CSSToLengthConversionData& conversionData, const IntSize& size)
|
| +FloatPoint CSSGradientValue::computeEndPoint(CSSValue* horizontal, CSSValue* vertical, const CSSToLengthConversionData& conversionData, const IntSize& size)
|
| {
|
| FloatPoint result;
|
|
|
| @@ -636,7 +639,7 @@ String CSSLinearGradientValue::customCSSText() const
|
| if (m_angle && m_angle->computeDegrees() != 180) {
|
| result.append(m_angle->cssText());
|
| wroteSomething = true;
|
| - } else if ((m_firstX || m_firstY) && !(!m_firstX && m_firstY && m_firstY->getValueID() == CSSValueBottom)) {
|
| + } else if ((m_firstX || m_firstY) && !(!m_firstX && m_firstY && m_firstY->isPrimitiveValue() && toCSSPrimitiveValue(m_firstY.get())->getValueID() == CSSValueBottom)) {
|
| result.appendLiteral("to ");
|
| if (m_firstX && m_firstY) {
|
| result.append(m_firstX->cssText());
|
| @@ -772,9 +775,9 @@ PassRefPtr<Gradient> CSSLinearGradientValue::createGradient(const CSSToLengthCon
|
| // "Magic" corners, so the 50% line touches two corners.
|
| float rise = size.width();
|
| float run = size.height();
|
| - if (m_firstX && m_firstX->getValueID() == CSSValueLeft)
|
| + if (m_firstX && m_firstX->isPrimitiveValue() && toCSSPrimitiveValue(m_firstX.get())->getValueID() == CSSValueLeft)
|
| run *= -1;
|
| - if (m_firstY && m_firstY->getValueID() == CSSValueBottom)
|
| + if (m_firstY && m_firstY->isPrimitiveValue() && toCSSPrimitiveValue(m_firstY.get())->getValueID() == CSSValueBottom)
|
| rise *= -1;
|
| // Compute angle, and flip it back to "bearing angle" degrees.
|
| float angle = 90 - rad2deg(atan2(rise, run));
|
|
|