gdi32: Implement the polyline entry points in the path driver.

oldstable
Alexandre Julliard 2011-10-26 20:20:24 +02:00
parent d4889bef47
commit 613972efe5
3 changed files with 57 additions and 84 deletions

View File

@ -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, 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;
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_PolyPolyline(DC *dc, const POINT *pt, const DWORD *counts, DWORD polylines) DECLSPEC_HIDDEN;
/* painting.c */ /* painting.c */
extern POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut ) DECLSPEC_HIDDEN; extern POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut ) DECLSPEC_HIDDEN;

View File

@ -728,13 +728,9 @@ BOOL WINAPI Polyline( HDC hdc, const POINT* pt, INT count )
if (dc) if (dc)
{ {
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyline );
update_dc( dc ); update_dc( dc );
if (PATH_IsPathOpen(dc->path)) ret = PATH_Polyline(dc, pt, count); ret = physdev->funcs->pPolyline( physdev, pt, count );
else
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyline );
ret = physdev->funcs->pPolyline( physdev, pt, count );
}
release_dc_ptr( dc ); release_dc_ptr( dc );
} }
return ret; return ret;
@ -746,17 +742,15 @@ BOOL WINAPI Polyline( HDC hdc, const POINT* pt, INT count )
BOOL WINAPI PolylineTo( HDC hdc, const POINT* pt, DWORD cCount ) BOOL WINAPI PolylineTo( HDC hdc, const POINT* pt, DWORD cCount )
{ {
DC * dc = get_dc_ptr( hdc ); DC * dc = get_dc_ptr( hdc );
BOOL ret = FALSE; PHYSDEV physdev;
BOOL ret;
if(!dc) return FALSE; if(!dc) return FALSE;
update_dc( dc ); update_dc( dc );
if(PATH_IsPathOpen(dc->path)) ret = PATH_PolylineTo(dc, pt, cCount); physdev = GET_DC_PHYSDEV( dc, pPolylineTo );
else ret = physdev->funcs->pPolylineTo( physdev, pt, cCount );
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolylineTo );
ret = physdev->funcs->pPolylineTo( physdev, pt, cCount );
}
if (ret && cCount) if (ret && cCount)
{ {
dc->CursPosX = pt[cCount-1].x; dc->CursPosX = pt[cCount-1].x;
@ -816,13 +810,9 @@ BOOL WINAPI PolyPolyline( HDC hdc, const POINT* pt, const DWORD* counts,
if (dc) if (dc)
{ {
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyPolyline );
update_dc( dc ); update_dc( dc );
if (PATH_IsPathOpen(dc->path)) ret = PATH_PolyPolyline(dc, pt, counts, polylines); ret = physdev->funcs->pPolyPolyline( physdev, pt, counts, polylines );
else
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pPolyPolyline );
ret = physdev->funcs->pPolyPolyline( physdev, pt, counts, polylines );
}
release_dc_ptr( dc ); release_dc_ptr( dc );
} }
return ret; return ret;

View File

