]> git.donarmstrong.com Git - lilypond.git/blob - lily/abbrev.cc
patch::: 1.0.12.jcn2: opniewvisite
[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 beam_f = paper ()->beam_thickness_f ();
37
38   int beams_i = 0;
39   Real slope_f = internote_f / 4 / internote_f;
40
41   if (stem_l_ && stem_l_->beam_l_) {
42     slope_f = stem_l_->beam_l_->slope_f_;
43     // ugh, rather calc from Abbreviation_req
44     beams_i = stem_l_->beams_right_i_ >? stem_l_->beams_left_i_;
45   } 
46   Real sl = slope_f * internote_f;
47
48   Atom a (lookup_l ()->beam (sl, w, beam_f));
49   a.translate (Offset (-w/2, w / 2 * slope_f));
50
51   Molecule *beams= new Molecule; 
52   for (int i = 0; i < abbrev_flags_i_; i++)
53     {
54       Atom b (a);
55       b.translate_axis (interbeam_f * i, Y_AXIS);
56       beams->add_atom (b);
57     }
58 #define EGCS_ICE
59 #ifndef EGCS_ICE
60   beams->translate_axis (-beams->extent ()[Y_AXIS].center (), Y_AXIS);
61 #else
62   beams->translate_axis (-(beams->extent ()[Y_AXIS].min () + 
63     beams->extent ()[Y_AXIS].max ()) / 2 , Y_AXIS);
64 #endif
65
66   if (stem_l_)
67     { 
68       if (stem_l_->beam_l_)
69         {
70           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (),
71             stem_l_->stem_end_f () * internote_f - 
72             stem_l_->beam_l_->dir_ * beams_i * interbeam_f));
73         }
74       else
75 #if 1
76         {  
77           /*
78             Beams should intersect one beamthickness below staff end
79            */
80           Real dy = - beams->extent ()[Y_AXIS].length () / 2 * stem_l_->dir_;
81           dy /= internote_f;
82           dy += stem_l_->stem_end_f ();
83           dy *= internote_f;
84 // urg: can't: stem should be stetched first
85 //        dy -= paper ()->beam_thickness_f () * stem_l_->dir_;
86           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (), dy));
87         }
88 #else
89         {
90           /* 
91              urg: this is wrong, even if coded correctly
92
93              Try to be in the middle of the open part of the stem and
94              between on the staff.
95
96              (urgh)
97           */
98           Direction sd  = stem_l_->dir_;
99           // watch out: chord_start_f is (the only one) not in dim(internote)
100           Interval empty_stem (stem_l_->chord_start_f () / internote_f * sd
101             + interline_f, (stem_l_->stem_end_f ()* sd));
102           empty_stem *= sd;
103           
104           Interval instaff = empty_stem;
105           /*
106             huh? i don't understand, hw
107             what about:
108             .fly= \stemup d'''2:16
109             instaff.intersect (Interval (-4,4));
110             */
111           // hmm, let's try
112           if (stem_l_->get_default_dir () == stem_l_->dir_)
113             instaff.intersect (Interval (-4,4));
114
115           if (instaff.empty_b ())
116             instaff = empty_stem;
117
118           instaff.print (); 
119           instaff *= internote_f;
120           beams->translate (Offset(stem_l_->hpos_f () - hpos_f (),
121                               instaff.center ()));
122         }
123 #endif
124     }
125   
126   return beams;
127 }
128
129 void
130 Abbreviation::do_substitute_dependent (Score_element*o, Score_element*n)
131 {
132   if (stem_l_ == o)
133     stem_l_ = n ? (Stem*)n->access_Item () : 0;
134 }
135
136
137 void
138 Abbreviation::set_stem (Stem *s)
139 {
140   stem_l_ = s;
141   add_dependency (s);
142 }