mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:46:06 +00:00
[Win32SS]
- Merge path objects with gdi path structure. See CORE-13536.
This commit is contained in:
parent
da53a9399a
commit
31aab36e88
2 changed files with 67 additions and 61 deletions
|
@ -14,24 +14,6 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#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 *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
/* FIXME: set last error */
|
/* FIXME: set last error */
|
||||||
|
@ -44,16 +26,27 @@ PATHOBJ*
|
||||||
APIENTRY
|
APIENTRY
|
||||||
EngCreatePath(VOID)
|
EngCreatePath(VOID)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
const ULONG size = sizeof(EXTPATHOBJ);
|
const ULONG size = sizeof(EPATHOBJ);
|
||||||
|
|
||||||
|
PPATH pPath = PATH_AllocPathWithHandle();
|
||||||
|
if (pPath == NULL)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
pPathObj = ExAllocatePoolWithTag(PagedPool, size, GDITAG_PATHOBJ);
|
pPathObj = ExAllocatePoolWithTag(PagedPool, size, GDITAG_PATHOBJ);
|
||||||
if (pPathObj == NULL)
|
if (pPathObj == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlZeroMemory(pPathObj, size);
|
RtlZeroMemory(pPathObj, size);
|
||||||
|
|
||||||
|
pPathObj->pPath = pPath;
|
||||||
|
|
||||||
|
pPath->flType = PATHTYPE_KEEPME;
|
||||||
|
pPath->epo = pPathObj;
|
||||||
|
|
||||||
return &pPathObj->po;
|
return &pPathObj->po;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,19 +57,23 @@ VOID
|
||||||
APIENTRY
|
APIENTRY
|
||||||
EngDeletePath(IN PATHOBJ *ppo)
|
EngDeletePath(IN PATHOBJ *ppo)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
PEXTPATHDATA ppd, ppdNext;
|
PEXTPATHDATA ppd, ppdNext;
|
||||||
|
PPATH pPath;
|
||||||
|
|
||||||
pPathObj = (PEXTPATHOBJ)ppo;
|
pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL)
|
if (pPathObj == NULL || pPathObj->pPath == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (ppd = pPathObj->ppdFirst; ppd; ppd = ppdNext)
|
pPath = pPathObj->pPath;
|
||||||
|
|
||||||
|
for (ppd = pPath->ppdFirst; ppd; ppd = ppdNext)
|
||||||
{
|
{
|
||||||
ppdNext = ppd->ppdNext;
|
ppdNext = ppd->ppdNext;
|
||||||
ExFreePoolWithTag(ppd, GDITAG_PATHOBJ);
|
ExFreePoolWithTag(ppd, GDITAG_PATHOBJ);
|
||||||
}
|
}
|
||||||
ExFreePoolWithTag(pPathObj, GDITAG_PATHOBJ);
|
ExFreePoolWithTag(pPathObj, GDITAG_PATHOBJ);
|
||||||
|
GDIOBJ_vDeleteObject(&pPath->BaseObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -87,11 +84,11 @@ APIENTRY
|
||||||
PATHOBJ_bCloseFigure(IN PATHOBJ *ppo)
|
PATHOBJ_bCloseFigure(IN PATHOBJ *ppo)
|
||||||
{
|
{
|
||||||
PEXTPATHDATA ppd;
|
PEXTPATHDATA ppd;
|
||||||
PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
|
PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL)
|
if (pPathObj == NULL || pPathObj->pPath == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ppd = pPathObj->ppdLast;
|
ppd = pPathObj->pPath->ppdLast;
|
||||||
if (ppd == NULL)
|
if (ppd == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -106,11 +103,11 @@ VOID
|
||||||
APIENTRY
|
APIENTRY
|
||||||
PATHOBJ_vEnumStart(IN PATHOBJ *ppo)
|
PATHOBJ_vEnumStart(IN PATHOBJ *ppo)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
|
PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL)
|
if (pPathObj == NULL || pPathObj->pPath == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pPathObj->ppdCurrent = pPathObj->ppdFirst;
|
pPathObj->pPath->ppdCurrent = pPathObj->pPath->ppdFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -122,14 +119,14 @@ PATHOBJ_bEnum(
|
||||||
IN PATHOBJ *ppo,
|
IN PATHOBJ *ppo,
|
||||||
OUT PATHDATA *ppd)
|
OUT PATHDATA *ppd)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj = (PEXTPATHOBJ)ppo;
|
PEPATHOBJ pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL || pPathObj->ppdCurrent == NULL)
|
if (pPathObj == NULL|| pPathObj->pPath == NULL || pPathObj->pPath->ppdCurrent == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
*ppd = pPathObj->ppdCurrent->pd;
|
*ppd = pPathObj->pPath->ppdCurrent->pd;
|
||||||
|
|
||||||
pPathObj->ppdCurrent = pPathObj->ppdCurrent->ppdNext;
|
pPathObj->pPath->ppdCurrent = pPathObj->pPath->ppdCurrent->ppdNext;
|
||||||
return (pPathObj->ppdCurrent != NULL);
|
return (pPathObj->pPath->ppdCurrent != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -141,11 +138,11 @@ PATHOBJ_bMoveTo(
|
||||||
IN PATHOBJ *ppo,
|
IN PATHOBJ *ppo,
|
||||||
IN POINTFIX ptfx)
|
IN POINTFIX ptfx)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
PEXTPATHDATA ppd, ppdLast;
|
PEXTPATHDATA ppd, ppdLast;
|
||||||
|
|
||||||
pPathObj = (PEXTPATHOBJ)ppo;
|
pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL)
|
if (pPathObj == NULL || pPathObj->pPath == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* allocate a subpath data */
|
/* allocate a subpath data */
|
||||||
|
@ -166,7 +163,7 @@ PATHOBJ_bMoveTo(
|
||||||
}
|
}
|
||||||
ppd->pd.pptfx[0] = ptfx;
|
ppd->pd.pptfx[0] = ptfx;
|
||||||
|
|
||||||
ppdLast = pPathObj->ppdLast;
|
ppdLast = pPathObj->pPath->ppdLast;
|
||||||
if (ppdLast)
|
if (ppdLast)
|
||||||
{
|
{
|
||||||
/* end the last subpath */
|
/* end the last subpath */
|
||||||
|
@ -174,12 +171,12 @@ PATHOBJ_bMoveTo(
|
||||||
|
|
||||||
/* add the subpath to the last */
|
/* add the subpath to the last */
|
||||||
ppdLast->ppdNext = ppd;
|
ppdLast->ppdNext = ppd;
|
||||||
pPathObj->ppdLast = ppd;
|
pPathObj->pPath->ppdLast = ppd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* add the subpath */
|
/* add the subpath */
|
||||||
pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
|
pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPathObj->po.cCurves++;
|
pPathObj->po.cCurves++;
|
||||||
|
@ -197,16 +194,16 @@ PATHOBJ_bPolyLineTo(
|
||||||
IN POINTFIX *pptfx,
|
IN POINTFIX *pptfx,
|
||||||
IN ULONG cptfx)
|
IN ULONG cptfx)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
PEXTPATHDATA ppd, ppdLast;
|
PEXTPATHDATA ppd, ppdLast;
|
||||||
PPOINTFIX pptfxNew, pptfxOld;
|
PPOINTFIX pptfxNew, pptfxOld;
|
||||||
ULONG size;
|
ULONG size;
|
||||||
|
|
||||||
pPathObj = (PEXTPATHOBJ)ppo;
|
pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL || pptfx == NULL || cptfx == 0)
|
if (pPathObj == NULL || pPathObj->pPath == NULL || pptfx == NULL || cptfx == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ppdLast = pPathObj->ppdLast;
|
ppdLast = pPathObj->pPath->ppdLast;
|
||||||
if (ppdLast == NULL)
|
if (ppdLast == NULL)
|
||||||
{
|
{
|
||||||
/* allocate a subpath data */
|
/* allocate a subpath data */
|
||||||
|
@ -230,7 +227,7 @@ PATHOBJ_bPolyLineTo(
|
||||||
ppd->pd.count = cptfx;
|
ppd->pd.count = cptfx;
|
||||||
|
|
||||||
/* set the subpath */
|
/* set the subpath */
|
||||||
pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
|
pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
|
||||||
|
|
||||||
pPathObj->po.cCurves++;
|
pPathObj->po.cCurves++;
|
||||||
}
|
}
|
||||||
|
@ -258,7 +255,7 @@ PATHOBJ_bPolyLineTo(
|
||||||
|
|
||||||
/* add to last */
|
/* add to last */
|
||||||
ppdLast->ppdNext = ppd;
|
ppdLast->ppdNext = ppd;
|
||||||
pPathObj->ppdLast = ppd;
|
pPathObj->pPath->ppdLast = ppd;
|
||||||
|
|
||||||
pPathObj->po.cCurves++;
|
pPathObj->po.cCurves++;
|
||||||
}
|
}
|
||||||
|
@ -294,16 +291,16 @@ PATHOBJ_bPolyBezierTo(
|
||||||
IN POINTFIX *pptfx,
|
IN POINTFIX *pptfx,
|
||||||
IN ULONG cptfx)
|
IN ULONG cptfx)
|
||||||
{
|
{
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
PEXTPATHDATA ppd, ppdLast;
|
PEXTPATHDATA ppd, ppdLast;
|
||||||
PPOINTFIX pptfxNew, pptfxOld;
|
PPOINTFIX pptfxNew, pptfxOld;
|
||||||
ULONG size;
|
ULONG size;
|
||||||
|
|
||||||
pPathObj = (PEXTPATHOBJ)ppo;
|
pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL || pptfx == NULL || cptfx == 0)
|
if (pPathObj == NULL || pPathObj->pPath == NULL || pptfx == NULL || cptfx == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ppdLast = pPathObj->ppdLast;
|
ppdLast = pPathObj->pPath->ppdLast;
|
||||||
if (ppdLast == NULL)
|
if (ppdLast == NULL)
|
||||||
{
|
{
|
||||||
/* allocate a subpath data */
|
/* allocate a subpath data */
|
||||||
|
@ -327,7 +324,7 @@ PATHOBJ_bPolyBezierTo(
|
||||||
ppd->pd.count = cptfx;
|
ppd->pd.count = cptfx;
|
||||||
|
|
||||||
/* set the subpath */
|
/* set the subpath */
|
||||||
pPathObj->ppdLast = pPathObj->ppdFirst = ppd;
|
pPathObj->pPath->ppdLast = pPathObj->pPath->ppdFirst = ppd;
|
||||||
|
|
||||||
pPathObj->po.cCurves++;
|
pPathObj->po.cCurves++;
|
||||||
}
|
}
|
||||||
|
@ -355,7 +352,7 @@ PATHOBJ_bPolyBezierTo(
|
||||||
|
|
||||||
/* add to last */
|
/* add to last */
|
||||||
ppdLast->ppdNext = ppd;
|
ppdLast->ppdNext = ppd;
|
||||||
pPathObj->ppdLast = ppd;
|
pPathObj->pPath->ppdLast = ppd;
|
||||||
|
|
||||||
pPathObj->po.cCurves++;
|
pPathObj->po.cCurves++;
|
||||||
}
|
}
|
||||||
|
@ -415,18 +412,18 @@ PATHOBJ_vGetBounds(
|
||||||
OUT PRECTFX prectfx)
|
OUT PRECTFX prectfx)
|
||||||
{
|
{
|
||||||
FIX xLeft, yTop, xRight, yBottom;
|
FIX xLeft, yTop, xRight, yBottom;
|
||||||
PEXTPATHOBJ pPathObj;
|
PEPATHOBJ pPathObj;
|
||||||
PEXTPATHDATA ppd, ppdNext;
|
PEXTPATHDATA ppd, ppdNext;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
pPathObj = (PEXTPATHOBJ)ppo;
|
pPathObj = (PEPATHOBJ)ppo;
|
||||||
if (pPathObj == NULL || prectfx == NULL)
|
if (pPathObj == NULL || pPathObj->pPath == NULL || prectfx == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
yTop = xLeft = MAXLONG;
|
yTop = xLeft = MAXLONG;
|
||||||
yBottom = xRight = MINLONG;
|
yBottom = xRight = MINLONG;
|
||||||
|
|
||||||
for (ppd = pPathObj->ppdFirst; ppd; ppd = ppdNext)
|
for (ppd = pPathObj->pPath->ppdFirst; ppd; ppd = ppdNext)
|
||||||
{
|
{
|
||||||
ppdNext = ppd->ppdNext;
|
ppdNext = ppd->ppdNext;
|
||||||
for (i = 0; i < ppd->pd.count; ++i)
|
for (i = 0; i < ppd->pd.count; ++i)
|
||||||
|
|
|
@ -24,6 +24,13 @@ typedef enum tagGdiPathState
|
||||||
#define PATHTYPE_KEEPME 1
|
#define PATHTYPE_KEEPME 1
|
||||||
#define PATHTYPE_STACK 2
|
#define PATHTYPE_STACK 2
|
||||||
|
|
||||||
|
/* extended PATHDATA */
|
||||||
|
typedef struct _EXTPATHDATA
|
||||||
|
{
|
||||||
|
PATHDATA pd;
|
||||||
|
struct _EXTPATHDATA *ppdNext;
|
||||||
|
} EXTPATHDATA, *PEXTPATHDATA;
|
||||||
|
|
||||||
typedef struct _PATH
|
typedef struct _PATH
|
||||||
{
|
{
|
||||||
BASEOBJECT BaseObject;
|
BASEOBJECT BaseObject;
|
||||||
|
@ -31,14 +38,16 @@ typedef struct _PATH
|
||||||
RECTFX rcfxBoundBox;
|
RECTFX rcfxBoundBox;
|
||||||
POINTFX ptfxSubPathStart;
|
POINTFX ptfxSubPathStart;
|
||||||
FLONG flType;
|
FLONG flType;
|
||||||
//PEXTPATHDATA ppdFirst;
|
PEXTPATHDATA ppdFirst;
|
||||||
//PEXTPATHDATA ppdLast;
|
PEXTPATHDATA ppdLast;
|
||||||
FLONG flags; // PATHDATA flags.
|
FLONG flags; // PATHDATA flags.
|
||||||
//PEXTPATHDATA ppdCurrent;
|
PEXTPATHDATA ppdCurrent;
|
||||||
// PATHOBJ;
|
// PATHOBJ;
|
||||||
FLONG fl; // Saved flags.
|
FLONG fl; // Saved flags.
|
||||||
ULONG cCurves; // Saved number of lines and Bezier.
|
ULONG cCurves; // Saved number of lines and Bezier.
|
||||||
|
|
||||||
|
struct _EPATHOBJ *epo;
|
||||||
|
|
||||||
// Wine/ReactOS Things to convert from:
|
// Wine/ReactOS Things to convert from:
|
||||||
FLONG state;
|
FLONG state;
|
||||||
POINT *pPoints;
|
POINT *pPoints;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue