18#pragma warning(disable:4244)
21#define NUM_ENTRIES_INITIAL 16
23#define GROW_FACTOR_NUMER 2
24#define GROW_FACTOR_DENOM 1
27static int PathCount = 0;
45 TRACE(
"CreatePath p 0x%p\n", pPath);
69 TRACE(
"Create Path %d\n",PathCount);
93 if (!hPath)
return FALSE;
95 if (!pPath)
return FALSE;
100 TRACE(
"Delete Path %d\n",PathCount);
168 const PPATH pPathSrc)
180 pPathDest->
pos = pPathSrc->
pos;
190 TRACE(
"PATH_SavePath\n");
193 TRACE(
"PATH_SavePath 1\n");
197 dst->dclevel.flPath =
src->dclevel.flPath;
211 TRACE(
"PATH_RestorePath\n");
213 if (
dst->dclevel.hPath ==
NULL)
216 TRACE(
"PATH_RestorePath 1\n");
218 dst->dclevel.flPath =
src->dclevel.flPath;
230 TRACE(
"PATH_RestorePath 2\n");
300 INT numEntriesToAllocate;
316 while (numEntriesToAllocate < numEntries)
320 numEntriesToAllocate = numEntries;
347 pPath->
pFlags = pFlagsNew;
472 if (bExtraPt &&
path->numEntriesUsed == 1)
518 if (!
path->newStroke &&
path->numEntriesUsed &&
520 path->pPoints[
path->numEntriesUsed - 1].x ==
path->pos.x &&
521 path->pPoints[
path->numEntriesUsed - 1].y ==
path->pos.y)
568 if (!pPath)
return FALSE;
573 TRACE(
"MoveTo has changed\n");
603 if (!pPath)
return FALSE;
614 TRACE(
"Line To : New Stroke\n");
650 if (!pPath)
return FALSE;
703 if (!pPath)
return FALSE;
723 TRACE(
"xOffset %d, yOffset %d, Rect WxH: %dx%d.\n",
731 ell_height =
EngMulDiv(ell_height, 1, 2);
806 TRACE(
"PATH_Ellipse: %p -> (%d, %d) - (%d, %d)\n",
829 TRACE(
"xOffset %d, yOffset %d, Rect WxH: %dx%d.\n",
878 ERR(
"PATH_Ellipse No add\n");
908 float xNorm[4], yNorm[4];
918 halfAngle = (angleEnd - angleStart) / 2.0;
919 if (
fabs(halfAngle) > 1
e-8)
921 a = 4.0 / 3.0 * (1 -
cos(halfAngle)) /
sin(halfAngle);
922 xNorm[0] =
cos(angleStart);
923 yNorm[0] =
sin(angleStart);
924 xNorm[1] = xNorm[0] -
a * yNorm[0];
925 yNorm[1] = yNorm[0] +
a * xNorm[0];
926 xNorm[3] =
cos(angleEnd);
927 yNorm[3] =
sin(angleEnd);
928 xNorm[2] = xNorm[3] +
a * yNorm[3];
929 yNorm[2] = yNorm[3] -
a * xNorm[3];
932 for (
i = 0;
i < 4;
i++)
934 xNorm[
i] =
cos(angleStart);
935 yNorm[
i] =
sin(angleStart);
939 start = !startEntryType;
978 double angleStart, angleEnd, angleStartQuadrant, angleEndQuadrant = 0.0;
981 POINT corners[2], pointStart, pointEnd;
982 POINT centre, pointCurPos;
994 if (!pPath)
return FALSE;
1009 corners[0].
x =
x1; corners[0].
y =
y1;
1010 corners[1].
x =
x2; corners[1].
y =
y2;
1011 pointStart.
x = xStart; pointStart.
y = yStart;
1012 pointEnd.
x = xEnd; pointEnd.
y = yEnd;
1018 if (corners[0].
x > corners[1].
x)
1020 temp = corners[0].
x;
1021 corners[0].
x = corners[1].
x;
1022 corners[1].
x =
temp;
1024 if (corners[0].
y > corners[1].
y)
1026 temp = corners[0].
y;
1027 corners[0].
y = corners[1].
y;
1028 corners[1].
y =
temp;
1040 if (angleEnd <= angleStart)
1042 angleEnd += 2 *
M_PI;
1043 ASSERT(angleEnd >= angleStart);
1048 if (angleEnd >= angleStart)
1050 angleEnd -= 2 *
M_PI;
1051 ASSERT(angleEnd <= angleStart);
1084 angleStartQuadrant = angleStart;
1092 angleStartQuadrant = angleEndQuadrant;
1094 angleEndQuadrant +=
M_PI_2;
1096 angleEndQuadrant -=
M_PI_2;
1100 if ((clockwise && angleEnd < angleEndQuadrant) ||
1101 (!clockwise && angleEnd > angleEndQuadrant))
1104 angleEndQuadrant = angleEnd;
1129 centre.
x = (corners[0].
x + corners[1].
x) / 2;
1130 centre.
y = (corners[0].
y + corners[1].
y) / 2;
1154 if (!pPath)
return FALSE;
1177 if (!pPath)
return FALSE;
1197 POINT orig_pos, cur_pos;
1201 if (!pPath)
return FALSE;
1210 orig_pos = pPath->
pos;
1214 TRACE(
"PPD : Current pos X %d Y %d\n",pPath->
pos.
x, pPath->
pos.
y);
1215 TRACE(
"PPD : last %d pos X %d Y %d\n",lastmove, pPath->
pPoints[lastmove].
x, pPath->
pPoints[lastmove].
y);
1218 for(
i = 0;
i < cbPoints;
i++)
1224 pPath->
pos = pts[
i];
1251 pPath->
pos = orig_pos;
1253 TRACE(
"PPD Bad : pos X %d Y %d\n",pPath->
pos.
x, pPath->
pos.
y);
1265 TRACE(
"PPD close : pos X %d Y %d\n",pPath->
pos.
x, pPath->
pos.
y);
1286 if (cbPoints < 1)
return FALSE;
1289 if (!pPath)
return FALSE;
1316 if (!polygons)
return FALSE;
1319 if (!pPath)
return FALSE;
1322 for (poly =
count = 0; poly < polygons; poly++)
1324 if (counts[poly] < 2)
1329 count += counts[poly];
1340 for (poly = 0; poly < polygons;
type += counts[poly++])
1354 const DWORD* counts,
1372 for (
i = 0, poly = 0; poly < polylines; poly++)
1401 if (!pts)
return FALSE;
1403 for (
i = 1;
i <
no;
i++)
1424 TRACE(
"PATH_FlattenPath\n");
1451 TRACE(
"PATH_FlattenPath good\n");
1468 int i,
pos, polygons;
1477 ERR(
"Failed to allocate %lu strokes\n", (pPath->
numEntriesUsed / 2) *
sizeof(*counts));
1487 counts[polygons++] =
i -
pos;
1490 if (
i >
pos + 1) counts[polygons++] =
i -
pos;
1492 ASSERT( polygons <= pPath->numEntriesUsed / 2 );
1502 ERR(
"REGION_SetPolyPolygonRgn failed\n");
1532 INT mapMode, graphicsMode;
1533 SIZE ptViewportExt, ptWindowExt;
1534 POINTL ptViewportOrg, ptWindowOrg;
1549 TRACE(
"PFP : Fail P2R\n");
1615 INT nLinePts, nAlloc, jOldFillMode,
i = 0;
1617 POINT ptViewportOrg, ptWindowOrg;
1618 SIZE szViewportExt, szWindowExt;
1619 DWORD mapMode, graphicsMode;
1627 pbrLine =
dc->dclevel.pbrLine;
1648 ptViewportOrg =
dc->pdcattr->ptlViewportOrg;
1649 szWindowExt =
dc->pdcattr->szlWindowExt;
1650 ptWindowOrg =
dc->pdcattr->ptlWindowOrg;
1672 ERR(
"Can't allocate pool!\n");
1683 ERR(
"Expected PT_MOVETO %s, got path flag %d\n",
1684 i == 0 ?
"as first point" :
"after PT_CLOSEFIGURE",
1692 TRACE(
"Got PT_MOVETO (%ld, %ld)\n",
1696 pLinePts[nLinePts++] = pPath->
pPoints[
i];
1700 TRACE(
"Got PT_LINETO (%ld, %ld)\n",
1702 pLinePts[nLinePts++] = pPath->
pPoints[
i];
1705 TRACE(
"Got PT_BEZIERTO\n");
1709 ERR(
"Path didn't contain 3 successive PT_BEZIERTOs\n");
1715 INT nBzrPts, nMinAlloc;
1721 if (nAlloc < nMinAlloc)
1726 nAlloc = nMinAlloc * 2;
1729 nAlloc *
sizeof(
POINT),
1734 ERR(
"Can't allocate pool!\n");
1743 memcpy(&pLinePts[nLinePts], &pBzrPts[1], (nBzrPts - 1) *
sizeof(
POINT));
1744 nLinePts += nBzrPts - 1;
1750 ERR(
"Got path flag %d (not supported)\n", (
INT)pPath->
pFlags[
i]);
1756 pLinePts[nLinePts++] = pLinePts[0];
1799#define round(x) ((int)((x)>0?(x)+0.5:(x)-0.5))
1804 INT i,
j, numStrokes, numOldStrokes, penWidthIn, penWidthOut;
1805 PPATH flat_path, pNewPath =
NULL, *pStrokes =
NULL, *pOldStrokes, pUpPath, pDownPath;
1807 DWORD joint, endcap;
1815 ERR(
"PATH_FlattenPath\n");
1819 penWidthIn = penWidth / 2;
1820 penWidthOut = penWidth / 2;
1821 if (penWidthIn + penWidthOut < penWidth)
1832 ERR(
"Expected PT_MOVETO %s, got path flag %c\n",
1833 i == 0 ?
"as first point" :
"after PT_CLOSEFIGURE",
1844 numOldStrokes = numStrokes;
1847 if (numStrokes == 1)
1851 pOldStrokes = pStrokes;
1866 if (!pStrokes[numStrokes - 1])
1871 pStrokes[numStrokes - 1]->state =
PATH_Open;
1880 ERR(
"Should never happen\n");
1883 ERR(
"Got path flag %c\n", flat_path->
pFlags[
i]);
1889 if (pNewPath ==
NULL)
1891 ERR(
"PATH_CreatePath\n");
1897 for (
i = 0;
i < numStrokes;
i++)
1906 for (
j = 0;
j < pStrokes[
i]->numEntriesUsed;
j++)
1909 if ((!(pStrokes[
i]->pFlags[pStrokes[
i]->numEntriesUsed - 1] &
PT_CLOSEFIGURE)) && (
j == 0 ||
j == pStrokes[
i]->numEntriesUsed - 1))
1918 xo = pStrokes[
i]->pPoints[
j].
x;
1919 yo = pStrokes[
i]->pPoints[
j].y;
1920 xa = pStrokes[
i]->pPoints[1].x;
1921 ya = pStrokes[
i]->pPoints[1].y;
1925 xa = pStrokes[
i]->pPoints[
j - 1].x;
1926 ya = pStrokes[
i]->pPoints[
j - 1].y;
1927 xo = pStrokes[
i]->pPoints[
j].x;
1928 yo = pStrokes[
i]->pPoints[
j].y;
1930 theta =
atan2(ya - yo, xa - xo);
1951 corners[0].
x = xo - penWidthIn;
1952 corners[0].
y = yo - penWidthIn;
1953 corners[1].
x = xo + penWidthOut;
1954 corners[1].
y = yo + penWidthOut;
1967 double xa, ya, xb, yb, xo, yo;
1968 double alpha, theta, miterWidth;
1969 DWORD _joint = joint;
1971 PPATH pInsidePath, pOutsidePath;
1972 if (
j > 0 &&
j < pStrokes[
i]->numEntriesUsed - 1)
1979 previous = pStrokes[
i]->numEntriesUsed - 1;
1987 xo = pStrokes[
i]->pPoints[
j].x;
1988 yo = pStrokes[
i]->pPoints[
j].y;
1989 xa = pStrokes[
i]->pPoints[previous].x;
1990 ya = pStrokes[
i]->pPoints[previous].y;
1991 xb = pStrokes[
i]->pPoints[
next].x;
1992 yb = pStrokes[
i]->pPoints[
next].y;
1993 theta =
atan2(yo - ya, xo - xa);
2003 pInsidePath = pUpPath;
2004 pOutsidePath = pDownPath;
2008 pInsidePath = pDownPath;
2009 pOutsidePath = pUpPath;
2135 PPATH pPath, pNewPath;
2154 UINT penWidth, penStyle;
2187 penStyle = ((
LOGPEN*)elp)->lopnStyle;
2213 return IntGdiWidenPath(pPath, penWidth, penStyle,
dc->dclevel.laPath.eMiterLimit);
2218 return (
f.fract >= 0x8000) ? (
f.value + 1) :
f.value;
2255 pt[1] = lppt[
i + 1];
2256 pt[2].x = (lppt[
i + 2].
x + lppt[
i + 1].
x) / 2;
2257 pt[2].y = (lppt[
i + 2].
y + lppt[
i + 1].
y) / 2;
2264 pt[1] = lppt[
i + 1];
2265 pt[2] = lppt[
i + 2];
2293 ERR(
"Unknown header type %lu\n",
header->dwType);
2307 switch(curve->
wType)
2313 for (
i = 0;
i < curve->
cpfx;
i++)
2336 for (
i = 0;
i < curve->
cpfx;
i++)
2349 ERR(
"Unknown curve type %04x\n", curve->
wType);
2392 ERR(
"PATH_ExtTextOut not open\n");
2483 if (!
dc->dclevel.hPath)
2495 dc->dclevel.hPath = 0;
2496 dc->dclevel.flPath &= ~DCPATH_ACTIVE;
2523 if (
dc->dclevel.hPath)
2525 TRACE(
"BeginPath 1 0x%p\n",
dc->dclevel.hPath);
2539 dc->dclevel.hPath =
NULL;
2547 TRACE(
"BP : Current pos X %d Y %d\n",pPath->
pos.
x, pPath->
pos.
y);
2622 TRACE(
"EndPath ERROR! 0x%p\n",
dc->dclevel.hPath);
2629 TRACE(
"EndPath 0x%p\n",
dc->dclevel.hPath);
2631 dc->dclevel.flPath &= ~DCPATH_ACTIVE;
2644 PPATH pPath, pNewPath;
2664 pdcattr =
dc->pdcattr;
2689 dc->dclevel.hPath = 0;
2690 dc->dclevel.flPath &= ~DCPATH_ACTIVE;
2760 *
pdwOut = pDc->dclevel.laPath.eMiterLimit;
2799 TRACE(
"NtGdiGetPath start\n");
2802 ERR(
"Can't lock dc!\n");
2824 else if (nSize < pPath->numEntriesUsed)
2853 TRACE(
"NtGdiGetPath exit %d\n",
ret);
2863 PPATH pPath, pNewPath;
2875 ERR(
"Failed to lock DC %p\n",
hDC);
2880 pdcattr = pDc->pdcattr;
2885 ERR(
"Failed to lock DC path %p\n", pDc->dclevel.hPath);
2893 ERR(
"Path is not closed!\n");
2902 ERR(
"Failed to allocate a region\n");
2910 if (pNewPath ==
NULL)
2912 ERR(
"Failed to flatten path %p\n", pDc->dclevel.hPath);
2926 ERR(
"PATH_PathToRegion failed\n");
2936 pDc->dclevel.hPath =
NULL;
2937 pDc->dclevel.flPath &= ~DCPATH_ACTIVE;
2961 worker1.
f = pDc->dclevel.laPath.eMiterLimit;
2962 pDc->dclevel.laPath.eMiterLimit = worker.
f;
2989 PPATH pPath, pNewPath;
3008 pdcattr = pDc->pdcattr;
3034 pDc->dclevel.hPath = 0;
3035 pDc->dclevel.flPath &= ~DCPATH_ACTIVE;
3048 PPATH pPath, pNewPath;
3068 pdcattr = pDc->pdcattr;
3088 pDc->dclevel.hPath = 0;
3089 pDc->dclevel.flPath &= ~DCPATH_ACTIVE;
3102 TRACE(
"NtGdiWidenPat Enter\n");
3112 TRACE(
"WindenPath New Path\n");
3118 TRACE(
"NtGdiWidenPat Ret %d\n",Ret);
char ACPI_OBJECT_TYPE * Types
POINT * GDI_Bezier(const POINT *Points, INT count, INT *nPtsOut)
#define DBG_DEFAULT_CHANNEL(ch)
#define CoordLPtoDP(pdc, ppt)
static BOOLEAN INTERNAL_LPTODP(DC *dc, LPPOINT points, UINT count)
#define XForm2MatrixS(m, x)
#define MatrixS2XForm(x, m)
FORCEINLINE PSIZEL DC_pszlViewportExt(PDC pdc)
static BOOLEAN IntDPtoLP(DC *pdc, PPOINTL ppt, UINT count)
static BOOLEAN IntLPtoDP(DC *pdc, PPOINTL ppt, UINT count)
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT *rcDest, PDC pdcSrc, const RECT *rcSrc)
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc)
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2)
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
VOID FASTCALL DC_vUpdateFillBrush(PDC pdc)
FORCEINLINE PDC DC_LockDc(HDC hdc)
#define ERROR_NOT_ENOUGH_MEMORY
static WCHAR no[MAX_STRING_RESOURCE_LEN]
#define ERROR_INVALID_PARAMETER
#define ERROR_INVALID_HANDLE
static void cleanup(void)
_ACRTIMP double __cdecl sqrt(double)
_ACRTIMP double __cdecl fabs(double)
_ACRTIMP double __cdecl sin(double)
_ACRTIMP double __cdecl ceil(double)
_ACRTIMP double __cdecl floor(double)
_ACRTIMP double __cdecl cos(double)
_ACRTIMP double __cdecl atan2(double, double)
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
static const FLOATOBJ gef1
static const FLOATOBJ gef2
#define FLOATOBJ_bConvertToLong(pf, pl)
ULONG FASTCALL ftGdiGetGlyphOutline(PDC dc, WCHAR wch, UINT iFormat, LPGLYPHMETRICS pgm, ULONG cjBuf, PVOID pvBuf, const MAT2 *pmat2, BOOL bIgnoreRotation)
#define GDI_HANDLE_GET_TYPE(h)
#define GDI_OBJECT_TYPE_EXTPEN
#define GDI_OBJECT_TYPE_PEN
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLclampf GLclampf GLclampf alpha
GLint GLint GLint GLint GLint GLint y
GLdouble GLdouble GLdouble GLdouble top
GLboolean GLboolean GLboolean GLboolean a
GLsizei const GLfloat * points
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define EXCEPTION_EXECUTE_HANDLER
BOOL FASTCALL IntGdiPolyline(DC *dc, LPPOINT pt, int Count)
BOOL FASTCALL IntGdiMoveToEx(DC *dc, int X, int Y, LPPOINT Point)
#define KeSaveFloatingPointState(x)
#define KeRestoreFloatingPointState(x)
#define memcpy(s1, s2, n)
#define ExFreePoolWithTag(_P, _T)
void * Realloc(void *, size_t)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
int APIENTRY IntGdiSetMapMode(PDC dc, int MapMode)
BOOL NTAPI GreModifyWorldTransform(PDC pdc, const XFORML *pxform, DWORD dwMode)
#define PATH_AllocPathWithHandle()
#define PATH_UnlockPath(pPath)
#define PATH_LockPath(hPath)
#define IntIsEffectiveWidePen(pbrLine)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiEndPath(_In_ HDC hdc)
__kernel_entry W32KAPI INT APIENTRY NtGdiGetPath(_In_ HDC hdc, _Out_writes_opt_(cptBuf) LPPOINT pptlBuf, _Out_writes_opt_(cptBuf) LPBYTE pjTypes, _In_ INT cptBuf)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiCloseFigure(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiFlattenPath(_In_ HDC hdc)
__kernel_entry W32KAPI HRGN APIENTRY NtGdiPathToRegion(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiStrokePath(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiAbortPath(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiWidenPath(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiFillPath(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiSetMiterLimit(_In_ HDC hdc, _In_ DWORD dwNew, _Inout_opt_ PDWORD pdwOut)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBeginPath(_In_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiStrokeAndFillPath(_In_ HDC hdc)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
static unsigned __int64 next
PULONG MinorVersion OPTIONAL
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
BOOL IntGdiFillRgn(_In_ PDC pdc, _In_ PREGION prgn, _In_opt_ PBRUSH pbrFill)
INT NTAPI GreGetObject(IN HGDIOBJ hobj, IN INT cbCount, OUT PVOID pvBuffer)
VOID NTAPI GDIOBJ_vUnlockObject(POBJ pobj)
VOID NTAPI GDIOBJ_vDeleteObject(POBJ pobj)
VOID FASTCALL IntGetCurrentPositionEx(PDC dc, LPPOINT pt)
#define NUM_ENTRIES_INITIAL
BOOL FASTCALL PATH_AssignGdiPath(PPATH pPathDest, const PPATH pPathSrc)
BOOL PATH_RestorePath(DC *dst, DC *src)
BOOL FASTCALL PATH_PolyBezierTo(PDC dc, const POINT *pts, DWORD cbPoints)
static BOOLEAN PATH_ScaleNormalizedPoint(POINT corners[], FLOATL x, FLOATL y, POINT *pPoint)
BOOL FASTCALL PATH_PolyPolygon(PDC dc, const POINT *pts, const INT *counts, UINT polygons)
BOOL FASTCALL PATH_PolyBezier(PDC dc, const POINT *pts, DWORD cbPoints)
BOOL PATH_RoundRect(DC *dc, INT x1, INT y1, INT x2, INT y2, INT ell_width, INT ell_height)
PPATH FASTCALL IntGdiWidenPath(PPATH pPath, UINT penWidth, UINT penStyle, FLOAT eMiterLimit)
BOOL FASTCALL PATH_PathToRegion(PPATH pPath, INT Mode, PREGION Rgn)
BOOL FASTCALL PATH_Rectangle(PDC dc, INT x1, INT y1, INT x2, INT y2)
BOOL FASTCALL PATH_Delete(HPATH hPath)
static void update_current_pos(PPATH path)
static BOOL PATH_CheckRect(DC *dc, RECTL *rect, INT x1, INT y1, INT x2, INT y2)
#define GROW_FACTOR_DENOM
BOOL FASTCALL PATH_FillPathEx(PDC dc, PPATH pPath, PBRUSH pbrFill)
VOID FASTCALL PATH_DestroyGdiPath(PPATH pPath)
BOOL FASTCALL PATH_ReserveEntries(PPATH pPath, INT numEntries)
static void close_figure(PPATH path)
VOID FASTCALL IntGdiCloseFigure(PPATH pPath)
VOID FASTCALL PATH_InitGdiPath(PPATH pPath)
BOOL PATH_Ellipse(PDC dc, INT x1, INT y1, INT x2, INT y2)
static BOOL add_log_points_new_stroke(DC *dc, PPATH path, const POINT *points, DWORD count, BYTE type, BOOL bExtraPt)
static BOOL PATH_DoArcPart(PPATH pPath, POINT corners[], double angleStart, double angleEnd, BYTE startEntryType)
BOOL FASTCALL PATH_PolylineTo(PDC dc, const POINT *pts, DWORD cbPoints)
BOOL FASTCALL GdiPathDPtoLP(PDC pdc, PPOINT ppt, INT count)
BOOL FASTCALL PATH_LineTo(PDC dc, INT x, INT y)
static VOID FASTCALL PATH_BezierTo(PPATH pPath, POINT *lppt, INT n)
static VOID PATH_NormalizePoint(POINTL corners[], const POINTL *pPoint, FLOATL *pX, FLOATL *pY)
BOOL FASTCALL PATH_FillPath(PDC dc, PPATH pPath)
BOOL FASTCALL PATH_ExtTextOut(PDC dc, INT x, INT y, UINT flags, const RECTL *lprc, LPCWSTR str, UINT count, const INT *dx)
PPATH FASTCALL PATH_FlattenPath(PPATH pPath)
BOOL FASTCALL PATH_StrokePath(DC *dc, PPATH pPath)
BOOL FASTCALL PATH_AddEntry(PPATH pPath, const POINT *pPoint, BYTE flags)
VOID FASTCALL PATH_EmptyPath(PPATH pPath)
BOOL FASTCALL PATH_PolyPolyline(PDC dc, const POINT *pts, const DWORD *counts, DWORD polylines)
#define GROW_FACTOR_NUMER
PPATH FASTCALL PATH_CreatePath(int count)
static BYTE * add_points(PPATH path, const POINT *points, DWORD count, BYTE type)
BOOL FASTCALL PATH_PolyDraw(PDC dc, const POINT *pts, const BYTE *types, DWORD cbPoints)
BOOL FASTCALL PATH_AddFlatBezier(PPATH pPath, POINT *pt, BOOL closed)
static void reverse_points(POINT *points, UINT count)
static BOOL start_new_stroke(PPATH path)
static INT int_from_fixed(FIXED f)
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)
PPATH FASTCALL PATH_WidenPathEx(DC *dc, PPATH pPath)
BOOL FASTCALL PATH_MoveTo(PDC dc, PPATH pPath)
static BOOL FASTCALL PATH_add_outline(PDC dc, PPATH pPath, INT x, INT y, TTPOLYGONHEADER *header, DWORD size)
static PPATH FASTCALL PATH_WidenPath(DC *dc)
static BYTE * add_log_points(DC *dc, PPATH path, const POINT *points, DWORD count, BYTE type, BOOL bExtraPt)
BOOL PATH_SavePath(DC *dst, DC *src)
VOID FASTCALL RECTL_vMakeWellOrdered(_Inout_ RECTL *prcl)
FORCEINLINE LONG RECTL_lGetWidth(_In_ const RECTL *prcl)
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
FORCEINLINE LONG RECTL_lGetHeight(_In_ const RECTL *prcl)
VOID FASTCALL REGION_Delete(PREGION pRgn)
BOOL FASTCALL REGION_SetPolyPolygonRgn(_Inout_ PREGION prgn, _In_ const POINT *ppt, _In_ const ULONG *pcPoints, _In_ ULONG cPolygons, _In_ INT iMode)
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
PREGION FASTCALL REGION_AllocUserRgnWithHandle(INT nRgn)
*nSize LPSTR _Inout_ LPDWORD nSize
#define FLOATOBJ_Div(pf, pf1)
#define FLOATOBJ_DivLong(pf, l)
#define FLOATOBJ_Sub(pf, pf1)
#define FLOATOBJ_Add(pf, pf1)
#define FLOATOBJ_MulLong(pf, l)
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
ENGAPI INT APIENTRY EngMulDiv(_In_ INT a, _In_ INT b, _In_ INT c)
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG y1
#define FLOATOBJ_SetFloat(pf, f)
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG _In_ LONG y2
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
#define FLOATOBJ_GetFloat(pf)
#define FLOATOBJ_SetLong(pf, l)
#define FLOATOBJ_AddLong(pf, l)
W32KAPI BOOL WINAPI NtGdiGetMiterLimit(HDC hdc, DWORD *limit)
#define ERROR_CAN_NOT_COMPLETE
#define ERROR_ARITHMETIC_OVERFLOW
struct tagPOINTFX POINTFX
_In_ int _Inout_ LPRECT lprc