]> git.donarmstrong.com Git - lilypond.git/blob - lily/abbrev.cc
release: 1.0.1
[lilypond.git] / lily / abbrev.cc
1 /*   
2   abbrev.cc --  implement Abbreviation
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "abbrev.hh"
11 #include "debug.hh"
12 #include "beam.hh"
13 #include "paper-def.hh"
14 #include "lookup.hh"
15 #include "stem.hh"
16 #include "dimension.hh"
17
18 Abbreviation::Abbreviation ()
19 {
20   stem_l_ = 0;
21   abbrev_flags_i_ = 1;
22 }
23
24 void
25 Abbreviation::do_print () const
26 {
27   DOUT << "abbrev_flags_i_ " << abbrev_flags_i_;
28 }
29
30 Molecule*
31 Abbreviation::brew_molecule_p () const
32 {
33   Real interbeam_f = paper ()->interbeam_f (stem_l_->mult_i_);
34   Real w = 1.5 * lookup_l ()->ball (2).dim_.x ().length ();
35   Real internote_f = paper ()->internote_f ();
36   Real interline_f = paper ()->interline_f ();
37   Real beam_f = paper ()->beam_thickness_f ();
38
39   int beams_i = 0;
40   Real slope_f = internote_f / 4 / internote_f;
41
42   if (stem_l_ && stem_l_->beam_l_) {
43     slope_f = stem_l_->beam_l_->slope_f_;
44     // ugh, rather calc from Abbreviation_req
45     beams_i = stem_l_->beams_right_i_ >? stem_l_->beams_left_i_;
46   } 
47   Real sl = slope_f * internote_f;
48
49   Atom a (lookup_l ()->beam (sl, w, beam_f));
50   a.translate (Offset (-w/2, w / 2 * slope_f));
51
52   Molecule *beams= new Molecule; 
53   for (int i = 0; i < abbrev_flags_i_; i++)
54     {
55       Atom b (a);
56       b.translate_axis (interbeam_f * i, Y_AXIS);
57       beams->add_atom (b);
58     }
59 #define EGCS_ICE
60 #ifndef EGCS_ICE
61   beams->translate_axis (-beams->extent ()[Y_AXIS].center (), Y_AXIS);
62 #else
63   beams->translate_axis (-(beams->extent ()[Y_AXIS].min () + 
64     beams->extent ()[Y_AXIS].max ()) / 2 , Y_AXIS);
65 #endif
66
67   if (stem_l_)
68     { 
69       if (stem_l_->beam_l_)
70         {
71           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (),
72             stem_l_->stem_end_f () * internote_f - 
73             stem_l_->beam_l_->dir_ * beams_i * interbeam_f));
74         }
75       else
76 #if 1
77         {  
78           /*
79             Beams should intersect one beamthickness below staff end
80            */
81           Real dy = - beams->extent ()[Y_AXIS].length () / 2 * stem_l_->dir_;
82           dy /= internote_f;
83           dy += stem_l_->stem_end_f ();
84           dy *= internote_f;
85 // urg: can't: stem should be stetched first
86 //        dy -= paper ()->beam_thickness_f () * stem_l_->dir_;
87           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (), dy));
88         }
89 #else
90         {
91           /* 
92              urg: this is wrong, even if coded correctly
93
94              Try to be in the middle of the open part of the stem and
95              between on the staff.
96
97              (urgh)
98           */
99           Direction sd  = stem_l_->dir_;
100           // watch out: chord_start_f is (the only one) not in dim(internote)
101           Interval empty_stem (stem_l_->chord_start_f () / internote_f * sd
102             + interline_f, (stem_l_->stem_end_f ()* sd));
103           empty_stem *= sd;
104           
105           Interval instaff = empty_stem;
106           /*
107             huh? i don't understand, hw
108             what about:
109             .fly= \stemup d'''2:16
110             instaff.intersect (Interval (-4,4));
111             */
112           // hmm, let's try
113           if (stem_l_->get_default_dir () == stem_l_->dir_)
114             instaff.intersect (Interval (-4,4));
115
116           if (instaff.empty_b ())
117             instaff = empty_stem;
118
119           instaff.print (); 
120           instaff *= internote_f;
121           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (),
122                               instaff.center ()));
123         }
124 #endif
125     }
126   
127   return beams;
128 }
129
130 void
131 Abbreviation::do_substitute_dependent (Score_element*o, Score_element*n)
132 {
133   if (stem_l_ == o)
134     stem_l_ = n ? (Stem*)n->access_Item () : 0;
135 }
136
137
138 void
139 Abbreviation::set_stem (Stem *s)
140 {
141   stem_l_ = s;
142   add_dependency (s);
143 }