]> git.donarmstrong.com Git - lilypond.git/blob - lily/laissez-vibrer-tie-column.cc
(AncientRemoveEmptyStaffContext): switch on
[lilypond.git] / lily / laissez-vibrer-tie-column.cc
1 /*
2   laissez-vibrer-tie-column.cc -- implement Laissez_vibrer_tie_column
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "laissez-vibrer-tie-column.hh"
11 #include "laissez-vibrer-tie.hh"
12 #include "grob.hh"
13 #include "tie-column.hh"
14 #include "tie.hh"
15 #include "directional-element-interface.hh"
16 #include "pointer-group-interface.hh"
17 #include "staff-symbol-referencer.hh"
18 #include "item.hh"
19 #include "tie-column-format.hh"
20
21
22 ADD_INTERFACE(Laissez_vibrer_tie_column,
23               "laissez-vibrer-tie-column-interface",
24               "The interface for a column of l.v. ties.",
25
26               /* properties */
27               "positioning-done "
28               "tie-configuration "
29               );
30                            
31
32
33 /*
34   Cut & paste from tie-column.cc
35  */   
36 void
37 Laissez_vibrer_tie_column::set_directions (Grob *me)
38 {
39   if (!to_boolean (me->get_property ("positioning-done")))
40     me->set_property ("positioning-done", SCM_BOOL_T); 
41   else
42     return;
43
44
45   extract_grob_set (me, "ties", lv_ro_ties);
46   Link_array<Grob> lv_ties (lv_ro_ties);
47
48   lv_ties.sort (&Laissez_vibrer_tie::compare);
49
50   Array<Tie_configuration> tie_configs;
51   Link_array<Item> heads;
52   for (int i = 0; i < lv_ties.size (); i++)
53     {
54       Tie_configuration conf;
55       conf.dir_ = get_grob_direction (lv_ties[i]);
56       Item *head = unsmob_item (lv_ties[i]->get_object ("note-head"));
57
58       heads.push (head);
59       if (head)
60         conf.position_ = (int) Staff_symbol_referencer::get_position (head);
61       
62       tie_configs.push (conf);
63     }
64
65   bool manual_override = false;
66   SCM manual_configs = me->get_property ("tie-configuration");
67   set_manual_tie_configuration (&tie_configs,
68                                 &manual_override,
69                                 manual_configs
70                                 );
71
72   set_tie_config_directions (&tie_configs);
73
74   Grob *common = me;
75   for (int i = 0; i < lv_ties.size (); i++)
76     {
77       common = lv_ties[i]->common_refpoint (common, X_AXIS); 
78     }
79
80   Drul_array< Array<Skyline_entry> > skylines;
81   set_chord_outline (&skylines[LEFT],
82                      heads,
83                      common, LEFT);
84
85   Real right_most = - infinity_f;   
86   for (int i = 0; i < skylines[LEFT].size (); i++)
87     {
88       right_most = max (right_most, skylines[LEFT][i].height_);
89     }
90
91   Skyline_entry right_entry;
92   right_entry.width_.set_full ();
93   right_entry.height_ = right_most + 1.5;
94   
95   skylines[RIGHT].push (right_entry);
96
97   Tie_details details;
98   details.init (lv_ties[0]);
99
100   /*
101     Calculate final width and shape of the ties.
102    */
103   for (int i = 0; i < lv_ties.size(); i++)
104     {
105       final_shape_adjustment (tie_configs[i],
106                               skylines,
107                               lv_ties[0],
108                               details);
109     }
110   
111   /*
112     Try to shift small ties into available spaces.
113    */
114   if (!manual_override)
115     {
116       shift_small_ties (&tie_configs, lv_ties[0], details);
117     }
118   
119   for (int i = 0; i < lv_ties.size(); i++)
120     {
121       Tie::set_control_points (lv_ties[i], common, tie_configs[i],
122                                details );
123       set_grob_direction (lv_ties[i], tie_configs[i].dir_);
124     }
125 }
126   
127