| Index: Source/core/css/BasicShapeFunctions.cpp
|
| diff --git a/Source/core/css/BasicShapeFunctions.cpp b/Source/core/css/BasicShapeFunctions.cpp
|
| index 7692d2dcb90b49adbaf039d0f50f77957471c6d8..8f948ae8eeb4d49654c17aadd78c4d88f106699e 100644
|
| --- a/Source/core/css/BasicShapeFunctions.cpp
|
| +++ b/Source/core/css/BasicShapeFunctions.cpp
|
| @@ -33,12 +33,36 @@
|
| #include "core/css/CSSBasicShapes.h"
|
| #include "core/css/CSSPrimitiveValueMappings.h"
|
| #include "core/css/CSSValuePool.h"
|
| +#include "core/css/Pair.h"
|
| #include "core/css/resolver/StyleResolverState.h"
|
| #include "core/rendering/style/BasicShapes.h"
|
| #include "core/rendering/style/RenderStyle.h"
|
|
|
| namespace WebCore {
|
|
|
| +static PassRefPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool, const RenderStyle& style, const BasicShapeCenterCoordinate& center)
|
| +{
|
| + CSSValueID keyword = CSSValueInvalid;
|
| + switch (center.keyword()) {
|
| + case BasicShapeCenterCoordinate::None:
|
| + 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;
|
| + }
|
| +
|
| + return pool.createValue(Pair::create(pool.createIdentifierValue(keyword), pool.createValue(center.length(), style), Pair::DropIdenticalValues));
|
| +}
|
| +
|
| PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicShape* basicShape)
|
| {
|
| CSSValuePool& pool = cssValuePool();
|
| @@ -59,9 +83,9 @@ PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha
|
| basicShapeValue = rectangleValue.release();
|
| break;
|
| }
|
| - case BasicShape::BasicShapeCircleType: {
|
| - const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(basicShape);
|
| - RefPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create();
|
| + case BasicShape::DeprecatedBasicShapeCircleType: {
|
| + const DeprecatedBasicShapeCircle* circle = static_cast<const DeprecatedBasicShapeCircle*>(basicShape);
|
| + RefPtr<CSSDeprecatedBasicShapeCircle> circleValue = CSSDeprecatedBasicShapeCircle::create();
|
|
|
| circleValue->setCenterX(pool.createValue(circle->centerX(), style));
|
| circleValue->setCenterY(pool.createValue(circle->centerY(), style));
|
| @@ -70,6 +94,26 @@ PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha
|
| basicShapeValue = circleValue.release();
|
| break;
|
| }
|
| + case BasicShape::BasicShapeCircleType: {
|
| + const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(basicShape);
|
| + RefPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create();
|
| +
|
| + circleValue->setCenterX(valueForCenterCoordinate(pool, style, circle->centerX()));
|
| + circleValue->setCenterY(valueForCenterCoordinate(pool, style, circle->centerY()));
|
| + switch (circle->radius().type()) {
|
| + case BasicShapeRadius::Value:
|
| + circleValue->setRadius(pool.createValue(circle->radius().value(), style));
|
| + break;
|
| + case BasicShapeRadius::ClosestSide:
|
| + circleValue->setRadius(pool.createIdentifierValue(CSSValueClosestSide));
|
| + break;
|
| + case BasicShapeRadius::FarthestSide:
|
| + circleValue->setRadius(pool.createIdentifierValue(CSSValueFarthestSide));
|
| + break;
|
| + }
|
| + basicShapeValue = circleValue.release();
|
| + break;
|
| + }
|
| case BasicShape::BasicShapeEllipseType: {
|
| const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(basicShape);
|
| RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create();
|
| @@ -123,6 +167,33 @@ static Length convertToLength(const StyleResolverState& state, CSSPrimitiveValue
|
| return value->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
|
| }
|
|
|
| +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()));
|
| + }
|
| +
|
| + return BasicShapeCenterCoordinate(convertToLength(state, value));
|
| +}
|
| +
|
| PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const CSSBasicShape* basicShapeValue)
|
| {
|
| RefPtr<BasicShape> basicShape;
|
| @@ -150,9 +221,9 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
|
| basicShape = rect.release();
|
| break;
|
| }
|
| - case CSSBasicShape::CSSBasicShapeCircleType: {
|
| - const CSSBasicShapeCircle* circleValue = static_cast<const CSSBasicShapeCircle *>(basicShapeValue);
|
| - RefPtr<BasicShapeCircle> circle = BasicShapeCircle::create();
|
| + case CSSBasicShape::CSSDeprecatedBasicShapeCircleType: {
|
| + const CSSDeprecatedBasicShapeCircle* circleValue = static_cast<const CSSDeprecatedBasicShapeCircle *>(basicShapeValue);
|
| + RefPtr<DeprecatedBasicShapeCircle> circle = DeprecatedBasicShapeCircle::create();
|
|
|
| circle->setCenterX(convertToLength(state, circleValue->centerX()));
|
| circle->setCenterY(convertToLength(state, circleValue->centerY()));
|
| @@ -161,6 +232,40 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
|
| basicShape = circle.release();
|
| break;
|
| }
|
| + case CSSBasicShape::CSSBasicShapeCircleType: {
|
| + 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)));
|
| + }
|
| + if (RefPtr<CSSPrimitiveValue> radius = circleValue->radius()) {
|
| + if (radius->isValueID()) {
|
| + switch (radius->getValueID()) {
|
| + case CSSValueClosestSide:
|
| + circle->setRadius(BasicShapeRadius(BasicShapeRadius::ClosestSide));
|
| + break;
|
| + case CSSValueFarthestSide:
|
| + circle->setRadius(BasicShapeRadius(BasicShapeRadius::FarthestSide));
|
| + break;
|
| + default:
|
| + ASSERT_NOT_REACHED();
|
| + break;
|
| + }
|
| + } else {
|
| + circle->setRadius(BasicShapeRadius(convertToLength(state, radius.get())));
|
| + }
|
| + } else {
|
| + circle->setRadius(BasicShapeRadius(BasicShapeRadius::ClosestSide));
|
| + }
|
| +
|
| + basicShape = circle.release();
|
| + break;
|
| + }
|
| case CSSBasicShape::CSSBasicShapeEllipseType: {
|
| const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicShapeEllipse *>(basicShapeValue);
|
| RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create();
|
|
|