Misha Koshelev : gdi32: Emulate AngleArc using ArcTo.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 22 07:35:47 CDT 2007
Module: wine
Branch: master
Commit: 920b050a8b583534bd33336a81814450cf05afd2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=920b050a8b583534bd33336a81814450cf05afd2
Author: Misha Koshelev <mk144210 at bcm.edu>
Date: Thu Jun 21 23:39:18 2007 -0500
gdi32: Emulate AngleArc using ArcTo.
---
dlls/gdi32/painting.c | 41 ++++++++++++++++-------------------------
dlls/gdi32/tests/path.c | 24 ++++++++++++------------
2 files changed, 28 insertions(+), 37 deletions(-)
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index ea36421..98bae33 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -793,34 +793,25 @@ BOOL WINAPI AngleArc(HDC hdc, INT x, INT y, DWORD dwRadius, FLOAT eStartAngle, F
dc = DC_GetDCUpdate( hdc );
if(!dc) return FALSE;
- if(dc->funcs->pAngleArc)
- {
- result = dc->funcs->pAngleArc( dc->physDev, x, y, dwRadius, eStartAngle, eSweepAngle );
-
- GDI_ReleaseObj( hdc );
- return result;
- }
- GDI_ReleaseObj( hdc );
-
- /* AngleArc always works counterclockwise */
- arcdir = GetArcDirection( hdc );
- SetArcDirection( hdc, AD_COUNTERCLOCKWISE );
-
- x1 = x + cos(eStartAngle*M_PI/180) * dwRadius;
- y1 = y - sin(eStartAngle*M_PI/180) * dwRadius;
+ /* Calculate the end point */
x2 = x + cos((eStartAngle+eSweepAngle)*M_PI/180) * dwRadius;
y2 = y - sin((eStartAngle+eSweepAngle)*M_PI/180) * dwRadius;
- LineTo( hdc, x1, y1 );
- if( eSweepAngle >= 0 )
- result = Arc( hdc, x-dwRadius, y-dwRadius, x+dwRadius, y+dwRadius,
- x1, y1, x2, y2 );
- else
- result = Arc( hdc, x-dwRadius, y-dwRadius, x+dwRadius, y+dwRadius,
- x2, y2, x1, y1 );
-
- if( result ) MoveToEx( hdc, x2, y2, NULL );
- SetArcDirection( hdc, arcdir );
+ if(!PATH_IsPathOpen(dc->path) && dc->funcs->pAngleArc)
+ result = dc->funcs->pAngleArc( dc->physDev, x, y, dwRadius, eStartAngle, eSweepAngle );
+ else { /* do it using ArcTo */
+ x1 = x + cos(eStartAngle*M_PI/180) * dwRadius;
+ y1 = y - sin(eStartAngle*M_PI/180) * dwRadius;
+
+ arcdir = SetArcDirection( hdc, eSweepAngle >= 0 ? AD_COUNTERCLOCKWISE : AD_CLOCKWISE);
+ result = ArcTo( hdc, x-dwRadius, y-dwRadius, x+dwRadius, y+dwRadius,
+ x1, y1, x2, y2 );
+ SetArcDirection( hdc, arcdir );
+ }
+ if (result) {
+ dc->CursPosX = x2;
+ dc->CursPosY = y2;
+ }
return result;
}
diff --git a/dlls/gdi32/tests/path.c b/dlls/gdi32/tests/path.c
index 385a524..492673a 100644
--- a/dlls/gdi32/tests/path.c
+++ b/dlls/gdi32/tests/path.c
@@ -252,7 +252,7 @@ done:
static const path_test_t anglearc_path[] = {
{0, 0, PT_MOVETO, 0, 0}, /* 0 */
{371, 229, PT_LINETO, 0, 0}, /* 1 */
- {352, 211, PT_BEZIERTO, 1, 0}, /* 2 */
+ {352, 211, PT_BEZIERTO, 0, 0}, /* 2 */
{327, 200, PT_BEZIERTO, 0, 0}, /* 3 */
{300, 200, PT_BEZIERTO, 0, 0}, /* 4 */
{245, 200, PT_BEZIERTO, 0, 0}, /* 5 */
@@ -261,16 +261,16 @@ static const path_test_t anglearc_path[] = {
{200, 300, PT_BEZIERTO, 0, 2}, /* 8 */
{200, 300, PT_BEZIERTO, 0, 2}, /* 9 */
{200, 300, PT_BEZIERTO, 0, 2}, /* 10 */
- {231, 260, PT_LINETO, 1, 0}, /* 11 */
- {245, 235, PT_BEZIERTO, 1, 1}, /* 12 */
- {271, 220, PT_BEZIERTO, 0, 1}, /* 13 */
- {300, 220, PT_BEZIERTO, 0, 1}, /* 14 */
- {344, 220, PT_BEZIERTO, 0, 1}, /* 15 */
- {380, 256, PT_BEZIERTO, 0, 1}, /* 16 */
- {380, 300, PT_BEZIERTO, 0, 1}, /* 17 */
- {380, 314, PT_BEZIERTO, 0, 1}, /* 18 */
- {376, 328, PT_BEZIERTO, 0, 1}, /* 19 */
- {369, 340, PT_BEZIERTO | PT_CLOSEFIGURE, 0, 1}}; /* 20 */
+ {231, 260, PT_LINETO, 0, 0}, /* 11 */
+ {245, 235, PT_BEZIERTO, 0, 0}, /* 12 */
+ {271, 220, PT_BEZIERTO, 0, 0}, /* 13 */
+ {300, 220, PT_BEZIERTO, 0, 0}, /* 14 */
+ {344, 220, PT_BEZIERTO, 0, 0}, /* 15 */
+ {380, 256, PT_BEZIERTO, 0, 0}, /* 16 */
+ {380, 300, PT_BEZIERTO, 0, 0}, /* 17 */
+ {380, 314, PT_BEZIERTO, 0, 0}, /* 18 */
+ {376, 328, PT_BEZIERTO, 0, 0}, /* 19 */
+ {369, 340, PT_BEZIERTO | PT_CLOSEFIGURE, 0, 0}}; /* 20 */
static void test_anglearc(void)
{
@@ -287,7 +287,7 @@ static void test_anglearc(void)
CloseFigure(hdc);
EndPath(hdc);
- ok_path(hdc, "anglearc_path", anglearc_path, sizeof(anglearc_path)/sizeof(path_test_t), 0);
+ ok_path(hdc, "anglearc_path", anglearc_path, sizeof(anglearc_path)/sizeof(path_test_t), 1);
done:
ReleaseDC(0, hdc);
}
More information about the wine-cvs
mailing list