@ -1321,55 +1321,43 @@ static BOOL pathdrv_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types,
return TRUE; return TRUE;
} }
BOOL PATH_Polyline(DC *dc, const POINT *pts, DWORD cbPoints)
/*************************************************************
* pathdrv_Polyline
*/
static BOOL pathdrv_Polyline( PHYSDEV dev, const POINT *pts, INT cbPoints )
{ {
GdiPath *pPath = &dc->path; struct path_physdev *physdev = get_path_physdev( dev );
POINT pt; POINT pt;
UINT i; INT i;
/* Check that path is open */ for(i = 0; i < cbPoints; i++) {
if(pPath->state!=PATH_Open) pt = pts[i];
return FALSE; LPtoDP( dev->hdc, &pt, 1 );
PATH_AddEntry(physdev->path, &pt, (i == 0) ? PT_MOVETO : PT_LINETO);
for(i = 0; i < cbPoints; i++) { }
pt = pts[i]; return TRUE;
if(!LPtoDP(dc->hSelf, &pt, 1))
return FALSE;
PATH_AddEntry(pPath, &pt, (i == 0) ? PT_MOVETO : PT_LINETO);
}
return TRUE;
} }
BOOL PATH_PolylineTo(DC *dc, const POINT *pts, DWORD cbPoints)
/*************************************************************
* pathdrv_PolylineTo
*/
static BOOL pathdrv_PolylineTo( PHYSDEV dev, const POINT *pts, INT cbPoints )
{ {
GdiPath *pPath = &dc->path; struct path_physdev *physdev = get_path_physdev( dev );
POINT pt; POINT pt;
UINT i; INT i;
/* Check that path is open */ if (!start_new_stroke( physdev )) return FALSE;
if(pPath->state!=PATH_Open)
return FALSE;
/* Add a PT_MOVETO if necessary */ for(i = 0; i < cbPoints; i++) {
if(pPath->newStroke) pt = pts[i];
{ LPtoDP( dev->hdc, &pt, 1 );
pPath->newStroke=FALSE; PATH_AddEntry(physdev->path, &pt, PT_LINETO);
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++) { return TRUE;
pt = pts[i];
if(!LPtoDP(dc->hSelf, &pt, 1))
return FALSE;
PATH_AddEntry(pPath, &pt, PT_LINETO);
}
return TRUE;
} }
@ -1416,26 +1404,24 @@ static BOOL pathdrv_PolyPolygon( PHYSDEV dev, const POINT* pts, const INT* count
return TRUE; return TRUE;
} }
BOOL PATH_PolyPolyline( DC *dc, const POINT* pts, const DWORD* counts,
DWORD polylines ) /*************************************************************
* pathdrv_PolyPolyline
*/
static BOOL pathdrv_PolyPolyline( PHYSDEV dev, const POINT* pts, const DWORD* counts, DWORD polylines )
{ {
GdiPath *pPath = &dc->path; struct path_physdev *physdev = get_path_physdev( dev );
POINT pt; POINT pt;
UINT poly, point, i; UINT poly, point, i;
/* Check that path is open */ for(i = 0, poly = 0; poly < polylines; poly++) {
if(pPath->state!=PATH_Open) for(point = 0; point < counts[poly]; point++, i++) {
return FALSE; pt = pts[i];
LPtoDP( dev->hdc, &pt, 1 );
for(i = 0, poly = 0; poly < polylines; poly++) { PATH_AddEntry(physdev->path, &pt, (point == 0) ? PT_MOVETO : PT_LINETO);
for(point = 0; point < counts[poly]; point++, i++) { }
pt = pts[i]; }
if(!LPtoDP(dc->hSelf, &pt, 1)) return TRUE;
return FALSE;
PATH_AddEntry(pPath, &pt, (point == 0) ? PT_MOVETO : PT_LINETO);
}
}
return TRUE;
} }
@ -2359,10 +2345,10 @@ const struct gdi_dc_funcs path_driver =
pathdrv_PolyBezierTo, /* pPolyBezierTo */ pathdrv_PolyBezierTo, /* pPolyBezierTo */
pathdrv_PolyDraw, /* pPolyDraw */ pathdrv_PolyDraw, /* pPolyDraw */
pathdrv_PolyPolygon, /* pPolyPolygon */ pathdrv_PolyPolygon, /* pPolyPolygon */
NULL, /* pPolyPolyline */ pathdrv_PolyPolyline, /* pPolyPolyline */
pathdrv_Polygon, /* pPolygon */ pathdrv_Polygon, /* pPolygon */
NULL, /* pPolyline */ pathdrv_Polyline, /* pPolyline */
NULL, /* pPolylineTo */ pathdrv_PolylineTo, /* pPolylineTo */
NULL, /* pPutImage */ NULL, /* pPutImage */
NULL, /* pRealizeDefaultPalette */ NULL, /* pRealizeDefaultPalette */
NULL, /* pRealizePalette */ NULL, /* pRealizePalette */