From 2bda045a8edbfa2a90989851e1b1853e6200e555 Mon Sep 17 00:00:00 2001 From: Eugene Ingerman Date: Mon, 22 Jul 2002 07:55:49 +0000 Subject: [PATCH] Added GetRegionData gdi function. Added region test. Fixed some bugs. svn path=/trunk/; revision=3285 --- reactos/apps/tests/gditest/gditest.c | 171 +++++++++++- reactos/iface/addsys/w32ksvc.db | 3 +- reactos/include/structs.h | 2 +- reactos/include/win32k/region.h | 18 +- reactos/lib/gdi32/makefile | 4 +- reactos/lib/gdi32/misc/stubs.c | 349 ++++++------------------ reactos/lib/gdi32/objects/dc.c | 16 +- reactos/subsys/win32k/objects/cliprgn.c | 2 +- reactos/subsys/win32k/objects/gdiobj.c | 9 +- reactos/subsys/win32k/objects/line.c | 5 +- reactos/subsys/win32k/objects/region.c | 150 ++++++---- 11 files changed, 396 insertions(+), 333 deletions(-) diff --git a/reactos/apps/tests/gditest/gditest.c b/reactos/apps/tests/gditest/gditest.c index 5c1f47632a5..f163ca0f5b5 100644 --- a/reactos/apps/tests/gditest/gditest.c +++ b/reactos/apps/tests/gditest/gditest.c @@ -11,7 +11,7 @@ void __stdcall Background (HDC Desktop) { HPEN Pen; int x, y; - + Pen = CreatePen(PS_SOLID, 1, RGB(64, 64, 128)); SelectObject (Desktop, Pen); @@ -30,8 +30,7 @@ void __stdcall Background (HDC Desktop) } } -int main (void) -{ +void gditest( void ){ HDC Desktop, MyDC, DC24; HPEN RedPen, GreenPen, BluePen, WhitePen; HBITMAP MyBitmap, DIB24; @@ -39,14 +38,12 @@ int main (void) BITMAPINFOHEADER BitInf; BITMAPINFO BitPalInf; - printf("Entering GDITest..\n"); - - GdiDllInitialize (NULL, DLL_PROCESS_ATTACH, NULL); - // Set up a DC called Desktop that accesses DISPLAY Desktop = CreateDCA("DISPLAY", NULL, NULL, NULL); - if (Desktop == NULL) - return 1; + if (Desktop == NULL){ + printf("Can't create desktop\n"); + return; + } // Background Background (Desktop); @@ -128,5 +125,161 @@ int main (void) // Free up everything DeleteDC(Desktop); DeleteDC(MyDC); +} + +void DumpRgnData( HRGN hRgn ) +{ + int size, ret, i; + LPRGNDATA rgnData; + + size = GetRegionData( hRgn, 0, NULL ); + if( size == 0 ){ + printf("GetRegionData returned 0\n"); + return; + } + rgnData = (LPRGNDATA) malloc( size ); + ret = GetRegionData( hRgn, size, rgnData ); + if( ret == 0 ){ + printf("GetRegionData( hRgn, size, rgnData ) returned 0\n"); + return; + } + printf("Bounds: left=%d top=%d right=%d bottom=%d, count: %d, type: %i\n\n", + rgnData->rdh.rcBound.left, rgnData->rdh.rcBound.top, rgnData->rdh.rcBound.right, rgnData->rdh.rcBound.bottom, + rgnData->rdh.nCount, rgnData->rdh.iType); + printf("Rects:\t i \t left \t top \t right \t bottom\n"); + for ( i = 0; i < rgnData->rdh.nCount; i++ ) { + PRECT pr = (PRECT) rgnData->Buffer + i; + printf("\t %d \t %d \t %d \t %d \t %d\n", i, pr->left, pr->top, pr->right, pr->bottom ); + } + printf("\n"); +} + +void rgntest( void ) +{ + HRGN hRgn1, hRgn2, hRgn3; + RECT Rect; + int i; + + hRgn1 = CreateRectRgn( 1, 1, 100, 100 ); + if( hRgn1 == NULL ) { + printf("Failed at hRgn1 = CreateRectRgn( 1, 1, 100, 100 )\n"); + return; + } + i = GetRgnBox( hRgn1, &Rect ); + if( i==0 ){ + printf("Failed GetRgnBox( hRgn1, &Rect )\n"); + return; + } + printf("GetRgnBox( hRgn1, &Rect ): i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + + DumpRgnData( hRgn1 ); + + hRgn2 = CreateRectRgn( 51, 51, 150, 150 ); + if( hRgn2 == NULL ) { + printf("Failed at hRgn2 = CreateRectRgn( 51, 51, 150, 150 )\n"); + return; + } + i = GetRgnBox( hRgn2, &Rect ); + if( i==0 ){ + printf("Failed GetRgnBox( hRgn2, &Rect )\n"); + return; + } + printf("GetRgnBox( hRgn2, &Rect ): i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + + DumpRgnData( hRgn2 ); + + if( EqualRgn( hRgn1, hRgn2 ) == TRUE ){ + printf("\t hRgn1, hRgn2 are equal\n"); + } + else{ + printf("\t hRgn1, hRgn2 are NOT equal\n\n"); + } + + i = OffsetRgn(hRgn1,50,50); + if( i==ERROR ){ + printf("Failed OffsetRgn(hRgn1,50,50)\n"); + return; + } + + i = GetRgnBox( hRgn1, &Rect ); + if( i==0 ){ + printf("Failed GetRgnBox( hRgn1, &Rect )\n"); + return; + } + printf("After offset\nGetRgnBox( hRgn1, &Rect ): i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + + if( EqualRgn( hRgn1, hRgn2 ) == TRUE ){ + printf("\t hRgn1, hRgn2 are equal after offset\n"); + } + else{ + printf("\t hRgn1, hRgn2 are NOT equal after offset!\n\n"); + } + + i = SetRectRgn(hRgn1, 10, 10, 110, 110 ); + if( i==0 ){ + printf("Failed SetRectRgn(hRgn1... )\n"); + return; + } + i = GetRgnBox( hRgn1, &Rect ); + if( i==0 ){ + printf("Failed GetRgnBox( hRgn1, &Rect )\n"); + return; + } + printf("after SetRectRgn(hRgn1, 10, 10, 110, 110 ):\n i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + + hRgn3 = CreateRectRgn( 1, 1, 1, 1); + i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ); + if( i==ERROR ){ + printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ). LastError: %d\n", GetLastError); + return; + } + + if( GetRgnBox( hRgn3, &Rect )==0 ){ + printf("Failed GetRgnBox( hRgn1, &Rect )\n"); + return; + } + printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + DumpRgnData( hRgn3 ); +/* + i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ); + if( i==ERROR ){ + printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ). LastError: %d\n", GetLastError); + return; + } + + if( GetRgnBox( hRgn3, &Rect )==0 ){ + printf("Failed GetRgnBox( hRgn1, &Rect )\n"); + return; + } + printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%d top=%d right=%d bottom=%d\n\n", + i, Rect.left, Rect.top, Rect.right, Rect.bottom ); + DumpRgnData( hRgn3 ); +*/ + DeleteObject( hRgn1 ); + DeleteObject( hRgn2 ); + DeleteObject( hRgn3 ); + printf("region test finished\n"); +} + +int main (int argc, char* argv[]) +{ + printf("Entering GDITest..\n"); + printf("use gditest for older tests\n"); + printf("use gditest 1 for region test\n"); + + GdiDllInitialize (NULL, DLL_PROCESS_ATTACH, NULL); + if( argc < 2 ) + gditest(); + else { + if( !strncmp( argv[1], "1", 1 ) ) { + rgntest(); + } + } + return 0; } diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index e84d2277e64..5b95995f36a 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -153,6 +153,7 @@ W32kGetROP2 1 #W32kGetRandomRgn ? W32kGetRasterizerCaps 2 W32kGetRelAbs 1 +W32kGetRegionData 3 W32kGetRgnBox 2 W32kGetStockObject 1 W32kGetStretchBltMode 1 @@ -533,4 +534,4 @@ NtUserWin32PoolAllocationStats 6 NtUserWindowFromPoint 2 NtUserYieldTask 0 # ReactOS only system calls -NtUserAcquireOrReleaseInputOwnership 1 \ No newline at end of file +NtUserAcquireOrReleaseInputOwnership 1 diff --git a/reactos/include/structs.h b/reactos/include/structs.h index ef379fe6f83..aa3400c06bf 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3450,7 +3450,7 @@ typedef struct _RGNDATAHEADER { typedef struct _RGNDATA { RGNDATAHEADER rdh; - char* Buffer; + char Buffer[1]; } RGNDATA, *PRGNDATA, *LPRGNDATA; typedef struct tagSCROLLINFO { diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 6665a1eb298..5103346b8b1 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -4,12 +4,19 @@ #include +//Internal region data. Can't use RGNDATA structure because buffer is allocated statically +typedef struct _ROSRGNDATA { + RGNDATAHEADER rdh; + char* Buffer; +} ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA; + + #define RGNDATA_FreeRgn(hRgn) GDIOBJ_FreeObj((HGDIOBJ)hRgn, GO_REGION_MAGIC) -#define RGNDATA_LockRgn(hRgn) ((PRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GO_REGION_MAGIC)) +#define RGNDATA_LockRgn(hRgn) ((PROSRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GO_REGION_MAGIC)) #define RGNDATA_UnlockRgn(hRgn) GDIOBJ_UnlockObj((HGDIOBJ)hRgn, GO_REGION_MAGIC) HRGN RGNDATA_AllocRgn(INT n); -BOOL RGNDATA_InternalDelete( PRGNDATA Obj ); +BOOL RGNDATA_InternalDelete( PROSRGNDATA Obj ); /* User entry points */ HRGN STDCALL @@ -75,7 +82,7 @@ HRGN STDCALL W32kExtCreateRegion(CONST PXFORM Xform, DWORD Count, - CONST PRGNDATA RgnData); + CONST PROSRGNDATA RgnData); BOOL STDCALL @@ -131,5 +138,10 @@ W32kSetRectRgn(HRGN hRgn, INT RightRect, INT BottomRect); +DWORD +STDCALL +W32kGetRegionData(HRGN hrgn, + DWORD count, + LPRGNDATA rgndata); #endif diff --git a/reactos/lib/gdi32/makefile b/reactos/lib/gdi32/makefile index cfb9fb21da0..6eda08d1ae1 100644 --- a/reactos/lib/gdi32/makefile +++ b/reactos/lib/gdi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.19 2001/08/21 20:13:06 chorns Exp $ +# $Id: makefile,v 1.20 2002/07/22 07:55:48 ei Exp $ PATH_TO_TOP = ../.. @@ -22,7 +22,7 @@ MAIN_OBJECTS = main/dllmain.o MISC_OBJECTS = misc/stubs.o misc/stubsa.o misc/stubsw.o misc/win32k.o -OBJECTS_OBJECTS = objects/dc.o objects/line.o objects/pen.o objects/bitblt.o objects/text.o +OBJECTS_OBJECTS = objects/dc.o objects/line.o objects/pen.o objects/bitblt.o objects/text.o objects/region.o OBJECTS = $(MAIN_OBJECTS) $(MISC_OBJECTS) $(OBJECTS_OBJECTS) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 60249db2e9b..a2aa1d7b508 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.6 2001/08/02 20:20:17 phreak Exp $ +/* $Id: stubs.c,v 1.7 2002/07/22 07:55:48 ei Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -105,21 +105,6 @@ CloseMetaFile( -int -STDCALL -CombineRgn( - HRGN a0, - HRGN a1, - HRGN a2, - int a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - HBRUSH STDCALL CreateBrushIndirect( @@ -210,75 +195,6 @@ CreatePalette( -HRGN -STDCALL -CreatePolyPolygonRgn( - CONST POINT *a0, - CONST INT *a1, - int a2, - int a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - -HBRUSH -STDCALL -CreatePatternBrush( - HBITMAP a0 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - -HRGN -STDCALL -CreateRectRgn( - int a0, - int a1, - int a2, - int a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - -HRGN -STDCALL -CreateRectRgnIndirect( - CONST RECT *a0 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - -HRGN -STDCALL -CreateRoundRectRgn( - int a0, - int a1, - int a2, - int a3, - int a4, - int a5 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - HBRUSH STDCALL @@ -303,18 +219,6 @@ DeleteMetaFile( -BOOL -STDCALL -DeleteObject( - HGDIOBJ a0 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - - int STDCALL DescribePixelFormat( @@ -376,19 +280,6 @@ EnumObjects( -BOOL -STDCALL -EqualRgn( - HRGN a0, - HRGN a1 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - - int STDCALL Escape( @@ -827,33 +718,6 @@ GetRasterizerCaps( -DWORD -STDCALL -GetRegionData( - HRGN a0, - DWORD a1, - LPRGNDATA a2 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - -int -STDCALL -GetRgnBox( - HRGN a0, - LPRECT a1 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - HGDIOBJ STDCALL GetStockObject( @@ -1103,21 +967,6 @@ OffsetClipRgn( } - -int -STDCALL -OffsetRgn( - HRGN a0, - int a1, - int a2 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - BOOL STDCALL PatBlt( @@ -1411,10 +1260,10 @@ SetBoundsRect( -DWORD -STDCALL +DWORD +STDCALL SetMapperFlags( - HDC a0, + HDC a0, DWORD a1 ) { @@ -1423,11 +1272,11 @@ SetMapperFlags( } - -int -STDCALL + +int +STDCALL SetGraphicsMode( - HDC hdc, + HDC hdc, int iMode ) { @@ -1436,11 +1285,11 @@ SetGraphicsMode( } - -HMETAFILE -STDCALL + +HMETAFILE +STDCALL SetMetaFileBitsEx( - UINT a0, + UINT a0, CONST BYTE *a1 ) { @@ -1449,13 +1298,13 @@ SetMetaFileBitsEx( } - -UINT -STDCALL + +UINT +STDCALL SetPaletteEntries( - HPALETTE a0, - UINT a1, - UINT a2, + HPALETTE a0, + UINT a1, + UINT a2, CONST PALETTEENTRY *a3 ) { @@ -1464,13 +1313,13 @@ SetPaletteEntries( } - -BOOL -STDCALL + +BOOL +STDCALL SetPixelV( HDC a0, - int a1, - int a2, + int a1, + int a2, COLORREF a3 ) { @@ -1479,12 +1328,12 @@ SetPixelV( } - -BOOL -STDCALL + +BOOL +STDCALL SetPixelFormat( - HDC a0, - int a1, + HDC a0, + int a1, CONST PIXELFORMATDESCRIPTOR *a2 ) { @@ -1493,11 +1342,11 @@ SetPixelFormat( } - -int -STDCALL + +int +STDCALL SetPolyFillMode( - HDC a0, + HDC a0, int a1 ) { @@ -1506,20 +1355,20 @@ SetPolyFillMode( } - -BOOL -STDCALL + +BOOL +STDCALL StretchBlt( - HDC a0, - int a1, - int a2, - int a3, - int a4, - HDC a5, - int a6, - int a7, - int a8, - int a9, + HDC a0, + int a1, + int a2, + int a3, + int a4, + HDC a5, + int a6, + int a7, + int a8, + int a9, DWORD a10 ) { @@ -1528,27 +1377,11 @@ StretchBlt( } - -BOOL -STDCALL -SetRectRgn( - HRGN a0, - int a1, - int a2, - int a3, - int a4 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -int -STDCALL +int +STDCALL SetROP2( - HDC a0, + HDC a0, int a1 ) { @@ -1557,11 +1390,11 @@ SetROP2( } - -int -STDCALL + +int +STDCALL SetStretchBltMode( - HDC a0, + HDC a0, int a1 ) { @@ -1570,11 +1403,11 @@ SetStretchBltMode( } - -UINT -STDCALL + +UINT +STDCALL SetSystemPaletteUse( - HDC a0, + HDC a0, UINT a1 ) { @@ -1583,11 +1416,11 @@ SetSystemPaletteUse( } - -int -STDCALL + +int +STDCALL SetTextCharacterExtra( - HDC a0, + HDC a0, int a1 ) { @@ -1596,11 +1429,11 @@ SetTextCharacterExtra( } - -UINT -STDCALL + +UINT +STDCALL SetTextAlign( - HDC a0, + HDC a0, UINT a1 ) { @@ -1609,9 +1442,9 @@ SetTextAlign( } - -BOOL -STDCALL + +BOOL +STDCALL SetTextJustification( HDC a0, int a1, @@ -1623,9 +1456,9 @@ SetTextJustification( } - -BOOL -STDCALL + +BOOL +STDCALL UpdateColors( HDC hdc ) @@ -1635,13 +1468,13 @@ UpdateColors( } - -BOOL -STDCALL + +BOOL +STDCALL PlayMetaFileRecord( - HDC a0, - LPHANDLETABLE a1, - LPMETARECORD a2, + HDC a0, + LPHANDLETABLE a1, + LPMETARECORD a2, UINT a3 ) { @@ -1650,13 +1483,13 @@ PlayMetaFileRecord( } - -BOOL -STDCALL + +BOOL +STDCALL EnumMetaFile( - HDC a0, - HMETAFILE a1, - ENUMMETAFILEPROC a2, + HDC a0, + HMETAFILE a1, + ENUMMETAFILEPROC a2, LPARAM a3 ) { @@ -1665,9 +1498,9 @@ EnumMetaFile( } - -HENHMETAFILE -STDCALL + +HENHMETAFILE +STDCALL CloseEnhMetaFile( HDC hdc ) @@ -1677,9 +1510,9 @@ CloseEnhMetaFile( } - -BOOL -STDCALL + +BOOL +STDCALL DeleteEnhMetaFile( HENHMETAFILE a0 ) @@ -1689,9 +1522,9 @@ DeleteEnhMetaFile( } - -BOOL -STDCALL + +BOOL +STDCALL EnumEnhMetaFile( HDC a0, HENHMETAFILE a1, diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 1a4e903af45..6b0c4a858fa 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -118,10 +118,10 @@ SelectObject( return W32kSelectObject(hDC, hGDIObj); } -int -STDCALL +int +STDCALL SetMapMode( - HDC a0, + HDC a0, int a1 ) { @@ -151,3 +151,13 @@ SetWindowOrgEx( { return W32kSetWindowOrgEx( a0, a1, a2, a3 ); } + + +BOOL +STDCALL +DeleteObject( + HGDIOBJ a0 + ) +{ + return W32kDeleteObject(a0); +} diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 98981514d61..ee3f7aebcf1 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -13,7 +13,7 @@ HRGN WINAPI SaveVisRgn(HDC hdc) { HRGN copy; - PRGNDATA obj, copyObj; + PROSRGNDATA obj, copyObj; PDC dc = DC_HandleToPtr(hdc); if (!dc) return 0; diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index e2a48654e3c..a695f5d7c51 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -1,7 +1,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.13 2002/07/18 21:59:18 ei Exp $ + * $Id: gdiobj.c,v 1.14 2002/07/22 07:55:48 ei Exp $ * */ @@ -14,7 +14,8 @@ #include #include #include -//#define NDEBUG +#include +#define NDEBUG #include // GDI stock objects @@ -132,7 +133,7 @@ GDIOBJ_iGetHandleEntryForIndex (WORD TableIndex) { //DPRINT("GDIOBJ_iGetHandleEntryForIndex: TableIndex: %d,\n handle: %x, ptr: %x\n", TableIndex, HandleTable->Handles [TableIndex], &(HandleTable->Handles [TableIndex]) ); //DPRINT("GIG: HandleTable: %x, Handles: %x, \n TableIndex: %x, pt: %x\n", HandleTable, HandleTable->Handles, TableIndex, ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)); - DPRINT("GIG: Hndl: %x, mag: %x\n", ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex), ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)->wMagic); + //DPRINT("GIG: Hndl: %x, mag: %x\n", ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex), ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)->wMagic); return ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex); } @@ -213,7 +214,7 @@ BOOL GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic) Obj = (PGDIOBJ)((PCHAR)handleEntry->pObject + sizeof(GDIOBJHDR)); switch( handleEntry->wMagic ){ case GO_REGION_MAGIC: - bRet = RGNDATA_InternalDelete( (PRGNDATA) Obj ); + bRet = RGNDATA_InternalDelete( (PROSRGNDATA) Obj ); break; case GO_PEN_MAGIC: case GO_PALETTE_MAGIC: diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index e4c8cf72f7c..4c092fb58bf 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -7,6 +7,7 @@ #include #include #include +#include // #define NDEBUG #include @@ -107,7 +108,7 @@ W32kLineTo(HDC hDC, SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject(dc->Surface); BOOL ret; PPENOBJ pen; - PRGNDATA reg; + PROSRGNDATA reg; if(!dc) return FALSE; @@ -115,7 +116,7 @@ W32kLineTo(HDC hDC, ret = PATH_LineTo(hDC, XEnd, YEnd); } else { pen = (PPENOBJ) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC); - reg = (PRGNDATA)GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC); + reg = (PROSRGNDATA)GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC); ASSERT( pen ); // not yet implemented ASSERT( reg ); diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 197e7aa83d7..3353caa918e 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -42,7 +42,7 @@ /* * Check to see if there is enough memory in the present region. */ -static inline int xmemcheck(RGNDATA *reg, LPRECT *rect, LPRECT *firstrect ) { +static inline int xmemcheck(ROSRGNDATA *reg, LPRECT *rect, LPRECT *firstrect ) { if ( (reg->rdh.nCount+1)*sizeof( RECT ) >= reg->rdh.nRgnSize ) { PRECT temp; temp = ExAllocatePool( PagedPool, (2 * (reg->rdh.nRgnSize))); @@ -72,7 +72,7 @@ typedef struct _POINTBLOCK { struct _POINTBLOCK *next; } POINTBLOCK; -static BOOL REGION_CopyRegion(PRGNDATA dst, PRGNDATA src) +static BOOL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) { if(dst != src) // don't want to copy to itself { @@ -100,7 +100,7 @@ static BOOL REGION_CopyRegion(PRGNDATA dst, PRGNDATA src) return TRUE; } -static void REGION_SetExtents (RGNDATA *pReg) +static void REGION_SetExtents (ROSRGNDATA *pReg) { RECT *pRect, *pRectEnd, *pExtents; @@ -143,7 +143,7 @@ static void REGION_SetExtents (RGNDATA *pReg) /*********************************************************************** * REGION_CropAndOffsetRegion */ -static BOOL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT rect, PRGNDATA rgnSrc, PRGNDATA rgnDst) +static BOOL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT rect, PROSRGNDATA rgnSrc, PROSRGNDATA rgnDst) { if(!rect) // just copy and offset { @@ -166,7 +166,7 @@ static BOOL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT rect, PRGND INT i; if(rgnDst != rgnSrc) - RtlCopyMemory(rgnDst, rgnSrc, sizeof(RGNDATA)); + RtlCopyMemory(rgnDst, rgnSrc, sizeof(ROSRGNDATA)); if(off->x || off->y) { @@ -307,14 +307,14 @@ empty: * * Returns: hDst if success, 0 otherwise. */ -HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, const PPOINT lpPt) +HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt) { - PRGNDATA objSrc = RGNDATA_LockRgn(hSrc); + PROSRGNDATA objSrc = RGNDATA_LockRgn(hSrc); HRGN hNewDst; if(objSrc) { - PRGNDATA rgnDst; + PROSRGNDATA rgnDst; if(hDst) { @@ -392,7 +392,7 @@ done: * */ static INT REGION_Coalesce ( - PRGNDATA pReg, /* Region to coalesce */ + PROSRGNDATA pReg, /* Region to coalesce */ INT prevStart, /* Index of start of previous band */ INT curStart /* Index of start of current band */ ) { @@ -536,9 +536,9 @@ static INT REGION_Coalesce ( * */ static void REGION_RegionOp( - RGNDATA *newReg, /* Place to store result */ - RGNDATA *reg1, /* First region in operation */ - RGNDATA *reg2, /* 2nd region in operation */ + ROSRGNDATA *newReg, /* Place to store result */ + ROSRGNDATA *reg1, /* First region in operation */ + ROSRGNDATA *reg2, /* 2nd region in operation */ void (*overlapFunc)(), /* Function to call for over-lapping bands */ void (*nonOverlap1Func)(), /* Function to call for non-overlapping bands in region 1 */ void (*nonOverlap2Func)() /* Function to call for non-overlapping bands in region 2 */ @@ -826,7 +826,7 @@ static void REGION_RegionOp( * Rectangles may be added to the region. * */ -static void REGION_IntersectO(RGNDATA *pReg, RECT *r1, RECT *r1End, +static void REGION_IntersectO(ROSRGNDATA *pReg, RECT *r1, RECT *r1End, RECT *r2, RECT *r2End, INT top, INT bottom) { @@ -883,8 +883,8 @@ static void REGION_IntersectO(RGNDATA *pReg, RECT *r1, RECT *r1End, /*********************************************************************** * REGION_IntersectRegion */ -static void REGION_IntersectRegion(RGNDATA *newReg, RGNDATA *reg1, - RGNDATA *reg2) +static void REGION_IntersectRegion(ROSRGNDATA *newReg, ROSRGNDATA *reg1, + ROSRGNDATA *reg2) { /* check for trivial reject */ if ( (!(reg1->rdh.nCount)) || (!(reg2->rdh.nCount)) || @@ -923,7 +923,7 @@ static void REGION_IntersectRegion(RGNDATA *newReg, RGNDATA *reg1, * with the rectangles we're passed. * */ -static void REGION_UnionNonO (RGNDATA *pReg, RECT *r, RECT *rEnd, +static void REGION_UnionNonO (ROSRGNDATA *pReg, RECT *r, RECT *rEnd, INT top, INT bottom) { RECT *pNextRect; @@ -958,7 +958,7 @@ static void REGION_UnionNonO (RGNDATA *pReg, RECT *r, RECT *rEnd, * be changed. * */ -static void REGION_UnionO (RGNDATA *pReg, RECT *r1, RECT *r1End, +static void REGION_UnionO (ROSRGNDATA *pReg, RECT *r1, RECT *r1End, RECT *r2, RECT *r2End, INT top, INT bottom) { RECT *pNextRect; @@ -1017,8 +1017,8 @@ static void REGION_UnionO (RGNDATA *pReg, RECT *r1, RECT *r1End, /*********************************************************************** * REGION_UnionRegion */ -static void REGION_UnionRegion(RGNDATA *newReg, RGNDATA *reg1, - RGNDATA *reg2) +static void REGION_UnionRegion(ROSRGNDATA *newReg, ROSRGNDATA *reg1, + ROSRGNDATA *reg2) { /* checks all the simple cases */ @@ -1096,7 +1096,7 @@ static void REGION_UnionRegion(RGNDATA *newReg, RGNDATA *reg1, * pReg may be affected. * */ -static void REGION_SubtractNonO1 (RGNDATA *pReg, RECT *r, RECT *rEnd, +static void REGION_SubtractNonO1 (ROSRGNDATA *pReg, RECT *r, RECT *rEnd, INT top, INT bottom) { RECT *pNextRect; @@ -1131,7 +1131,7 @@ static void REGION_SubtractNonO1 (RGNDATA *pReg, RECT *r, RECT *rEnd, * pReg may have rectangles added to it. * */ -static void REGION_SubtractO (RGNDATA *pReg, RECT *r1, RECT *r1End, +static void REGION_SubtractO (ROSRGNDATA *pReg, RECT *r1, RECT *r1End, RECT *r2, RECT *r2End, INT top, INT bottom) { RECT *pNextRect; @@ -1259,8 +1259,8 @@ static void REGION_SubtractO (RGNDATA *pReg, RECT *r1, RECT *r1End, * regD is overwritten. * */ -static void REGION_SubtractRegion(RGNDATA *regD, RGNDATA *regM, - RGNDATA *regS ) +static void REGION_SubtractRegion(ROSRGNDATA *regD, ROSRGNDATA *regM, + ROSRGNDATA *regS ) { /* check for trivial reject */ if ( (!(regM->rdh.nCount)) || (!(regS->rdh.nCount)) || @@ -1286,11 +1286,11 @@ static void REGION_SubtractRegion(RGNDATA *regD, RGNDATA *regM, /*********************************************************************** * REGION_XorRegion */ -static void REGION_XorRegion(RGNDATA *dr, RGNDATA *sra, - RGNDATA *srb) +static void REGION_XorRegion(ROSRGNDATA *dr, ROSRGNDATA *sra, + ROSRGNDATA *srb) { HRGN htra, htrb; - RGNDATA *tra, *trb; + ROSRGNDATA *tra, *trb; if ((! (htra = RGNDATA_AllocRgn(sra->rdh.nCount + 1))) || (! (htrb = RGNDATA_AllocRgn(srb->rdh.nCount + 1)))) @@ -1326,9 +1326,9 @@ static void REGION_XorRegion(RGNDATA *dr, RGNDATA *sra, * REGION_UnionRectWithRegion * Adds a rectangle to a WINEREGION */ -static void REGION_UnionRectWithRegion(const RECT *rect, RGNDATA *rgn) +static void REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rgn) { - RGNDATA region; + ROSRGNDATA region; region.Buffer = (char*)(&(region.rdh.rcBound)); region.rdh.nCount = 1; @@ -1341,8 +1341,8 @@ static void REGION_UnionRectWithRegion(const RECT *rect, RGNDATA *rgn) BOOL REGION_LPTODP(HDC hdc, HRGN hDest, HRGN hSrc) { RECT *pCurRect, *pEndRect; - PRGNDATA srcObj = NULL; - PRGNDATA destObj = NULL; + PROSRGNDATA srcObj = NULL; + PROSRGNDATA destObj = NULL; DC * dc = DC_HandleToPtr(hdc); RECT tmpRect; @@ -1361,9 +1361,9 @@ BOOL REGION_LPTODP(HDC hdc, HRGN hDest, HRGN hSrc) goto done; } - if(!( srcObj = (PRGNDATA) RGNDATA_LockRgn( hSrc ) )) + if(!( srcObj = (PROSRGNDATA) RGNDATA_LockRgn( hSrc ) )) goto done; - if(!( destObj = (PRGNDATA) RGNDATA_LockRgn( hDest ) )) + if(!( destObj = (PROSRGNDATA) RGNDATA_LockRgn( hDest ) )) { RGNDATA_UnlockRgn( hSrc ); goto done; @@ -1399,17 +1399,17 @@ done: HRGN RGNDATA_AllocRgn(INT n) { HRGN hReg; - PRGNDATA pReg; + PROSRGNDATA pReg; BOOL bRet; - if((hReg = (HRGN)GDIOBJ_AllocObj(sizeof(RGNDATA), GO_REGION_MAGIC))){ + if((hReg = (HRGN)GDIOBJ_AllocObj(sizeof(ROSRGNDATA), GO_REGION_MAGIC))){ if( (pReg = GDIOBJ_LockObj( hReg, GO_REGION_MAGIC )) ){ if ((pReg->Buffer = ExAllocatePool(PagedPool, n * sizeof(RECT)))){ + EMPTY_REGION(pReg); pReg->rdh.dwSize = sizeof(RGNDATAHEADER); pReg->rdh.nCount = n; pReg->rdh.nRgnSize = n*sizeof(RECT); - EMPTY_REGION(pReg); bRet = GDIOBJ_UnlockObj( hReg, GO_REGION_MAGIC ); ASSERT(bRet); @@ -1424,7 +1424,7 @@ HRGN RGNDATA_AllocRgn(INT n) return NULL; } -BOOL RGNDATA_InternalDelete( PRGNDATA pRgn ) +BOOL RGNDATA_InternalDelete( PROSRGNDATA pRgn ) { ASSERT(pRgn); if(pRgn->Buffer) @@ -1441,10 +1441,10 @@ W32kCombineRgn(HRGN hDest, INT CombineMode) { INT result = ERROR; - PRGNDATA destRgn = RGNDATA_LockRgn(hDest); + PROSRGNDATA destRgn = RGNDATA_LockRgn(hDest); if( destRgn ){ - PRGNDATA src1Rgn = RGNDATA_LockRgn(hSrc1); + PROSRGNDATA src1Rgn = RGNDATA_LockRgn(hSrc1); if( src1Rgn ){ if (CombineMode == RGN_COPY) @@ -1455,7 +1455,7 @@ W32kCombineRgn(HRGN hDest, } else { - PRGNDATA src2Rgn = RGNDATA_LockRgn(hSrc2); + PROSRGNDATA src2Rgn = RGNDATA_LockRgn(hSrc2); if( src2Rgn ){ switch (CombineMode) { @@ -1530,7 +1530,7 @@ W32kCreateRectRgn(INT LeftRect, INT BottomRect) { HRGN hRgn; - PRGNDATA pRgnData; + PROSRGNDATA pRgnData; PRECT pRect; // Allocate region data structure with space for 1 RECT @@ -1583,7 +1583,7 @@ STDCALL W32kEqualRgn(HRGN hSrcRgn1, HRGN hSrcRgn2) { - PRGNDATA rgn1, rgn2; + PROSRGNDATA rgn1, rgn2; PRECT tRect1, tRect2; int i; BOOL bRet = FALSE; @@ -1630,7 +1630,7 @@ HRGN STDCALL W32kExtCreateRegion(CONST PXFORM Xform, DWORD Count, - CONST PRGNDATA RgnData) + CONST PROSRGNDATA RgnData) { HRGN hRgn; @@ -1668,7 +1668,7 @@ STDCALL W32kGetRgnBox(HRGN hRgn, LPRECT pRect) { - PRGNDATA rgn = RGNDATA_LockRgn(hRgn); + PROSRGNDATA rgn = RGNDATA_LockRgn(hRgn); DWORD ret; if( rgn ){ @@ -1702,16 +1702,21 @@ W32kOffsetRgn(HRGN hRgn, INT XOffset, INT YOffset) { - PRGNDATA rgn = RGNDATA_LockRgn(hRgn); + PROSRGNDATA rgn = RGNDATA_LockRgn(hRgn); INT ret; - if( !rgn ) + DPRINT("W32kOffsetRgn: hRgn %d Xoffs %d Yoffs %d rgn %x\n", hRgn, XOffset, YOffset, rgn ); + + if( !rgn ){ + DPRINT("W32kOffsetRgn: hRgn error\n"); return ERROR; + } if(XOffset || YOffset) { int nbox = rgn->rdh.nCount; PRECT pbox = (PRECT)rgn->Buffer; + DPRINT("nbox %d, pbox %x\n", nbox, pbox); if(nbox && pbox) { while(nbox--) { pbox->left += XOffset; @@ -1720,10 +1725,12 @@ W32kOffsetRgn(HRGN hRgn, pbox->bottom += YOffset; pbox++; } + DPRINT("rgn->rdh.rcBound.left %d\n",rgn->rdh.rcBound.left); rgn->rdh.rcBound.left += XOffset; rgn->rdh.rcBound.right += XOffset; rgn->rdh.rcBound.top += YOffset; rgn->rdh.rcBound.bottom += YOffset; + DPRINT("after rgn->rdh.rcBound.left %d\n",rgn->rdh.rcBound.left); } } ret = rgn->rdh.iType; @@ -1790,7 +1797,7 @@ W32kPtInRegion(HRGN hRgn, INT X, INT Y) { - PRGNDATA rgn; + PROSRGNDATA rgn; int i; if( (rgn = RGNDATA_LockRgn(hRgn) ) ) @@ -1813,7 +1820,7 @@ STDCALL W32kRectInRegion(HRGN hRgn, CONST LPRECT unsaferc) { - PRGNDATA rgn; + PROSRGNDATA rgn; PRECT pCurRect, pRectEnd; PRECT rc; BOOL bRet = FALSE; @@ -1851,7 +1858,7 @@ W32kSetRectRgn(HRGN hRgn, INT RightRect, INT BottomRect) { - PRGNDATA rgn; + PROSRGNDATA rgn; PRECT firstRect; @@ -1883,7 +1890,7 @@ HRGN STDCALL W32kUnionRectWithRgn(HRGN hDest, const RECT* unsafeRect) { PRECT pRect; - PRGNDATA pRgn; + PROSRGNDATA pRgn; if( !NT_SUCCESS( MmCopyFromCaller( pRect, unsafeRect, sizeof( RECT ) ) ) ) return NULL; @@ -1895,3 +1902,48 @@ W32kUnionRectWithRgn(HRGN hDest, const RECT* unsafeRect) RGNDATA_UnlockRgn( hDest ); return hDest; } + +/*********************************************************************** + * GetRegionData (GDI32.@) + * + * MSDN: GetRegionData, Return Values: + * + * "If the function succeeds and dwCount specifies an adequate number of bytes, + * the return value is always dwCount. If dwCount is too small or the function + * fails, the return value is 0. If lpRgnData is NULL, the return value is the + * required number of bytes. + * + * If the function fails, the return value is zero." + */ +DWORD STDCALL W32kGetRegionData(HRGN hrgn, DWORD count, LPRGNDATA rgndata) +{ + DWORD size; + PROSRGNDATA obj = RGNDATA_LockRgn( hrgn ); + + if(!obj) + return 0; + + size = obj->rdh.nCount * sizeof(RECT); + if(count < (size + sizeof(RGNDATAHEADER)) || rgndata == NULL) + { + RGNDATA_UnlockRgn( hrgn ); + if (rgndata) /* buffer is too small, signal it by return 0 */ + return 0; + else /* user requested buffer size with rgndata NULL */ + return size + sizeof(RGNDATAHEADER); + } + + //first we copy the header then we copy buffer + if( !NT_SUCCESS( MmCopyToCaller( rgndata, obj, sizeof( RGNDATAHEADER )))){ + RGNDATA_UnlockRgn( hrgn ); + return 0; + } + if( !NT_SUCCESS( MmCopyToCaller( (char*)rgndata+sizeof( RGNDATAHEADER ), obj->Buffer, size ))){ + RGNDATA_UnlockRgn( hrgn ); + return 0; + } + + RGNDATA_UnlockRgn( hrgn ); + return size + sizeof(RGNDATAHEADER); +} +