]> git.donarmstrong.com Git - lilypond.git/blob - lily/item.cc
release: 1.1.18
[lilypond.git] / lily / item.cc
1 /*
2   item.cc -- implement Item
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "p-score.hh"
10 #include "debug.hh"
11 #include "item.hh"
12 #include "p-col.hh"
13 #include "spanner.hh"
14
15 Item::Item ()
16 {
17   unbroken_original_l_ =0;
18   break_priority_i_ = 0;
19   breakable_b_ = false;
20   break_status_dir_ = CENTER;
21   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
22 }
23
24
25
26 void
27 Item::do_print() const
28 {
29 #ifndef NPRINT
30   DOUT << "breakable_b_: " << breakable_b_ << 
31     " break_status_dir_: " << break_status_dir_;
32 #endif
33 }
34
35
36 Real 
37 Item::hpos_f() const
38 {
39   return absolute_coordinate (X_AXIS);
40 }
41
42 Line_of_score *
43 Item::line_l() const
44 {
45   Graphical_element *g =parent_l (X_AXIS);
46   if (!g)
47     return 0;
48   return dynamic_cast <Score_element *> (g)-> line_l ();
49 }
50
51 Direction
52 Item::break_status_dir() const
53 {
54   return break_status_dir_;
55 }
56
57 void
58 Item::copy_breakable_items()
59 {
60   if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
61     return;
62   Drul_array<Item *> new_copies;
63   Direction  i=LEFT;
64   do 
65     {
66       Item * item_p = dynamic_cast<Item*>(clone());
67
68       item_p->break_status_dir_ =  i;
69       pscore_l_->typeset_element (item_p);
70       item_p->handle_prebroken_dependencies();
71       new_copies[i] =item_p;
72     }
73   while (flip(&i) != LEFT);
74   broken_to_drul_= new_copies;
75 }
76
77 void
78 Item::do_breakable_col_processing()
79 {
80   if (!breakable_b_)
81     return;
82
83   if (!column_l ()->breakable_b_)
84     return;
85
86   copy_breakable_items();
87   handle_prebroken_dependencies();
88
89   /*
90     Otherwise the broken items won't be pre_process()'ed.
91   */
92   add_dependency (broken_to_drul_[LEFT]);
93   add_dependency (broken_to_drul_[RIGHT]);    
94 }
95
96 Item*
97 Item::find_prebroken_piece (Line_of_score*l) const
98 {
99   if (line_l() == l) 
100     return (Item*)this;
101   else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
102     return broken_to_drul_[LEFT];
103   else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
104     return broken_to_drul_[RIGHT];
105
106   return 0;
107 }
108
109 Item*
110 Item::find_prebroken_piece (Direction breakstatus) const
111 {
112   if (!breakstatus)
113     return (Item *) this;       // ugh
114   else
115     return (Item*) broken_to_drul_[breakstatus];
116 }
117
118 void
119 Item::handle_prebroken_dependencies()
120 {
121   if (breakable_b_)
122     Score_element::handle_prebroken_dependencies();
123 }
124
125 int
126 Item::left_right_compare(Item const *l, Item const *r)
127 {
128   Paper_column *p1 = l->column_l ();
129   Paper_column* p2 = r->column_l ();
130   return p1->rank_i () - p2->rank_i ();
131 }
132
133
134 bool
135 Item::linked_b() const
136 {
137   return Score_element::linked_b() || attached_span_l_arr_.size();
138 }
139
140 void
141 Item::do_junk_links()
142 {
143   attached_span_l_arr_.set_size(0);
144 }
145
146 void
147 Item::do_unlink()
148 {
149   Link_array<Spanner> attached=attached_span_l_arr_;
150   for (int i=0; i < attached.size (); i++)
151     {
152       Spanner *s= attached[i];
153
154       Direction d= LEFT;
155       do {
156         if (s->spanned_drul_[d] == this)
157           s->set_bounds (d, 0);
158         if (unbroken_original_l_
159             && unbroken_original_l_-> broken_to_drul_[d] == this)
160           unbroken_original_l_->broken_to_drul_[d] = 0;
161       } while (flip (&d) != LEFT);
162     }
163   assert (!attached_span_l_arr_.size ());
164   unbroken_original_l_ =0;
165 }
166
167 Paper_column *
168 Item::column_l () const
169 {
170   return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
171 }
172
173 Item::Item (Item const &s)
174   : Score_element (s)
175 {
176   unbroken_original_l_ = &s;
177   /* do not copy attached_span_l_arr_ */
178   breakable_b_ = s.breakable_b_;
179   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
180   break_status_dir_ = s.break_status_dir_;
181   break_priority_i_ = s.break_priority_i_;
182 }
183