Implement ExtCreateRegion.
Modified: trunk/reactos/include/win32k/region.h
Modified: trunk/reactos/lib/gdi32/gdi32.def
Modified: trunk/reactos/subsys/win32k/objects/region.c
_____
Modified: trunk/reactos/include/win32k/region.h
--- trunk/reactos/include/win32k/region.h 2005-01-02 18:00:31 UTC
(rev 12729)
+++ trunk/reactos/include/win32k/region.h 2005-01-02 18:04:59 UTC
(rev 12730)
@@ -79,9 +79,9 @@
HRGN
STDCALL
-NtGdiExtCreateRegion(CONST PXFORM Xform,
- DWORD Count,
- CONST PROSRGNDATA RgnData);
+NtGdiExtCreateRegion(CONST XFORM *Xform,
+ DWORD Count,
+ CONST RGNDATA *RgnData);
BOOL
STDCALL
_____
Modified: trunk/reactos/lib/gdi32/gdi32.def
--- trunk/reactos/lib/gdi32/gdi32.def 2005-01-02 18:00:31 UTC (rev
12729)
+++ trunk/reactos/lib/gdi32/gdi32.def 2005-01-02 18:04:59 UTC (rev
12730)
@@ -1,4 +1,4 @@
-; $Id: gdi32.def,v 1.13 2004/12/30 02:32:23 navaraf Exp $
+; $Id$
;
; gdi32.def
;
@@ -168,7 +168,7 @@
EudcUnloadLinkW@8
ExcludeClipRect@20=NtGdiExcludeClipRect@20
ExtCreatePen@20=NtGdiExtCreatePen@20
-ExtCreateRegion@12
+ExtCreateRegion@12=NtGdiExtCreateRegion@12
ExtEscape@24=NtGdiExtEscape@24
ExtFloodFill@20=NtGdiExtFloodFill@20
ExtSelectClipRgn@12=NtGdiExtSelectClipRgn@12
_____
Modified: trunk/reactos/subsys/win32k/objects/region.c
--- trunk/reactos/subsys/win32k/objects/region.c 2005-01-02
18:00:31 UTC (rev 12729)
+++ trunk/reactos/subsys/win32k/objects/region.c 2005-01-02
18:04:59 UTC (rev 12730)
@@ -113,7 +113,7 @@
* the y-x-banding that's so nice to have...
*/
-/* $Id: region.c,v 1.64 2004/12/12 01:40:38 weiden Exp $ */
+/* $Id$ */
#include <w32k.h>
#include <win32k/float.h>
@@ -2224,12 +2224,57 @@
HRGN
STDCALL
-NtGdiExtCreateRegion(CONST PXFORM Xform,
- DWORD Count,
- CONST PROSRGNDATA RgnData)
+NtGdiExtCreateRegion(CONST XFORM *Xform,
+ DWORD Count,
+ CONST RGNDATA *RgnData)
{
- UNIMPLEMENTED;
- return 0;
+ HRGN hRgn;
+ RGNDATA SafeRgnData;
+ PROSRGNDATA Region;
+ NTSTATUS Status;
+
+ if (Count < FIELD_OFFSET(RGNDATA, Buffer))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+
+ Status = MmCopyFromCaller(&SafeRgnData, RgnData, min(Count,
sizeof(RGNDATA)));
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+
+ hRgn = RGNDATA_AllocRgn(SafeRgnData.rdh.nCount);
+ if (hRgn == NULL)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ return NULL;
+ }
+
+ Region = RGNDATA_LockRgn(hRgn);
+ if (Region == NULL)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+
+ RtlCopyMemory(&Region->rdh, &SafeRgnData, FIELD_OFFSET(RGNDATA,
Buffer));
+
+ Status = MmCopyFromCaller(Region->Buffer, RgnData->Buffer,
+ Count - FIELD_OFFSET(RGNDATA, Buffer));
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RGNDATA_UnlockRgn(hRgn);
+ NtGdiDeleteObject(hRgn);
+ return NULL;
+ }
+
+ RGNDATA_UnlockRgn(hRgn);
+
+ return hRgn;
}
BOOL