- 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, YStartArc,
XEndArc, XEndArc,
YEndArc, YEndArc,
0,
arctype); arctype);
} }

View file

@ -387,8 +387,13 @@ DC_vCleanup(PVOID ObjectBody)
/* Free CLIPOBJ resources */ /* Free CLIPOBJ resources */
IntEngFreeClipResources(&pdc->co); IntEngFreeClipResources(&pdc->co);
if (pdc->dclevel.hPath)
{
DPRINT("DC_vCleanup Path\n");
PATH_Delete(pdc->dclevel.hPath); PATH_Delete(pdc->dclevel.hPath);
pdc->dclevel.hPath = 0;
pdc->dclevel.flPath = 0;
}
if(pdc->dclevel.pSurface) if(pdc->dclevel.pSurface)
SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface); SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);

View file

@ -496,7 +496,7 @@ NtGdiSelectClipPath(
int Mode) int Mode)
{ {
PREGION RgnPath; PREGION RgnPath;
PPATH pPath; PPATH pPath, pNewPath;
BOOL success = FALSE; BOOL success = FALSE;
PDC_ATTR pdcattr; PDC_ATTR pdcattr;
PDC pdc; PDC pdc;
@ -520,8 +520,8 @@ NtGdiSelectClipPath(
if (pPath->state != PATH_Closed) if (pPath->state != PATH_Closed)
{ {
EngSetLastError(ERROR_CAN_NOT_COMPLETE); EngSetLastError(ERROR_CAN_NOT_COMPLETE);
DC_UnlockDc(pdc); success = FALSE;
return FALSE; goto Exit;
} }
/* Construct a region from the path */ /* Construct a region from the path */
@ -533,24 +533,23 @@ NtGdiSelectClipPath(
return FALSE; return FALSE;
} }
if (!PATH_PathToRegion(pPath, pdcattr->jFillMode, RgnPath)) pNewPath = PATH_FlattenPath(pPath);
{
EngSetLastError(ERROR_CAN_NOT_COMPLETE); success = PATH_PathToRegion(pNewPath, pdcattr->jFillMode, RgnPath);
REGION_Delete(RgnPath);
DC_UnlockDc(pdc); PATH_UnlockPath(pNewPath);
return FALSE; PATH_Delete(pNewPath->BaseObject.hHmgr);
}
if (success) success = IntGdiExtSelectClipRgn(pdc, RgnPath, Mode) != ERROR;
success = IntGdiExtSelectClipRgn(pdc, RgnPath, Mode) != ERROR;
REGION_Delete(RgnPath); REGION_Delete(RgnPath);
/* Empty the path */ Exit:
if (success)
PATH_EmptyPath(pPath);
/* FIXME: Should this function delete the path even if it failed? */
PATH_UnlockPath(pPath); PATH_UnlockPath(pPath);
PATH_Delete(pdc->dclevel.hPath);
pdc->dclevel.flPath &= ~DCPATH_ACTIVE;
pdc->dclevel.hPath = NULL;
DC_UnlockDc(pdc); DC_UnlockDc(pdc);
return success; return success;

View file

@ -88,6 +88,18 @@ IntGdiCleanDC(HDC hDC)
DC_vUpdateTextBrush(dc); 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 /* 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. */ * There is no need to clear prgnVis, as UserGetDC updates it immediately. */
if (dc->prgnRao) if (dc->prgnRao)
@ -175,13 +187,9 @@ DC_vRestoreDC(
if (pdc->dctype == DCTYPE_MEMORY) if (pdc->dctype == DCTYPE_MEMORY)
DC_vSelectSurface(pdc, pdcSave->dclevel.pSurface); DC_vSelectSurface(pdc, pdcSave->dclevel.pSurface);
// Restore Path by removing it, if the Save flag is set. if (pdcSave->dclevel.hPath)
// BeginPath will takecare of the rest.
if (pdc->dclevel.hPath && pdc->dclevel.flPath & DCPATH_SAVE)
{ {
PATH_Delete(pdc->dclevel.hPath); PATH_RestorePath( pdc, pdcSave );
pdc->dclevel.hPath = 0;
pdc->dclevel.flPath &= ~DCPATH_SAVE;
} }
} }
@ -294,10 +302,11 @@ NtGdiSaveDC(
DC_vSelectSurface(pdcSave, pdc->dclevel.pSurface); DC_vSelectSurface(pdcSave, pdc->dclevel.pSurface);
/* Copy path */ /* Copy path */
/* FIXME: Why this way? */ if (pdc->dclevel.hPath)
pdcSave->dclevel.hPath = pdc->dclevel.hPath; {
PATH_SavePath( pdcSave, pdc );
}
pdcSave->dclevel.flPath = pdc->dclevel.flPath | DCPATH_SAVESTATE; pdcSave->dclevel.flPath = pdc->dclevel.flPath | DCPATH_SAVESTATE;
if (pdcSave->dclevel.hPath) pdcSave->dclevel.flPath |= DCPATH_SAVE;
/* Set new dc as save dc */ /* Set new dc as save dc */
pdcSave->dclevel.hdcSave = pdc->dclevel.hdcSave; 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 numEntriesUsed;
int numEntriesAllocated; int numEntriesAllocated;
BOOL newStroke; BOOL newStroke;
POINT pos;
} PATH, *PPATH; } PATH, *PPATH;
typedef struct _EPATHOBJ typedef struct _EPATHOBJ
@ -50,15 +51,13 @@ typedef struct _EPATHOBJ
#define PATH_IsPathOpen(dclevel) ( ((dclevel).hPath) && ((dclevel).flPath & DCPATH_ACTIVE) ) #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); BOOL FASTCALL PATH_Ellipse (PDC dc, INT x1, INT y1, INT x2, INT y2);
VOID FASTCALL PATH_EmptyPath (PPATH pPath); VOID FASTCALL PATH_EmptyPath (PPATH pPath);
BOOL FASTCALL PATH_LineTo (PDC dc, INT x, INT y); BOOL FASTCALL PATH_LineTo (PDC dc, INT x, INT y);
BOOL FASTCALL PATH_PolyBezier (PDC dc, const POINT *pts, DWORD cbPoints); 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_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_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_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_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); 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_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_DoArcPart (PPATH pPath, FLOAT_POINT corners[], double angleStart, double angleEnd, BYTE startEntryType);
BOOL FASTCALL PATH_FillPath( PDC dc, PPATH pPath ); 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); VOID FASTCALL PATH_NormalizePoint (FLOAT_POINT corners[], const FLOAT_POINT *pPoint, double *pX, double *pY);
BOOL FASTCALL PATH_ReserveEntries (PPATH pPath, INT numEntries); BOOL FASTCALL PATH_ReserveEntries (PPATH pPath, INT numEntries);
@ -83,3 +82,6 @@ VOID FASTCALL IntGdiCloseFigure(PPATH pPath);
BOOL FASTCALL PATH_Delete(HPATH hPath); BOOL FASTCALL PATH_Delete(HPATH hPath);
VOID FASTCALL IntGetCurrentPositionEx(PDC dc, LPPOINT pt); VOID FASTCALL IntGetCurrentPositionEx(PDC dc, LPPOINT pt);
BOOL PATH_RestorePath( DC *, DC *);
BOOL PATH_SavePath( DC *, DC *);