From 80b7134bb801bbe4994d12712a5eceedf9248519 Mon Sep 17 00:00:00 2001 From: Misha Koshelev Date: Wed, 20 Jun 2007 17:02:41 -0500 Subject: [PATCH] gdi32: Set current position properly after ArcTo. --- dlls/gdi32/painting.c | 46 ++++++++++++++--------------------------- dlls/gdi32/tests/path.c | 2 +- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c index 807fee414aa..838e0e06714 100644 --- a/dlls/gdi32/painting.c +++ b/dlls/gdi32/painting.c @@ -113,6 +113,13 @@ BOOL WINAPI ArcTo( HDC hdc, INT xstart, INT ystart, INT xend, INT yend ) { + double width = fabs(right-left), + height = fabs(bottom-top), + xradius = width/2, + yradius = height/2, + xcenter = right > left ? left+xradius : right+xradius, + ycenter = bottom > top ? top+yradius : bottom+yradius, + angle; BOOL result; DC * dc = DC_GetDCUpdate( hdc ); if(!dc) return FALSE; @@ -120,40 +127,19 @@ BOOL WINAPI ArcTo( HDC hdc, if(dc->funcs->pArcTo) result = dc->funcs->pArcTo( dc->physDev, left, top, right, bottom, xstart, ystart, xend, yend ); - else + else /* We'll draw a line from the current position to the starting point of the arc, then draw the arc */ { - double width = fabs(right-left), - height = fabs(bottom-top), - xradius = width/2, - yradius = height/2, - xcenter = right > left ? left+xradius : right+xradius, - ycenter = bottom > top ? top+yradius : bottom+yradius; - /* - * Else emulate it. - * According to the documentation, a line is drawn from the current - * position to the starting point of the arc. - */ - double angle = atan2( - ((ystart-ycenter)/height), - ((xstart-xcenter)/width)); + angle = atan2(((ystart-ycenter)/height), + ((xstart-xcenter)/width)); LineTo(hdc, GDI_ROUND(xcenter+(cos(angle)*xradius)), GDI_ROUND(ycenter+(sin(angle)*yradius))); - /* - * Then the arc is drawn. - */ result = Arc(hdc, left, top, right, bottom, xstart, ystart, xend, yend); - /* - * If no error occurred, the current position is moved to the ending - * point of the arc. - */ - if (result) - { - angle = atan2( - ((yend-ycenter)/height), - ((xend-xcenter)/width)); - MoveToEx(hdc, GDI_ROUND(xcenter+(cos(angle)*xradius)), - GDI_ROUND(ycenter+(sin(angle)*yradius)), NULL); - } + } + if (result) { + angle = atan2(((yend-ycenter)/height), + ((xend-xcenter)/width)); + dc->CursPosX = GDI_ROUND(xcenter+(cos(angle)*xradius)); + dc->CursPosY = GDI_ROUND(ycenter+(sin(angle)*yradius)); } GDI_ReleaseObj( hdc ); return result; diff --git a/dlls/gdi32/tests/path.c b/dlls/gdi32/tests/path.c index bd7c12c7c04..2a803771475 100644 --- a/dlls/gdi32/tests/path.c +++ b/dlls/gdi32/tests/path.c @@ -203,7 +203,7 @@ static const path_test_t arcto_path[] = { {399, 263, PT_BEZIERTO, 0, 0}, /* 8 */ {389, 275, PT_BEZIERTO, 0, 0}, /* 9 */ {370, 285, PT_BEZIERTO, 0, 0}, /* 10 */ - {363, 277, PT_LINETO, 1, 0}, /* 11 */ + {363, 277, PT_LINETO, 0, 0}, /* 11 */ {380, 270, PT_BEZIERTO, 1, 0}, /* 12 */ {389, 260, PT_BEZIERTO, 0, 0}, /* 13 */ {389, 250, PT_BEZIERTO, 0, 0}, /* 14 */