Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Unified Diff: Source/core/css/BasicShapeFunctions.cpp

Issue 103413006: Implement parsing of the new ellipse shape syntax. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase after CSSParser rename Created 6 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/fast/shapes/parsing/parsing-test-utils.js ('k') | Source/core/css/CSSBasicShapes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/BasicShapeFunctions.cpp
diff --git a/Source/core/css/BasicShapeFunctions.cpp b/Source/core/css/BasicShapeFunctions.cpp
index 8f948ae8eeb4d49654c17aadd78c4d88f106699e..e6bdc103bc85e17a16d0acd89ec8e120f1bb5d2a 100644
--- a/Source/core/css/BasicShapeFunctions.cpp
+++ b/Source/core/css/BasicShapeFunctions.cpp
@@ -63,6 +63,21 @@ static PassRefPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool
return pool.createValue(Pair::create(pool.createIdentifierValue(keyword), pool.createValue(center.length(), style), Pair::DropIdenticalValues));
}
+static PassRefPtr<CSSPrimitiveValue> basicShapeRadiusToCSSValue(CSSValuePool& pool, const RenderStyle& style, const BasicShapeRadius& radius)
+{
+ switch (radius.type()) {
+ case BasicShapeRadius::Value:
+ return pool.createValue(radius.value(), style);
+ case BasicShapeRadius::ClosestSide:
+ return pool.createIdentifierValue(CSSValueClosestSide);
+ case BasicShapeRadius::FarthestSide:
+ return pool.createIdentifierValue(CSSValueFarthestSide);
+ }
+
+ ASSERT_NOT_REACHED();
+ return 0;
+}
+
PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicShape* basicShape)
{
CSSValuePool& pool = cssValuePool();
@@ -100,23 +115,13 @@ PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha
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;
- }
+ circleValue->setRadius(basicShapeRadiusToCSSValue(pool, style, circle->radius()));
basicShapeValue = circleValue.release();
break;
}
- case BasicShape::BasicShapeEllipseType: {
- const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(basicShape);
- RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create();
+ case BasicShape::DeprecatedBasicShapeEllipseType: {
+ const DeprecatedBasicShapeEllipse* ellipse = static_cast<const DeprecatedBasicShapeEllipse*>(basicShape);
+ RefPtr<CSSDeprecatedBasicShapeEllipse> ellipseValue = CSSDeprecatedBasicShapeEllipse::create();
ellipseValue->setCenterX(pool.createValue(ellipse->centerX(), style));
ellipseValue->setCenterY(pool.createValue(ellipse->centerY(), style));
@@ -126,6 +131,17 @@ PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha
basicShapeValue = ellipseValue.release();
break;
}
+ case BasicShape::BasicShapeEllipseType: {
+ const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(basicShape);
+ RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create();
+
+ ellipseValue->setCenterX(valueForCenterCoordinate(pool, style, ellipse->centerX()));
+ ellipseValue->setCenterY(valueForCenterCoordinate(pool, style, ellipse->centerY()));
+ ellipseValue->setRadiusX(basicShapeRadiusToCSSValue(pool, style, ellipse->radiusX()));
+ ellipseValue->setRadiusY(basicShapeRadiusToCSSValue(pool, style, ellipse->radiusY()));
+ basicShapeValue = ellipseValue.release();
+ break;
+ }
case BasicShape::BasicShapePolygonType: {
const BasicShapePolygon* polygon = static_cast<const BasicShapePolygon*>(basicShape);
RefPtr<CSSBasicShapePolygon> polygonValue = CSSBasicShapePolygon::create();
@@ -194,6 +210,26 @@ static BasicShapeCenterCoordinate convertToCenterCoordinate(const StyleResolverS
return BasicShapeCenterCoordinate(convertToLength(state, value));
}
+static BasicShapeRadius cssValueToBasicShapeRadius(const StyleResolverState& state, PassRefPtr<CSSPrimitiveValue> radius)
+{
+ if (!radius)
+ return BasicShapeRadius(BasicShapeRadius::ClosestSide);
+
+ if (radius->isValueID()) {
+ switch (radius->getValueID()) {
+ case CSSValueClosestSide:
+ return BasicShapeRadius(BasicShapeRadius::ClosestSide);
+ case CSSValueFarthestSide:
+ return BasicShapeRadius(BasicShapeRadius::FarthestSide);
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+
+ return BasicShapeRadius(convertToLength(state, radius.get()));
+}
+
PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const CSSBasicShape* basicShapeValue)
{
RefPtr<BasicShape> basicShape;
@@ -243,32 +279,14 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
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));
- }
+ circle->setRadius(cssValueToBasicShapeRadius(state, circleValue->radius()));
basicShape = circle.release();
break;
}
- case CSSBasicShape::CSSBasicShapeEllipseType: {
- const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicShapeEllipse *>(basicShapeValue);
- RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create();
+ case CSSBasicShape::CSSDeprecatedBasicShapeEllipseType: {
+ const CSSDeprecatedBasicShapeEllipse* ellipseValue = static_cast<const CSSDeprecatedBasicShapeEllipse *>(basicShapeValue);
+ RefPtr<DeprecatedBasicShapeEllipse> ellipse = DeprecatedBasicShapeEllipse::create();
ellipse->setCenterX(convertToLength(state, ellipseValue->centerX()));
ellipse->setCenterY(convertToLength(state, ellipseValue->centerY()));
@@ -278,6 +296,23 @@ PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const
basicShape = ellipse.release();
break;
}
+ case CSSBasicShape::CSSBasicShapeEllipseType: {
+ 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->setRadiusX(cssValueToBasicShapeRadius(state, ellipseValue->radiusX()));
+ ellipse->setRadiusY(cssValueToBasicShapeRadius(state, ellipseValue->radiusY()));
+
+ basicShape = ellipse.release();
+ break;
+ }
case CSSBasicShape::CSSBasicShapePolygonType: {
const CSSBasicShapePolygon* polygonValue = static_cast<const CSSBasicShapePolygon *>(basicShapeValue);
RefPtr<BasicShapePolygon> polygon = BasicShapePolygon::create();
« no previous file with comments | « LayoutTests/fast/shapes/parsing/parsing-test-utils.js ('k') | Source/core/css/CSSBasicShapes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698