]> git.donarmstrong.com Git - lilypond.git/blob - lily/paper-column.cc
release: 1.5.47
[lilypond.git] / lily / paper-column.cc
1 /*
2   paper-column.cc -- implement Paper_column
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "moment.hh"
10 #include "paper-column.hh"
11 #include "paper-score.hh"
12 #include "debug.hh"
13 #include "axis-group-interface.hh"
14 #include "spaceable-grob.hh"
15 #include "molecule.hh"
16 #include "text-item.hh"
17 #include "lookup.hh"
18 #include "font-interface.hh"
19
20
21 /*
22   Paper_columns form the top-most item parent. (The Paper_columns X
23   parent is System, which is a spanner.)
24
25   Paper_columns form the units for the spacing engine. They are
26   numbered, the first (leftmost) is column 0. Numbering happens before
27   line-breaking, and columns are not renumbered after line breaking.
28
29   Since many columns go unused, you should only use the rank field to
30   get ordering information.  Two adjacent columns may have
31   non-adjacent numbers.
32   
33  */
34
35 void
36 Paper_column::do_break_processing ()
37 {
38   Spaceable_grob::remove_interface (this);
39   Item::do_break_processing ();
40 }
41
42 int
43 Paper_column::rank_i (Grob*me) 
44 {
45   return dynamic_cast<Paper_column*> (me)->rank_i_;
46 }
47
48 System*
49 Paper_column::line_l () const
50 {
51   return line_l_;
52 }
53
54 Paper_column*
55 Paper_column::column_l () const
56 {
57   return (Paper_column*) (this);
58 }
59
60 Paper_column::Paper_column (SCM l)
61   : Item (l)            // guh.?
62 {
63   line_l_=0;
64   rank_i_ = -1;
65 }
66
67 Moment
68 Paper_column::when_mom (Grob*me)
69 {
70   SCM m = me->get_grob_property ("when");
71   Moment s (0);
72   if (unsmob_moment (m))
73     {
74       return *unsmob_moment (m);
75     }
76   return s;
77 }
78
79 bool
80 Paper_column::musical_b (Grob *me)
81 {
82   SCM m = me->get_grob_property ("shortest-starter-duration");
83   Moment s (0);
84   if (unsmob_moment (m))
85     {
86       s = *unsmob_moment (m);
87     }
88   return s != Moment (0);
89   
90 }
91   
92
93 bool
94 Paper_column::used_b (Grob*me)
95 {
96   return gh_pair_p (me->get_grob_property ("elements")) ||  Item::breakable_b (me)
97     || gh_pair_p (me->get_grob_property ("bounded-by-me"))
98     ;
99 }
100
101 /*
102   Print a vertical line and  the rank number, to aid debugging.  
103  */
104
105 MAKE_SCHEME_CALLBACK(Paper_column,brew_molecule,1);
106 SCM
107 Paper_column::brew_molecule (SCM p)
108 {
109   Grob *me = unsmob_grob (p);
110
111   String r = to_str (Paper_column::rank_i (me));
112   SCM properties = Font_interface::font_alist_chain (me);
113   
114   Molecule t = Text_item::text2molecule (me, ly_str02scm (r.ch_C()),
115                                          properties);
116   t.align_to (X_AXIS, CENTER);
117   t.align_to (Y_AXIS, DOWN);
118   
119   Molecule l = Lookup::filledbox (Box (Interval (-0.01, 0.01),
120                                        Interval (-2, -1)));
121
122   t.add_molecule (l);
123   return t.smobbed_copy ();                                             
124 }
125
126
127
128
129 ADD_INTERFACE (Paper_column, "paper-column-interface",
130   "",
131   "between-cols when bounded-by-me shortest-playing-duration shortest-starter-duration");