#define NDEBUG
#include <debug.h>
-/* TYPES *********************************************************************/
-
-/* extended PATHDATA */
-typedef struct _EXTPATHDATA
-{
- PATHDATA pd;
- struct _EXTPATHDATA *ppdNext;
-} EXTPATHDATA, *PEXTPATHDATA;
-
-/* extended PATHOBJ */
-typedef struct _EXTPATHOBJ
-{
- PATHOBJ po;
- PEXTPATHDATA ppdFirst;
- PEXTPATHDATA ppdLast;
- PEXTPATHDATA ppdCurrent;
-} EXTPATHOBJ, *PEXTPATHOBJ;
-
/* FUNCTIONS *****************************************************************/
/* FIXME: set last error */
APIENTRY
EngCreatePath(VOID)
{
- PEXTPATHOBJ pPathObj;
- const ULONG size = sizeof(EXTPATHOBJ);
+ PEPATHOBJ pPathObj;
+ const ULONG size = sizeof(EPATHOBJ);
+
+ PPATH pPath = PATH_AllocPathWithHandle();
+ if (pPath == NULL)
+ {
+ return NULL;
+ }
pPathObj = ExAllocatePoolWithTag(PagedPool, size, GDITAG_PATHOBJ);
if (pPathObj == NULL)
{
return NULL;
}
-
RtlZeroMemory(pPathObj, size);
+
+ pPathObj->pPath = pPath;
+
+ pPath->flType = PATHTYPE_KEEPME;
+ pPath->epo = pPathObj;
+
return &pPathObj->po;
}
APIENTRY
EngDeletePath(IN PATHOBJ *ppo)
{
- PEXTPATHOBJ pPathObj;
+ PEPATHOBJ pPathObj;
PEXTPATHDATA ppd, ppdNext;
+ PPATH pPath;
- pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL)
+ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL)
return;
- for (ppd = pPathObj->ppdFirst; ppd; ppd = ppdNext)
+ pPath = pPathObj->pPath;
+
+ for (ppd = pPath->ppdFirst; ppd; ppd = ppdNext)
{
ppdNext = ppd->ppdNext;
ExFreePoolWithTag(ppd, GDITAG_PATHOBJ);
}
ExFreePoolWithTag(pPathObj, GDITAG_PATHOBJ);
+ GDIOBJ_vDeleteObject(&pPath->BaseObject);
}
/*
PATHOBJ_bCloseFigure(IN PATHOBJ *ppo)
{
PEXTPATHDATA ppd;
- PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL)
+ PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL)
return FALSE;
- ppd = pPathObj->ppdLast;
+ ppd = pPathObj->pPath->ppdLast;
if (ppd == NULL)
return FALSE;
APIENTRY
PATHOBJ_vEnumStart(IN PATHOBJ *ppo)
{
- PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL)
+ PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL)
return;
- pPathObj->ppdCurrent = pPathObj->ppdFirst;
+ pPathObj->pPath->ppdCurrent = pPathObj->pPath->ppdFirst;
}
/*
IN PATHOBJ *ppo,
OUT PATHDATA *ppd)
{
- PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL || pPathObj->ppdCurrent == NULL)
+ PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL|| pPathObj->pPath == NULL || pPathObj->pPath->ppdCurrent == NULL)
return FALSE;
- *ppd = pPathObj->ppdCurrent->pd;
+ *ppd = pPathObj->pPath->ppdCurrent->pd;
- pPathObj->ppdCurrent = pPathObj->ppdCurrent->ppdNext;
- return (pPathObj->ppdCurrent != NULL);
+ pPathObj->pPath->ppdCurrent = pPathObj->pPath->ppdCurrent->ppdNext;
+ return (pPathObj->pPath->ppdCurrent != NULL);
}
/*
IN PATHOBJ *ppo,
IN POINTFIX ptfx)
{
- PEXTPATHOBJ pPathObj;
+ PEPATHOBJ pPathObj;
PEXTPATHDATA ppd, ppdLast;
- pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL)
+ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL)
return FALSE;
/* allocate a subpath data */
}
ppd->pd.pptfx[0] = ptfx;
- ppdLast = pPathObj->ppdLast;
+ ppdLast = pPathObj->pPath->ppdLast;
if (ppdLast)
{
/* end the last subpath */
/* add the subpath to the last */
ppdLast->ppdNext = ppd;
- pPathObj->ppdLast = ppd;
+ pPathObj->pPath->ppdLast = ppd;
}
else
{
/* add the subpath */
- pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
+ pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
}
pPathObj->po.cCurves++;
IN POINTFIX *pptfx,
IN ULONG cptfx)
{
- PEXTPATHOBJ pPathObj;
+ PEPATHOBJ pPathObj;
PEXTPATHDATA ppd, ppdLast;
PPOINTFIX pptfxNew, pptfxOld;
ULONG size;
- pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL || pptfx == NULL || cptfx == 0)
+ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL || pptfx == NULL || cptfx == 0)
return FALSE;
- ppdLast = pPathObj->ppdLast;
+ ppdLast = pPathObj->pPath->ppdLast;
if (ppdLast == NULL)
{
/* allocate a subpath data */
ppd->pd.count = cptfx;
/* set the subpath */
- pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
+ pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
pPathObj->po.cCurves++;
}
/* add to last */
ppdLast->ppdNext = ppd;
- pPathObj->ppdLast = ppd;
+ pPathObj->pPath->ppdLast = ppd;
pPathObj->po.cCurves++;
}
IN POINTFIX *pptfx,
IN ULONG cptfx)
{
- PEXTPATHOBJ pPathObj;
+ PEPATHOBJ pPathObj;
PEXTPATHDATA ppd, ppdLast;
PPOINTFIX pptfxNew, pptfxOld;
ULONG size;
- pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL || pptfx == NULL || cptfx == 0)
+ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL || pptfx == NULL || cptfx == 0)
return FALSE;
- ppdLast = pPathObj->ppdLast;
+ ppdLast = pPathObj->pPath->ppdLast;
if (ppdLast == NULL)
{
/* allocate a subpath data */
ppd->pd.count = cptfx;
/* set the subpath */
- pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
+ pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
pPathObj->po.cCurves++;
}
/* add to last */
ppdLast->ppdNext = ppd;
- pPathObj->ppdLast = ppd;
+ pPathObj->pPath->ppdLast = ppd;
pPathObj->po.cCurves++;
}
OUT PRECTFX prectfx)
{
FIX xLeft, yTop, xRight, yBottom;
- PEXTPATHOBJ pPathObj;
+ PEPATHOBJ pPathObj;
PEXTPATHDATA ppd, ppdNext;
ULONG i;
- pPathObj = (PEXTPATHOBJ)ppo;
- if (pPathObj == NULL || prectfx == NULL)
+ pPathObj = (PEPATHOBJ)ppo;
+ if (pPathObj == NULL || pPathObj->pPath == NULL || prectfx == NULL)
return;
yTop = xLeft = MAXLONG;
yBottom = xRight = MINLONG;
- for (ppd = pPathObj->ppdFirst; ppd; ppd = ppdNext)
+ for (ppd = pPathObj->pPath->ppdFirst; ppd; ppd = ppdNext)
{
ppdNext = ppd->ppdNext;
for (i = 0; i < ppd->pd.count; ++i)