lilypond-1.3.28
[lilypond.git] / lily / item.cc
blobd9abade41bf7e23fb80ad3bff5b1bc4f89eb568f
1 /*
2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
9 #include "dimension-cache.hh"
10 #include "paper-score.hh"
11 #include "debug.hh"
12 #include "item.hh"
13 #include "paper-column.hh"
14 #include "spanner.hh"
15 #include "lily-guile.hh"
17 Item::Item ()
19 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
22 bool
23 Item::breakable_b () const
25 if (original_l_ )
26 return false;
28 Item * i =dynamic_cast<Item*> (parent_l (X_AXIS));
29 return (i) ? i->breakable_b () : to_boolean (get_elt_property( "breakable"));
32 Real
33 Item::hpos_f() const
35 return relative_coordinate (0, X_AXIS);
38 Line_of_score *
39 Item::line_l() const
41 Score_element *g = parent_l (X_AXIS);
42 if (!g)
43 return 0;
44 return dynamic_cast<Score_element *> (g)-> line_l ();
48 void
49 Item::copy_breakable_items()
51 Drul_array<Item *> new_copies;
52 Direction i=LEFT;
53 do
55 Score_element * dolly = clone();
56 Item * item_p = dynamic_cast<Item*>(dolly);
57 pscore_l_->typeset_element (item_p);
58 new_copies[i] =item_p;
60 while (flip(&i) != LEFT);
61 broken_to_drul_= new_copies;
63 do
65 broken_to_drul_[i]->handle_prebroken_dependencies();
66 broken_to_drul_[i]->try_visibility_lambda();
68 while (flip(&i) != LEFT);
71 void
72 Item::try_visibility_lambda ()
74 SCM vis = remove_elt_property ("visibility-lambda");
75 if (gh_procedure_p (vis))
77 SCM args = scm_listify (gh_int2scm (break_status_dir ()), SCM_UNDEFINED);
78 SCM result = gh_apply (vis, args);
79 bool trans = gh_scm2bool (gh_car (result));
80 bool empty = gh_scm2bool (gh_cdr (result));
82 if (empty)
84 set_empty (X_AXIS);
85 set_empty ( Y_AXIS);
87 if (trans)
88 set_elt_property ("transparent", SCM_BOOL_T);
92 bool
93 Item::broken_b () const
95 return broken_to_drul_[LEFT] || broken_to_drul_[RIGHT];
98 void
99 Item::do_break ()
101 if (broken_b ())
102 return;
104 if (breakable_b ())
106 copy_breakable_items();
107 handle_prebroken_dependencies();
110 Otherwise the broken items won't be pre_process()'ed.
113 if (broken_to_drul_[LEFT])
115 add_dependency (broken_to_drul_[LEFT]);
116 add_dependency (broken_to_drul_[RIGHT]);
119 try_visibility_lambda (); // ugh.
122 void
123 Item::do_breakable_col_processing()
125 do_break ();
128 Score_element*
129 Item::find_broken_piece (Line_of_score*l) const
131 if (line_l() == l)
132 return (Item*)(this);
134 Direction d = LEFT;
135 do {
136 Score_element *s = find_broken_piece (d);
137 if (s && s->line_l () == l)
138 return s;
140 while (flip (&d) != LEFT);
142 return 0;
145 Item*
146 Item::find_broken_piece (Direction d) const
148 Item * me = (Item *) (this);
149 if (!d)
150 return me;
151 else if (breakable_b ())
153 me->do_break ();
154 return dynamic_cast<Item*> (broken_to_drul_[d]);
156 else
157 return 0;
160 Paper_column *
161 Item::column_l () const
163 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
166 Item::Item (Item const &s)
167 : Score_element (s)
169 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
172 Direction
173 Item::break_status_dir () const
175 if (original_l_)
177 Item * i = dynamic_cast<Item*> (original_l_);
179 return (i->broken_to_drul_[LEFT] == this) ? LEFT : RIGHT;
181 else
182 return CENTER;