OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. |
3 * 2006 Rob Buis <buis@kde.org> | 3 * 2006 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
5 * Copyright (C) 2013 Google Inc. All rights reserved. | 5 * Copyright (C) 2013 Google Inc. All rights reserved. |
6 * | 6 * |
7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
9 * are met: | 9 * are met: |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 sweepDegrees += s360; | 298 sweepDegrees += s360; |
299 | 299 |
300 m_path.arcTo(oval, startDegrees, sweepDegrees, false); | 300 m_path.arcTo(oval, startDegrees, sweepDegrees, false); |
301 } | 301 } |
302 | 302 |
303 void Path::addRect(const FloatRect& rect) | 303 void Path::addRect(const FloatRect& rect) |
304 { | 304 { |
305 m_path.addRect(rect); | 305 m_path.addRect(rect); |
306 } | 306 } |
307 | 307 |
| 308 void Path::addEllipse(const FloatPoint& p, float radiusX, float radiusY, float r
otation, float startAngle, float endAngle, bool anticlockwise) |
| 309 { |
| 310 // Optimize the common case of an entire ellipse. |
| 311 SkScalar twoPiScalar = WebCoreFloatToSkScalar(2 * piFloat); |
| 312 SkScalar endAngleScalar = WebCoreFloatToSkScalar(endAngle); |
| 313 if (!rotation && !startAngle && SkScalarNearlyEqual(twoPiScalar, SkScalarAbs
(endAngleScalar))) { |
| 314 FloatRect boundingRect(p - FloatSize(radiusX, radiusY), FloatSize(2 * ra
diusX, 2 * radiusY)); |
| 315 if (anticlockwise && SkScalarNearlyEqual(twoPiScalar, -endAngleScalar))
{ |
| 316 m_path.addOval(boundingRect, SkPath::kCCW_Direction); |
| 317 return; |
| 318 } |
| 319 if (!anticlockwise && SkScalarNearlyEqual(twoPiScalar, endAngleScalar))
{ |
| 320 m_path.addOval(boundingRect); |
| 321 return; |
| 322 } |
| 323 } |
| 324 |
| 325 // Add an arc after the relevant transform. |
| 326 AffineTransform ellipseTransform = AffineTransform::translation(p.x(), p.y()
).rotate(rad2deg(rotation)).scale(radiusX, radiusY); |
| 327 ASSERT(ellipseTransform.isInvertible()); |
| 328 AffineTransform inverseEllipseTransform = ellipseTransform.inverse(); |
| 329 transform(inverseEllipseTransform); |
| 330 addArc(FloatPoint::zero(), 1 /* unit circle */, startAngle, endAngle, anticl
ockwise); |
| 331 transform(ellipseTransform); |
| 332 } |
| 333 |
308 void Path::addEllipse(const FloatRect& rect) | 334 void Path::addEllipse(const FloatRect& rect) |
309 { | 335 { |
310 m_path.addOval(rect); | 336 m_path.addOval(rect); |
311 } | 337 } |
312 | 338 |
313 void Path::addRoundedRect(const RoundedRect& r) | 339 void Path::addRoundedRect(const RoundedRect& r) |
314 { | 340 { |
315 addRoundedRect(r.rect(), r.radii().topLeft(), r.radii().topRight(), r.radii(
).bottomLeft(), r.radii().bottomRight()); | 341 addRoundedRect(r.rect(), r.radii().topLeft(), r.radii().topRight(), r.radii(
).bottomLeft(), r.radii().bottomRight()); |
316 } | 342 } |
317 | 343 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 | 427 |
402 closeSubpath(); | 428 closeSubpath(); |
403 } | 429 } |
404 | 430 |
405 void Path::translate(const FloatSize& size) | 431 void Path::translate(const FloatSize& size) |
406 { | 432 { |
407 m_path.offset(WebCoreFloatToSkScalar(size.width()), WebCoreFloatToSkScalar(s
ize.height())); | 433 m_path.offset(WebCoreFloatToSkScalar(size.width()), WebCoreFloatToSkScalar(s
ize.height())); |
408 } | 434 } |
409 | 435 |
410 } | 436 } |
OLD | NEW |