OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. | 2 * Copyright (C) 2011 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 23 matching lines...) Expand all Loading... |
34 #include "core/css/Pair.h" | 34 #include "core/css/Pair.h" |
35 #include "platform/Length.h" | 35 #include "platform/Length.h" |
36 #include "wtf/text/StringBuilder.h" | 36 #include "wtf/text/StringBuilder.h" |
37 | 37 |
38 using namespace WTF; | 38 using namespace WTF; |
39 | 39 |
40 namespace WebCore { | 40 namespace WebCore { |
41 | 41 |
42 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CSSBasicShape) | 42 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CSSBasicShape) |
43 | 43 |
44 static String buildCircleString(const String& radius, const String& centerX, con
st String& centerY, const String& layoutBox) | 44 static String buildCircleString(const String& radius, const String& centerX, con
st String& centerY, const String& box) |
45 { | 45 { |
46 char at[] = "at"; | 46 char at[] = "at"; |
47 char separator[] = " "; | 47 char separator[] = " "; |
48 StringBuilder result; | 48 StringBuilder result; |
49 result.appendLiteral("circle("); | 49 result.appendLiteral("circle("); |
50 if (!radius.isNull()) | 50 if (!radius.isNull()) |
51 result.append(radius); | 51 result.append(radius); |
52 | 52 |
53 if (!centerX.isNull() || !centerY.isNull()) { | 53 if (!centerX.isNull() || !centerY.isNull()) { |
54 if (!radius.isNull()) | 54 if (!radius.isNull()) |
55 result.appendLiteral(separator); | 55 result.appendLiteral(separator); |
56 result.append(at); | 56 result.append(at); |
57 result.appendLiteral(separator); | 57 result.appendLiteral(separator); |
58 result.append(centerX); | 58 result.append(centerX); |
59 result.appendLiteral(separator); | 59 result.appendLiteral(separator); |
60 result.append(centerY); | 60 result.append(centerY); |
61 } | 61 } |
62 result.append(")"); | 62 result.append(")"); |
63 if (layoutBox.length()) { | 63 if (box.length()) { |
64 result.appendLiteral(separator); | 64 result.appendLiteral(separator); |
65 result.append(layoutBox); | 65 result.append(box); |
66 } | 66 } |
67 return result.toString(); | 67 return result.toString(); |
68 } | 68 } |
69 | 69 |
70 static String serializePositionOffset(const Pair& offset, const Pair& other) | 70 static String serializePositionOffset(const Pair& offset, const Pair& other) |
71 { | 71 { |
72 if ((offset.first()->getValueID() == CSSValueLeft && other.first()->getValue
ID() == CSSValueTop) | 72 if ((offset.first()->getValueID() == CSSValueLeft && other.first()->getValue
ID() == CSSValueTop) |
73 || (offset.first()->getValueID() == CSSValueTop && other.first()->getVal
ueID() == CSSValueLeft)) | 73 || (offset.first()->getValueID() == CSSValueTop && other.first()->getVal
ueID() == CSSValueLeft)) |
74 return offset.second()->cssText(); | 74 return offset.second()->cssText(); |
75 return offset.cssText(); | 75 return offset.cssText(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 } | 110 } |
111 | 111 |
112 String CSSBasicShapeCircle::cssText() const | 112 String CSSBasicShapeCircle::cssText() const |
113 { | 113 { |
114 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCX = buildSerializablePositi
onOffset(m_centerX, CSSValueLeft); | 114 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCX = buildSerializablePositi
onOffset(m_centerX, CSSValueLeft); |
115 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCY = buildSerializablePositi
onOffset(m_centerY, CSSValueTop); | 115 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCY = buildSerializablePositi
onOffset(m_centerY, CSSValueTop); |
116 | 116 |
117 return buildCircleString(m_radius ? m_radius->cssText() : String(), | 117 return buildCircleString(m_radius ? m_radius->cssText() : String(), |
118 serializePositionOffset(*normalizedCX->getPairValue(), *normalizedCY->ge
tPairValue()), | 118 serializePositionOffset(*normalizedCX->getPairValue(), *normalizedCY->ge
tPairValue()), |
119 serializePositionOffset(*normalizedCY->getPairValue(), *normalizedCX->ge
tPairValue()), | 119 serializePositionOffset(*normalizedCY->getPairValue(), *normalizedCX->ge
tPairValue()), |
120 m_layoutBox ? m_layoutBox->cssText() : String()); | 120 m_referenceBox ? m_referenceBox->cssText() : String()); |
121 } | 121 } |
122 | 122 |
123 bool CSSBasicShapeCircle::equals(const CSSBasicShape& shape) const | 123 bool CSSBasicShapeCircle::equals(const CSSBasicShape& shape) const |
124 { | 124 { |
125 if (shape.type() != CSSBasicShapeCircleType) | 125 if (shape.type() != CSSBasicShapeCircleType) |
126 return false; | 126 return false; |
127 | 127 |
128 const CSSBasicShapeCircle& other = static_cast<const CSSBasicShapeCircle&>(s
hape); | 128 const CSSBasicShapeCircle& other = static_cast<const CSSBasicShapeCircle&>(s
hape); |
129 return compareCSSValuePtr(m_centerX, other.m_centerX) | 129 return compareCSSValuePtr(m_centerX, other.m_centerX) |
130 && compareCSSValuePtr(m_centerY, other.m_centerY) | 130 && compareCSSValuePtr(m_centerY, other.m_centerY) |
131 && compareCSSValuePtr(m_radius, other.m_radius) | 131 && compareCSSValuePtr(m_radius, other.m_radius) |
132 && compareCSSValuePtr(m_layoutBox, other.m_layoutBox); | 132 && compareCSSValuePtr(m_referenceBox, other.m_referenceBox); |
133 } | 133 } |
134 | 134 |
135 void CSSBasicShapeCircle::trace(Visitor* visitor) | 135 void CSSBasicShapeCircle::trace(Visitor* visitor) |
136 { | 136 { |
137 visitor->trace(m_centerX); | 137 visitor->trace(m_centerX); |
138 visitor->trace(m_centerY); | 138 visitor->trace(m_centerY); |
139 visitor->trace(m_radius); | 139 visitor->trace(m_radius); |
140 CSSBasicShape::trace(visitor); | 140 CSSBasicShape::trace(visitor); |
141 } | 141 } |
142 | 142 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 | 177 |
178 String CSSBasicShapeEllipse::cssText() const | 178 String CSSBasicShapeEllipse::cssText() const |
179 { | 179 { |
180 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCX = buildSerializablePositi
onOffset(m_centerX, CSSValueLeft); | 180 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCX = buildSerializablePositi
onOffset(m_centerX, CSSValueLeft); |
181 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCY = buildSerializablePositi
onOffset(m_centerY, CSSValueTop); | 181 RefPtrWillBeRawPtr<CSSPrimitiveValue> normalizedCY = buildSerializablePositi
onOffset(m_centerY, CSSValueTop); |
182 | 182 |
183 return buildEllipseString(m_radiusX ? m_radiusX->cssText() : String(), | 183 return buildEllipseString(m_radiusX ? m_radiusX->cssText() : String(), |
184 m_radiusY ? m_radiusY->cssText() : String(), | 184 m_radiusY ? m_radiusY->cssText() : String(), |
185 serializePositionOffset(*normalizedCX->getPairValue(), *normalizedCY->ge
tPairValue()), | 185 serializePositionOffset(*normalizedCX->getPairValue(), *normalizedCY->ge
tPairValue()), |
186 serializePositionOffset(*normalizedCY->getPairValue(), *normalizedCX->ge
tPairValue()), | 186 serializePositionOffset(*normalizedCY->getPairValue(), *normalizedCX->ge
tPairValue()), |
187 m_layoutBox ? m_layoutBox->cssText() : String()); | 187 m_referenceBox ? m_referenceBox->cssText() : String()); |
188 } | 188 } |
189 | 189 |
190 bool CSSBasicShapeEllipse::equals(const CSSBasicShape& shape) const | 190 bool CSSBasicShapeEllipse::equals(const CSSBasicShape& shape) const |
191 { | 191 { |
192 if (shape.type() != CSSBasicShapeEllipseType) | 192 if (shape.type() != CSSBasicShapeEllipseType) |
193 return false; | 193 return false; |
194 | 194 |
195 const CSSBasicShapeEllipse& other = static_cast<const CSSBasicShapeEllipse&>
(shape); | 195 const CSSBasicShapeEllipse& other = static_cast<const CSSBasicShapeEllipse&>
(shape); |
196 return compareCSSValuePtr(m_centerX, other.m_centerX) | 196 return compareCSSValuePtr(m_centerX, other.m_centerX) |
197 && compareCSSValuePtr(m_centerY, other.m_centerY) | 197 && compareCSSValuePtr(m_centerY, other.m_centerY) |
198 && compareCSSValuePtr(m_radiusX, other.m_radiusX) | 198 && compareCSSValuePtr(m_radiusX, other.m_radiusX) |
199 && compareCSSValuePtr(m_radiusY, other.m_radiusY) | 199 && compareCSSValuePtr(m_radiusY, other.m_radiusY) |
200 && compareCSSValuePtr(m_layoutBox, other.m_layoutBox); | 200 && compareCSSValuePtr(m_referenceBox, other.m_referenceBox); |
201 } | 201 } |
202 | 202 |
203 void CSSBasicShapeEllipse::trace(Visitor* visitor) | 203 void CSSBasicShapeEllipse::trace(Visitor* visitor) |
204 { | 204 { |
205 visitor->trace(m_centerX); | 205 visitor->trace(m_centerX); |
206 visitor->trace(m_centerY); | 206 visitor->trace(m_centerY); |
207 visitor->trace(m_radiusX); | 207 visitor->trace(m_radiusX); |
208 visitor->trace(m_radiusY); | 208 visitor->trace(m_radiusY); |
209 CSSBasicShape::trace(visitor); | 209 CSSBasicShape::trace(visitor); |
210 } | 210 } |
211 | 211 |
212 static String buildPolygonString(const WindRule& windRule, const Vector<String>&
points, const String& layoutBox) | 212 static String buildPolygonString(const WindRule& windRule, const Vector<String>&
points, const String& box) |
213 { | 213 { |
214 ASSERT(!(points.size() % 2)); | 214 ASSERT(!(points.size() % 2)); |
215 | 215 |
216 StringBuilder result; | 216 StringBuilder result; |
217 const char evenOddOpening[] = "polygon(evenodd, "; | 217 const char evenOddOpening[] = "polygon(evenodd, "; |
218 const char nonZeroOpening[] = "polygon("; | 218 const char nonZeroOpening[] = "polygon("; |
219 const char commaSeparator[] = ", "; | 219 const char commaSeparator[] = ", "; |
220 COMPILE_ASSERT(sizeof(evenOddOpening) > sizeof(nonZeroOpening), polygon_stri
ng_openings_have_same_length); | 220 COMPILE_ASSERT(sizeof(evenOddOpening) > sizeof(nonZeroOpening), polygon_stri
ng_openings_have_same_length); |
221 | 221 |
222 // Compute the required capacity in advance to reduce allocations. | 222 // Compute the required capacity in advance to reduce allocations. |
223 size_t length = sizeof(evenOddOpening) - 1; | 223 size_t length = sizeof(evenOddOpening) - 1; |
224 for (size_t i = 0; i < points.size(); i += 2) { | 224 for (size_t i = 0; i < points.size(); i += 2) { |
225 if (i) | 225 if (i) |
226 length += (sizeof(commaSeparator) - 1); | 226 length += (sizeof(commaSeparator) - 1); |
227 // add length of two strings, plus one for the space separator. | 227 // add length of two strings, plus one for the space separator. |
228 length += points[i].length() + 1 + points[i + 1].length(); | 228 length += points[i].length() + 1 + points[i + 1].length(); |
229 } | 229 } |
230 if (!layoutBox.isEmpty()) | 230 if (!box.isEmpty()) |
231 length += layoutBox.length() + 1; | 231 length += box.length() + 1; |
232 result.reserveCapacity(length); | 232 result.reserveCapacity(length); |
233 | 233 |
234 if (windRule == RULE_EVENODD) | 234 if (windRule == RULE_EVENODD) |
235 result.appendLiteral(evenOddOpening); | 235 result.appendLiteral(evenOddOpening); |
236 else | 236 else |
237 result.appendLiteral(nonZeroOpening); | 237 result.appendLiteral(nonZeroOpening); |
238 | 238 |
239 for (size_t i = 0; i < points.size(); i += 2) { | 239 for (size_t i = 0; i < points.size(); i += 2) { |
240 if (i) | 240 if (i) |
241 result.appendLiteral(commaSeparator); | 241 result.appendLiteral(commaSeparator); |
242 result.append(points[i]); | 242 result.append(points[i]); |
243 result.append(' '); | 243 result.append(' '); |
244 result.append(points[i + 1]); | 244 result.append(points[i + 1]); |
245 } | 245 } |
246 | 246 |
247 result.append(')'); | 247 result.append(')'); |
248 | 248 |
249 if (!layoutBox.isEmpty()) { | 249 if (!box.isEmpty()) { |
250 result.append(' '); | 250 result.append(' '); |
251 result.append(layoutBox); | 251 result.append(box); |
252 } | 252 } |
253 | 253 |
254 return result.toString(); | 254 return result.toString(); |
255 } | 255 } |
256 | 256 |
257 String CSSBasicShapePolygon::cssText() const | 257 String CSSBasicShapePolygon::cssText() const |
258 { | 258 { |
259 Vector<String> points; | 259 Vector<String> points; |
260 points.reserveInitialCapacity(m_values.size()); | 260 points.reserveInitialCapacity(m_values.size()); |
261 | 261 |
262 for (size_t i = 0; i < m_values.size(); ++i) | 262 for (size_t i = 0; i < m_values.size(); ++i) |
263 points.append(m_values.at(i)->cssText()); | 263 points.append(m_values.at(i)->cssText()); |
264 | 264 |
265 return buildPolygonString(m_windRule, points, m_layoutBox ? m_layoutBox->css
Text() : String()); | 265 return buildPolygonString(m_windRule, points, m_referenceBox ? m_referenceBo
x->cssText() : String()); |
266 } | 266 } |
267 | 267 |
268 bool CSSBasicShapePolygon::equals(const CSSBasicShape& shape) const | 268 bool CSSBasicShapePolygon::equals(const CSSBasicShape& shape) const |
269 { | 269 { |
270 if (shape.type() != CSSBasicShapePolygonType) | 270 if (shape.type() != CSSBasicShapePolygonType) |
271 return false; | 271 return false; |
272 | 272 |
273 const CSSBasicShapePolygon& rhs = static_cast<const CSSBasicShapePolygon&>(s
hape); | 273 const CSSBasicShapePolygon& rhs = static_cast<const CSSBasicShapePolygon&>(s
hape); |
274 | 274 |
275 if (!compareCSSValuePtr(m_layoutBox, rhs.m_layoutBox)) | 275 if (!compareCSSValuePtr(m_referenceBox, rhs.m_referenceBox)) |
276 return false; | 276 return false; |
277 | 277 |
278 return compareCSSValueVector(m_values, rhs.m_values); | 278 return compareCSSValueVector(m_values, rhs.m_values); |
279 } | 279 } |
280 | 280 |
281 void CSSBasicShapePolygon::trace(Visitor* visitor) | 281 void CSSBasicShapePolygon::trace(Visitor* visitor) |
282 { | 282 { |
283 visitor->trace(m_values); | 283 visitor->trace(m_values); |
284 CSSBasicShape::trace(visitor); | 284 CSSBasicShape::trace(visitor); |
285 } | 285 } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 visitor->trace(m_left); | 404 visitor->trace(m_left); |
405 visitor->trace(m_topLeftRadius); | 405 visitor->trace(m_topLeftRadius); |
406 visitor->trace(m_topRightRadius); | 406 visitor->trace(m_topRightRadius); |
407 visitor->trace(m_bottomRightRadius); | 407 visitor->trace(m_bottomRightRadius); |
408 visitor->trace(m_bottomLeftRadius); | 408 visitor->trace(m_bottomLeftRadius); |
409 CSSBasicShape::trace(visitor); | 409 CSSBasicShape::trace(visitor); |
410 } | 410 } |
411 | 411 |
412 } // namespace WebCore | 412 } // namespace WebCore |
413 | 413 |
OLD | NEW |