X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fhairpin.cc;h=828bb6ec52b11694f23826e98391146d40bc2138;hb=873c31e41713a3aa7e162268286521e0d582e4f4;hp=a7046766aa536f8644f07812673f41017661e9db;hpb=4478a4f00c0958af4964af412fa9e0e050569fe0;p=lilypond.git diff --git a/lily/hairpin.cc b/lily/hairpin.cc index a7046766aa..828bb6ec52 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -3,31 +3,31 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include "molecule.hh" +#include "staff-symbol-referencer.hh" +#include "stencil.hh" +#include "line-interface.hh" #include "hairpin.hh" #include "spanner.hh" #include "font-interface.hh" #include "dimensions.hh" -#include "paper-def.hh" -#include "debug.hh" +#include "output-def.hh" +#include "warn.hh" #include "paper-column.hh" #include "lookup.hh" -MAKE_SCHEME_CALLBACK (Hairpin, brew_molecule, 1); +MAKE_SCHEME_CALLBACK (Hairpin, print, 1); SCM -Hairpin::brew_molecule (SCM smob) +Hairpin::print (SCM smob) { Grob *me= unsmob_grob (smob); Spanner *spanner = dynamic_cast (me); - Real line = me->paper_l ()->get_var ("linethickness"); - - SCM s = me->get_grob_property ("grow-direction"); - if (!ly_dir_p (s)) + SCM s = me->get_property ("grow-direction"); + if (!is_direction (s)) { me->suicide (); return SCM_EOL; @@ -35,20 +35,14 @@ Hairpin::brew_molecule (SCM smob) Direction grow_dir = to_dir (s); - - /* 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")); + Real padding = scm_to_double (me->get_property ("bound-padding")); Drul_array broken; Drul_array bounds ; Direction d = LEFT; do { - bounds[d] =spanner->get_bound (d); + bounds[d] = spanner->get_bound (d); broken[d] = bounds[d]->break_status_dir () != CENTER; } while (flip (&d) != LEFT); @@ -59,7 +53,7 @@ Hairpin::brew_molecule (SCM smob) do { Item *b = bounds[d]; - x_points[d] = b->relative_coordinate (common, X_AXIS); + x_points[d] = b->relative_coordinate (common, X_AXIS); if (broken [d]) { if (d == LEFT) @@ -69,21 +63,36 @@ Hairpin::brew_molecule (SCM smob) { if (dynamic_cast (b)) { + bool neighbor_found = false; + for (SCM adj = me->get_property ("adjacent-hairpins"); + ly_c_pair_p (adj); adj = ly_cdr (adj)) + { + /* + FIXME: this will fuck up in case of polyphonic + notes in other voices. Need to look at note-columns + in the current staff/voice. + */ + + Spanner *pin = unsmob_spanner (ly_car (adj)); + if (pin + && (pin->get_bound (LEFT)->get_column() == b + || pin->get_bound (RIGHT)->get_column() == b)) + neighbor_found = true; + } + /* 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. + Interval e = robust_relative_extent (b, common, X_AXIS); + x_points[d] = + neighbor_found ? e.center() - d * padding / 3 : e[d]; } else { - Interval e =b->extent (common, X_AXIS); - if (!e.empty_b ()) + Interval e = b->extent (common, X_AXIS); + if (!e.is_empty ()) x_points[d] = e[-d] - d*padding; } } @@ -101,8 +110,8 @@ 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")); + Real height = robust_scm2double (me->get_property ("height"), 0.2) * + Staff_symbol_referencer::staff_space (me); Real starth, endh; if (grow_dir < 0) @@ -116,23 +125,25 @@ Hairpin::brew_molecule (SCM smob) 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))); - + /* + should do relative to staff-symbol staff-space? + */ + + Stencil mol; + mol = Line_interface::line (me, Offset (0, starth), Offset (width, endh)); + mol.add_stencil (Line_interface::line (me, + 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"); + "A hairpin (de)crescendo.", + "grow-direction height bound-padding adjacent-hairpins");