| Index: Source/core/css/BasicShapeFunctions.cpp
|
| diff --git a/Source/core/css/BasicShapeFunctions.cpp b/Source/core/css/BasicShapeFunctions.cpp
|
| index 10b23f9344d67eddb35397f8cd0a9b770ddf3b1e..d482a76a4d9a7024d75172e299a34212aeb7ffbb 100644
|
| --- a/Source/core/css/BasicShapeFunctions.cpp
|
| +++ b/Source/core/css/BasicShapeFunctions.cpp
|
| @@ -40,25 +40,12 @@
|
|
|
| namespace WebCore {
|
|
|
| -static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const RenderStyle& style, const BasicShapeCenterCoordinate& center)
|
| +static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const RenderStyle& style, const BasicShapeCenterCoordinate& center, EBoxOrient orientation)
|
| {
|
| - CSSValueID keyword = CSSValueInvalid;
|
| - switch (center.keyword()) {
|
| - case BasicShapeCenterCoordinate::None:
|
| + if (center.direction() == BasicShapeCenterCoordinate::TopLeft)
|
| return pool.createValue(center.length(), style);
|
| - case BasicShapeCenterCoordinate::Top:
|
| - keyword = CSSValueTop;
|
| - break;
|
| - case BasicShapeCenterCoordinate::Right:
|
| - keyword = CSSValueRight;
|
| - break;
|
| - case BasicShapeCenterCoordinate::Bottom:
|
| - keyword = CSSValueBottom;
|
| - break;
|
| - case BasicShapeCenterCoordinate::Left:
|
| - keyword = CSSValueLeft;
|
| - break;
|
| - }
|
| +
|
| + CSSValueID keyword = orientation == HORIZONTAL ? CSSValueRight : CSSValueBottom;
|
|
|
| return pool.createValue(Pair::create(pool.createIdentifierValue(keyword), pool.createValue(center.length(), style), Pair::DropIdenticalValues));
|
| }
|
| @@ -113,8 +100,8 @@ PassRefPtrWillBeRawPtr<CSSValue> valueForBasicShape(const RenderStyle& style, co
|
| const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(basicShape);
|
| RefPtrWillBeRawPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create();
|
|
|
| - circleValue->setCenterX(valueForCenterCoordinate(pool, style, circle->centerX()));
|
| - circleValue->setCenterY(valueForCenterCoordinate(pool, style, circle->centerY()));
|
| + circleValue->setCenterX(valueForCenterCoordinate(pool, style, circle->centerX(), HORIZONTAL));
|
| + circleValue->setCenterY(valueForCenterCoordinate(pool, style, circle->centerY(), VERTICAL));
|
| circleValue->setRadius(basicShapeRadiusToCSSValue(pool, style, circle->radius()));
|
| basicShapeValue = circleValue.release();
|
| break;
|
| @@ -135,8 +122,8 @@ PassRefPtrWillBeRawPtr<CSSValue> valueForBasicShape(const RenderStyle& style, co
|
| const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(basicShape);
|
| RefPtrWillBeRawPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create();
|
|
|
| - ellipseValue->setCenterX(valueForCenterCoordinate(pool, style, ellipse->centerX()));
|
| - ellipseValue->setCenterY(valueForCenterCoordinate(pool, style, ellipse->centerY()));
|
| + ellipseValue->setCenterX(valueForCenterCoordinate(pool, style, ellipse->centerX(), HORIZONTAL));
|
| + ellipseValue->setCenterY(valueForCenterCoordinate(pool, style, ellipse->centerY(), VERTICAL));
|
| ellipseValue->setRadiusX(basicShapeRadiusToCSSValue(pool, style, ellipse->radiusX()));
|
| ellipseValue->setRadiusY(basicShapeRadiusToCSSValue(pool, style, ellipse->radiusY()));
|
| basicShapeValue = ellipseValue.release();
|
| @@ -213,29 +200,41 @@ static LengthSize convertToLengthSize(const StyleResolverState& state, CSSPrimit
|
|
|
| static BasicShapeCenterCoordinate convertToCenterCoordinate(const StyleResolverState& state, CSSPrimitiveValue* value)
|
| {
|
| - if (Pair* pair = value->getPairValue()) {
|
| - BasicShapeCenterCoordinate::Keyword keyword = BasicShapeCenterCoordinate::None;
|
| - switch (pair->first()->getValueID()) {
|
| - case CSSValueTop:
|
| - keyword = BasicShapeCenterCoordinate::Top;
|
| - break;
|
| - case CSSValueRight:
|
| - keyword = BasicShapeCenterCoordinate::Right;
|
| - break;
|
| - case CSSValueBottom:
|
| - keyword = BasicShapeCenterCoordinate::Bottom;
|
| - break;
|
| - case CSSValueLeft:
|
| - keyword = BasicShapeCenterCoordinate::Left;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - return BasicShapeCenterCoordinate(keyword, convertToLength(state, pair->second()));
|
| + BasicShapeCenterCoordinate::Direction direction;
|
| + Length offset = Length(0, Fixed);
|
| +
|
| + CSSValueID keyword = CSSValueTop;
|
| + if (!value) {
|
| + keyword = CSSValueCenter;
|
| + } else if (value->isValueID()) {
|
| + keyword = value->getValueID();
|
| + } else if (Pair* pair = value->getPairValue()) {
|
| + keyword = pair->first()->getValueID();
|
| + offset = convertToLength(state, pair->second());
|
| + } else {
|
| + offset = convertToLength(state, value);
|
| + }
|
| +
|
| + switch (keyword) {
|
| + case CSSValueTop:
|
| + case CSSValueLeft:
|
| + direction = BasicShapeCenterCoordinate::TopLeft;
|
| + break;
|
| + case CSSValueRight:
|
| + case CSSValueBottom:
|
| + direction = BasicShapeCenterCoordinate::BottomRight;
|
| + break;
|
| + case CSSValueCenter:
|
| + direction = BasicShapeCenterCoordinate::TopLeft;
|
| + offset = Length(50, Percent);
|
| + break;
|
| + default:
|
| + ASSERT_NOT_REACHED();
|
| + direction = BasicShapeCenterCoordinate::TopLeft;
|
| + break;
|
| }
|
|
|
| - return BasicShapeCenterCoordinate(convertToLength(state, value));
|
| + return BasicShapeCenterCoordinate(direction, offset);
|
| }
|
|
|
| static BasicShapeRadius cssValueToBasicShapeRadius(const StyleResolverState& state, PassRefPtrWillBeRawPtr<CSSPrimitiveValue> radius)
|
| @@ -300,13 +299,8 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
|
| const CSSBasicShapeCircle* circleValue = static_cast<const CSSBasicShapeCircle *>(basicShapeValue);
|
| RefPtr<BasicShapeCircle> circle = BasicShapeCircle::create();
|
|
|
| - if (circleValue->centerX() && circleValue->centerY()) {
|
| - circle->setCenterX(convertToCenterCoordinate(state, circleValue->centerX()));
|
| - circle->setCenterY(convertToCenterCoordinate(state, circleValue->centerY()));
|
| - } else {
|
| - circle->setCenterX(BasicShapeCenterCoordinate(Length(50, Percent)));
|
| - circle->setCenterY(BasicShapeCenterCoordinate(Length(50, Percent)));
|
| - }
|
| + circle->setCenterX(convertToCenterCoordinate(state, circleValue->centerX()));
|
| + circle->setCenterY(convertToCenterCoordinate(state, circleValue->centerY()));
|
| circle->setRadius(cssValueToBasicShapeRadius(state, circleValue->radius()));
|
|
|
| basicShape = circle.release();
|
| @@ -328,13 +322,8 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
|
| const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicShapeEllipse *>(basicShapeValue);
|
| RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create();
|
|
|
| - if (ellipseValue->centerX() && ellipseValue->centerY()) {
|
| - ellipse->setCenterX(convertToCenterCoordinate(state, ellipseValue->centerX()));
|
| - ellipse->setCenterY(convertToCenterCoordinate(state, ellipseValue->centerY()));
|
| - } else {
|
| - ellipse->setCenterX(BasicShapeCenterCoordinate(Length(50, Percent)));
|
| - ellipse->setCenterY(BasicShapeCenterCoordinate(Length(50, Percent)));
|
| - }
|
| + ellipse->setCenterX(convertToCenterCoordinate(state, ellipseValue->centerX()));
|
| + ellipse->setCenterY(convertToCenterCoordinate(state, ellipseValue->centerY()));
|
| ellipse->setRadiusX(cssValueToBasicShapeRadius(state, ellipseValue->radiusX()));
|
| ellipse->setRadiusY(cssValueToBasicShapeRadius(state, ellipseValue->radiusY()));
|
|
|
| @@ -406,31 +395,9 @@ FloatPoint floatPointForCenterCoordinate(const BasicShapeCenterCoordinate& cente
|
| {
|
| FloatPoint p;
|
| float offset = floatValueForLength(centerX.length(), boxSize.width());
|
| - switch (centerX.keyword()) {
|
| - case BasicShapeCenterCoordinate::None:
|
| - case BasicShapeCenterCoordinate::Left:
|
| - p.setX(offset);
|
| - break;
|
| - case BasicShapeCenterCoordinate::Right:
|
| - p.setX(boxSize.width() - offset);
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -
|
| + p.setX(centerX.direction() == BasicShapeCenterCoordinate::TopLeft ? offset : boxSize.width() - offset);
|
| offset = floatValueForLength(centerY.length(), boxSize.height());
|
| - switch (centerY.keyword()) {
|
| - case BasicShapeCenterCoordinate::None:
|
| - case BasicShapeCenterCoordinate::Top:
|
| - p.setY(offset);
|
| - break;
|
| - case BasicShapeCenterCoordinate::Bottom:
|
| - p.setY(boxSize.height() - offset);
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -
|
| + p.setY(centerY.direction() == BasicShapeCenterCoordinate::TopLeft ? offset : boxSize.height() - offset);
|
| return p;
|
| }
|
|
|
|
|