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

Side by Side Diff: Source/core/css/BasicShapeFunctions.cpp

Issue 98723006: Parse new circle shape syntax (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase after 164114 Created 7 years 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 15 matching lines...) Expand all
26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE. 27 * SUCH DAMAGE.
28 */ 28 */
29 29
30 #include "config.h" 30 #include "config.h"
31 #include "core/css/BasicShapeFunctions.h" 31 #include "core/css/BasicShapeFunctions.h"
32 32
33 #include "core/css/CSSBasicShapes.h" 33 #include "core/css/CSSBasicShapes.h"
34 #include "core/css/CSSPrimitiveValueMappings.h" 34 #include "core/css/CSSPrimitiveValueMappings.h"
35 #include "core/css/CSSValuePool.h" 35 #include "core/css/CSSValuePool.h"
36 #include "core/css/Pair.h"
36 #include "core/css/resolver/StyleResolverState.h" 37 #include "core/css/resolver/StyleResolverState.h"
37 #include "core/rendering/style/BasicShapes.h" 38 #include "core/rendering/style/BasicShapes.h"
38 #include "core/rendering/style/RenderStyle.h" 39 #include "core/rendering/style/RenderStyle.h"
39 40
40 namespace WebCore { 41 namespace WebCore {
41 42
43 static PassRefPtr<CSSPrimitiveValue> valueForCenterCoordinate(CSSValuePool& pool , const RenderStyle& style, const BasicShapeCenterCoordinate& center)
44 {
45 CSSValueID keyword = CSSValueInvalid;
46 switch (center.keyword()) {
47 case BasicShapeCenterCoordinate::None:
48 return pool.createValue(center.length(), style);
49 case BasicShapeCenterCoordinate::Top:
50 keyword = CSSValueTop;
51 break;
52 case BasicShapeCenterCoordinate::Right:
53 keyword = CSSValueRight;
54 break;
55 case BasicShapeCenterCoordinate::Bottom:
56 keyword = CSSValueBottom;
57 break;
58 case BasicShapeCenterCoordinate::Left:
59 keyword = CSSValueLeft;
60 break;
61 }
62
63 return pool.createValue(Pair::create(pool.createIdentifierValue(keyword), po ol.createValue(center.length(), style), Pair::DropIdenticalValues));
64 }
65
42 PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha pe* basicShape) 66 PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle& style, const BasicSha pe* basicShape)
43 { 67 {
44 CSSValuePool& pool = cssValuePool(); 68 CSSValuePool& pool = cssValuePool();
45 69
46 RefPtr<CSSBasicShape> basicShapeValue; 70 RefPtr<CSSBasicShape> basicShapeValue;
47 switch (basicShape->type()) { 71 switch (basicShape->type()) {
48 case BasicShape::BasicShapeRectangleType: { 72 case BasicShape::BasicShapeRectangleType: {
49 const BasicShapeRectangle* rectangle = static_cast<const BasicShapeRecta ngle*>(basicShape); 73 const BasicShapeRectangle* rectangle = static_cast<const BasicShapeRecta ngle*>(basicShape);
50 RefPtr<CSSBasicShapeRectangle> rectangleValue = CSSBasicShapeRectangle:: create(); 74 RefPtr<CSSBasicShapeRectangle> rectangleValue = CSSBasicShapeRectangle:: create();
51 75
52 rectangleValue->setX(pool.createValue(rectangle->x(), style)); 76 rectangleValue->setX(pool.createValue(rectangle->x(), style));
53 rectangleValue->setY(pool.createValue(rectangle->y(), style)); 77 rectangleValue->setY(pool.createValue(rectangle->y(), style));
54 rectangleValue->setWidth(pool.createValue(rectangle->width(), style)); 78 rectangleValue->setWidth(pool.createValue(rectangle->width(), style));
55 rectangleValue->setHeight(pool.createValue(rectangle->height(), style)); 79 rectangleValue->setHeight(pool.createValue(rectangle->height(), style));
56 rectangleValue->setRadiusX(pool.createValue(rectangle->cornerRadiusX(), style)); 80 rectangleValue->setRadiusX(pool.createValue(rectangle->cornerRadiusX(), style));
57 rectangleValue->setRadiusY(pool.createValue(rectangle->cornerRadiusY(), style)); 81 rectangleValue->setRadiusY(pool.createValue(rectangle->cornerRadiusY(), style));
58 82
59 basicShapeValue = rectangleValue.release(); 83 basicShapeValue = rectangleValue.release();
60 break; 84 break;
61 } 85 }
62 case BasicShape::BasicShapeCircleType: { 86 case BasicShape::DeprecatedBasicShapeCircleType: {
63 const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(ba sicShape); 87 const DeprecatedBasicShapeCircle* circle = static_cast<const DeprecatedB asicShapeCircle*>(basicShape);
64 RefPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create(); 88 RefPtr<CSSDeprecatedBasicShapeCircle> circleValue = CSSDeprecatedBasicSh apeCircle::create();
65 89
66 circleValue->setCenterX(pool.createValue(circle->centerX(), style)); 90 circleValue->setCenterX(pool.createValue(circle->centerX(), style));
67 circleValue->setCenterY(pool.createValue(circle->centerY(), style)); 91 circleValue->setCenterY(pool.createValue(circle->centerY(), style));
68 circleValue->setRadius(pool.createValue(circle->radius(), style)); 92 circleValue->setRadius(pool.createValue(circle->radius(), style));
69 93
70 basicShapeValue = circleValue.release(); 94 basicShapeValue = circleValue.release();
71 break; 95 break;
72 } 96 }
97 case BasicShape::BasicShapeCircleType: {
98 const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(ba sicShape);
99 RefPtr<CSSBasicShapeCircle> circleValue = CSSBasicShapeCircle::create();
100
101 circleValue->setCenterX(valueForCenterCoordinate(pool, style, circle->ce nterX()));
102 circleValue->setCenterY(valueForCenterCoordinate(pool, style, circle->ce nterY()));
103 switch (circle->radius().type()) {
104 case BasicShapeRadius::Value:
105 circleValue->setRadius(pool.createValue(circle->radius().value(), st yle));
106 break;
107 case BasicShapeRadius::ClosestSide:
108 circleValue->setRadius(pool.createIdentifierValue(CSSValueClosestSid e));
109 break;
110 case BasicShapeRadius::FarthestSide:
111 circleValue->setRadius(pool.createIdentifierValue(CSSValueFarthestSi de));
112 break;
113 }
114 basicShapeValue = circleValue.release();
115 break;
116 }
73 case BasicShape::BasicShapeEllipseType: { 117 case BasicShape::BasicShapeEllipseType: {
74 const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*> (basicShape); 118 const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*> (basicShape);
75 RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create (); 119 RefPtr<CSSBasicShapeEllipse> ellipseValue = CSSBasicShapeEllipse::create ();
76 120
77 ellipseValue->setCenterX(pool.createValue(ellipse->centerX(), style)); 121 ellipseValue->setCenterX(pool.createValue(ellipse->centerX(), style));
78 ellipseValue->setCenterY(pool.createValue(ellipse->centerY(), style)); 122 ellipseValue->setCenterY(pool.createValue(ellipse->centerY(), style));
79 ellipseValue->setRadiusX(pool.createValue(ellipse->radiusX(), style)); 123 ellipseValue->setRadiusX(pool.createValue(ellipse->radiusX(), style));
80 ellipseValue->setRadiusY(pool.createValue(ellipse->radiusY(), style)); 124 ellipseValue->setRadiusY(pool.createValue(ellipse->radiusY(), style));
81 125
82 basicShapeValue = ellipseValue.release(); 126 basicShapeValue = ellipseValue.release();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 basicShapeValue->setLayoutBox(pool.createValue(basicShape->layoutBox())) ; 160 basicShapeValue->setLayoutBox(pool.createValue(basicShape->layoutBox())) ;
117 161
118 return pool.createValue(basicShapeValue.release()); 162 return pool.createValue(basicShapeValue.release());
119 } 163 }
120 164
121 static Length convertToLength(const StyleResolverState& state, CSSPrimitiveValue * value) 165 static Length convertToLength(const StyleResolverState& state, CSSPrimitiveValue * value)
122 { 166 {
123 return value->convertToLength<FixedConversion | PercentConversion>(state.css ToLengthConversionData()); 167 return value->convertToLength<FixedConversion | PercentConversion>(state.css ToLengthConversionData());
124 } 168 }
125 169
170 static BasicShapeCenterCoordinate convertToCenterCoordinate(const StyleResolverS tate& state, CSSPrimitiveValue* value)
171 {
172 if (Pair* pair = value->getPairValue()) {
173 BasicShapeCenterCoordinate::Keyword keyword = BasicShapeCenterCoordinate ::None;
174 switch (pair->first()->getValueID()) {
175 case CSSValueTop:
176 keyword = BasicShapeCenterCoordinate::Top;
177 break;
178 case CSSValueRight:
179 keyword = BasicShapeCenterCoordinate::Right;
180 break;
181 case CSSValueBottom:
182 keyword = BasicShapeCenterCoordinate::Bottom;
183 break;
184 case CSSValueLeft:
185 keyword = BasicShapeCenterCoordinate::Left;
186 break;
187 default:
188 ASSERT_NOT_REACHED();
189 break;
190 }
191 return BasicShapeCenterCoordinate(keyword, convertToLength(state, pair-> second()));
192 }
193
194 return BasicShapeCenterCoordinate(convertToLength(state, value));
195 }
196
126 PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const CSSBasicShape* basicShapeValue) 197 PassRefPtr<BasicShape> basicShapeForValue(const StyleResolverState& state, const CSSBasicShape* basicShapeValue)
127 { 198 {
128 RefPtr<BasicShape> basicShape; 199 RefPtr<BasicShape> basicShape;
129 200
130 switch (basicShapeValue->type()) { 201 switch (basicShapeValue->type()) {
131 case CSSBasicShape::CSSBasicShapeRectangleType: { 202 case CSSBasicShape::CSSBasicShapeRectangleType: {
132 const CSSBasicShapeRectangle* rectValue = static_cast<const CSSBasicShap eRectangle *>(basicShapeValue); 203 const CSSBasicShapeRectangle* rectValue = static_cast<const CSSBasicShap eRectangle *>(basicShapeValue);
133 RefPtr<BasicShapeRectangle> rect = BasicShapeRectangle::create(); 204 RefPtr<BasicShapeRectangle> rect = BasicShapeRectangle::create();
134 205
135 rect->setX(convertToLength(state, rectValue->x())); 206 rect->setX(convertToLength(state, rectValue->x()));
136 rect->setY(convertToLength(state, rectValue->y())); 207 rect->setY(convertToLength(state, rectValue->y()));
137 rect->setWidth(convertToLength(state, rectValue->width())); 208 rect->setWidth(convertToLength(state, rectValue->width()));
138 rect->setHeight(convertToLength(state, rectValue->height())); 209 rect->setHeight(convertToLength(state, rectValue->height()));
139 if (rectValue->radiusX()) { 210 if (rectValue->radiusX()) {
140 Length radiusX = convertToLength(state, rectValue->radiusX()); 211 Length radiusX = convertToLength(state, rectValue->radiusX());
141 rect->setCornerRadiusX(radiusX); 212 rect->setCornerRadiusX(radiusX);
142 if (rectValue->radiusY()) 213 if (rectValue->radiusY())
143 rect->setCornerRadiusY(convertToLength(state, rectValue->radiusY ())); 214 rect->setCornerRadiusY(convertToLength(state, rectValue->radiusY ()));
144 else 215 else
145 rect->setCornerRadiusY(radiusX); 216 rect->setCornerRadiusY(radiusX);
146 } else { 217 } else {
147 rect->setCornerRadiusX(Length(0, Fixed)); 218 rect->setCornerRadiusX(Length(0, Fixed));
148 rect->setCornerRadiusY(Length(0, Fixed)); 219 rect->setCornerRadiusY(Length(0, Fixed));
149 } 220 }
150 basicShape = rect.release(); 221 basicShape = rect.release();
151 break; 222 break;
152 } 223 }
153 case CSSBasicShape::CSSBasicShapeCircleType: { 224 case CSSBasicShape::CSSDeprecatedBasicShapeCircleType: {
154 const CSSBasicShapeCircle* circleValue = static_cast<const CSSBasicShape Circle *>(basicShapeValue); 225 const CSSDeprecatedBasicShapeCircle* circleValue = static_cast<const CSS DeprecatedBasicShapeCircle *>(basicShapeValue);
155 RefPtr<BasicShapeCircle> circle = BasicShapeCircle::create(); 226 RefPtr<DeprecatedBasicShapeCircle> circle = DeprecatedBasicShapeCircle:: create();
156 227
157 circle->setCenterX(convertToLength(state, circleValue->centerX())); 228 circle->setCenterX(convertToLength(state, circleValue->centerX()));
158 circle->setCenterY(convertToLength(state, circleValue->centerY())); 229 circle->setCenterY(convertToLength(state, circleValue->centerY()));
159 circle->setRadius(convertToLength(state, circleValue->radius())); 230 circle->setRadius(convertToLength(state, circleValue->radius()));
160 231
161 basicShape = circle.release(); 232 basicShape = circle.release();
162 break; 233 break;
163 } 234 }
235 case CSSBasicShape::CSSBasicShapeCircleType: {
236 const CSSBasicShapeCircle* circleValue = static_cast<const CSSBasicShape Circle *>(basicShapeValue);
237 RefPtr<BasicShapeCircle> circle = BasicShapeCircle::create();
238
239 if (circleValue->centerX() && circleValue->centerY()) {
240 circle->setCenterX(convertToCenterCoordinate(state, circleValue->cen terX()));
241 circle->setCenterY(convertToCenterCoordinate(state, circleValue->cen terY()));
242 } else {
243 circle->setCenterX(BasicShapeCenterCoordinate(Length(50, Percent)));
244 circle->setCenterY(BasicShapeCenterCoordinate(Length(50, Percent)));
245 }
246 if (RefPtr<CSSPrimitiveValue> radius = circleValue->radius()) {
247 if (radius->isValueID()) {
248 switch (radius->getValueID()) {
249 case CSSValueClosestSide:
250 circle->setRadius(BasicShapeRadius(BasicShapeRadius::Closest Side));
251 break;
252 case CSSValueFarthestSide:
253 circle->setRadius(BasicShapeRadius(BasicShapeRadius::Farthes tSide));
254 break;
255 default:
256 ASSERT_NOT_REACHED();
257 break;
258 }
259 } else {
260 circle->setRadius(BasicShapeRadius(convertToLength(state, radius .get())));
261 }
262 } else {
263 circle->setRadius(BasicShapeRadius(BasicShapeRadius::ClosestSide));
264 }
265
266 basicShape = circle.release();
267 break;
268 }
164 case CSSBasicShape::CSSBasicShapeEllipseType: { 269 case CSSBasicShape::CSSBasicShapeEllipseType: {
165 const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicSha peEllipse *>(basicShapeValue); 270 const CSSBasicShapeEllipse* ellipseValue = static_cast<const CSSBasicSha peEllipse *>(basicShapeValue);
166 RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create(); 271 RefPtr<BasicShapeEllipse> ellipse = BasicShapeEllipse::create();
167 272
168 ellipse->setCenterX(convertToLength(state, ellipseValue->centerX())); 273 ellipse->setCenterX(convertToLength(state, ellipseValue->centerX()));
169 ellipse->setCenterY(convertToLength(state, ellipseValue->centerY())); 274 ellipse->setCenterY(convertToLength(state, ellipseValue->centerY()));
170 ellipse->setRadiusX(convertToLength(state, ellipseValue->radiusX())); 275 ellipse->setRadiusX(convertToLength(state, ellipseValue->radiusX()));
171 ellipse->setRadiusY(convertToLength(state, ellipseValue->radiusY())); 276 ellipse->setRadiusY(convertToLength(state, ellipseValue->radiusY()));
172 277
173 basicShape = ellipse.release(); 278 basicShape = ellipse.release();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 default: 315 default:
211 break; 316 break;
212 } 317 }
213 318
214 if (basicShapeValue->layoutBox()) 319 if (basicShapeValue->layoutBox())
215 basicShape->setLayoutBox(LayoutBox(*basicShapeValue->layoutBox())); 320 basicShape->setLayoutBox(LayoutBox(*basicShapeValue->layoutBox()));
216 321
217 return basicShape.release(); 322 return basicShape.release();
218 } 323 }
219 } 324 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698