X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fhyphen-spanner.cc;h=09699d7546cf4c55676f86ac1b0429f2351684bf;hb=b14cdbb52b7ec3edf0b5d5eea74e0f6843a36da8;hp=65470ea81c4204e414228bf39055ff20d45e2425;hpb=ffe548cfbb3c3b37c8969f49b5aba04ef998d080;p=lilypond.git diff --git a/lily/hyphen-spanner.cc b/lily/hyphen-spanner.cc index 65470ea81c..09699d7546 100644 --- a/lily/hyphen-spanner.cc +++ b/lily/hyphen-spanner.cc @@ -3,84 +3,88 @@ source file of the GNU LilyPond music typesetter - (c) 1999 Glen Prideaux + (c) 1999--2004 Glen Prideaux - (adapted from extender-spanner) + (adapted from lyric-extender) */ -/* - TODO: too complicated implementation. Why the dx_drul?. - */ - #include + #include "box.hh" -#include "debug.hh" #include "lookup.hh" #include "molecule.hh" -#include "paper-column.hh" #include "paper-def.hh" #include "hyphen-spanner.hh" -#include "dimension-cache.hh" +#include "paper-column.hh" +#include "spanner.hh" +#include "item.hh" -Hyphen_spanner::Hyphen_spanner () - : Spanner () -{ - dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0; - dim_cache_[Y_AXIS]->set_callback (Dimension_cache::point_dimension_callback); -} - -Molecule -Hyphen_spanner::do_brew_molecule () const +MAKE_SCHEME_CALLBACK (Hyphen_spanner,brew_molecule,1) +SCM +Hyphen_spanner::brew_molecule (SCM smob) { - Molecule mol; - - Real w = spanner_length (); + Spanner * sp = unsmob_spanner (smob); + Drul_array bounds (sp->get_bound (LEFT), + sp->get_bound (RIGHT)); + + Grob * common = bounds[LEFT]->common_refpoint (bounds[RIGHT], X_AXIS); - w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); + Interval span_points; + Direction d = LEFT; + do + { + Interval iv = bounds[d]->extent (common, X_AXIS); - Real th = paper_l ()->get_var ("hyphen_thickness"); - Real h = paper_l ()->get_var ("hyphen_height"); + span_points[d] = iv.is_empty () + ? bounds[d]->relative_coordinate (common, X_AXIS) + : iv[-d]; + } + while (flip (&d) != LEFT); + + Real lt = sp->get_paper ()->get_realvar (ly_symbol2scm ("linethickness")); + Real th = robust_scm2double (sp->get_grob_property ("thickness"), 1) * lt ; + Real h = robust_scm2double (sp->get_grob_property ("height"), 0.5); - // UGH. First try: just make the hyphen take 1/3 of the available space - // for length, use a geometric mean of the available space and some minimum - Real l = paper_l ()->get_var ("hyphen_minimum_length"); - if(l < w) - l = sqrt(l*w); - Molecule a = lookup_l ()->filledbox ( Box (Interval ((w-l)/2,(w+l)/2), Interval (h,h+th))); - a.translate (Offset (dx_f_drul_[LEFT], 0)); + // interval? + + Real dp = robust_scm2double (sp->get_grob_property ("dash-period"), 1.0); + Real dl = robust_scm2double (sp->get_grob_property ("length"), .5 ); - mol.add_molecule (a); + if (dp < dl) + dp = 1.5 * dl; - return mol; -} + Real l = span_points.length (); + int n = int (ceil (l/dp - 0.5)); + if (n <= 0) + n = 1; + Real space_left = l - dl - (n-1)* dp; -void -Hyphen_spanner::do_post_processing () -{ - // UGH - Real gap = paper_l ()->get_var ("interline"); + /* + If there is not enough space, the hyphen should disappear. + */ + if (space_left < 0) + return SCM_EOL; + + Box b (Interval (0, dl), Interval (h,h+th)); + Molecule dash_mol (Lookup::round_filled_box (b, 0.8 * lt)); - Direction d = LEFT; - do + Molecule total; + for (int i = 0; i < n; i++) { - Item* t = spanned_drul_[d] - ? spanned_drul_[d] : spanned_drul_[(Direction)-d]; - if (d == LEFT) - dx_f_drul_[d] += t->extent (X_AXIS).length (); - else - dx_f_drul_[d] -= d * gap / 2; + Molecule m (dash_mol); + m.translate_axis (span_points[LEFT] + i * dp + space_left / 2, X_AXIS); + total.add_molecule (m); } - while (flip(&d) != LEFT); -} - -void -Hyphen_spanner::set_textitem (Direction d, Item* textitem_l) -{ - set_bounds (d, textitem_l); - add_dependency (textitem_l); + total.translate_axis ( -sp->relative_coordinate (common, X_AXIS), X_AXIS); + return total.smobbed_copy (); } +ADD_INTERFACE (Hyphen_spanner, "lyric-hyphen-interface", + "A centred hyphen is a simple line between lyrics used to divide syllables", + "thickness height dash-period length"); + +