]> git.donarmstrong.com Git - lilypond.git/blob - lily/p-col.cc
898c7357ab7826525be8b7bab1d7886c03ef9dea
[lilypond.git] / lily / p-col.cc
1 /*
2   p-col.cc -- implement Paper_column
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-col.hh"
10 #include "p-score.hh"
11 #include "debug.hh"
12
13 void
14 Paper_column::add_rod (Paper_column * p, Real d, Direction dir)
15 {
16   assert( sign (p->rank_i ()  - rank_i ()) == dir);
17   for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++)
18     {
19       Column_rod &rod = minimal_dists_arr_drul_[dir][i];
20       if (rod.other_l_ == p)
21         {
22           rod.distance_f_ = rod.distance_f_ >? d;
23           return ;
24         }
25     }
26
27   Column_rod cr;
28   cr.distance_f_ = d;
29   cr.other_l_ = p;
30   cr.dir_ = dir;
31
32   minimal_dists_arr_drul_[dir].push (cr);
33       
34 }
35
36 int
37 Paper_column::rank_i() const
38 {
39   return rank_i_;
40 }
41
42 void
43 Paper_column::set_rank (int i)
44 {
45   rank_i_ = i;
46   if (prebreak_l())
47     prebreak_l()->rank_i_ = i;
48   if (postbreak_l())
49     postbreak_l()->rank_i_ = i;
50 }
51
52 void
53 Paper_column::do_print() const
54 {
55 #ifndef NPRINT
56   DOUT << "rank: " << rank_i_ << '\n';
57   if (prebreak_l())
58     {
59       DOUT << "\npre: ";
60       prebreak_l()->print();
61     }
62   if (postbreak_l()) 
63     {
64       DOUT << "post: ";
65       postbreak_l()->print();
66     } 
67   if (break_status_i_)
68     {
69       DOUT <<'\n' << ((break_status_i_ == LEFT) ? "prebreak" : "postbreak");
70       DOUT << '\n';
71     }
72   // DOUT << "extent: " << width().str () << "\n";
73
74   for (int i=0; i < minimal_dists_arr_drul_[RIGHT].size (); i++)
75     {
76       minimal_dists_arr_drul_[RIGHT][i].print ();
77     }
78 #endif 
79 }
80
81 int
82 Paper_column::compare (Paper_column const &c1, Paper_column const &c2)
83 {
84   return c1.rank_i() - c2.rank_i ();
85 }
86
87 Paper_column*
88 Paper_column::prebreak_l() const
89 {
90   return (Paper_column*)broken_to_drul_[LEFT];
91 }
92
93 Paper_column*
94 Paper_column::postbreak_l() const
95 {
96   return(Paper_column*) broken_to_drul_[RIGHT];
97 }
98 bool
99 Paper_column::breakpoint_b() const
100 {
101   return !line_l_;
102 }
103
104 Paper_column::Paper_column()
105 {
106   used_b_ = false;
107   error_mark_b_ = false;
108   line_l_=0;
109   rank_i_ = -1;
110 }
111
112 Line_of_score*
113 Paper_column::line_l() const
114 {
115   return line_l_;
116 }
117
118 bool
119 Paper_column::used_b() const
120 {
121   return linked_b();
122 }
123
124 IMPLEMENT_IS_TYPE_B1(Paper_column, Horizontal_group_item);
125
126 Paper_column*
127 Paper_column::column_l () const
128 {
129   return (Paper_column*)this;
130 }
131
132
133 void
134 Paper_column::preprocess ()
135 {
136   minimal_dists_arr_drul_[LEFT].sort (Column_rod::compare);
137   minimal_dists_arr_drul_[RIGHT].sort (Column_rod::compare);  
138 }