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(); |