diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 23249f9355a..68b5abfabe7 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -327,9 +327,6 @@ extern BOOL PATH_RestorePath( DC *dst, DC *src ) DECLSPEC_HIDDEN; extern BOOL PATH_ExtTextOut(DC *dc, INT x, INT y, UINT flags, const RECT *lprc, LPCWSTR str, UINT count, const INT *dx) DECLSPEC_HIDDEN; -extern BOOL PATH_PolyBezierTo(DC *dc, const POINT *pt, DWORD cbCount) DECLSPEC_HIDDEN; -extern BOOL PATH_PolyBezier(DC *dc, const POINT *pt, DWORD cbCount) DECLSPEC_HIDDEN; -extern BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types, DWORD cbCount) DECLSPEC_HIDDEN; extern BOOL PATH_PolylineTo(DC *dc, const POINT *pt, DWORD cbCount) DECLSPEC_HIDDEN; extern BOOL PATH_Polyline(DC *dc, const POINT *pt, DWORD cbCount) DECLSPEC_HIDDEN; extern BOOL PATH_Polygon(DC *dc, const POINT *pt, DWORD cbCount) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c index 239fe58faf3..d0c29554fc2 100644 --- a/dlls/gdi32/painting.c +++ b/dlls/gdi32/painting.c @@ -881,7 +881,8 @@ BOOL WINAPI FloodFill( HDC hdc, INT x, INT y, COLORREF color ) */ BOOL WINAPI PolyBezier( HDC hdc, const POINT* lppt, DWORD cPoints ) { - BOOL ret = FALSE; + PHYSDEV physdev; + BOOL ret; DC * dc; /* cPoints must be 3 * n + 1 (where n>=1) */ @@ -891,12 +892,8 @@ BOOL WINAPI PolyBezier( HDC hdc, const POINT* lppt, DWORD cPoints ) if(!dc) return FALSE; update_dc( dc ); - if(PATH_IsPathOpen(dc->path)) ret = PATH_PolyBezier(dc, lppt, cPoints); - else - { - PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyBezier ); - ret = physdev->funcs->pPolyBezier( physdev, lppt, cPoints ); - } + physdev = GET_DC_PHYSDEV( dc, pPolyBezier ); + ret = physdev->funcs->pPolyBezier( physdev, lppt, cPoints ); release_dc_ptr( dc ); return ret; } @@ -917,7 +914,8 @@ BOOL WINAPI PolyBezier( HDC hdc, const POINT* lppt, DWORD cPoints ) BOOL WINAPI PolyBezierTo( HDC hdc, const POINT* lppt, DWORD cPoints ) { DC * dc; - BOOL ret = FALSE; + BOOL ret; + PHYSDEV physdev; /* cbPoints must be 3 * n (where n>=1) */ if (!cPoints || (cPoints % 3) != 0) return FALSE; @@ -926,12 +924,9 @@ BOOL WINAPI PolyBezierTo( HDC hdc, const POINT* lppt, DWORD cPoints ) if(!dc) return FALSE; update_dc( dc ); - if(PATH_IsPathOpen(dc->path)) ret = PATH_PolyBezierTo(dc, lppt, cPoints); - else - { - PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyBezierTo ); - ret = physdev->funcs->pPolyBezierTo( physdev, lppt, cPoints ); - } + physdev = GET_DC_PHYSDEV( dc, pPolyBezierTo ); + ret = physdev->funcs->pPolyBezierTo( physdev, lppt, cPoints ); + if(ret) { dc->CursPosX = lppt[cPoints-1].x; dc->CursPosY = lppt[cPoints-1].y; @@ -974,17 +969,14 @@ BOOL WINAPI PolyDraw(HDC hdc, const POINT *lppt, const BYTE *lpbTypes, DWORD cCount) { DC *dc = get_dc_ptr( hdc ); - BOOL result = FALSE; + PHYSDEV physdev; + BOOL result; if(!dc) return FALSE; update_dc( dc ); - if( PATH_IsPathOpen( dc->path ) ) result = PATH_PolyDraw(dc, lppt, lpbTypes, cCount); - else - { - PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyDraw ); - result = physdev->funcs->pPolyDraw( physdev, lppt, lpbTypes, cCount ); - } + physdev = GET_DC_PHYSDEV( dc, pPolyDraw ); + result = physdev->funcs->pPolyDraw( physdev, lppt, lpbTypes, cCount ); release_dc_ptr( dc ); return result; } diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c index 6cdc8eca2dc..896d145a549 100644 --- a/dlls/gdi32/path.c +++ b/dlls/gdi32/path.c @@ -1224,75 +1224,60 @@ static BOOL pathdrv_Ellipse( PHYSDEV dev, INT x1, INT y1, INT x2, INT y2 ) } -BOOL PATH_PolyBezierTo(DC *dc, const POINT *pts, DWORD cbPoints) -{ - GdiPath *pPath = &dc->path; - POINT pt; - UINT i; - - /* Check that path is open */ - if(pPath->state!=PATH_Open) - return FALSE; - - /* Add a PT_MOVETO if necessary */ - if(pPath->newStroke) - { - pPath->newStroke=FALSE; - pt.x = dc->CursPosX; - pt.y = dc->CursPosY; - if(!LPtoDP(dc->hSelf, &pt, 1)) - return FALSE; - if(!PATH_AddEntry(pPath, &pt, PT_MOVETO)) - return FALSE; - } - - for(i = 0; i < cbPoints; i++) { - pt = pts[i]; - if(!LPtoDP(dc->hSelf, &pt, 1)) - return FALSE; - PATH_AddEntry(pPath, &pt, PT_BEZIERTO); - } - return TRUE; -} - -BOOL PATH_PolyBezier(DC *dc, const POINT *pts, DWORD cbPoints) -{ - GdiPath *pPath = &dc->path; - POINT pt; - UINT i; - - /* Check that path is open */ - if(pPath->state!=PATH_Open) - return FALSE; - - for(i = 0; i < cbPoints; i++) { - pt = pts[i]; - if(!LPtoDP(dc->hSelf, &pt, 1)) - return FALSE; - PATH_AddEntry(pPath, &pt, (i == 0) ? PT_MOVETO : PT_BEZIERTO); - } - return TRUE; -} - -/* PATH_PolyDraw - * - * Should be called when a call to PolyDraw is performed on a DC that has - * an open path. Returns TRUE if successful, else FALSE. +/************************************************************* + * pathdrv_PolyBezierTo */ -BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types, - DWORD cbPoints) +static BOOL pathdrv_PolyBezierTo( PHYSDEV dev, const POINT *pts, DWORD cbPoints ) { - GdiPath *pPath = &dc->path; + struct path_physdev *physdev = get_path_physdev( dev ); + POINT pt; + UINT i; + + if (!start_new_stroke( physdev )) return FALSE; + + for(i = 0; i < cbPoints; i++) { + pt = pts[i]; + LPtoDP( dev->hdc, &pt, 1 ); + PATH_AddEntry(physdev->path, &pt, PT_BEZIERTO); + } + return TRUE; +} + + +/************************************************************* + * pathdrv_PolyBezier + */ +static BOOL pathdrv_PolyBezier( PHYSDEV dev, const POINT *pts, DWORD cbPoints ) +{ + struct path_physdev *physdev = get_path_physdev( dev ); + POINT pt; + UINT i; + + for(i = 0; i < cbPoints; i++) { + pt = pts[i]; + LPtoDP( dev->hdc, &pt, 1 ); + PATH_AddEntry(physdev->path, &pt, (i == 0) ? PT_MOVETO : PT_BEZIERTO); + } + return TRUE; +} + + +/************************************************************* + * pathdrv_PolyDraw + */ +static BOOL pathdrv_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types, DWORD cbPoints ) +{ + struct path_physdev *physdev = get_path_physdev( dev ); POINT lastmove, orig_pos; INT i; - GetCurrentPositionEx( dc->hSelf, &orig_pos ); + GetCurrentPositionEx( dev->hdc, &orig_pos ); lastmove = orig_pos; - for(i = pPath->numEntriesUsed - 1; i >= 0; i--){ - if(pPath->pFlags[i] == PT_MOVETO){ - lastmove = pPath->pPoints[i]; - DPtoLP(dc->hSelf, &lastmove, 1); + for(i = physdev->path->numEntriesUsed - 1; i >= 0; i--){ + if(physdev->path->pFlags[i] == PT_MOVETO){ + lastmove = physdev->path->pPoints[i]; + DPtoLP(dev->hdc, &lastmove, 1); break; } } @@ -1302,17 +1287,17 @@ BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types, switch (types[i]) { case PT_MOVETO: - MoveToEx( dc->hSelf, pts[i].x, pts[i].y, NULL ); + MoveToEx( dev->hdc, pts[i].x, pts[i].y, NULL ); break; case PT_LINETO: case PT_LINETO | PT_CLOSEFIGURE: - LineTo( dc->hSelf, pts[i].x, pts[i].y ); + LineTo( dev->hdc, pts[i].x, pts[i].y ); break; case PT_BEZIERTO: if ((i + 2 < cbPoints) && (types[i + 1] == PT_BEZIERTO) && (types[i + 2] & ~PT_CLOSEFIGURE) == PT_BEZIERTO) { - PolyBezierTo( dc->hSelf, &pts[i], 3 ); + PolyBezierTo( dev->hdc, &pts[i], 3 ); i += 2; break; } @@ -1322,14 +1307,14 @@ BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types, { if (!(types[i - 1] & PT_CLOSEFIGURE)) lastmove = pts[i - 1]; if (lastmove.x != orig_pos.x || lastmove.y != orig_pos.y) - MoveToEx( dc->hSelf, orig_pos.x, orig_pos.y, NULL ); + MoveToEx( dev->hdc, orig_pos.x, orig_pos.y, NULL ); } return FALSE; } if(types[i] & PT_CLOSEFIGURE){ - pPath->pFlags[pPath->numEntriesUsed-1] |= PT_CLOSEFIGURE; - MoveToEx( dc->hSelf, lastmove.x, lastmove.y, NULL ); + physdev->path->pFlags[physdev->path->numEntriesUsed-1] |= PT_CLOSEFIGURE; + MoveToEx( dev->hdc, lastmove.x, lastmove.y, NULL ); } } @@ -2374,9 +2359,9 @@ const struct gdi_dc_funcs path_driver = NULL, /* pPaintRgn */ NULL, /* pPatBlt */ pathdrv_Pie, /* pPie */ - NULL, /* pPolyBezier */ - NULL, /* pPolyBezierTo */ - NULL, /* pPolyDraw */ + pathdrv_PolyBezier, /* pPolyBezier */ + pathdrv_PolyBezierTo, /* pPolyBezierTo */ + pathdrv_PolyDraw, /* pPolyDraw */ NULL, /* pPolyPolygon */ NULL, /* pPolyPolyline */ NULL, /* pPolygon */