2 abbrev.cc -- implement Stem_tremolo
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "stem-tremolo.hh"
13 #include "paper-def.hh"
17 #include "dimension-cache.hh"
19 Stem_tremolo::Stem_tremolo ()
21 set_elt_property ("stem", SCM_EOL);
26 Stem_tremolo::do_print () const
28 DEBUG_OUT << "abbrev_flags_i_ " << abbrev_flags_i_;
32 Stem_tremolo::stem_l ()const
34 SCM s = get_elt_property ("stem");
35 if (SMOB_IS_TYPE_B (Score_element, s))
37 return dynamic_cast<Stem*> (SMOB_TO_TYPE (Score_element,s));
44 Stem_tremolo::dim_callback (Dimension_cache const *c)
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);
53 Stem_tremolo::do_brew_molecule_p () const
55 Stem * st = stem_l ();
57 if (Beam * b = st->beam_l ())
59 Stem_info i = b->get_stem_info (st);
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;
68 Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
71 Real slope_f = internote_f / 4 / internote_f; // HUH?
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];
78 Real sl = slope_f * internote_f;
80 Molecule a (lookup_l ()->beam (sl, w, beam_f));
81 a.translate (Offset (-w/2, w / 2 * slope_f));
83 Molecule *beams= new Molecule;
84 for (int i = 0; i < abbrev_flags_i_; i++)
87 b.translate_axis (interbeam_f * i, Y_AXIS);
88 beams->add_molecule (b);
90 beams->translate_axis (-beams->extent ()[Y_AXIS].center (), Y_AXIS);
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));
103 Beams should intersect one beamthickness below staff end
105 Real dy = - beams->extent ()[Y_AXIS].length () / 2 * st->get_direction ();
108 uhg. Should use relative coords and placement
110 Real whole_note_correction = (st && st->invisible_b( ))
111 ? -st->get_direction () * st->note_delta_f ()/2
115 UGH. Internote fudging.
118 dy += st->stem_end_f ();
120 beams->translate (Offset(st->hpos_f () - hpos_f ()+
121 whole_note_correction, dy));
125 there used to be half a page of code that was long commented out.
135 Stem_tremolo::set_stem (Stem *s)
137 set_elt_property ("stem", s->self_scm_);