]> git.donarmstrong.com Git - lilypond.git/blob - lily/item.cc
release: 0.1.54
[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   break_priority_i_ = 0;
19   breakable_b_ = false;
20   break_status_i_ = CENTER;
21   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
22 }
23
24 IMPLEMENT_IS_TYPE_B1(Item, Score_elem);
25
26 void
27 Item::do_print() const
28 {
29 #ifndef NPRINT
30   DOUT << "breakable_b_: " << breakable_b_ << 
31     " break_status_i_: " <<break_status_i_;
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   return  (axis_group_l_a_[X_AXIS])? axis_group_l_a_[X_AXIS]->line_l() : 0;
46 }
47
48 int
49 Item::break_status_i() const
50 {
51   return break_status_i_;
52 }
53
54 void
55 Item::copy_breakable_items()
56 {
57   if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
58     return;
59   Drul_array<Item *> new_copies;
60   Direction  i=LEFT;
61   do 
62     {
63       Item * item_p = clone()->item ();
64
65       item_p->break_status_i_ =  i;
66       pscore_l_->typeset_element (item_p);
67       item_p->handle_prebroken_dependencies();
68       new_copies[i] =item_p;
69     }
70   while (flip(&i) != LEFT);
71   broken_to_drul_= new_copies;
72 }
73
74 void
75 Item::do_breakable_col_processing()
76 {
77   if (!breakable_b_)
78     return;
79
80   if (!column_l ()->breakable_b_)
81     return;
82
83   copy_breakable_items();
84   handle_prebroken_dependencies();
85
86   /*
87     Otherwise the broken items won't be pre_process()'ed.
88     */
89   add_dependency (broken_to_drul_[LEFT]);
90   add_dependency (broken_to_drul_[RIGHT]);    
91 }
92
93 Item*
94 Item::find_prebroken_piece (Line_of_score*l) const
95 {
96   if (line_l() == l) 
97     return (Item*)this;
98   else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
99     return broken_to_drul_[LEFT];
100   else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
101     return broken_to_drul_[RIGHT];
102
103   return 0;
104 }
105
106 Item*
107 Item::find_prebroken_piece (Direction breakstatus) const
108 {
109   if (!breakstatus)
110     return (Item *) this;       // ugh
111   else
112     return (Item*) broken_to_drul_[breakstatus];
113 }
114
115 void
116 Item::handle_prebroken_dependencies()
117 {
118   if (breakable_b_)
119     Score_elem::handle_prebroken_dependencies();
120 }
121
122 int
123 Item::left_right_compare(Item const *l, Item const *r)
124 {
125   while (!l->is_type_b (Paper_column::static_name ()))
126     l = l->axis_group_l_a_[X_AXIS]->item();
127   while (!r->is_type_b (Paper_column::static_name ()))
128     r = r->axis_group_l_a_[X_AXIS]->item();
129
130   Paper_column *p1 = (Paper_column*)l;
131   Paper_column* p2 = (Paper_column*)r;
132   return p1->rank_i () - p2->rank_i ();
133 }
134
135
136 bool
137 Item::linked_b() const
138 {
139   return Score_elem::linked_b() || attached_span_l_arr_.size();
140 }
141
142 void
143 Item::do_junk_links()
144 {
145   attached_span_l_arr_.set_size(0);
146 }
147
148 void
149 Item::do_unlink()
150 {
151   Link_array<Spanner> attached = attached_span_l_arr_;
152
153   for (int i=0; i < attached_span_l_arr_.size (); i++) {
154     Spanner *&s= attached_span_l_arr_[i];
155     if (s->spanned_drul_[LEFT] == this)
156       s->set_bounds (LEFT, 0);
157     if  (s->spanned_drul_[RIGHT] == this)
158       s->set_bounds (RIGHT,0);
159     s =0;
160   }
161   attached_span_l_arr_.set_size (0);
162 }
163
164 Paper_column *
165 Item::column_l () const
166 {
167   return axis_group_l_a_[X_AXIS]->item ()->column_l ();
168 }