- 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:
James Tabor 2016-09-08 22:37:41 +00:00
parent 4e5e90c854
commit 895906f45d
6 changed files with 1079 additions and 996 deletions

View file

@ -211,6 +211,7 @@ IntGdiArcInternal(
YStartArc,
XEndArc,
YEndArc,
0,
arctype);
}

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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 *);