OLD | NEW |
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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 if (m_radius.type() == BasicShapeRadius::ClosestSide) | 89 if (m_radius.type() == BasicShapeRadius::ClosestSide) |
90 return std::min(std::min(std::abs(center.x()), widthDelta), | 90 return std::min(std::min(std::abs(center.x()), widthDelta), |
91 std::min(std::abs(center.y()), heightDelta)); | 91 std::min(std::abs(center.y()), heightDelta)); |
92 | 92 |
93 // If radius.type() == BasicShapeRadius::FarthestSide. | 93 // If radius.type() == BasicShapeRadius::FarthestSide. |
94 return std::max(std::max(center.x(), widthDelta), | 94 return std::max(std::max(center.x(), widthDelta), |
95 std::max(center.y(), heightDelta)); | 95 std::max(center.y(), heightDelta)); |
96 } | 96 } |
97 | 97 |
98 void BasicShapeCircle::path(Path& path, const FloatRect& boundingBox) { | 98 void BasicShapeCircle::path(Path& path, const FloatRect& boundingBox) { |
99 ASSERT(path.isEmpty()); | 99 DCHECK(path.isEmpty()); |
100 FloatPoint center = | 100 FloatPoint center = |
101 floatPointForCenterCoordinate(m_centerX, m_centerY, boundingBox.size()); | 101 floatPointForCenterCoordinate(m_centerX, m_centerY, boundingBox.size()); |
102 float radius = floatValueForRadiusInBox(boundingBox.size()); | 102 float radius = floatValueForRadiusInBox(boundingBox.size()); |
103 path.addEllipse(FloatRect(center.x() - radius + boundingBox.x(), | 103 path.addEllipse(FloatRect(center.x() - radius + boundingBox.x(), |
104 center.y() - radius + boundingBox.y(), radius * 2, | 104 center.y() - radius + boundingBox.y(), radius * 2, |
105 radius * 2)); | 105 radius * 2)); |
106 } | 106 } |
107 | 107 |
108 PassRefPtr<BasicShape> BasicShapeCircle::blend(const BasicShape* other, | 108 PassRefPtr<BasicShape> BasicShapeCircle::blend(const BasicShape* other, |
109 double progress) const { | 109 double progress) const { |
110 ASSERT(type() == other->type()); | 110 DCHECK_EQ(type(), other->type()); |
111 const BasicShapeCircle* o = toBasicShapeCircle(other); | 111 const BasicShapeCircle* o = toBasicShapeCircle(other); |
112 RefPtr<BasicShapeCircle> result = BasicShapeCircle::create(); | 112 RefPtr<BasicShapeCircle> result = BasicShapeCircle::create(); |
113 | 113 |
114 result->setCenterX(m_centerX.blend(o->centerX(), progress)); | 114 result->setCenterX(m_centerX.blend(o->centerX(), progress)); |
115 result->setCenterY(m_centerY.blend(o->centerY(), progress)); | 115 result->setCenterY(m_centerY.blend(o->centerY(), progress)); |
116 result->setRadius(m_radius.blend(o->radius(), progress)); | 116 result->setRadius(m_radius.blend(o->radius(), progress)); |
117 return result.release(); | 117 return result.release(); |
118 } | 118 } |
119 | 119 |
120 bool BasicShapeEllipse::operator==(const BasicShape& o) const { | 120 bool BasicShapeEllipse::operator==(const BasicShape& o) const { |
121 if (!isSameType(o)) | 121 if (!isSameType(o)) |
122 return false; | 122 return false; |
123 const BasicShapeEllipse& other = toBasicShapeEllipse(o); | 123 const BasicShapeEllipse& other = toBasicShapeEllipse(o); |
124 return m_centerX == other.m_centerX && m_centerY == other.m_centerY && | 124 return m_centerX == other.m_centerX && m_centerY == other.m_centerY && |
125 m_radiusX == other.m_radiusX && m_radiusY == other.m_radiusY; | 125 m_radiusX == other.m_radiusX && m_radiusY == other.m_radiusY; |
126 } | 126 } |
127 | 127 |
128 float BasicShapeEllipse::floatValueForRadiusInBox( | 128 float BasicShapeEllipse::floatValueForRadiusInBox( |
129 const BasicShapeRadius& radius, | 129 const BasicShapeRadius& radius, |
130 float center, | 130 float center, |
131 float boxWidthOrHeight) const { | 131 float boxWidthOrHeight) const { |
132 if (radius.type() == BasicShapeRadius::Value) | 132 if (radius.type() == BasicShapeRadius::Value) |
133 return floatValueForLength(radius.value(), boxWidthOrHeight); | 133 return floatValueForLength(radius.value(), boxWidthOrHeight); |
134 | 134 |
135 float widthOrHeightDelta = std::abs(boxWidthOrHeight - center); | 135 float widthOrHeightDelta = std::abs(boxWidthOrHeight - center); |
136 if (radius.type() == BasicShapeRadius::ClosestSide) | 136 if (radius.type() == BasicShapeRadius::ClosestSide) |
137 return std::min(std::abs(center), widthOrHeightDelta); | 137 return std::min(std::abs(center), widthOrHeightDelta); |
138 | 138 |
139 ASSERT(radius.type() == BasicShapeRadius::FarthestSide); | 139 DCHECK_EQ(radius.type(), BasicShapeRadius::FarthestSide); |
140 return std::max(center, widthOrHeightDelta); | 140 return std::max(center, widthOrHeightDelta); |
141 } | 141 } |
142 | 142 |
143 void BasicShapeEllipse::path(Path& path, const FloatRect& boundingBox) { | 143 void BasicShapeEllipse::path(Path& path, const FloatRect& boundingBox) { |
144 ASSERT(path.isEmpty()); | 144 DCHECK(path.isEmpty()); |
145 FloatPoint center = | 145 FloatPoint center = |
146 floatPointForCenterCoordinate(m_centerX, m_centerY, boundingBox.size()); | 146 floatPointForCenterCoordinate(m_centerX, m_centerY, boundingBox.size()); |
147 float radiusX = | 147 float radiusX = |
148 floatValueForRadiusInBox(m_radiusX, center.x(), boundingBox.width()); | 148 floatValueForRadiusInBox(m_radiusX, center.x(), boundingBox.width()); |
149 float radiusY = | 149 float radiusY = |
150 floatValueForRadiusInBox(m_radiusY, center.y(), boundingBox.height()); | 150 floatValueForRadiusInBox(m_radiusY, center.y(), boundingBox.height()); |
151 path.addEllipse(FloatRect(center.x() - radiusX + boundingBox.x(), | 151 path.addEllipse(FloatRect(center.x() - radiusX + boundingBox.x(), |
152 center.y() - radiusY + boundingBox.y(), radiusX * 2, | 152 center.y() - radiusY + boundingBox.y(), radiusX * 2, |
153 radiusY * 2)); | 153 radiusY * 2)); |
154 } | 154 } |
155 | 155 |
156 PassRefPtr<BasicShape> BasicShapeEllipse::blend(const BasicShape* other, | 156 PassRefPtr<BasicShape> BasicShapeEllipse::blend(const BasicShape* other, |
157 double progress) const { | 157 double progress) const { |
158 ASSERT(type() == other->type()); | 158 DCHECK_EQ(type(), other->type()); |
159 const BasicShapeEllipse* o = toBasicShapeEllipse(other); | 159 const BasicShapeEllipse* o = toBasicShapeEllipse(other); |
160 RefPtr<BasicShapeEllipse> result = BasicShapeEllipse::create(); | 160 RefPtr<BasicShapeEllipse> result = BasicShapeEllipse::create(); |
161 | 161 |
162 if (m_radiusX.type() != BasicShapeRadius::Value || | 162 if (m_radiusX.type() != BasicShapeRadius::Value || |
163 o->radiusX().type() != BasicShapeRadius::Value || | 163 o->radiusX().type() != BasicShapeRadius::Value || |
164 m_radiusY.type() != BasicShapeRadius::Value || | 164 m_radiusY.type() != BasicShapeRadius::Value || |
165 o->radiusY().type() != BasicShapeRadius::Value) { | 165 o->radiusY().type() != BasicShapeRadius::Value) { |
166 result->setCenterX(o->centerX()); | 166 result->setCenterX(o->centerX()); |
167 result->setCenterY(o->centerY()); | 167 result->setCenterY(o->centerY()); |
168 result->setRadiusX(o->radiusX()); | 168 result->setRadiusX(o->radiusX()); |
169 result->setRadiusY(o->radiusY()); | 169 result->setRadiusY(o->radiusY()); |
170 return result; | 170 return result; |
171 } | 171 } |
172 | 172 |
173 result->setCenterX(m_centerX.blend(o->centerX(), progress)); | 173 result->setCenterX(m_centerX.blend(o->centerX(), progress)); |
174 result->setCenterY(m_centerY.blend(o->centerY(), progress)); | 174 result->setCenterY(m_centerY.blend(o->centerY(), progress)); |
175 result->setRadiusX(m_radiusX.blend(o->radiusX(), progress)); | 175 result->setRadiusX(m_radiusX.blend(o->radiusX(), progress)); |
176 result->setRadiusY(m_radiusY.blend(o->radiusY(), progress)); | 176 result->setRadiusY(m_radiusY.blend(o->radiusY(), progress)); |
177 return result.release(); | 177 return result.release(); |
178 } | 178 } |
179 | 179 |
180 void BasicShapePolygon::path(Path& path, const FloatRect& boundingBox) { | 180 void BasicShapePolygon::path(Path& path, const FloatRect& boundingBox) { |
181 ASSERT(path.isEmpty()); | 181 DCHECK(path.isEmpty()); |
182 ASSERT(!(m_values.size() % 2)); | 182 DCHECK(!(m_values.size() % 2)); |
183 size_t length = m_values.size(); | 183 size_t length = m_values.size(); |
184 | 184 |
185 if (!length) | 185 if (!length) |
186 return; | 186 return; |
187 | 187 |
188 path.moveTo( | 188 path.moveTo( |
189 FloatPoint(floatValueForLength(m_values.at(0), boundingBox.width()) + | 189 FloatPoint(floatValueForLength(m_values.at(0), boundingBox.width()) + |
190 boundingBox.x(), | 190 boundingBox.x(), |
191 floatValueForLength(m_values.at(1), boundingBox.height()) + | 191 floatValueForLength(m_values.at(1), boundingBox.height()) + |
192 boundingBox.y())); | 192 boundingBox.y())); |
193 for (size_t i = 2; i < length; i = i + 2) { | 193 for (size_t i = 2; i < length; i = i + 2) { |
194 path.addLineTo(FloatPoint( | 194 path.addLineTo(FloatPoint( |
195 floatValueForLength(m_values.at(i), boundingBox.width()) + | 195 floatValueForLength(m_values.at(i), boundingBox.width()) + |
196 boundingBox.x(), | 196 boundingBox.x(), |
197 floatValueForLength(m_values.at(i + 1), boundingBox.height()) + | 197 floatValueForLength(m_values.at(i + 1), boundingBox.height()) + |
198 boundingBox.y())); | 198 boundingBox.y())); |
199 } | 199 } |
200 path.closeSubpath(); | 200 path.closeSubpath(); |
201 } | 201 } |
202 | 202 |
203 PassRefPtr<BasicShape> BasicShapePolygon::blend(const BasicShape* other, | 203 PassRefPtr<BasicShape> BasicShapePolygon::blend(const BasicShape* other, |
204 double progress) const { | 204 double progress) const { |
205 ASSERT(other && isSameType(*other)); | 205 DCHECK(other); |
| 206 DCHECK(isSameType(*other)); |
206 | 207 |
207 const BasicShapePolygon* o = toBasicShapePolygon(other); | 208 const BasicShapePolygon* o = toBasicShapePolygon(other); |
208 ASSERT(m_values.size() == o->values().size()); | 209 DCHECK_EQ(m_values.size(), o->values().size()); |
209 ASSERT(!(m_values.size() % 2)); | 210 DCHECK(!(m_values.size() % 2)); |
210 | 211 |
211 size_t length = m_values.size(); | 212 size_t length = m_values.size(); |
212 RefPtr<BasicShapePolygon> result = BasicShapePolygon::create(); | 213 RefPtr<BasicShapePolygon> result = BasicShapePolygon::create(); |
213 if (!length) | 214 if (!length) |
214 return result.release(); | 215 return result.release(); |
215 | 216 |
216 result->setWindRule(o->getWindRule()); | 217 result->setWindRule(o->getWindRule()); |
217 | 218 |
218 for (size_t i = 0; i < length; i = i + 2) { | 219 for (size_t i = 0; i < length; i = i + 2) { |
219 result->appendPoint( | 220 result->appendPoint( |
(...skipping 13 matching lines...) Expand all Loading... |
233 } | 234 } |
234 | 235 |
235 static FloatSize floatSizeForLengthSize(const LengthSize& lengthSize, | 236 static FloatSize floatSizeForLengthSize(const LengthSize& lengthSize, |
236 const FloatRect& boundingBox) { | 237 const FloatRect& boundingBox) { |
237 return FloatSize( | 238 return FloatSize( |
238 floatValueForLength(lengthSize.width(), boundingBox.width()), | 239 floatValueForLength(lengthSize.width(), boundingBox.width()), |
239 floatValueForLength(lengthSize.height(), boundingBox.height())); | 240 floatValueForLength(lengthSize.height(), boundingBox.height())); |
240 } | 241 } |
241 | 242 |
242 void BasicShapeInset::path(Path& path, const FloatRect& boundingBox) { | 243 void BasicShapeInset::path(Path& path, const FloatRect& boundingBox) { |
243 ASSERT(path.isEmpty()); | 244 DCHECK(path.isEmpty()); |
244 float left = floatValueForLength(m_left, boundingBox.width()); | 245 float left = floatValueForLength(m_left, boundingBox.width()); |
245 float top = floatValueForLength(m_top, boundingBox.height()); | 246 float top = floatValueForLength(m_top, boundingBox.height()); |
246 FloatRect rect( | 247 FloatRect rect( |
247 left + boundingBox.x(), top + boundingBox.y(), | 248 left + boundingBox.x(), top + boundingBox.y(), |
248 std::max<float>(boundingBox.width() - left - | 249 std::max<float>(boundingBox.width() - left - |
249 floatValueForLength(m_right, boundingBox.width()), | 250 floatValueForLength(m_right, boundingBox.width()), |
250 0), | 251 0), |
251 std::max<float>(boundingBox.height() - top - | 252 std::max<float>(boundingBox.height() - top - |
252 floatValueForLength(m_bottom, boundingBox.height()), | 253 floatValueForLength(m_bottom, boundingBox.height()), |
253 0)); | 254 0)); |
(...skipping 11 matching lines...) Expand all Loading... |
265 static inline LengthSize blendLengthSize(const LengthSize& to, | 266 static inline LengthSize blendLengthSize(const LengthSize& to, |
266 const LengthSize& from, | 267 const LengthSize& from, |
267 double progress) { | 268 double progress) { |
268 return LengthSize( | 269 return LengthSize( |
269 to.width().blend(from.width(), progress, ValueRangeNonNegative), | 270 to.width().blend(from.width(), progress, ValueRangeNonNegative), |
270 to.height().blend(from.height(), progress, ValueRangeNonNegative)); | 271 to.height().blend(from.height(), progress, ValueRangeNonNegative)); |
271 } | 272 } |
272 | 273 |
273 PassRefPtr<BasicShape> BasicShapeInset::blend(const BasicShape* other, | 274 PassRefPtr<BasicShape> BasicShapeInset::blend(const BasicShape* other, |
274 double progress) const { | 275 double progress) const { |
275 ASSERT(other && isSameType(*other)); | 276 DCHECK(other); |
| 277 DCHECK(isSameType(*other)); |
276 | 278 |
277 const BasicShapeInset& otherInset = toBasicShapeInset(*other); | 279 const BasicShapeInset& otherInset = toBasicShapeInset(*other); |
278 RefPtr<BasicShapeInset> result = BasicShapeInset::create(); | 280 RefPtr<BasicShapeInset> result = BasicShapeInset::create(); |
279 result->setTop(m_top.blend(otherInset.top(), progress, ValueRangeAll)); | 281 result->setTop(m_top.blend(otherInset.top(), progress, ValueRangeAll)); |
280 result->setRight(m_right.blend(otherInset.right(), progress, ValueRangeAll)); | 282 result->setRight(m_right.blend(otherInset.right(), progress, ValueRangeAll)); |
281 result->setBottom( | 283 result->setBottom( |
282 m_bottom.blend(otherInset.bottom(), progress, ValueRangeAll)); | 284 m_bottom.blend(otherInset.bottom(), progress, ValueRangeAll)); |
283 result->setLeft(m_left.blend(otherInset.left(), progress, ValueRangeAll)); | 285 result->setLeft(m_left.blend(otherInset.left(), progress, ValueRangeAll)); |
284 | 286 |
285 result->setTopLeftRadius( | 287 result->setTopLeftRadius( |
(...skipping 14 matching lines...) Expand all Loading... |
300 const BasicShapeInset& other = toBasicShapeInset(o); | 302 const BasicShapeInset& other = toBasicShapeInset(o); |
301 return m_right == other.m_right && m_top == other.m_top && | 303 return m_right == other.m_right && m_top == other.m_top && |
302 m_bottom == other.m_bottom && m_left == other.m_left && | 304 m_bottom == other.m_bottom && m_left == other.m_left && |
303 m_topLeftRadius == other.m_topLeftRadius && | 305 m_topLeftRadius == other.m_topLeftRadius && |
304 m_topRightRadius == other.m_topRightRadius && | 306 m_topRightRadius == other.m_topRightRadius && |
305 m_bottomRightRadius == other.m_bottomRightRadius && | 307 m_bottomRightRadius == other.m_bottomRightRadius && |
306 m_bottomLeftRadius == other.m_bottomLeftRadius; | 308 m_bottomLeftRadius == other.m_bottomLeftRadius; |
307 } | 309 } |
308 | 310 |
309 } // namespace blink | 311 } // namespace blink |
OLD | NEW |