2 crescendo.cc -- implement Hairpin
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "crescendo.hh"
12 #include "font-interface.hh"
13 #include "dimensions.hh"
14 #include "paper-def.hh"
16 #include "paper-column.hh"
18 MAKE_SCHEME_CALLBACK (Hairpin
, brew_molecule
, 1);
21 Hairpin::brew_molecule (SCM smob
)
23 Grob
*me
= unsmob_grob (smob
);
24 Spanner
*span
= dynamic_cast<Spanner
*>(me
);
26 Real line
= me
->paper_l ()->get_var ("stafflinethickness");
28 Real broken_left
= span
->get_broken_left_end_align ();
30 SCM s
= me
->get_grob_property("grow-direction");
37 Direction grow_dir
= to_dir (s
);
38 Real padding
= gh_scm2double (me
->get_grob_property ("padding"));
39 Real width
= span
->spanner_length ();
40 width
-= span
->get_broken_left_end_align ();
44 warning (_ ((grow_dir
< 0) ? "decrescendo too small"
45 : "crescendo too small"));
49 Drul_array
<bool> broken
;
50 Drul_array
<Real
> extra_off
;
54 Item
*b
= span
->get_bound (d
);
55 broken
[d
] = b
->break_status_dir () != CENTER
;
60 Interval e
=b
->extent (b
, X_AXIS
);
68 while (flip (&d
) != LEFT
);
70 bool continued
= broken
[Direction (-grow_dir
)];
71 Real height
= gh_scm2double (me
->get_grob_property ("height"));
72 Real thick
= line
* gh_scm2double (me
->get_grob_property ("thickness"));
74 const char* type
= (grow_dir
< 0) ? "decrescendo" : "crescendo";
75 SCM hairpin
= gh_list (ly_symbol2scm (type
),
76 gh_double2scm (thick
),
77 gh_double2scm (width
),
78 gh_double2scm (height
),
79 gh_double2scm (continued
? height
/2 : 0.0),
82 Box
b (Interval (0, width
), Interval (-2*height
, 2*height
));
83 Molecule
mol (b
, hairpin
);
84 mol
.translate_axis (broken_left
+ extra_off
[LEFT
], X_AXIS
);
86 return mol
.smobbed_copy ();