2 * Copyright © 2005 Novell, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software
5 * and its documentation for any purpose is hereby granted without
6 * fee, provided that the above copyright notice appear in all copies
7 * and that both that copyright notice and this permission notice
8 * appear in supporting documentation, and that the name of
9 * Novell, Inc. not be used in advertising or publicity pertaining to
10 * distribution of the software without specific, written prior permission.
11 * Novell, Inc. makes no representations about the suitability of this
12 * software for any purpose. It is provided "as is" without express or
15 * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
17 * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
19 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * Author: David Reveman <davidr@novell.com>
29 xglAreaMoveIn (xglAreaPtr pArea
,
32 pArea
->closure
= closure
;
33 pArea
->state
= xglAreaOccupied
;
35 return (*pArea
->pRoot
->funcs
->MoveIn
) (pArea
, closure
);
39 xglAreaMoveOut (xglAreaPtr pArea
)
41 (*pArea
->pRoot
->funcs
->MoveOut
) (pArea
, pArea
->closure
);
43 pArea
->closure
= (pointer
) 0;
44 pArea
->state
= xglAreaAvailable
;
48 xglAreaCreate (xglRootAreaPtr pRoot
,
58 pArea
= xalloc (sizeof (xglAreaRec
) + pRoot
->devPrivateSize
);
66 pArea
->height
= height
;
68 pArea
->closure
= (pointer
) 0;
69 pArea
->state
= xglAreaAvailable
;
72 pArea
->pArea
[n
] = NULL
;
74 if (pRoot
->devPrivateSize
)
75 pArea
->devPrivate
.ptr
= pArea
+ 1;
77 pArea
->devPrivate
.ptr
= (pointer
) 0;
79 if (!(*pArea
->pRoot
->funcs
->Create
) (pArea
))
89 xglAreaDestroy (xglAreaPtr pArea
)
94 if (pArea
->state
== xglAreaOccupied
)
96 xglAreaMoveOut (pArea
);
103 xglAreaDestroy (pArea
->pArea
[n
]);
110 xglAreaGetTopScoredSubArea (xglAreaPtr pArea
)
115 switch (pArea
->state
) {
116 case xglAreaOccupied
:
118 case xglAreaAvailable
:
120 case xglAreaDivided
: {
121 xglAreaPtr tmp
, top
= NULL
;
124 for (i
= 0; i
< 4; i
++)
126 tmp
= xglAreaGetTopScoredSubArea (pArea
->pArea
[i
]);
129 if ((*pArea
->pRoot
->funcs
->CompareScore
) (tmp
,
147 xglAreaFind (xglAreaPtr pArea
,
153 if (pArea
->width
< width
|| pArea
->height
< height
)
156 switch (pArea
->state
) {
157 case xglAreaOccupied
:
160 if ((*pArea
->pRoot
->funcs
->CompareScore
) (pArea
,
165 xglAreaMoveOut (pArea
);
170 case xglAreaAvailable
:
172 if (pArea
->level
== pArea
->pRoot
->maxLevel
||
173 (pArea
->width
== width
&& pArea
->height
== height
))
175 if (xglAreaMoveIn (pArea
, closure
))
180 int dx
[4], dy
[4], w
[4], h
[4], i
;
182 dx
[0] = dx
[2] = dy
[0] = dy
[1] = 0;
184 w
[0] = w
[2] = dx
[1] = dx
[3] = width
;
185 h
[0] = h
[1] = dy
[2] = dy
[3] = height
;
187 w
[1] = w
[3] = pArea
->width
- width
;
188 h
[2] = h
[3] = pArea
->height
- height
;
190 for (i
= 0; i
< 2; i
++)
194 xglAreaCreate (pArea
->pRoot
,
205 xglAreaCreate (pArea
->pRoot
,
212 pArea
->state
= xglAreaDivided
;
214 if (xglAreaFind (pArea
->pArea
[0], width
, height
, kickOut
, closure
))
221 int i
, rejected
= FALSE
;
223 for (i
= 0; i
< 4; i
++)
227 if (pArea
->pArea
[i
]->width
>= width
&&
228 pArea
->pArea
[i
]->height
>= height
)
230 if (xglFindArea (pArea
->pArea
[i
], width
, height
, kickOut
,
242 topArea
= xglAreaGetTopScoredSubArea (pArea
);
247 if ((*pArea
->pRoot
->funcs
->CompareScore
) (topArea
,
255 for (i
= 0; i
< 4; i
++)
257 xglAreaDestroy (pArea
->pArea
[i
]);
258 pArea
->pArea
[i
] = NULL
;
261 pArea
->closure
= (pointer
) 0;
262 pArea
->state
= xglAreaAvailable
;
263 if (xglFindArea (pArea
, width
, height
, TRUE
, closure
))
273 xglRootAreaInit (xglRootAreaPtr pRoot
,
278 xglAreaFuncsPtr funcs
,
281 pRoot
->maxLevel
= maxLevel
;
282 pRoot
->funcs
= funcs
;
283 pRoot
->devPrivateSize
= devPrivateSize
;
284 pRoot
->closure
= closure
;
286 pRoot
->pArea
= xglAreaCreate (pRoot
, 0, 0, 0, width
, height
);
294 xglRootAreaFini (xglRootAreaPtr pRoot
)
296 xglAreaDestroy (pRoot
->pArea
);
300 xglLeaveArea (xglAreaPtr pArea
)
302 xglAreaMoveOut (pArea
);
306 xglWithdrawArea (xglAreaPtr pArea
)
308 pArea
->closure
= NULL
;
309 pArea
->state
= xglAreaAvailable
;
313 xglFindArea (xglAreaPtr pArea
,
319 if (width
< 1 || height
< 0)
322 return xglAreaFind (pArea
, width
, height
, kickOut
, closure
);