22 #include "allheaders.h"
26 #include "config_auto.h"
36 static
void position_outline(
38 C_OUTLINE_LIST *destlist
41 C_OUTLINE_IT it = destlist;
43 C_OUTLINE_IT child_it = outline->
child ();
47 dest_outline = it.data ();
49 if (*dest_outline < *outline) {
51 dest_outline = it.extract ();
53 it.add_after_then_move (outline);
55 child_it.add_to_end (dest_outline);
56 while (!it.at_last ()) {
59 dest_outline = it.data ();
60 if (*dest_outline < *outline) {
62 dest_outline = it.extract ();
63 child_it.add_to_end (dest_outline);
72 else if (*outline < *dest_outline) {
73 position_outline (outline, dest_outline->
child ());
79 while (!it.at_first ());
81 it.add_to_end (outline);
92 #ifndef GRAPHICS_DISABLED
93 static void plot_outline_list(
100 C_OUTLINE_IT it = list;
102 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
103 outline = it.data ();
105 outline->
plot (window, colour);
106 if (!outline->
child ()->empty ())
107 plot_outline_list (outline->
child (), window,
108 child_colour, child_colour);
120 static void reverse_outline_list(
124 C_OUTLINE_IT it = list;
126 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
127 outline = it.data ();
129 if (!outline->
child ()->empty ())
130 reverse_outline_list (outline->
child ());
144 C_OUTLINE_LIST *outline_list
147 C_OUTLINE_IT it = outline_list;
149 while (!it.empty ()) {
150 outline = it.extract ();
152 position_outline(outline, &outlines);
156 it.set_to_list (&outlines);
157 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
158 outline = it.data ();
161 reverse_outline_list (outline->
child ());
173 C_OUTLINE_IT it(&outlines);
174 it.add_to_end(outline);
181 C_OUTLINE_LIST outlines;
183 return new C_BLOB(&outlines);
194 C_OUTLINE_IT it = &outlines;
197 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
198 outline = it.data ();
213 C_OUTLINE_IT it = &outlines;
217 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
218 outline = it.data ();
219 total += outline->
area ();
232 C_OUTLINE_IT it = &outlines;
236 for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
252 C_OUTLINE_IT it = &outlines;
256 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
257 outline = it.data ();
275 C_OUTLINE_IT it = &outlines;
279 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
280 outline = it.data ();
296 C_OUTLINE_IT it(&outlines);
298 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
299 it.data ()->move (vec);
304 C_OUTLINE_LIST new_outlines;
305 C_OUTLINE_IT src_it(outlines);
306 C_OUTLINE_IT dest_it(&new_outlines);
307 while (!src_it.empty()) {
308 C_OUTLINE* old_outline = src_it.extract();
311 if (!old_outline->
child()->empty()) {
313 C_OUTLINE_IT child_it(new_outline->
child());
314 child_it.add_list_after(old_outline->
child());
317 dest_it.add_to_end(new_outline);
319 src_it.add_list_after(&new_outlines);
332 static void render_outline_list(C_OUTLINE_LIST *list,
333 int left,
int top, Pix* pix) {
334 C_OUTLINE_IT it(list);
335 for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
337 outline->
render(left, top, pix);
338 if (!outline->
child()->empty())
339 render_outline_list(outline->
child(), left, top, pix);
343 static void render_outline_list_outline(C_OUTLINE_LIST *list,
344 int left,
int top, Pix* pix) {
345 C_OUTLINE_IT it(list);
346 for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
355 Pix* pix = pixCreate(box.
width(), box.
height(), 1);
356 render_outline_list(&outlines, box.
left(), box.
top(), pix);
364 Pix* pix = pixCreate(box.
width(), box.
height(), 1);
365 render_outline_list_outline(&outlines, box.
left(), box.
top(), pix);
375 #ifndef GRAPHICS_DISABLED
381 plot_outline_list(&outlines, window, blob_colour, child_colour);