| Index: Source/core/platform/graphics/Path.cpp
|
| diff --git a/Source/core/platform/graphics/Path.cpp b/Source/core/platform/graphics/Path.cpp
|
| index f70126594af34acf02f8ae71ceb686aa18ca0440..73e79b1c40dc8ce71984eb5d89b1f132091d490c 100644
|
| --- a/Source/core/platform/graphics/Path.cpp
|
| +++ b/Source/core/platform/graphics/Path.cpp
|
| @@ -263,18 +263,18 @@ void Path::closeSubpath()
|
| m_path.close();
|
| }
|
|
|
| -void Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool anticlockwise)
|
| +void Path::addArc(const FloatPoint& p, float radius, float startAngle, float ea, bool anticlockwise)
|
| {
|
| SkScalar cx = WebCoreFloatToSkScalar(p.x());
|
| SkScalar cy = WebCoreFloatToSkScalar(p.y());
|
| - SkScalar radius = WebCoreFloatToSkScalar(r);
|
| + SkScalar radiusScalar = WebCoreFloatToSkScalar(radius);
|
| SkScalar s360 = SkIntToScalar(360);
|
|
|
| SkRect oval;
|
| - oval.set(cx - radius, cy - radius, cx + radius, cy + radius);
|
| + oval.set(cx - radiusScalar, cy - radiusScalar, cx + radiusScalar, cy + radiusScalar);
|
|
|
| - float sweep = ea - sa;
|
| - SkScalar startDegrees = WebCoreFloatToSkScalar(sa * 180 / piFloat);
|
| + float sweep = ea - startAngle;
|
| + SkScalar startDegrees = WebCoreFloatToSkScalar(startAngle * 180 / piFloat);
|
| SkScalar sweepDegrees = WebCoreFloatToSkScalar(sweep * 180 / piFloat);
|
| // Check for a circle.
|
| if (sweepDegrees >= s360 || sweepDegrees <= -s360) {
|
| @@ -305,6 +305,32 @@ void Path::addRect(const FloatRect& rect)
|
| m_path.addRect(rect);
|
| }
|
|
|
| +void Path::addEllipse(const FloatPoint& p, float radiusX, float radiusY, float rotation, float startAngle, float endAngle, bool anticlockwise)
|
| +{
|
| + // Optimize the common case of an entire ellipse.
|
| + SkScalar twoPiScalar = WebCoreFloatToSkScalar(2 * piFloat);
|
| + SkScalar endAngleScalar = WebCoreFloatToSkScalar(endAngle);
|
| + if (!rotation && !startAngle && SkScalarNearlyEqual(twoPiScalar, SkScalarAbs(endAngleScalar))) {
|
| + FloatRect boundingRect(p - FloatSize(radiusX, radiusY), FloatSize(2 * radiusX, 2 * radiusY));
|
| + if (anticlockwise && SkScalarNearlyEqual(twoPiScalar, -endAngleScalar)) {
|
| + m_path.addOval(boundingRect, SkPath::kCCW_Direction);
|
| + return;
|
| + }
|
| + if (!anticlockwise && SkScalarNearlyEqual(twoPiScalar, endAngleScalar)) {
|
| + m_path.addOval(boundingRect);
|
| + return;
|
| + }
|
| + }
|
| +
|
| + // Add an arc after the relevant transform.
|
| + AffineTransform ellipseTransform = AffineTransform::translation(p.x(), p.y()).rotate(rad2deg(rotation)).scale(radiusX, radiusY);
|
| + ASSERT(ellipseTransform.isInvertible());
|
| + AffineTransform inverseEllipseTransform = ellipseTransform.inverse();
|
| + transform(inverseEllipseTransform);
|
| + addArc(FloatPoint::zero(), 1 /* unit circle */, startAngle, endAngle, anticlockwise);
|
| + transform(ellipseTransform);
|
| +}
|
| +
|
| void Path::addEllipse(const FloatRect& rect)
|
| {
|
| m_path.addOval(rect);
|
|
|