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>
18 #include <win32k/debug1.h>
20 VOID IntEngDeleteClipRegion(CLIPOBJ *ClipObj)
22 HCLIP HClip = AccessHandleFromUserObject(ClipObj);
26 CLIPOBJ * IntEngCreateClipRegion( ULONG count, PRECTL pRect, RECTL rcBounds )
31 DPRINT("IntEngCreateClipRegion count: %d\n", count);
33 hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ) + count*sizeof(RECTL),
37 clipInt = (CLIPGDI*)AccessInternalObject( hClip );
38 RtlCopyMemory( clipInt->EnumRects.arcl, pRect, count*sizeof(RECTL));
39 clipInt->EnumRects.c=count;
41 clipUser = (CLIPOBJ*)AccessUserObject( hClip );
44 clipUser->iDComplexity = DC_COMPLEX;
45 clipUser->iFComplexity = (count <= 4)? FC_RECT4: FC_COMPLEX;
46 clipUser->iMode = TC_RECTANGLES;
47 RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
54 hClip = (HCLIP)CreateGDIHandle( sizeof( CLIPGDI ),
57 clipInt = (CLIPGDI*)AccessInternalObject( hClip );
58 RtlCopyMemory( clipInt->EnumRects.arcl, &rcBounds, sizeof( RECTL ));
59 clipInt->EnumRects.c = 1;
61 clipUser = (CLIPOBJ*)AccessUserObject( hClip );
64 clipUser->iDComplexity = ((rcBounds.top==rcBounds.bottom)&&(rcBounds.left==rcBounds.right))?
66 clipUser->iFComplexity = FC_RECT;
67 clipUser->iMode = TC_RECTANGLES;
68 DPRINT("IntEngCreateClipRegion: iDComplexity: %d\n", clipUser->iDComplexity);
69 RtlCopyMemory( &(clipUser->rclBounds), &rcBounds, sizeof( RECTL ) );
79 return EngAllocMem(FL_ZERO_MEMORY, sizeof(CLIPOBJ), 0);
83 EngDeleteClip(CLIPOBJ *ClipRegion)
85 EngFreeMem(ClipRegion);
89 CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj,
95 CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
98 ClipGDI->EnumMax = (MaxRects>0)? MaxRects : ClipGDI->EnumRects.c;
100 if( !((BuildOrder == CD_ANY) || (BuildOrder == CD_LEFTDOWN ))){
103 ClipGDI->EnumOrder = BuildOrder;
105 // Return the number of rectangles enumerated
106 if( (MaxRects > 0) && (ClipGDI->EnumRects.c>MaxRects) )
111 return ClipGDI->EnumRects.c;
115 CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj,
117 OUT ULONG *EnumRects)
119 CLIPGDI *ClipGDI = (CLIPGDI*)AccessInternalObjectFromUserObject(ClipObj);
121 PENUMRECTS pERects = (PENUMRECTS)EnumRects;
123 //calculate how many rectangles we should copy
124 nCopy = MIN( ClipGDI->EnumMax - ClipGDI->EnumPos,
125 MIN( ClipGDI->EnumRects.c - ClipGDI->EnumPos,
126 (ObjSize - sizeof(ULONG)) / sizeof(RECTL)));
128 RtlCopyMemory( pERects->arcl, ClipGDI->EnumRects.arcl + ClipGDI->EnumPos,
129 nCopy * sizeof(RECTL) );
132 ClipGDI->EnumPos+=nCopy;
134 return ClipGDI->EnumPos < ClipGDI->EnumRects.c;