X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdynamic-text-spanner.cc;h=ff6eac541e4dd76e1833b57c715a337dbd09acca;hb=refs%2Ftags%2Frelease%2F2.11.5-1;hp=b47edf2182fc10ddbe1df5f30ee8df5b835fac8f;hpb=c2d44e3a71b2d031305abede97a53f6e5fcf832b;p=lilypond.git diff --git a/lily/dynamic-text-spanner.cc b/lily/dynamic-text-spanner.cc index b47edf2182..ff6eac541e 100644 --- a/lily/dynamic-text-spanner.cc +++ b/lily/dynamic-text-spanner.cc @@ -1,16 +1,14 @@ - /* - crescendo-text-spanner.cc -- implement Text_spanner + dynamic-text-spanner.cc -- implement Text_spanner source file of the GNU LilyPond music typesetter - (c) 2000--2004 Jan Nieuwenhuizen + (c) 2000--2006 Jan Nieuwenhuizen - Revised over good by Han-Wen. + Revised over good by Han-Wen. */ -#include "stencil.hh" -#include "text-item.hh" +#include "text-interface.hh" #include "text-spanner.hh" #include "line-spanner.hh" #include "spanner.hh" @@ -20,17 +18,13 @@ #include "warn.hh" #include "paper-column.hh" - - class Dynamic_text_spanner { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - static bool has_interface (Grob*); + DECLARE_GROB_INTERFACE(); }; - - /* This is a partial C&P from text-spanner.cc @@ -39,28 +33,27 @@ public: * does not require bracket functionality. * should make room for spanning points (mf/f/mp texts). - + * In the future, we should support - cresc - - - - poco - - - a - - - - poco - - - + cresc - - - - poco - - - a - - - - poco - - - as well The cut & paste is rather inelegant, but text-spanner was a failed and buggy attempt at being generic. - - */ MAKE_SCHEME_CALLBACK (Dynamic_text_spanner, print, 1); SCM -Dynamic_text_spanner::print (SCM smob) +Dynamic_text_spanner::print (SCM smob) { - Grob *me= unsmob_grob (smob); - Spanner *spanner = dynamic_cast (me); + Grob *me = unsmob_grob (smob); + Spanner *spanner = dynamic_cast (me); - Grob *common = spanner->get_bound (LEFT)->common_refpoint (spanner->get_bound (RIGHT), X_AXIS); - Output_def * paper = me->get_paper (); + Grob *common = spanner->get_bound (LEFT) + ->common_refpoint (spanner->get_bound (RIGHT), X_AXIS); + Output_def *layout = me->layout (); Interval span_points; Drul_array broken; @@ -86,54 +79,74 @@ Dynamic_text_spanner::print (SCM smob) pad = robust_scm2double (me->get_property ("bound-padding"), 0.0); encl = -d; } + + /* + ugh - a special case. + + FIXME: this fixed an issue, but need to have this issue in + the issue tracker. + + This fix doesn't quite work: it should only do this if the + right bound has a trill too. + */ +#if 0 + if (d == RIGHT && me->get_property ("style") == ly_symbol2scm ("trill")) + { + pad = 2.0; + encl = LEFT; + } +#endif - span_points[d] = -d * pad + b->extent (common, X_AXIS).linear_combination (encl); + Interval ext = b->extent (common, X_AXIS); + span_points[d] = -d * pad + + robust_relative_extent (b, common, X_AXIS) + .linear_combination (encl); } } while (flip (&d) != LEFT); - - Stencil m; SCM properties = Font_interface::text_font_alist_chain (me); SCM edge_text = me->get_property ("edge-text"); Drul_array edge; - if (ly_c_pair_p (edge_text)) + if (scm_is_pair (edge_text)) { Direction d = LEFT; do { if (broken[d]) continue; - + SCM text = index_get_cell (edge_text, d); - if (Text_item::markup_p (text)) - edge[d] = *unsmob_stencil (Text_item::interpret_markup (paper->self_scm (), properties, text)); - + if (Text_interface::is_markup (text)) + edge[d] = *unsmob_stencil (Text_interface::interpret_markup (layout->self_scm (), properties, text)); + if (!edge[d].is_empty ()) edge[d].align_to (Y_AXIS, CENTER); } while (flip (&d) != LEFT); } + Stencil m; do { Interval ext = edge[d].extent (X_AXIS); + Real pad = robust_scm2double (me->get_property ("bound-padding"), 0.0); if (!ext.is_empty ()) { edge[d].translate_axis (span_points[d], X_AXIS); m.add_stencil (edge[d]); - span_points[d] += -d * ext[-d]; + span_points[d] += -d * (ext[-d] + pad); } } while (flip (&d) != LEFT); - - if (!span_points.is_empty ()) + if (!span_points.is_empty () + && span_points.length () > robust_scm2double (me->get_property ("dash-period"), 0.0)) { - Stencil l =Line_spanner::line_stencil (me, - Offset (span_points[LEFT], 0), - Offset (span_points[RIGHT], 0)); + Stencil l = Line_spanner::line_stencil (me, + Offset (span_points[LEFT], 0), + Offset (span_points[RIGHT], 0)); m.add_stencil (l); } m.translate_axis (- me->relative_coordinate (common, X_AXIS), X_AXIS); @@ -141,7 +154,12 @@ Dynamic_text_spanner::print (SCM smob) } ADD_INTERFACE (Dynamic_text_spanner, - "dynamic-text-spanner-interface", "A text spanner for crescendo texts", - "dash-period dash-fraction edge-text style thickness"); + + "bound-padding " + "dash-period " + "dash-fraction " + "edge-text " + "style " + "thickness");