gdi32: Implement the LineTo entry point in the path driver.

This commit is contained in:
Alexandre Julliard 2011-10-26 19:58:51 +02:00
parent 2c1ec7fc3b
commit fc5e29486d
3 changed files with 26 additions and 40 deletions

View File

@ -325,7 +325,6 @@ extern void PATH_DestroyGdiPath(GdiPath *pPath) DECLSPEC_HIDDEN;
extern BOOL PATH_SavePath( DC *dst, DC *src ) DECLSPEC_HIDDEN; extern BOOL PATH_SavePath( DC *dst, DC *src ) DECLSPEC_HIDDEN;
extern BOOL PATH_RestorePath( DC *dst, DC *src ) DECLSPEC_HIDDEN; extern BOOL PATH_RestorePath( DC *dst, DC *src ) DECLSPEC_HIDDEN;
extern BOOL PATH_LineTo(DC *dc, INT x, INT y) DECLSPEC_HIDDEN;
extern BOOL PATH_Rectangle(DC *dc, INT x1, INT y1, INT x2, INT y2) DECLSPEC_HIDDEN; extern BOOL PATH_Rectangle(DC *dc, INT x1, INT y1, INT x2, INT y2) DECLSPEC_HIDDEN;
extern BOOL PATH_ExtTextOut(DC *dc, INT x, INT y, UINT flags, const RECT *lprc, extern BOOL PATH_ExtTextOut(DC *dc, INT x, INT y, UINT flags, const RECT *lprc,
LPCWSTR str, UINT count, const INT *dx) DECLSPEC_HIDDEN; LPCWSTR str, UINT count, const INT *dx) DECLSPEC_HIDDEN;

View File

@ -232,18 +232,15 @@ BOOL nulldrv_PolylineTo( PHYSDEV dev, const POINT *points, INT count )
BOOL WINAPI LineTo( HDC hdc, INT x, INT y ) BOOL WINAPI LineTo( HDC hdc, INT x, INT y )
{ {
DC * dc = get_dc_ptr( hdc ); DC * dc = get_dc_ptr( hdc );
PHYSDEV physdev;
BOOL ret; BOOL ret;
if(!dc) return FALSE; if(!dc) return FALSE;
update_dc( dc ); update_dc( dc );
if(PATH_IsPathOpen(dc->path)) physdev = GET_DC_PHYSDEV( dc, pLineTo );
ret = PATH_LineTo(dc, x, y); ret = physdev->funcs->pLineTo( physdev, x, y );
else
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pLineTo );
ret = physdev->funcs->pLineTo( physdev, x, y );
}
if(ret) { if(ret) {
dc->CursPosX = x; dc->CursPosX = x;
dc->CursPosY = y; dc->CursPosY = y;

View File

@ -895,42 +895,32 @@ static BOOL pathdrv_MoveTo( PHYSDEV dev, INT x, INT y )
return TRUE; return TRUE;
} }
/* PATH_LineTo
* /*************************************************************
* Should be called when a LineTo is performed on a DC that has an * pathdrv_LineTo
* open path. This adds a PT_LINETO entry to the path (and possibly
* a PT_MOVETO entry, if this is the first LineTo in a stroke).
* Returns TRUE if successful, else FALSE.
*/ */
BOOL PATH_LineTo(DC *dc, INT x, INT y) static BOOL pathdrv_LineTo( PHYSDEV dev, INT x, INT y )
{ {
GdiPath *pPath = &dc->path; struct path_physdev *physdev = get_path_physdev( dev );
POINT point, pointCurPos; POINT point, pointCurPos;
/* Check that path is open */ /* Convert point to device coordinates */
if(pPath->state!=PATH_Open) point.x = x;
return FALSE; point.y = y;
LPtoDP( dev->hdc, &point, 1 );
/* Convert point to device coordinates */ /* Add a PT_MOVETO if necessary */
point.x=x; if(physdev->path->newStroke)
point.y=y; {
if(!LPtoDP(dc->hSelf, &point, 1)) physdev->path->newStroke = FALSE;
return FALSE; GetCurrentPositionEx( dev->hdc, &pointCurPos );
LPtoDP( dev->hdc, &pointCurPos, 1 );
if(!PATH_AddEntry(physdev->path, &pointCurPos, PT_MOVETO))
return FALSE;
}
/* Add a PT_MOVETO if necessary */ /* Add a PT_LINETO entry */
if(pPath->newStroke) return PATH_AddEntry(physdev->path, &point, PT_LINETO);
{
pPath->newStroke=FALSE;
pointCurPos.x = dc->CursPosX;
pointCurPos.y = dc->CursPosY;
if(!LPtoDP(dc->hSelf, &pointCurPos, 1))
return FALSE;
if(!PATH_AddEntry(pPath, &pointCurPos, PT_MOVETO))
return FALSE;
}
/* Add a PT_LINETO entry */
return PATH_AddEntry(pPath, &point, PT_LINETO);
} }
/* PATH_RoundRect /* PATH_RoundRect
@ -2360,7 +2350,7 @@ const struct gdi_dc_funcs path_driver =
NULL, /* pGetTextMetrics */ NULL, /* pGetTextMetrics */
NULL, /* pIntersectClipRect */ NULL, /* pIntersectClipRect */
NULL, /* pInvertRgn */ NULL, /* pInvertRgn */
NULL, /* pLineTo */ pathdrv_LineTo, /* pLineTo */
NULL, /* pModifyWorldTransform */ NULL, /* pModifyWorldTransform */
pathdrv_MoveTo, /* pMoveTo */ pathdrv_MoveTo, /* pMoveTo */
NULL, /* pOffsetClipRgn */ NULL, /* pOffsetClipRgn */