]> git.donarmstrong.com Git - lilypond.git/blob - lily/laissez-vibrer-tie-column.cc
83b14cc3f4766e873b11e9c24b5fb38be2c7f028
[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 MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie_column, calc_positioning_done, 1);
37 SCM
38 Laissez_vibrer_tie_column::calc_positioning_done (SCM smob)
39 {
40   Grob *me = unsmob_grob (smob);
41   
42   extract_grob_set (me, "ties", lv_ro_ties);
43   Link_array<Grob> lv_ties (lv_ro_ties);
44
45   lv_ties.sort (&Laissez_vibrer_tie::compare);
46
47   Array<Tie_configuration> tie_configs;
48   Link_array<Item> heads;
49   for (int i = 0; i < lv_ties.size (); i++)
50     {
51       Tie_configuration conf;
52       conf.dir_ = CENTER;
53       Item *head = unsmob_item (lv_ties[i]->get_object ("note-head"));
54
55       heads.push (head);
56       if (head)
57         conf.position_ = (int) Staff_symbol_referencer::get_position (head);
58       
59       tie_configs.push (conf);
60     }
61
62   bool manual_override = false;
63   SCM manual_configs = me->get_property ("tie-configuration");
64   set_manual_tie_configuration (&tie_configs,
65                                 &manual_override,
66                                 manual_configs
67                                 );
68
69   set_tie_config_directions (&tie_configs);
70
71   Grob *common = me;
72   for (int i = 0; i < lv_ties.size (); i++)
73     {
74       common = lv_ties[i]->common_refpoint (common, X_AXIS); 
75     }
76
77   Drul_array< Array<Skyline_entry> > skylines;
78   set_chord_outline (&skylines[LEFT],
79                      heads,
80                      common, LEFT);
81
82   Real right_most = - infinity_f;   
83   for (int i = 0; i < skylines[LEFT].size (); i++)
84     {
85       right_most = max (right_most, skylines[LEFT][i].height_);
86     }
87
88   Skyline_entry right_entry;
89   right_entry.width_.set_full ();
90   right_entry.height_ = right_most + 1.5;
91   
92   skylines[RIGHT].push (right_entry);
93
94   Tie_details details;
95   details.init (lv_ties[0]);
96
97   /*
98     Calculate final width and shape of the ties.
99    */
100   for (int i = 0; i < lv_ties.size(); i++)
101     {
102       final_shape_adjustment (tie_configs[i],
103                               skylines,
104                               lv_ties[0],
105                               details);
106     }
107   
108   /*
109     Try to shift small ties into available spaces.
110    */
111   if (!manual_override)
112     {
113       shift_small_ties (&tie_configs, lv_ties[0], details);
114     }
115   
116   for (int i = 0; i < lv_ties.size(); i++)
117     {
118       Tie::set_control_points (lv_ties[i], common, tie_configs[i],
119                                details );
120       set_grob_direction (lv_ties[i], tie_configs[i].dir_);
121     }
122
123   return SCM_BOOL_T;
124 }
125   
126