2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: GDI Clipping Functions
5 * FILE: subsys/win32k/eng/clip.c
6 * PROGRAMER: Jason Filby
11 #include <ddk/winddi.h>
12 #include <ddk/ntddk.h>
15 #include <include/object.h>
17 #include <win32k/debug1.h>
19 VOID IntEngDeleteClipRegion(CLIPOBJ *ClipObj)
21 HCLIP HClip = AccessHandleFromUserObject(ClipObj);
25 CLIPOBJ * IntEngCreateClipRegion( ULONG count, PRECTL pRect, RECTL rcBounds )
30 DPRINT("IntEngCreateClipRegion count: %d\n", count);
32 hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ) + count*sizeof(RECTL),
36 clipInt = (CLIPGDI*)AccessInternalObject( hClip );
37 RtlCopyMemory( clipInt->EnumRects.arcl, pRect, count*sizeof(RECTL));
38 clipInt->EnumRects.c=count;
40 clipUser = (CLIPOBJ*)AccessUserObject( hClip );
43 clipUser->iDComplexity = DC_COMPLEX;
44 clipUser->iFComplexity = (count <= 4)? FC_RECT4: FC_COMPLEX;
45 clipUser->iMode = TC_RECTANGLES;
46 RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
53 hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ),
56 clipInt = (CLIPGDI*)AccessInternalObject( hClip );
57 RtlCopyMemory( clipInt->EnumRects.arcl, &rcBounds, sizeof( RECTL ));
58 clipInt->EnumRects.c = 1;
60 clipUser = (CLIPOBJ*)AccessUserObject( hClip );
63 clipUser->iDComplexity = ((rcBounds.top==rcBounds.bottom)&&(rcBounds.left==rcBounds.right))?
65 clipUser->iFComplexity = FC_RECT;
66 clipUser->iMode = TC_RECTANGLES;
67 DPRINT("IntEngCreateClipRegion: iDComplexity: %d\n", clipUser->iDComplexity);
68 RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
78 return EngAllocMem(FL_ZERO_MEMORY, sizeof(CLIPOBJ), 0);
82 EngDeleteClip(CLIPOBJ *ClipRegion)
84 EngFreeMem(ClipRegion);
88 CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj,
94 CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
97 ClipGDI->EnumMax = (MaxRects>0)? MaxRects : ClipGDI->EnumRects.c;
99 if( !((BuildOrder == CD_ANY) || (BuildOrder == CD_LEFTDOWN ))){
102 ClipGDI->EnumOrder = BuildOrder;
104 // Return the number of rectangles enumerated
105 if( (MaxRects > 0) && (ClipGDI->EnumRects.c>MaxRects) )
110 return ClipGDI->EnumRects.c;
114 CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj,
116 OUT ULONG *EnumRects)
118 CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
120 PENUMRECTS pERects = (PENUMRECTS)EnumRects;
122 //calculate how many rectangles we should copy
123 nCopy = MIN( ClipGDI->EnumMax-ClipGDI->EnumPos,
124 MIN( ClipGDI->EnumRects.c, (ObjSize-sizeof(ULONG))/sizeof(RECTL)));
126 RtlCopyMemory( &(pERects->arcl), &(ClipGDI->EnumRects.arcl), nCopy*sizeof(RECTL) );
129 ClipGDI->EnumPos+=nCopy;
131 if(ClipGDI->EnumPos > ClipGDI->EnumRects.c)