]> git.donarmstrong.com Git - lilypond.git/blob - lily/stem-tremolo.cc
patch::: 1.3.9.hwn2
[lilypond.git] / lily / stem-tremolo.cc
1 /*   
2   abbrev.cc --  implement Stem_tremolo
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "stem-tremolo.hh"
11 #include "debug.hh"
12 #include "beam.hh"
13 #include "paper-def.hh"
14 #include "lookup.hh"
15 #include "stem.hh"
16 #include "offset.hh"
17 #include "dimension-cache.hh"
18
19 Stem_tremolo::Stem_tremolo ()
20 {
21   set_elt_property ("stem", SCM_EOL);
22   abbrev_flags_i_ = 1;
23 }
24
25 void
26 Stem_tremolo::do_print () const
27 {
28   DEBUG_OUT << "abbrev_flags_i_ " << abbrev_flags_i_;
29 }
30
31 Stem *
32 Stem_tremolo::stem_l ()const
33 {
34   SCM s =   get_elt_property ("stem");
35   if (SMOB_IS_TYPE_B (Score_element, s))
36     {
37       return dynamic_cast<Stem*> (SMOB_TO_TYPE (Score_element,s));
38     }
39   else
40     return 0;
41 }
42
43 Interval
44 Stem_tremolo::dim_callback (Dimension_cache const *c) 
45 {
46   Stem_tremolo * s = dynamic_cast<Stem_tremolo*> (c->element_l ());
47   Real space = s->stem_l ()->staff_line_leading_f ();
48   return Interval (-space, space);
49 }
50
51
52 Molecule*
53 Stem_tremolo::do_brew_molecule_p () const
54 {
55   Stem * st = stem_l ();
56   int mult =0;
57   if (Beam * b = st->beam_l ())
58     {
59       Stem_info i = b->get_stem_info (st);
60       mult = i.mult_i_;
61     }
62   
63   Real interbeam_f = paper_l ()->interbeam_f (mult);
64   Real w  = gh_scm2double (get_elt_property ("beam-width"));
65   Real space = st->staff_line_leading_f ();
66   Real internote_f = space/2;
67   
68   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
69
70   int beams_i = 0;
71   Real slope_f = internote_f / 4 / internote_f; // HUH?
72
73   if (st && st->beam_l ()) {
74     slope_f = st->beam_l ()->slope_f_;
75     // ugh, rather calc from Stem_tremolo_req
76     beams_i = st->beams_i_drul_[RIGHT] >? st->beams_i_drul_[LEFT];
77   } 
78   Real sl = slope_f * internote_f;
79
80   Molecule a (lookup_l ()->beam (sl, w, beam_f));
81   a.translate (Offset (-w/2, w / 2 * slope_f));
82
83   Molecule *beams= new Molecule; 
84   for (int i = 0; i < abbrev_flags_i_; i++)
85     {
86       Molecule b (a);
87       b.translate_axis (interbeam_f * i, Y_AXIS);
88       beams->add_molecule (b);
89     }
90   beams->translate_axis (-beams->extent ()[Y_AXIS].center (), Y_AXIS);
91
92   if (st)
93     { 
94       if (st->beam_l ())
95         {
96           beams->translate (Offset(st->hpos_f () - hpos_f (),
97             st->stem_end_f () * internote_f - 
98             st->beam_l ()->get_direction () * beams_i * interbeam_f));
99         }
100       else
101         {  
102           /*
103             Beams should intersect one beamthickness below staff end
104            */
105           Real dy = - beams->extent ()[Y_AXIS].length () / 2 * st->get_direction ();
106
107           /*
108             uhg.  Should use relative coords and placement
109           */
110           Real whole_note_correction = (st && st->invisible_b( ))
111             ? -st->get_direction () * st->note_delta_f ()/2
112             : 0.0;
113
114           /*
115             UGH. Internote fudging.
116            */
117           dy /= internote_f;
118           dy += st->stem_end_f ();
119           dy *= internote_f;
120           beams->translate (Offset(st->hpos_f () - hpos_f ()+
121                                    whole_note_correction, dy));
122         }
123
124       /*
125         there used to be half a page of code that was long commented out.
126         Removed in 1.1.35
127        */
128     }
129   
130   return beams;
131 }
132
133
134 void
135 Stem_tremolo::set_stem (Stem *s)
136 {
137   set_elt_property ("stem", s->self_scm_);
138   add_dependency (s);
139 }
140