gdi32: Avoid directly modifying the cursor position in the DC structure in PolyDraw.
This commit is contained in:
parent
da6363e377
commit
97a261d573
|
@ -1199,63 +1199,58 @@ BOOL PATH_PolyBezier(DC *dc, const POINT *pts, DWORD cbPoints)
|
||||||
BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types,
|
BOOL PATH_PolyDraw(DC *dc, const POINT *pts, const BYTE *types,
|
||||||
DWORD cbPoints)
|
DWORD cbPoints)
|
||||||
{
|
{
|
||||||
GdiPath *pPath = &dc->path;
|
GdiPath *pPath = &dc->path;
|
||||||
POINT lastmove, orig_pos;
|
POINT lastmove, orig_pos;
|
||||||
INT i;
|
INT i;
|
||||||
|
|
||||||
lastmove.x = orig_pos.x = dc->CursPosX;
|
GetCurrentPositionEx( dc->hSelf, &orig_pos );
|
||||||
lastmove.y = orig_pos.y = dc->CursPosY;
|
lastmove = orig_pos;
|
||||||
|
|
||||||
for(i = pPath->numEntriesUsed - 1; i >= 0; i--){
|
for(i = pPath->numEntriesUsed - 1; i >= 0; i--){
|
||||||
if(pPath->pFlags[i] == PT_MOVETO){
|
if(pPath->pFlags[i] == PT_MOVETO){
|
||||||
lastmove.x = pPath->pPoints[i].x;
|
lastmove = pPath->pPoints[i];
|
||||||
lastmove.y = pPath->pPoints[i].y;
|
DPtoLP(dc->hSelf, &lastmove, 1);
|
||||||
if(!DPtoLP(dc->hSelf, &lastmove, 1))
|
break;
|
||||||
return FALSE;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < cbPoints; i++)
|
||||||
|
{
|
||||||
|
switch (types[i])
|
||||||
|
{
|
||||||
|
case PT_MOVETO:
|
||||||
|
MoveToEx( dc->hSelf, 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 );
|
||||||
|
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 );
|
||||||
|
i += 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* fall through */
|
||||||
|
default:
|
||||||
|
if (i) /* restore original position */
|
||||||
|
{
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < cbPoints; i++){
|
if(types[i] & PT_CLOSEFIGURE){
|
||||||
if(types[i] == PT_MOVETO){
|
pPath->pFlags[pPath->numEntriesUsed-1] |= PT_CLOSEFIGURE;
|
||||||
pPath->newStroke = TRUE;
|
MoveToEx( dc->hSelf, lastmove.x, lastmove.y, NULL );
|
||||||
lastmove.x = pts[i].x;
|
|
||||||
lastmove.y = pts[i].y;
|
|
||||||
}
|
|
||||||
else if((types[i] & ~PT_CLOSEFIGURE) == PT_LINETO){
|
|
||||||
PATH_LineTo(dc, pts[i].x, pts[i].y);
|
|
||||||
}
|
|
||||||
else if(types[i] == PT_BEZIERTO){
|
|
||||||
if(!((i + 2 < cbPoints) && (types[i + 1] == PT_BEZIERTO)
|
|
||||||
&& ((types[i + 2] & ~PT_CLOSEFIGURE) == PT_BEZIERTO)))
|
|
||||||
goto err;
|
|
||||||
PATH_PolyBezierTo(dc, &(pts[i]), 3);
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
dc->CursPosX = pts[i].x;
|
|
||||||
dc->CursPosY = pts[i].y;
|
|
||||||
|
|
||||||
if(types[i] & PT_CLOSEFIGURE){
|
|
||||||
pPath->pFlags[pPath->numEntriesUsed-1] |= PT_CLOSEFIGURE;
|
|
||||||
pPath->newStroke = TRUE;
|
|
||||||
dc->CursPosX = lastmove.x;
|
|
||||||
dc->CursPosY = lastmove.y;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
err:
|
|
||||||
if((dc->CursPosX != orig_pos.x) || (dc->CursPosY != orig_pos.y)){
|
|
||||||
pPath->newStroke = TRUE;
|
|
||||||
dc->CursPosX = orig_pos.x;
|
|
||||||
dc->CursPosY = orig_pos.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL PATH_Polyline(DC *dc, const POINT *pts, DWORD cbPoints)
|
BOOL PATH_Polyline(DC *dc, const POINT *pts, DWORD cbPoints)
|
||||||
|
|
Loading…
Reference in New Issue