mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 15:46:13 +00:00
[NTGDI] Support the wide pen (#4137)
- Extend PATH_WidenPath function as PATH_WidenPathEx with the path argument. - Use PATH_WidenPathEx and PATH_FillPathEx functions to implement wide pen drawing in PATH_StrokePath function. - Add the code to IntGdiLineTo, IntRectangle, IntGdiPolygon, and IntGdiPolyline in order to stroke the path when the effective wide pen. FIXME: Boundary rectangle. CORE-2527, CORE-8366
This commit is contained in:
parent
ff89651ed0
commit
6358c4ac9f
5 changed files with 258 additions and 85 deletions
|
@ -23,9 +23,10 @@ IntGdiPolygon(PDC dc,
|
|||
PBRUSH pbrLine, pbrFill;
|
||||
BOOL ret = FALSE; // Default to failure
|
||||
RECTL DestRect;
|
||||
int CurrentPoint;
|
||||
INT i, CurrentPoint;
|
||||
PDC_ATTR pdcattr;
|
||||
POINTL BrushOrigin;
|
||||
PPATH pPath;
|
||||
// int Left;
|
||||
// int Top;
|
||||
|
||||
|
@ -105,38 +106,72 @@ IntGdiPolygon(PDC dc,
|
|||
// Draw the Polygon Edges with the current pen ( if not a NULL pen )
|
||||
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < Count-1; i++)
|
||||
if (IntIsEffectiveWidePen(pbrLine))
|
||||
{
|
||||
/* Clear the path */
|
||||
PATH_Delete(dc->dclevel.hPath);
|
||||
dc->dclevel.hPath = NULL;
|
||||
|
||||
/* Begin a path */
|
||||
pPath = PATH_CreatePath(Count + 1);
|
||||
dc->dclevel.flPath |= DCPATH_ACTIVE;
|
||||
dc->dclevel.hPath = pPath->BaseObject.hHmgr;
|
||||
pPath->pos = Points[0];
|
||||
IntLPtoDP(dc, &pPath->pos, 1);
|
||||
|
||||
PATH_MoveTo(dc, pPath);
|
||||
for (i = 1; i < Count; ++i)
|
||||
{
|
||||
PATH_LineTo(dc, Points[i].x, Points[i].y);
|
||||
}
|
||||
PATH_LineTo(dc, Points[0].x, Points[0].y);
|
||||
|
||||
/* Close the path */
|
||||
pPath->state = PATH_Closed;
|
||||
dc->dclevel.flPath &= ~DCPATH_ACTIVE;
|
||||
|
||||
/* Actually stroke a path */
|
||||
ret = PATH_StrokePath(dc, pPath);
|
||||
|
||||
/* Clear the path */
|
||||
PATH_UnlockPath(pPath);
|
||||
PATH_Delete(dc->dclevel.hPath);
|
||||
dc->dclevel.hPath = NULL;
|
||||
|
||||
/* FIXME: Boundary */
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < Count-1; i++)
|
||||
{
|
||||
// DPRINT1("Polygon Making line from (%d,%d) to (%d,%d)\n",
|
||||
// Points[0].x, Points[0].y,
|
||||
// Points[1].x, Points[1].y );
|
||||
|
||||
ret = IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
Points[i].x, /* From */
|
||||
Points[i].y,
|
||||
Points[i+1].x, /* To */
|
||||
Points[i+1].y,
|
||||
&DestRect,
|
||||
ROP2_TO_MIX(pdcattr->jROP2)); /* MIX */
|
||||
if (!ret) break;
|
||||
}
|
||||
/* Close the polygon */
|
||||
if (ret)
|
||||
{
|
||||
ret = IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
Points[Count-1].x, /* From */
|
||||
Points[Count-1].y,
|
||||
Points[0].x, /* To */
|
||||
Points[0].y,
|
||||
&DestRect,
|
||||
ROP2_TO_MIX(pdcattr->jROP2)); /* MIX */
|
||||
ret = IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
Points[i].x, /* From */
|
||||
Points[i].y,
|
||||
Points[i+1].x, /* To */
|
||||
Points[i+1].y,
|
||||
&DestRect,
|
||||
ROP2_TO_MIX(pdcattr->jROP2)); /* MIX */
|
||||
if (!ret) break;
|
||||
}
|
||||
/* Close the polygon */
|
||||
if (ret)
|
||||
{
|
||||
ret = IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
Points[Count-1].x, /* From */
|
||||
Points[Count-1].y,
|
||||
Points[0].x, /* To */
|
||||
Points[0].y,
|
||||
&DestRect,
|
||||
ROP2_TO_MIX(pdcattr->jROP2)); /* MIX */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -542,6 +577,7 @@ IntRectangle(PDC dc,
|
|||
MIX Mix;
|
||||
PDC_ATTR pdcattr;
|
||||
POINTL BrushOrigin;
|
||||
PPATH pPath;
|
||||
|
||||
ASSERT ( dc ); // Caller's responsibility to set this up
|
||||
|
||||
|
@ -628,34 +664,71 @@ IntRectangle(PDC dc,
|
|||
|
||||
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
||||
{
|
||||
Mix = ROP2_TO_MIX(pdcattr->jROP2);
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.left, DestRect.top, DestRect.right, DestRect.top,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
if (IntIsEffectiveWidePen(pbrLine))
|
||||
{
|
||||
/* Clear the path */
|
||||
PATH_Delete(dc->dclevel.hPath);
|
||||
dc->dclevel.hPath = NULL;
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.right, DestRect.top, DestRect.right, DestRect.bottom,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
/* Begin a path */
|
||||
pPath = PATH_CreatePath(5);
|
||||
dc->dclevel.flPath |= DCPATH_ACTIVE;
|
||||
dc->dclevel.hPath = pPath->BaseObject.hHmgr;
|
||||
pPath->pos.x = LeftRect;
|
||||
pPath->pos.y = TopRect;
|
||||
IntLPtoDP(dc, &pPath->pos, 1);
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.right, DestRect.bottom, DestRect.left, DestRect.bottom,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
PATH_MoveTo(dc, pPath);
|
||||
PATH_LineTo(dc, RightRect, TopRect);
|
||||
PATH_LineTo(dc, RightRect, BottomRect);
|
||||
PATH_LineTo(dc, LeftRect, BottomRect);
|
||||
PATH_LineTo(dc, LeftRect, TopRect);
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.left, DestRect.bottom, DestRect.left, DestRect.top,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
/* Close the path */
|
||||
pPath->state = PATH_Closed;
|
||||
dc->dclevel.flPath &= ~DCPATH_ACTIVE;
|
||||
|
||||
/* Actually stroke a path */
|
||||
ret = PATH_StrokePath(dc, pPath);
|
||||
|
||||
/* Clear the path */
|
||||
PATH_UnlockPath(pPath);
|
||||
PATH_Delete(dc->dclevel.hPath);
|
||||
dc->dclevel.hPath = NULL;
|
||||
|
||||
/* FIXME: Boundary */
|
||||
}
|
||||
else
|
||||
{
|
||||
Mix = ROP2_TO_MIX(pdcattr->jROP2);
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.left, DestRect.top, DestRect.right, DestRect.top,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.right, DestRect.top, DestRect.right, DestRect.bottom,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.right, DestRect.bottom, DestRect.left, DestRect.bottom,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
|
||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||
(CLIPOBJ *)&dc->co,
|
||||
&dc->eboLine.BrushObject,
|
||||
DestRect.left, DestRect.bottom, DestRect.left, DestRect.top,
|
||||
&DestRect, // Bounding rectangle
|
||||
Mix);
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue