X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fhairpin.cc;h=503b575f6e931ede8dbba762eb4100918e24a878;hb=b2a8b42e57aefbf1119ef2809950a35b81dc7d43;hp=c4520adef0b8d0bc34df8b71066a3e4ca4743a80;hpb=9a99014bb1c199f187553fa8284521505c569031;p=lilypond.git diff --git a/lily/hairpin.cc b/lily/hairpin.cc index c4520adef0..503b575f6e 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include "molecule.hh" @@ -12,8 +12,9 @@ #include "font-interface.hh" #include "dimensions.hh" #include "paper-def.hh" -#include "debug.hh" +#include "warn.hh" #include "paper-column.hh" +#include "lookup.hh" MAKE_SCHEME_CALLBACK (Hairpin, brew_molecule, 1); @@ -21,12 +22,12 @@ SCM Hairpin::brew_molecule (SCM smob) { Grob *me= unsmob_grob (smob); - Spanner *spanner = dynamic_cast(me); + Spanner *spanner = dynamic_cast (me); - Real line = me->paper_l ()->get_var ("stafflinethickness"); + Real line = me->get_paper ()->get_var ("linethickness"); - SCM s = me->get_grob_property("grow-direction"); - if (!isdir_b (s)) + SCM s = me->get_grob_property ("grow-direction"); + if (!ly_dir_p (s)) { me->suicide (); return SCM_EOL; @@ -35,40 +36,66 @@ Hairpin::brew_molecule (SCM smob) Direction grow_dir = to_dir (s); - /* Ugh, must be same as Text_spanner::brew_molecule. */ - Real padding = gh_scm2double (me->get_grob_property ("if-text-padding")); - Real broken_left = spanner->get_broken_left_end_align (); - Real width = spanner->spanner_length (); - width -= broken_left; + /* Ugh, must be same as Text_spanner::brew_molecule. */ + /* + Ugh. property name is not general. + */ + Real padding = gh_scm2double (me->get_grob_property ("if-text-padding")); + Drul_array broken; - Drul_array extra_off; + Drul_array bounds ; Direction d = LEFT; do { - Item *b = spanner->get_bound (d); - broken[d] = b->break_status_dir () != CENTER; + bounds[d] =spanner->get_bound (d); + broken[d] = bounds[d]->break_status_dir () != CENTER; + } + while (flip (&d) != LEFT); - if (!broken [d]) + Grob *common = bounds[LEFT]->common_refpoint (bounds[RIGHT], X_AXIS); + Drul_array x_points ; + + do + { + Item *b = bounds[d]; + x_points[d] = b->relative_coordinate (common, X_AXIS); + if (broken [d]) { - - Interval e =b->extent (b, X_AXIS); - Real r = 0.0; - if (!e.empty_b ()) - r = e[-d] + padding; - width += d * r; - extra_off[d] = r; + if (d == LEFT) + x_points[d] = b->extent (common,X_AXIS)[RIGHT] ; + } + else + { + if (dynamic_cast (b)) + { + /* + If we're hung on a paper column, that means we're not + adjacent to a text-dynamic, and we may move closer. We + make the padding a little smaller, here. + */ + Interval e =b->extent (common, X_AXIS); + if (e.empty_b ()) + e = Interval (0,0) + b->relative_coordinate (common, X_AXIS); + + x_points[d] = e.center () - d * padding /3; // ugh. + } + else + { + Interval e =b->extent (common, X_AXIS); + if (!e.empty_b ()) + x_points[d] = e[-d] - d*padding; + } } } while (flip (&d) != LEFT); - // FIXME: ecs tells us - width += gh_scm2double (me->get_grob_property ("width-correct")); - /* /Ugh */ - + + Real width = x_points[RIGHT] - x_points[LEFT]; + if (width < 0) { - warning (_ ((grow_dir < 0) ? "decrescendo too small" + me->warning (_ ((grow_dir < 0) ? "decrescendo too small" : "crescendo too small")); width = 0; } @@ -76,20 +103,36 @@ Hairpin::brew_molecule (SCM smob) bool continued = broken[Direction (-grow_dir)]; Real height = gh_scm2double (me->get_grob_property ("height")); Real thick = line * gh_scm2double (me->get_grob_property ("thickness")); - - const char* type = (grow_dir < 0) ? "decrescendo" : "crescendo"; - SCM hairpin = gh_list (ly_symbol2scm (type), - gh_double2scm (thick), - gh_double2scm (width), - gh_double2scm (height), - gh_double2scm (continued ? height/2 : 0.0), - SCM_UNDEFINED); - - Box b (Interval (0, width), Interval (-2*height, 2*height)); - Molecule mol (b, hairpin); - mol.translate_axis (broken_left + extra_off[LEFT], X_AXIS); + + Real starth, endh; + if (grow_dir < 0) + { + starth = height; + endh = continued ? height/2 : 0.0; + } + else + { + starth = continued ? height/2 : 0.0; + endh = height; + } + + Molecule mol = Lookup::line (thick, + Offset (0, starth), + Offset (width, endh)); + mol.add_molecule (Lookup::line (thick, + Offset (0, -starth), + Offset (width, -endh))); + + mol.translate_axis (x_points[LEFT] + - bounds[LEFT]->relative_coordinate (common, X_AXIS), + X_AXIS); return mol.smobbed_copy (); } + +ADD_INTERFACE (Hairpin, "hairpin-interface", + "hairpin crescendo.", + "grow-direction thickness height if-text-padding"); +