244b3bdbada9e8071e6ce2cac06e7e25f1314961
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
)