2007-12-21 Brent Fulgham <bfulgham@gmail.com>
authoralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Dec 2007 01:01:24 +0000 (01:01 +0000)
committeralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Dec 2007 01:01:24 +0000 (01:01 +0000)
        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=16558
        Cairo WebCore Rendering Fails on arc drawing

        Fix for bug reported (and patched) by Apollo team in which
        arcs were draw in reverse (resulting in inverted images).
        Review of the source found that the 'clockwise' term was
        actually meant to mean 'anticlockwise' so the IDL and
        supporting classes have been changed to match this.

        * html/CanvasRenderingContext2D.cpp:
        (WebCore::CanvasRenderingContext2D::arc):
        * html/CanvasRenderingContext2D.idl:
        * platform/graphics/cairo/PathCairo.cpp:
        (WebCore::Path::addArc):
        (WebCore::Path::addEllipse):
        * platform/graphics/Path.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28944 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/html/CanvasRenderingContext2D.cpp
WebCore/html/CanvasRenderingContext2D.idl
WebCore/platform/graphics/Path.h
WebCore/platform/graphics/cairo/PathCairo.cpp

index 81f8ce486b694053a2f3ba9e6ed15a19fba16146..a53699c6639d9ed19e99948a85ab1dd99718ae89 100644 (file)
@@ -1,3 +1,24 @@
+2007-12-21  Brent Fulgham  <bfulgham@gmail.com>
+
+        Reviewed by Alp Toker.
+
+        http://bugs.webkit.org/show_bug.cgi?id=16558
+        Cairo WebCore Rendering Fails on arc drawing
+
+        Fix for bug reported (and patched) by Apollo team in which
+        arcs were draw in reverse (resulting in inverted images).
+        Review of the source found that the 'clockwise' term was
+        actually meant to mean 'anticlockwise' so the IDL and
+        supporting classes have been changed to match this. 
+
+        * html/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::arc):
+        * html/CanvasRenderingContext2D.idl:
+        * platform/graphics/cairo/PathCairo.cpp:
+        (WebCore::Path::addArc):
+        (WebCore::Path::addEllipse):
+        * platform/graphics/Path.h:
+
 2007-12-21  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Oliver.
index 97b94373ee2d9638df945a3859a9acf554f44c56..f7b0833dbb09b43ef141574470eb849df4f9e9ac 100644 (file)
@@ -419,14 +419,14 @@ void CanvasRenderingContext2D::arcTo(float x0, float y0, float x1, float y1, flo
     state().m_path.addArcTo(FloatPoint(x0, y0), FloatPoint(x1, y1), r);
 }
 
-void CanvasRenderingContext2D::arc(float x, float y, float r, float sa, float ea, bool clockwise, ExceptionCode& ec)
+void CanvasRenderingContext2D::arc(float x, float y, float r, float sa, float ea, bool anticlockwise, ExceptionCode& ec)
 {
     ec = 0;
     if (!(r > 0)) {
         ec = INDEX_SIZE_ERR;
         return;
     }
-    state().m_path.addArc(FloatPoint(x, y), r, sa, ea, clockwise);
+    state().m_path.addArc(FloatPoint(x, y), r, sa, ea, anticlockwise);
 }
 
 void CanvasRenderingContext2D::rect(float x, float y, float width, float height, ExceptionCode& ec)
index 301ca0b048df8ed9c828854885379c9845baffe8..c9da2c2d8a28df1d0bb5f691da2b954e8a566896 100644 (file)
@@ -72,7 +72,7 @@ module html {
             raises (DOMException);
         void rect(in float x, in float y, in float width, in float height)
             raises (DOMException);
-        void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean clockwise)
+        void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise)
             raises (DOMException);
         void fill();
         void stroke();
index f1096e9f67ca9b8894a717ed157f54c0bc1c96b3..515064947b807b4a064fe2ae902a5a9a21d3ac22 100644 (file)
@@ -97,7 +97,7 @@ namespace WebCore {
         void addArcTo(const FloatPoint&, const FloatPoint&, float radius);
         void closeSubpath();
 
-        void addArc(const FloatPoint&, float radius, float startAngle, float endAngle, bool clockwise);
+        void addArc(const FloatPoint&, float radius, float startAngle, float endAngle, bool anticlockwise);
         void addRect(const FloatRect&);
         void addEllipse(const FloatRect&);
 
index d9ed5ca6831d0448504292a844f3dbde6510b50e..e4c9f72a29080ffdd7a4c7c083450f7aaa6a02bc 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <cairo.h>
 #include <math.h>
+#include <wtf/MathExtras.h>
 
 namespace WebCore {
 
@@ -136,7 +137,7 @@ void Path::addBezierCurveTo(const FloatPoint& controlPoint1, const FloatPoint& c
                    controlPoint3.x(), controlPoint3.y());
 }
 
-void Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool clockwise)
+void Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool anticlockwise)
 {
     // http://bugs.webkit.org/show_bug.cgi?id=16449
     // cairo_arc() functions hang or crash when passed inf as radius or start/end angle
@@ -144,10 +145,10 @@ void Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool clockwi
         return;
 
     cairo_t* cr = platformPath()->m_cr;
-    if (clockwise)
-        cairo_arc(cr, p.x(), p.y(), r, sa, ea);
-    else
+    if (anticlockwise)
         cairo_arc_negative(cr, p.x(), p.y(), r, sa, ea);
+    else
+        cairo_arc(cr, p.x(), p.y(), r, sa, ea);
 }
 
 void Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius)
@@ -165,7 +166,7 @@ void Path::addEllipse(const FloatRect& rect)
     float xRadius = .5 * rect.width();
     cairo_translate(cr, rect.x() + xRadius, rect.y() + yRadius);
     cairo_scale(cr, xRadius, yRadius);
-    cairo_arc(cr, 0., 0., 1., 0., 2 * M_PI);
+    cairo_arc(cr, 0., 0., 1., 0., 2 * piDouble);
     cairo_restore(cr);
 }