9a54fa96e584e0a71fd207ba90d64d99bfc927de
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
21 if (r1
->top
< r2
->top
)
25 else if (r2
->top
< r1
->top
)
31 ASSERT(r1
->bottom
== r2
->bottom
);
32 if (r1
->left
< r2
->left
)
36 else if (r2
->left
< r1
->left
)
42 ASSERT(r1
->right
== r2
->right
);
57 if (r1
->bottom
< r2
->bottom
)
61 else if (r2
->bottom
< r1
->bottom
)
67 ASSERT(r1
->top
== r2
->top
);
68 if (r1
->left
< r2
->left
)
72 else if (r2
->left
< r1
->left
)
78 ASSERT(r1
->right
== r2
->right
);
93 if (r1
->top
< r2
->top
)
97 else if (r2
->top
< r1
->top
)
103 ASSERT(r1
->bottom
== r2
->bottom
);
104 if (r1
->right
< r2
->right
)
108 else if (r2
->right
< r1
->right
)
114 ASSERT(r1
->left
== r2
->left
);
129 if (r1
->bottom
< r2
->bottom
)
133 else if (r2
->bottom
< r1
->bottom
)
139 ASSERT(r1
->top
== r2
->top
);
140 if (r1
->right
< r2
->right
)
144 else if (r2
->right
< r1
->right
)
150 ASSERT(r1
->left
== r2
->left
);
164 if (Span1
->Y
< Span2
->Y
)
168 else if (Span2
->Y
< Span1
->Y
)
174 if (Span1
->X
< Span2
->X
)
178 else if (Span2
->X
< Span1
->X
)
192 IntEngDeleteClipRegion(CLIPOBJ
*ClipObj
)
194 EngFreeMem(ObjToGDI(ClipObj
, CLIP
));
198 IntEngCreateClipRegion(ULONG count
, PRECTL pRect
, PRECTL rcBounds
)
206 Clip
= EngAllocMem(0, sizeof(CLIPGDI
) + ((count
- 1) * sizeof(RECTL
)), GDITAG_CLIPOBJ
);
210 Clip
->EnumRects
.c
= count
;
211 Clip
->EnumOrder
= CD_ANY
;
212 for(dest
= Clip
->EnumRects
.arcl
;count
> 0; count
--, dest
++, pRect
++)
217 Clip
->ClipObj
.iDComplexity
= DC_COMPLEX
;
218 Clip
->ClipObj
.iFComplexity
= ((Clip
->EnumRects
.c
<= 4) ? FC_RECT4
: FC_COMPLEX
);
219 Clip
->ClipObj
.iMode
= TC_RECTANGLES
;
220 Clip
->ClipObj
.rclBounds
= *rcBounds
;
222 return GDIToObj(Clip
, CLIP
);
227 Clip
= EngAllocMem(0, sizeof(CLIPGDI
), GDITAG_CLIPOBJ
);
231 Clip
->EnumRects
.c
= 1;
232 Clip
->EnumOrder
= CD_ANY
;
233 Clip
->EnumRects
.arcl
[0] = *rcBounds
;
235 Clip
->ClipObj
.iDComplexity
= (((rcBounds
->top
== rcBounds
->bottom
) &&
236 (rcBounds
->left
== rcBounds
->right
))
237 ? DC_TRIVIAL
: DC_RECT
);
239 Clip
->ClipObj
.iFComplexity
= FC_RECT
;
240 Clip
->ClipObj
.iMode
= TC_RECTANGLES
;
241 Clip
->ClipObj
.rclBounds
= *rcBounds
;
243 return GDIToObj(Clip
, CLIP
);
256 CLIPGDI
*Clip
= EngAllocMem(FL_ZERO_MEMORY
, sizeof(CLIPGDI
), GDITAG_CLIPOBJ
);
259 return GDIToObj(Clip
, CLIP
);
269 EngDeleteClip(CLIPOBJ
*ClipRegion
)
271 EngFreeMem(ObjToGDI(ClipRegion
, CLIP
));
285 CLIPGDI
*ClipGDI
= ObjToGDI(ClipObj
, CLIP
);
286 SORTCOMP CompareFunc
;
288 ClipGDI
->EnumPos
= 0;
289 ClipGDI
->EnumMax
= (MaxRects
> 0) ? MaxRects
: ClipGDI
->EnumRects
.c
;
291 if (CD_ANY
!= BuildOrder
&& ClipGDI
->EnumOrder
!= BuildOrder
)
296 CompareFunc
= (SORTCOMP
) CompareRightDown
;
300 CompareFunc
= (SORTCOMP
) CompareRightUp
;
304 CompareFunc
= (SORTCOMP
) CompareLeftDown
;
308 CompareFunc
= (SORTCOMP
) CompareLeftUp
;
312 DPRINT1("Invalid BuildOrder %d\n", BuildOrder
);
313 BuildOrder
= ClipGDI
->EnumOrder
;
318 if (NULL
!= CompareFunc
)
320 EngSort((PBYTE
) ClipGDI
->EnumRects
.arcl
, sizeof(RECTL
), ClipGDI
->EnumRects
.c
, CompareFunc
);
323 ClipGDI
->EnumOrder
= BuildOrder
;
326 /* Return the number of rectangles enumerated */
327 if ((MaxRects
> 0) && (ClipGDI
->EnumRects
.c
> MaxRects
))
332 return ClipGDI
->EnumRects
.c
;
342 OUT ULONG
*EnumRects
)
345 CLIPGDI
*ClipGDI
= ObjToGDI(ClipObj
, CLIP
);
347 ENUMRECTS
* pERects
= (ENUMRECTS
*)EnumRects
;
349 //calculate how many rectangles we should copy
350 nCopy
= min( ClipGDI
->EnumMax
- ClipGDI
->EnumPos
,
351 min( ClipGDI
->EnumRects
.c
- ClipGDI
->EnumPos
,
352 (ObjSize
- sizeof(ULONG
)) / sizeof(RECTL
)));
359 /* copy rectangles */
360 src
= ClipGDI
->EnumRects
.arcl
+ ClipGDI
->EnumPos
;
361 for(i
= 0, dest
= pERects
->arcl
; i
< nCopy
; i
++, dest
++, src
++)
368 ClipGDI
->EnumPos
+=nCopy
;
370 return ClipGDI
->EnumPos
< ClipGDI
->EnumRects
.c
;