mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 18:52:57 +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;
|
PBRUSH pbrLine, pbrFill;
|
||||||
BOOL ret = FALSE; // Default to failure
|
BOOL ret = FALSE; // Default to failure
|
||||||
RECTL DestRect;
|
RECTL DestRect;
|
||||||
int CurrentPoint;
|
INT i, CurrentPoint;
|
||||||
PDC_ATTR pdcattr;
|
PDC_ATTR pdcattr;
|
||||||
POINTL BrushOrigin;
|
POINTL BrushOrigin;
|
||||||
|
PPATH pPath;
|
||||||
// int Left;
|
// int Left;
|
||||||
// int Top;
|
// int Top;
|
||||||
|
|
||||||
|
@ -105,11 +106,44 @@ IntGdiPolygon(PDC dc,
|
||||||
// Draw the Polygon Edges with the current pen ( if not a NULL pen )
|
// Draw the Polygon Edges with the current pen ( if not a NULL pen )
|
||||||
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
||||||
{
|
{
|
||||||
int 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++)
|
for (i = 0; i < Count-1; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
// DPRINT1("Polygon Making line from (%d,%d) to (%d,%d)\n",
|
// DPRINT1("Polygon Making line from (%d,%d) to (%d,%d)\n",
|
||||||
// Points[0].x, Points[0].y,
|
// Points[0].x, Points[0].y,
|
||||||
// Points[1].x, Points[1].y );
|
// Points[1].x, Points[1].y );
|
||||||
|
@ -140,6 +174,7 @@ IntGdiPolygon(PDC dc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -542,6 +577,7 @@ IntRectangle(PDC dc,
|
||||||
MIX Mix;
|
MIX Mix;
|
||||||
PDC_ATTR pdcattr;
|
PDC_ATTR pdcattr;
|
||||||
POINTL BrushOrigin;
|
POINTL BrushOrigin;
|
||||||
|
PPATH pPath;
|
||||||
|
|
||||||
ASSERT ( dc ); // Caller's responsibility to set this up
|
ASSERT ( dc ); // Caller's responsibility to set this up
|
||||||
|
|
||||||
|
@ -627,6 +663,42 @@ IntRectangle(PDC dc,
|
||||||
ret = TRUE; // Change default to success
|
ret = TRUE; // Change default to success
|
||||||
|
|
||||||
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
||||||
|
{
|
||||||
|
if (IntIsEffectiveWidePen(pbrLine))
|
||||||
|
{
|
||||||
|
/* Clear the path */
|
||||||
|
PATH_Delete(dc->dclevel.hPath);
|
||||||
|
dc->dclevel.hPath = NULL;
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
PATH_MoveTo(dc, pPath);
|
||||||
|
PATH_LineTo(dc, RightRect, TopRect);
|
||||||
|
PATH_LineTo(dc, RightRect, BottomRect);
|
||||||
|
PATH_LineTo(dc, LeftRect, BottomRect);
|
||||||
|
PATH_LineTo(dc, LeftRect, TopRect);
|
||||||
|
|
||||||
|
/* 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);
|
Mix = ROP2_TO_MIX(pdcattr->jROP2);
|
||||||
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
ret = ret && IntEngLineTo(&psurf->SurfObj,
|
||||||
|
@ -657,6 +729,7 @@ IntRectangle(PDC dc,
|
||||||
&DestRect, // Bounding rectangle
|
&DestRect, // Bounding rectangle
|
||||||
Mix);
|
Mix);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
DC_vFinishBlit(dc, NULL);
|
DC_vFinishBlit(dc, NULL);
|
||||||
|
|
|
@ -31,7 +31,7 @@ AddPenLinesBounds(PDC dc, int count, POINT *points)
|
||||||
bounds.left = bounds.top = INT_MAX;
|
bounds.left = bounds.top = INT_MAX;
|
||||||
bounds.right = bounds.bottom = INT_MIN;
|
bounds.right = bounds.bottom = INT_MIN;
|
||||||
|
|
||||||
if (((pbrLine->ulPenStyle & PS_TYPE_MASK) & PS_GEOMETRIC) || (pbrLine->lWidth > 1))
|
if (IntIsEffectiveWidePen(pbrLine))
|
||||||
{
|
{
|
||||||
/* Windows uses some heuristics to estimate the distance from the point that will be painted */
|
/* Windows uses some heuristics to estimate the distance from the point that will be painted */
|
||||||
lWidth = pbrLine->lWidth + 2;
|
lWidth = pbrLine->lWidth + 2;
|
||||||
|
@ -152,9 +152,13 @@ IntGdiLineTo(DC *dc,
|
||||||
PBRUSH pbrLine;
|
PBRUSH pbrLine;
|
||||||
RECTL Bounds;
|
RECTL Bounds;
|
||||||
POINT Points[2];
|
POINT Points[2];
|
||||||
PDC_ATTR pdcattr = dc->pdcattr;
|
PDC_ATTR pdcattr;
|
||||||
|
PPATH pPath;
|
||||||
|
|
||||||
ASSERT_DC_PREPARED(dc);
|
ASSERT_DC_PREPARED(dc);
|
||||||
|
|
||||||
|
pdcattr = dc->pdcattr;
|
||||||
|
|
||||||
if (PATH_IsPathOpen(dc->dclevel))
|
if (PATH_IsPathOpen(dc->dclevel))
|
||||||
{
|
{
|
||||||
Ret = PATH_LineTo(dc, XEnd, YEnd);
|
Ret = PATH_LineTo(dc, XEnd, YEnd);
|
||||||
|
@ -198,6 +202,38 @@ IntGdiLineTo(DC *dc,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
if (!(pbrLine->flAttrs & BR_IS_NULL))
|
||||||
|
{
|
||||||
|
if (IntIsEffectiveWidePen(pbrLine))
|
||||||
|
{
|
||||||
|
/* Clear the path */
|
||||||
|
PATH_Delete(dc->dclevel.hPath);
|
||||||
|
dc->dclevel.hPath = NULL;
|
||||||
|
|
||||||
|
/* Begin a path */
|
||||||
|
pPath = PATH_CreatePath(2);
|
||||||
|
dc->dclevel.flPath |= DCPATH_ACTIVE;
|
||||||
|
dc->dclevel.hPath = pPath->BaseObject.hHmgr;
|
||||||
|
IntGetCurrentPositionEx(dc, &pPath->pos);
|
||||||
|
IntLPtoDP(dc, &pPath->pos, 1);
|
||||||
|
|
||||||
|
PATH_MoveTo(dc, pPath);
|
||||||
|
PATH_LineTo(dc, XEnd, YEnd);
|
||||||
|
|
||||||
|
/* 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
|
||||||
{
|
{
|
||||||
Ret = IntEngLineTo(&psurf->SurfObj,
|
Ret = IntEngLineTo(&psurf->SurfObj,
|
||||||
(CLIPOBJ *)&dc->co,
|
(CLIPOBJ *)&dc->co,
|
||||||
|
@ -207,7 +243,7 @@ IntGdiLineTo(DC *dc,
|
||||||
&Bounds,
|
&Bounds,
|
||||||
ROP2_TO_MIX(pdcattr->jROP2));
|
ROP2_TO_MIX(pdcattr->jROP2));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ret)
|
if (Ret)
|
||||||
|
@ -298,6 +334,7 @@ IntGdiPolyline(DC *dc,
|
||||||
BOOL Ret = TRUE;
|
BOOL Ret = TRUE;
|
||||||
LONG i;
|
LONG i;
|
||||||
PDC_ATTR pdcattr = dc->pdcattr;
|
PDC_ATTR pdcattr = dc->pdcattr;
|
||||||
|
PPATH pPath;
|
||||||
|
|
||||||
if (!dc->dclevel.pSurface)
|
if (!dc->dclevel.pSurface)
|
||||||
{
|
{
|
||||||
|
@ -331,13 +368,48 @@ IntGdiPolyline(DC *dc,
|
||||||
AddPenLinesBounds(dc, Count, Points);
|
AddPenLinesBounds(dc, Count, Points);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IntIsEffectiveWidePen(pbrLine))
|
||||||
|
{
|
||||||
|
/* Clear the path */
|
||||||
|
PATH_Delete(dc->dclevel.hPath);
|
||||||
|
dc->dclevel.hPath = NULL;
|
||||||
|
|
||||||
|
/* Begin a path */
|
||||||
|
pPath = PATH_CreatePath(Count);
|
||||||
|
dc->dclevel.flPath |= DCPATH_ACTIVE;
|
||||||
|
dc->dclevel.hPath = pPath->BaseObject.hHmgr;
|
||||||
|
pPath->pos = pt[0];
|
||||||
|
IntLPtoDP(dc, &pPath->pos, 1);
|
||||||
|
|
||||||
|
PATH_MoveTo(dc, pPath);
|
||||||
|
for (i = 1; i < Count; ++i)
|
||||||
|
{
|
||||||
|
PATH_LineTo(dc, pt[i].x, pt[i].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
|
||||||
|
{
|
||||||
Ret = IntEngPolyline(&psurf->SurfObj,
|
Ret = IntEngPolyline(&psurf->SurfObj,
|
||||||
(CLIPOBJ *)&dc->co,
|
(CLIPOBJ *)&dc->co,
|
||||||
&dc->eboLine.BrushObject,
|
&dc->eboLine.BrushObject,
|
||||||
Points,
|
Points,
|
||||||
Count,
|
Count,
|
||||||
ROP2_TO_MIX(pdcattr->jROP2));
|
ROP2_TO_MIX(pdcattr->jROP2));
|
||||||
|
}
|
||||||
EngFreeMem(Points);
|
EngFreeMem(Points);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1600,17 +1600,35 @@ PATH_StrokePath(
|
||||||
PPATH pPath)
|
PPATH pPath)
|
||||||
{
|
{
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
INT i = 0;
|
INT nLinePts, nAlloc, jOldFillMode, i = 0;
|
||||||
INT nLinePts, nAlloc;
|
|
||||||
POINT *pLinePts = NULL;
|
POINT *pLinePts = NULL;
|
||||||
POINT ptViewportOrg, ptWindowOrg;
|
POINT ptViewportOrg, ptWindowOrg;
|
||||||
SIZE szViewportExt, szWindowExt;
|
SIZE szViewportExt, szWindowExt;
|
||||||
DWORD mapMode, graphicsMode;
|
DWORD mapMode, graphicsMode;
|
||||||
XFORM xform;
|
XFORM xform;
|
||||||
PDC_ATTR pdcattr = dc->pdcattr;
|
PDC_ATTR pdcattr = dc->pdcattr;
|
||||||
|
PBRUSH pbrLine;
|
||||||
|
PPATH pNewPath;
|
||||||
|
|
||||||
TRACE("Enter %s\n", __FUNCTION__);
|
TRACE("Enter %s\n", __FUNCTION__);
|
||||||
|
|
||||||
|
pbrLine = dc->dclevel.pbrLine;
|
||||||
|
if (IntIsEffectiveWidePen(pbrLine))
|
||||||
|
{
|
||||||
|
pNewPath = PATH_WidenPathEx(dc, pPath);
|
||||||
|
if (pNewPath)
|
||||||
|
{
|
||||||
|
/* Fill the path with the WINDING fill mode */
|
||||||
|
jOldFillMode = pdcattr->jFillMode;
|
||||||
|
pdcattr->jFillMode = WINDING;
|
||||||
|
PATH_FillPathEx(dc, pNewPath, pbrLine);
|
||||||
|
pdcattr->jFillMode = jOldFillMode;
|
||||||
|
|
||||||
|
PATH_Delete(pNewPath->BaseObject.hHmgr);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Save the mapping mode info */
|
/* Save the mapping mode info */
|
||||||
mapMode = pdcattr->iMapMode;
|
mapMode = pdcattr->iMapMode;
|
||||||
|
|
||||||
|
@ -2100,12 +2118,7 @@ PPATH
|
||||||
FASTCALL
|
FASTCALL
|
||||||
PATH_WidenPath(DC *dc)
|
PATH_WidenPath(DC *dc)
|
||||||
{
|
{
|
||||||
INT size;
|
|
||||||
UINT penWidth, penStyle;
|
|
||||||
DWORD obj_type;
|
|
||||||
PPATH pPath, pNewPath;
|
PPATH pPath, pNewPath;
|
||||||
LPEXTLOGPEN elp;
|
|
||||||
PDC_ATTR pdcattr = dc->pdcattr;
|
|
||||||
|
|
||||||
pPath = PATH_LockPath(dc->dclevel.hPath);
|
pPath = PATH_LockPath(dc->dclevel.hPath);
|
||||||
if (!pPath)
|
if (!pPath)
|
||||||
|
@ -2114,10 +2127,24 @@ PATH_WidenPath(DC *dc)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pNewPath = PATH_WidenPathEx(dc, pPath);
|
||||||
|
PATH_UnlockPath(pPath);
|
||||||
|
return pNewPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
PPATH
|
||||||
|
FASTCALL
|
||||||
|
PATH_WidenPathEx(DC *dc, PPATH pPath)
|
||||||
|
{
|
||||||
|
INT size;
|
||||||
|
UINT penWidth, penStyle;
|
||||||
|
DWORD obj_type;
|
||||||
|
LPEXTLOGPEN elp;
|
||||||
|
PDC_ATTR pdcattr = dc->pdcattr;
|
||||||
|
|
||||||
if (pPath->state != PATH_Closed)
|
if (pPath->state != PATH_Closed)
|
||||||
{
|
{
|
||||||
TRACE("PWP 1\n");
|
TRACE("PWP 1\n");
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2126,7 +2153,6 @@ PATH_WidenPath(DC *dc)
|
||||||
if (!size)
|
if (!size)
|
||||||
{
|
{
|
||||||
TRACE("PWP 2\n");
|
TRACE("PWP 2\n");
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2135,7 +2161,6 @@ PATH_WidenPath(DC *dc)
|
||||||
if (elp == NULL)
|
if (elp == NULL)
|
||||||
{
|
{
|
||||||
TRACE("PWP 3\n");
|
TRACE("PWP 3\n");
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
EngSetLastError(ERROR_OUTOFMEMORY);
|
EngSetLastError(ERROR_OUTOFMEMORY);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2156,7 +2181,6 @@ PATH_WidenPath(DC *dc)
|
||||||
TRACE("PWP 4\n");
|
TRACE("PWP 4\n");
|
||||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||||
ExFreePoolWithTag(elp, TAG_PATH);
|
ExFreePoolWithTag(elp, TAG_PATH);
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2168,14 +2192,11 @@ PATH_WidenPath(DC *dc)
|
||||||
(PS_TYPE_MASK & penStyle) == PS_COSMETIC)
|
(PS_TYPE_MASK & penStyle) == PS_COSMETIC)
|
||||||
{
|
{
|
||||||
TRACE("PWP 5\n");
|
TRACE("PWP 5\n");
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pNewPath = IntGdiWidenPath(pPath, penWidth, penStyle, dc->dclevel.laPath.eMiterLimit);
|
return IntGdiWidenPath(pPath, penWidth, penStyle, dc->dclevel.laPath.eMiterLimit);
|
||||||
PATH_UnlockPath(pPath);
|
|
||||||
return pNewPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline INT int_from_fixed(FIXED f)
|
static inline INT int_from_fixed(FIXED f)
|
||||||
|
|
|
@ -69,14 +69,14 @@ typedef struct _EPATHOBJ
|
||||||
#define PATH_AllocPathWithHandle() ((PPATH) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_PATH, sizeof(PATH)))
|
#define PATH_AllocPathWithHandle() ((PPATH) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_PATH, sizeof(PATH)))
|
||||||
#define PATH_LockPath(hPath) ((PPATH)GDIOBJ_ShareLockObj((HGDIOBJ)hPath, GDI_OBJECT_TYPE_PATH))
|
#define PATH_LockPath(hPath) ((PPATH)GDIOBJ_ShareLockObj((HGDIOBJ)hPath, GDI_OBJECT_TYPE_PATH))
|
||||||
#define PATH_UnlockPath(pPath) GDIOBJ_vDereferenceObject((POBJ)pPath)
|
#define PATH_UnlockPath(pPath) GDIOBJ_vDereferenceObject((POBJ)pPath)
|
||||||
|
|
||||||
|
|
||||||
#define PATH_IsPathOpen(dclevel) ( ((dclevel).hPath) && ((dclevel).flPath & DCPATH_ACTIVE) )
|
#define PATH_IsPathOpen(dclevel) ( ((dclevel).hPath) && ((dclevel).flPath & DCPATH_ACTIVE) )
|
||||||
|
|
||||||
BOOL FASTCALL PATH_Arc (PDC dc, INT x1, INT y1, INT x2, INT y2, INT xStart, INT yStart, INT xEnd, INT yEnd, INT direction, INT lines);
|
BOOL FASTCALL PATH_Arc (PDC dc, INT x1, INT y1, INT x2, INT y2, INT xStart, INT yStart, INT xEnd, INT yEnd, INT direction, INT lines);
|
||||||
BOOL PATH_Ellipse (PDC dc, INT x1, INT y1, INT x2, INT y2);
|
BOOL PATH_Ellipse (PDC dc, INT x1, INT y1, INT x2, INT y2);
|
||||||
|
PPATH FASTCALL PATH_CreatePath(int count);
|
||||||
VOID FASTCALL PATH_EmptyPath (PPATH pPath);
|
VOID FASTCALL PATH_EmptyPath (PPATH pPath);
|
||||||
BOOL FASTCALL PATH_LineTo (PDC dc, INT x, INT y);
|
BOOL FASTCALL PATH_LineTo (PDC dc, INT x, INT y);
|
||||||
|
BOOL FASTCALL PATH_MoveTo(PDC dc, PPATH pPath);
|
||||||
BOOL FASTCALL PATH_PolyBezier (PDC dc, const POINT *pts, DWORD cbPoints);
|
BOOL FASTCALL PATH_PolyBezier (PDC dc, const POINT *pts, DWORD cbPoints);
|
||||||
BOOL FASTCALL PATH_PolyBezierTo (PDC dc, const POINT *pts, DWORD cbPoints);
|
BOOL FASTCALL PATH_PolyBezierTo (PDC dc, const POINT *pts, DWORD cbPoints);
|
||||||
BOOL FASTCALL PATH_PolyDraw(PDC dc, const POINT *pts, const BYTE *types, DWORD cbPoints);
|
BOOL FASTCALL PATH_PolyDraw(PDC dc, const POINT *pts, const BYTE *types, DWORD cbPoints);
|
||||||
|
@ -93,6 +93,7 @@ BOOL FASTCALL PATH_AddFlatBezier (PPATH pPath, POINT *pt, BOOL closed);
|
||||||
BOOL FASTCALL PATH_FillPath( PDC dc, PPATH pPath );
|
BOOL FASTCALL PATH_FillPath( PDC dc, PPATH pPath );
|
||||||
BOOL FASTCALL PATH_FillPathEx(PDC dc, PPATH pPath, PBRUSH pbrFill);
|
BOOL FASTCALL PATH_FillPathEx(PDC dc, PPATH pPath, PBRUSH pbrFill);
|
||||||
PPATH FASTCALL PATH_FlattenPath (PPATH pPath);
|
PPATH FASTCALL PATH_FlattenPath (PPATH pPath);
|
||||||
|
PPATH FASTCALL PATH_WidenPathEx(DC *dc, PPATH pPath);
|
||||||
|
|
||||||
BOOL FASTCALL PATH_ReserveEntries (PPATH pPath, INT numEntries);
|
BOOL FASTCALL PATH_ReserveEntries (PPATH pPath, INT numEntries);
|
||||||
BOOL FASTCALL PATH_StrokePath(DC *dc, PPATH pPath);
|
BOOL FASTCALL PATH_StrokePath(DC *dc, PPATH pPath);
|
||||||
|
|
|
@ -29,3 +29,9 @@ PEN_GetObject(
|
||||||
_Out_ PLOGPEN Buffer);
|
_Out_ PLOGPEN Buffer);
|
||||||
|
|
||||||
VOID FASTCALL AddPenLinesBounds(PDC,int,POINT *);
|
VOID FASTCALL AddPenLinesBounds(PDC,int,POINT *);
|
||||||
|
|
||||||
|
#define IntIsEffectiveWidePen(pbrLine) ( \
|
||||||
|
(pbrLine)->lWidth > 1 && \
|
||||||
|
((pbrLine->flAttrs & BR_IS_OLDSTYLEPEN) || \
|
||||||
|
((pbrLine)->ulPenStyle & PS_TYPE_MASK) == PS_GEOMETRIC) \
|
||||||
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue