implemented NtGdiSelectClipPath and PATH_FillPath Modified: trunk/reactos/include/win32k/cliprgn.h Modified: trunk/reactos/subsys/win32k/include/path.h Modified: trunk/reactos/subsys/win32k/objects/cliprgn.c Modified: trunk/reactos/subsys/win32k/objects/path.c _____
Modified: trunk/reactos/include/win32k/cliprgn.h --- trunk/reactos/include/win32k/cliprgn.h 2005-12-09 17:57:58 UTC (rev 20011) +++ trunk/reactos/include/win32k/cliprgn.h 2005-12-09 18:06:19 UTC (rev 20012) @@ -6,6 +6,14 @@
int STDCALL +IntGdiExtSelectClipRgn ( + PDC dc, + HRGN hrgn, + int fnMode + ); + +int +STDCALL NtGdiExcludeClipRect ( HDC hDC, int LeftRect, _____
Modified: trunk/reactos/subsys/win32k/include/path.h --- trunk/reactos/subsys/win32k/include/path.h 2005-12-09 17:57:58 UTC (rev 20011) +++ trunk/reactos/subsys/win32k/include/path.h 2005-12-09 18:06:19 UTC (rev 20012) @@ -18,6 +18,6 @@
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_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 */ _____
Modified: trunk/reactos/subsys/win32k/objects/cliprgn.c --- trunk/reactos/subsys/win32k/objects/cliprgn.c 2005-12-09 17:57:58 UTC (rev 20011) +++ trunk/reactos/subsys/win32k/objects/cliprgn.c 2005-12-09 18:06:19 UTC (rev 20012) @@ -99,21 +99,14 @@
return retval; }
-int STDCALL NtGdiExtSelectClipRgn(HDC hDC, - HRGN hrgn, - int fnMode) + +int STDCALL IntGdiExtSelectClipRgn(PDC dc, + HRGN hrgn, + int fnMode) { 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 (fnMode == RGN_COPY) @@ -127,7 +120,6 @@ } else { - DC_UnlockDc(dc); SetLastWin32Error(ERROR_INVALID_PARAMETER); return ERROR; } @@ -158,8 +150,26 @@ }
retval = CLIPPING_UpdateGCRegion(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; }
@@ -427,13 +437,6 @@ return Result; }
-BOOL STDCALL NtGdiSelectClipPath(HDC hDC, - int Mode) -{ - UNIMPLEMENTED; - return FALSE; -} - INT STDCALL NtGdiSelectClipRgn(HDC hDC, HRGN hRgn) { _____
Modified: trunk/reactos/subsys/win32k/objects/path.c --- trunk/reactos/subsys/win32k/objects/path.c 2005-12-09 17:57:58 UTC (rev 20011) +++ trunk/reactos/subsys/win32k/objects/path.c 2005-12-09 18:06:19 UTC (rev 20012) @@ -35,7 +35,7 @@
BOOL FASTCALL PATH_FlattenPath (GdiPath *pPath); VOID FASTCALL PATH_GetPathFromDC (PDC dc, GdiPath **ppPath); 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); VOID FASTCALL PATH_ScaleNormalizedPoint (FLOAT_POINT corners[], double x, double y, POINT *pPoint);
@@ -235,27 +235,114 @@ 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 */
/* PATH_FillPath - * unimplemented * + * */ BOOL FASTCALL PATH_FillPath( PDC dc, GdiPath *pPath ) { + INT mapMode, graphicsMode; + SIZE ptViewportExt, ptWindowExt; + POINT ptViewportOrg, ptWindowOrg; + XFORM xform; + HRGN hrgn; + if( pPath->state != PATH_Closed ) { + SetLastWin32Error(ERROR_CAN_NOT_COMPLETE); 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; }
@@ -924,15 +1011,11 @@ * error occurs, SetLastError is called with the appropriate value and * 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 FASTCALL -PATH_PathToRegion ( const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn ) +PATH_PathToRegion ( GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn ) { int numStrokes, iStroke, i; INT *pNumPointsInStroke; @@ -990,7 +1073,6 @@ *pHrgn=hrgn; return TRUE; } -#endif
/* PATH_EmptyPath *