mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
implemented NtGdiSelectClipPath and PATH_FillPath
svn path=/trunk/; revision=20012
This commit is contained in:
parent
d224b2b02f
commit
e01c928700
4 changed files with 126 additions and 33 deletions
|
@ -4,6 +4,14 @@
|
||||||
HRGN WINAPI SaveVisRgn(HDC hdc);
|
HRGN WINAPI SaveVisRgn(HDC hdc);
|
||||||
INT WINAPI SelectVisRgn(HDC hdc, HRGN hrgn);
|
INT WINAPI SelectVisRgn(HDC hdc, HRGN hrgn);
|
||||||
|
|
||||||
|
int
|
||||||
|
STDCALL
|
||||||
|
IntGdiExtSelectClipRgn (
|
||||||
|
PDC dc,
|
||||||
|
HRGN hrgn,
|
||||||
|
int fnMode
|
||||||
|
);
|
||||||
|
|
||||||
int
|
int
|
||||||
STDCALL
|
STDCALL
|
||||||
NtGdiExcludeClipRect (
|
NtGdiExcludeClipRect (
|
||||||
|
|
|
@ -18,6 +18,6 @@ BOOL FASTCALL PATH_PolyPolygon ( PDC dc, const POINT* pts, const INT* counts, UI
|
||||||
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);
|
||||||
BOOL FASTCALL PATH_Rectangle (PDC dc, INT x1, INT y1, INT x2, INT y2);
|
BOOL FASTCALL PATH_Rectangle (PDC dc, INT x1, INT y1, INT x2, INT y2);
|
||||||
BOOL FASTCALL PATH_RoundRect (PDC dc, INT x1, INT y1, INT x2, INT y2, INT xradius, INT yradius);
|
BOOL FASTCALL PATH_RoundRect (PDC dc, INT x1, INT y1, INT x2, INT y2, INT xradius, INT yradius);
|
||||||
BOOL FASTCALL PATH_PathToRegion (const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn);
|
BOOL FASTCALL PATH_PathToRegion (GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn);
|
||||||
|
|
||||||
#endif /* _WIN32K_PATH_H */
|
#endif /* _WIN32K_PATH_H */
|
||||||
|
|
|
@ -99,20 +99,13 @@ NtGdiSelectVisRgn(HDC hdc, HRGN hrgn)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int STDCALL NtGdiExtSelectClipRgn(HDC hDC,
|
|
||||||
HRGN hrgn,
|
int STDCALL IntGdiExtSelectClipRgn(PDC dc,
|
||||||
int fnMode)
|
HRGN hrgn,
|
||||||
|
int fnMode)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
DC *dc;
|
// dc->w.flags &= ~DC_DIRTY;
|
||||||
|
|
||||||
if (!(dc = DC_LockDc(hDC)))
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dc->w.flags &= ~DC_DIRTY;
|
|
||||||
|
|
||||||
if (!hrgn)
|
if (!hrgn)
|
||||||
{
|
{
|
||||||
|
@ -127,7 +120,6 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DC_UnlockDc(dc);
|
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
@ -158,8 +150,26 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC,
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = CLIPPING_UpdateGCRegion(dc);
|
retval = CLIPPING_UpdateGCRegion(dc);
|
||||||
DC_UnlockDc(dc);
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int STDCALL NtGdiExtSelectClipRgn(HDC hDC,
|
||||||
|
HRGN hrgn,
|
||||||
|
int fnMode)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
DC *dc;
|
||||||
|
|
||||||
|
if (!(dc = DC_LockDc(hDC)))
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = IntGdiExtSelectClipRgn ( dc, hrgn, fnMode );
|
||||||
|
|
||||||
|
DC_UnlockDc(dc);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,13 +437,6 @@ BOOL STDCALL NtGdiRectVisible(HDC hDC,
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL STDCALL NtGdiSelectClipPath(HDC hDC,
|
|
||||||
int Mode)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
INT STDCALL
|
INT STDCALL
|
||||||
NtGdiSelectClipRgn(HDC hDC, HRGN hRgn)
|
NtGdiSelectClipRgn(HDC hDC, HRGN hRgn)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,7 +35,7 @@ BOOL FASTCALL PATH_FillPath( PDC dc, GdiPath *pPath );
|
||||||
BOOL FASTCALL PATH_FlattenPath (GdiPath *pPath);
|
BOOL FASTCALL PATH_FlattenPath (GdiPath *pPath);
|
||||||
VOID FASTCALL PATH_GetPathFromDC (PDC dc, GdiPath **ppPath);
|
VOID FASTCALL PATH_GetPathFromDC (PDC dc, GdiPath **ppPath);
|
||||||
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_PathToRegion(const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn);
|
BOOL FASTCALL PATH_PathToRegion (GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn);
|
||||||
BOOL FASTCALL PATH_ReserveEntries (GdiPath *pPath, INT numEntries);
|
BOOL FASTCALL PATH_ReserveEntries (GdiPath *pPath, INT numEntries);
|
||||||
VOID FASTCALL PATH_ScaleNormalizedPoint (FLOAT_POINT corners[], double x, double y, POINT *pPoint);
|
VOID FASTCALL PATH_ScaleNormalizedPoint (FLOAT_POINT corners[], double x, double y, POINT *pPoint);
|
||||||
|
|
||||||
|
@ -235,7 +235,37 @@ NtGdiWidenPath(HDC hDC)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL STDCALL NtGdiSelectClipPath(HDC hDC,
|
||||||
|
int Mode)
|
||||||
|
{
|
||||||
|
GdiPath *pPath;
|
||||||
|
HRGN hrgnPath;
|
||||||
|
BOOL success = FALSE;
|
||||||
|
PDC dc = DC_LockDc ( hDC );
|
||||||
|
|
||||||
|
if( !dc ) return FALSE;
|
||||||
|
|
||||||
|
PATH_GetPathFromDC ( dc, &pPath );
|
||||||
|
|
||||||
|
/* Check that path is closed */
|
||||||
|
if( pPath->state != PATH_Closed )
|
||||||
|
SetLastWin32Error(ERROR_CAN_NOT_COMPLETE);
|
||||||
|
return FALSE;
|
||||||
|
/* Construct a region from the path */
|
||||||
|
else if( PATH_PathToRegion( pPath, dc->w.polyFillMode, &hrgnPath ) )
|
||||||
|
{
|
||||||
|
success = IntGdiExtSelectClipRgn( dc, hrgnPath, Mode ) != ERROR;
|
||||||
|
NtGdiDeleteObject( hrgnPath );
|
||||||
|
|
||||||
|
/* Empty the path */
|
||||||
|
if( success )
|
||||||
|
PATH_EmptyPath( pPath );
|
||||||
|
/* FIXME: Should this function delete the path even if it failed? */
|
||||||
|
}
|
||||||
|
|
||||||
|
DC_UnlockDc ( dc );
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Exported functions
|
* Exported functions
|
||||||
|
@ -243,19 +273,76 @@ NtGdiWidenPath(HDC hDC)
|
||||||
|
|
||||||
|
|
||||||
/* PATH_FillPath
|
/* PATH_FillPath
|
||||||
* unimplemented
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
PATH_FillPath( PDC dc, GdiPath *pPath )
|
PATH_FillPath( PDC dc, GdiPath *pPath )
|
||||||
{
|
{
|
||||||
|
INT mapMode, graphicsMode;
|
||||||
|
SIZE ptViewportExt, ptWindowExt;
|
||||||
|
POINT ptViewportOrg, ptWindowOrg;
|
||||||
|
XFORM xform;
|
||||||
|
HRGN hrgn;
|
||||||
|
|
||||||
if( pPath->state != PATH_Closed )
|
if( pPath->state != PATH_Closed )
|
||||||
{
|
{
|
||||||
|
SetLastWin32Error(ERROR_CAN_NOT_COMPLETE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIMPLEMENTED;
|
if( PATH_PathToRegion( pPath, dc->w.polyFillMode, &hrgn ))
|
||||||
|
{
|
||||||
|
/* Since PaintRgn interprets the region as being in logical coordinates
|
||||||
|
* but the points we store for the path are already in device
|
||||||
|
* coordinates, we have to set the mapping mode to MM_TEXT temporarily.
|
||||||
|
* Using SaveDC to save information about the mapping mode / world
|
||||||
|
* transform would be easier but would require more overhead, especially
|
||||||
|
* now that SaveDC saves the current path.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Save the information about the old mapping mode */
|
||||||
|
mapMode = NtGdiGetMapMode( dc->hSelf );
|
||||||
|
NtGdiGetViewportExtEx( dc->hSelf, &ptViewportExt );
|
||||||
|
NtGdiGetViewportOrgEx( dc->hSelf, &ptViewportOrg );
|
||||||
|
NtGdiGetWindowExtEx( dc->hSelf, &ptWindowExt );
|
||||||
|
NtGdiGetWindowOrgEx( dc->hSelf, &ptWindowOrg );
|
||||||
|
|
||||||
|
/* Save world transform
|
||||||
|
* NB: The Windows documentation on world transforms would lead one to
|
||||||
|
* believe that this has to be done only in GM_ADVANCED; however, my
|
||||||
|
* tests show that resetting the graphics mode to GM_COMPATIBLE does
|
||||||
|
* not reset the world transform.
|
||||||
|
*/
|
||||||
|
NtGdiGetWorldTransform( dc->hSelf, &xform );
|
||||||
|
|
||||||
|
/* Set MM_TEXT */
|
||||||
|
NtGdiSetMapMode( dc->hSelf, MM_TEXT );
|
||||||
|
NtGdiSetViewportOrgEx( dc->hSelf, 0, 0, NULL );
|
||||||
|
NtGdiSetWindowOrgEx( dc->hSelf, 0, 0, NULL );
|
||||||
|
graphicsMode = NtGdiGetGraphicsMode( dc->hSelf );
|
||||||
|
NtGdiSetGraphicsMode( dc->hSelf, GM_ADVANCED );
|
||||||
|
NtGdiModifyWorldTransform( dc->hSelf, &xform, MWT_IDENTITY );
|
||||||
|
NtGdiSetGraphicsMode( dc->hSelf, graphicsMode );
|
||||||
|
|
||||||
|
/* Paint the region */
|
||||||
|
NtGdiPaintRgn( dc->hSelf, hrgn );
|
||||||
|
NtGdiDeleteObject( hrgn );
|
||||||
|
/* Restore the old mapping mode */
|
||||||
|
NtGdiSetMapMode( dc->hSelf, mapMode );
|
||||||
|
NtGdiSetViewportExtEx( dc->hSelf, ptViewportExt.cx, ptViewportExt.cy, NULL );
|
||||||
|
NtGdiSetViewportOrgEx( dc->hSelf, ptViewportOrg.x, ptViewportOrg.y, NULL );
|
||||||
|
NtGdiSetWindowExtEx( dc->hSelf, ptWindowExt.cx, ptWindowExt.cy, NULL );
|
||||||
|
NtGdiSetWindowOrgEx( dc->hSelf, ptWindowOrg.x, ptWindowOrg.y, NULL );
|
||||||
|
|
||||||
|
/* Go to GM_ADVANCED temporarily to restore the world transform */
|
||||||
|
graphicsMode = NtGdiGetGraphicsMode( dc->hSelf );
|
||||||
|
NtGdiSetGraphicsMode( dc->hSelf, GM_ADVANCED );
|
||||||
|
NtGdiSetWorldTransform( dc->hSelf, &xform );
|
||||||
|
NtGdiSetGraphicsMode( dc->hSelf, graphicsMode );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -924,15 +1011,11 @@ PATH_FlattenPath(GdiPath *pPath)
|
||||||
* error occurs, SetLastError is called with the appropriate value and
|
* error occurs, SetLastError is called with the appropriate value and
|
||||||
* FALSE is returned.
|
* FALSE is returned.
|
||||||
*/
|
*/
|
||||||
#if 0
|
|
||||||
// FIXME - don't reenable this function until you deal with the
|
|
||||||
// const pPath being given to PATH_FlattenPath() - which is
|
|
||||||
// expecting a non-const*. Since this function isn't being called
|
|
||||||
// at the moment, I'm commenting it out until the issue needs to
|
|
||||||
// be addressed.
|
|
||||||
BOOL
|
BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
PATH_PathToRegion ( const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn )
|
PATH_PathToRegion ( GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn )
|
||||||
{
|
{
|
||||||
int numStrokes, iStroke, i;
|
int numStrokes, iStroke, i;
|
||||||
INT *pNumPointsInStroke;
|
INT *pNumPointsInStroke;
|
||||||
|
@ -990,7 +1073,6 @@ PATH_PathToRegion ( const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn )
|
||||||
*pHrgn=hrgn;
|
*pHrgn=hrgn;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* PATH_EmptyPath
|
/* PATH_EmptyPath
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue