]> git.donarmstrong.com Git - lilypond.git/blob - lily/item.cc
release: 0.1.11
[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 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "p-score.hh"
10 #include "debug.hh"
11 #include "item.hh"
12 #include "p-col.hh"
13 #include "elem-group.hh"
14 #include "spanner.hh"
15
16 Item::Item()
17 {
18   breakable_b_ = false;
19   break_status_i_ = 0;
20   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
21 }
22
23 IMPLEMENT_IS_TYPE_B1(Item, Score_elem);
24
25 void
26 Item::do_print() const
27 {
28 #ifndef NPRINT
29   DOUT << "breakable_b_: " << breakable_b_;
30   DOUT << "break_status_i_: " <<break_status_i_;
31 #endif
32 }
33
34
35 Real 
36 Item::hpos_f() const
37 {
38   return absolute_coordinate (X_AXIS);
39 }
40
41 Line_of_score *
42 Item::line_l() const
43 {
44   return  (axis_group_l_a_[X_AXIS])? axis_group_l_a_[X_AXIS]->line_l() : 0;
45 }
46
47 int
48 Item::break_status_i() const
49 {
50   return break_status_i_;
51 }
52
53 void
54 Item::copy_breakable_items()
55 {
56   if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
57     return;
58   Drul_array<Item *> new_copies;
59   Direction  i=LEFT;
60   do 
61     {
62       Item * item_p = clone()->item ();
63
64       item_p->break_status_i_ =  i;
65       pscore_l_->typeset_element (item_p);
66       item_p->handle_prebroken_dependencies();
67       new_copies[i] =item_p;
68     }
69   while ((i *= -1) != LEFT);
70   broken_to_drul_= new_copies;
71 }
72
73 void
74 Item::do_breakable_col_processing()
75 {
76   if (!breakable_b_)
77     return;
78
79   copy_breakable_items();
80   handle_prebroken_dependencies();
81
82   /*
83     Otherwise the broken items won't be pre_process()'ed.
84     */
85   add_dependency (broken_to_drul_[LEFT]);
86   add_dependency (broken_to_drul_[RIGHT]);    
87
88 }
89
90 Item*
91 Item::find_prebroken_piece (Line_of_score*l) const
92 {
93   if (line_l() == l) 
94     return (Item*)this;
95   else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
96     return broken_to_drul_[LEFT];
97   else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
98     return broken_to_drul_[RIGHT];
99
100   return 0;
101 }
102
103 Item*
104 Item::find_prebroken_piece (int breakstatus) const
105 {
106   if (!breakstatus)
107     return (Item *) this;       // ugh
108   else
109     return (Item*) broken_to_drul_[(Direction)breakstatus];
110 }
111
112 void
113 Item::handle_prebroken_dependencies()
114 {
115   if (breakable_b_)
116     Score_elem::handle_prebroken_dependencies();
117 }
118
119 int
120 Item::left_right_compare(Item const *l, Item const *r)
121 {
122   while (!l->is_type_b (Paper_column::static_name ()))
123     l = l->axis_group_l_a_[X_AXIS]->item();
124   while (!r->is_type_b (Paper_column::static_name ()))
125     r = r->axis_group_l_a_[X_AXIS]->item();
126
127   Paper_column *p1 = (Paper_column*)l;
128   Paper_column* p2 = (Paper_column*)r;
129   return p1->rank_i () - p2->rank_i ();
130 }
131
132
133 bool
134 Item::linked_b() const
135 {
136   return Score_elem::linked_b() || attached_span_l_arr_.size();
137 }
138
139 void
140 Item::do_junk_links()
141 {
142   attached_span_l_arr_.set_size(0);
143 }
144
145 void
146 Item::do_unlink()
147 {
148   for (int i=0; i < attached_span_l_arr_.size (); i++) {
149     Spanner *&s= attached_span_l_arr_[i];
150     if (s->spanned_drul_[LEFT] == this)
151       s->set_bounds (LEFT, 0);
152     if  (s->spanned_drul_[RIGHT] == this)
153       s->set_bounds (RIGHT,0);
154     s =0;
155   }
156   attached_span_l_arr_.set_size (0);
157 }