changeset 1633:c441c85baa57

Fix rendering Arc segments in anti-antialiased mode on Windows.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 28 Mar 2012 23:11:12 +0000
parents fdf874f25076
children c3e08322b8f6
files win/dw.c
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/win/dw.c	Wed Mar 28 19:17:08 2012 +0000
+++ b/win/dw.c	Wed Mar 28 23:11:12 2012 +0000
@@ -22,6 +22,7 @@
 #include <malloc.h>
 #include <io.h>
 #include <time.h>
+#define _USE_MATH_DEFINES
 #include <math.h>
 #include "dw.h"
 #ifdef BUILD_DLL
@@ -9958,8 +9959,18 @@
       {
          double a1 = atan2((y1-yorigin), (x1-xorigin));
          double a2 = atan2((y2-yorigin), (x2-xorigin));
+         double dx = xorigin - x1;
+         double dy = yorigin - y1;
+         double r = sqrt(dx*dx + dy*dy);
+         double sweep;
+         int ri = (int)r;
          
-         GdipDrawArcI(graphics, pen, x1 < x2 ? x1 : x2, y1 < y2 ? y1 : y2, abs(x1-x2), abs(y1-y2), (REAL)a1, (REAL)a2);
+         /* Convert to degrees */
+         a1 *= (180.0 / M_PI);
+         a2 *= (180.0 / M_PI);
+         sweep = fabs(a1 - a2);
+         
+         GdipDrawArcI(graphics, pen, xorigin-ri, yorigin-ri, ri*2, ri*2, (REAL)a1, (REAL)sweep);
       }
       GdipDeleteGraphics(graphics);
    }
@@ -9989,7 +10000,7 @@
       if(flags & DW_DRAW_FULL)
          Ellipse(hdcPaint, x1, y1, x2, y2);
       else
-         Arc(hdcPaint, xorigin-(int)r, yorigin-(int)r, xorigin+(int)r, yorigin+(int)r, x2, y2, x1, y1);
+         Arc(hdcPaint, xorigin-ri, yorigin-ri, xorigin+ri, yorigin+ri, x2, y2, x1, y1);
       SelectObject( hdcPaint, oldBrush );
       SelectObject( hdcPaint, oldPen );