mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[NtGDI]
- Fix Path issues, Sync/Port wine. See CORE-4990 (Fill Path painting?), CORE-9612 (Fixed) and CORE-11916 (Fixed). Maybe more. - Pen width might be related to another issue outside Path. See CORE-2527. svn path=/trunk/; revision=72625
This commit is contained in:
parent
4e5e90c854
commit
895906f45d
6 changed files with 1079 additions and 996 deletions
|
@ -211,6 +211,7 @@ IntGdiArcInternal(
|
|||
YStartArc,
|
||||
XEndArc,
|
||||
YEndArc,
|
||||
0,
|
||||
arctype);
|
||||
}
|
||||
|
||||
|
|
|
@ -387,8 +387,13 @@ DC_vCleanup(PVOID ObjectBody)
|
|||
/* Free CLIPOBJ resources */
|
||||
IntEngFreeClipResources(&pdc->co);
|
||||
|
||||
PATH_Delete(pdc->dclevel.hPath);
|
||||
|
||||
if (pdc->dclevel.hPath)
|
||||
{
|
||||
DPRINT("DC_vCleanup Path\n");
|
||||
PATH_Delete(pdc->dclevel.hPath);
|
||||
pdc->dclevel.hPath = 0;
|
||||
pdc->dclevel.flPath = 0;
|
||||
}
|
||||
if(pdc->dclevel.pSurface)
|
||||
SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);
|
||||
|
||||
|
|
|
@ -496,7 +496,7 @@ NtGdiSelectClipPath(
|
|||
int Mode)
|
||||
{
|
||||
PREGION RgnPath;
|
||||
PPATH pPath;
|
||||
PPATH pPath, pNewPath;
|
||||
BOOL success = FALSE;
|
||||
PDC_ATTR pdcattr;
|
||||
PDC pdc;
|
||||
|
@ -520,8 +520,8 @@ NtGdiSelectClipPath(
|
|||
if (pPath->state != PATH_Closed)
|
||||
{
|
||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||
DC_UnlockDc(pdc);
|
||||
return FALSE;
|
||||
success = FALSE;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* Construct a region from the path */
|
||||
|
@ -533,24 +533,23 @@ NtGdiSelectClipPath(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (!PATH_PathToRegion(pPath, pdcattr->jFillMode, RgnPath))
|
||||
{
|
||||
EngSetLastError(ERROR_CAN_NOT_COMPLETE);
|
||||
REGION_Delete(RgnPath);
|
||||
DC_UnlockDc(pdc);
|
||||
return FALSE;
|
||||
}
|
||||
pNewPath = PATH_FlattenPath(pPath);
|
||||
|
||||
success = PATH_PathToRegion(pNewPath, pdcattr->jFillMode, RgnPath);
|
||||
|
||||
PATH_UnlockPath(pNewPath);
|
||||
PATH_Delete(pNewPath->BaseObject.hHmgr);
|
||||
|
||||
if (success) success = IntGdiExtSelectClipRgn(pdc, RgnPath, Mode) != ERROR;
|
||||
|
||||
success = IntGdiExtSelectClipRgn(pdc, RgnPath, Mode) != ERROR;
|
||||
REGION_Delete(RgnPath);
|
||||
|
||||
/* Empty the path */
|
||||
if (success)
|
||||
PATH_EmptyPath(pPath);
|
||||
|
||||
/* FIXME: Should this function delete the path even if it failed? */
|
||||
|
||||
Exit:
|
||||
PATH_UnlockPath(pPath);
|
||||
PATH_Delete(pdc->dclevel.hPath);
|
||||
pdc->dclevel.flPath &= ~DCPATH_ACTIVE;
|
||||
pdc->dclevel.hPath = NULL;
|
||||
|
||||
DC_UnlockDc(pdc);
|
||||
|
||||
return success;
|
||||
|
|
|
@ -88,6 +88,18 @@ IntGdiCleanDC(HDC hDC)
|
|||
DC_vUpdateTextBrush(dc);
|
||||
}
|
||||
|
||||
// Remove Path and reset flags.
|
||||
if (dc->dclevel.hPath)
|
||||
{
|
||||
DPRINT("Clean DC Remove Path\n");
|
||||
if (!PATH_Delete(dc->dclevel.hPath))
|
||||
{
|
||||
DPRINT1("Failed to remove Path\n");
|
||||
}
|
||||
dc->dclevel.hPath = 0;
|
||||
dc->dclevel.flPath = 0;
|
||||
}
|
||||
|
||||
/* DC_vCopyState frees the Clip rgn and the Meta rgn. Take care of the other ones
|
||||
* There is no need to clear prgnVis, as UserGetDC updates it immediately. */
|
||||
if (dc->prgnRao)
|
||||
|
@ -175,13 +187,9 @@ DC_vRestoreDC(
|
|||
if (pdc->dctype == DCTYPE_MEMORY)
|
||||
DC_vSelectSurface(pdc, pdcSave->dclevel.pSurface);
|
||||
|
||||
// Restore Path by removing it, if the Save flag is set.
|
||||
// BeginPath will takecare of the rest.
|
||||
if (pdc->dclevel.hPath && pdc->dclevel.flPath & DCPATH_SAVE)
|
||||
if (pdcSave->dclevel.hPath)
|
||||
{
|
||||
PATH_Delete(pdc->dclevel.hPath);
|
||||
pdc->dclevel.hPath = 0;
|
||||
pdc->dclevel.flPath &= ~DCPATH_SAVE;
|
||||
PATH_RestorePath( pdc, pdcSave );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -294,10 +302,11 @@ NtGdiSaveDC(
|
|||
DC_vSelectSurface(pdcSave, pdc->dclevel.pSurface);
|
||||
|
||||
/* Copy path */
|
||||
/* FIXME: Why this way? */
|
||||
pdcSave->dclevel.hPath = pdc->dclevel.hPath;
|
||||
if (pdc->dclevel.hPath)
|
||||
{
|
||||
PATH_SavePath( pdcSave, pdc );
|
||||
}
|
||||
pdcSave->dclevel.flPath = pdc->dclevel.flPath | DCPATH_SAVESTATE;
|
||||
if (pdcSave->dclevel.hPath) pdcSave->dclevel.flPath |= DCPATH_SAVE;
|
||||
|
||||
/* Set new dc as save dc */
|
||||
pdcSave->dclevel.hdcSave = pdc->dclevel.hdcSave;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -34,6 +34,7 @@ typedef struct _PATH
|
|||
int numEntriesUsed;
|
||||
int numEntriesAllocated;
|
||||
BOOL newStroke;
|
||||
POINT pos;
|
||||
} PATH, *PPATH;
|
||||
|
||||
typedef struct _EPATHOBJ
|
||||
|
@ -50,15 +51,13 @@ typedef struct _EPATHOBJ
|
|||
|
||||
#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 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 FASTCALL PATH_Ellipse (PDC dc, INT x1, INT y1, INT x2, INT y2);
|
||||
VOID FASTCALL PATH_EmptyPath (PPATH pPath);
|
||||
BOOL FASTCALL PATH_LineTo (PDC dc, INT x, INT y);
|
||||
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_PolyDraw(PDC dc, const POINT *pts, const BYTE *types, DWORD cbPoints);
|
||||
BOOL FASTCALL PATH_Polygon (PDC dc, const POINT *pts, DWORD cbPoints);
|
||||
BOOL FASTCALL PATH_Polyline (PDC dc, const POINT *pts, DWORD cbPoints);
|
||||
BOOL FASTCALL PATH_PolylineTo (PDC dc, const POINT *pts, DWORD cbPoints);
|
||||
BOOL FASTCALL PATH_PolyPolygon ( PDC dc, const POINT* pts, const INT* counts, UINT polygons);
|
||||
BOOL FASTCALL PATH_PolyPolyline( PDC dc, const POINT* pts, const DWORD* counts, DWORD polylines);
|
||||
|
@ -71,7 +70,7 @@ BOOL FASTCALL PATH_AddEntry (PPATH pPath, const POINT *pPoint, BYTE flags);
|
|||
BOOL FASTCALL PATH_AddFlatBezier (PPATH pPath, POINT *pt, BOOL closed);
|
||||
BOOL FASTCALL PATH_DoArcPart (PPATH pPath, FLOAT_POINT corners[], double angleStart, double angleEnd, BYTE startEntryType);
|
||||
BOOL FASTCALL PATH_FillPath( PDC dc, PPATH pPath );
|
||||
BOOL FASTCALL PATH_FlattenPath (PPATH pPath);
|
||||
PPATH FASTCALL PATH_FlattenPath (PPATH pPath);
|
||||
VOID FASTCALL PATH_NormalizePoint (FLOAT_POINT corners[], const FLOAT_POINT *pPoint, double *pX, double *pY);
|
||||
|
||||
BOOL FASTCALL PATH_ReserveEntries (PPATH pPath, INT numEntries);
|
||||
|
@ -83,3 +82,6 @@ VOID FASTCALL IntGdiCloseFigure(PPATH pPath);
|
|||
BOOL FASTCALL PATH_Delete(HPATH hPath);
|
||||
|
||||
VOID FASTCALL IntGetCurrentPositionEx(PDC dc, LPPOINT pt);
|
||||
|
||||
BOOL PATH_RestorePath( DC *, DC *);
|
||||
BOOL PATH_SavePath( DC *, DC *);
|
||||
|
|
Loading…
Reference in a new issue