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
;