From: Han-Wen Nienhuys Date: Wed, 24 Jan 2007 13:46:12 +0000 (+0100) Subject: use new-line-spanner for dynamic texts too. X-Git-Tag: release/2.11.14-1~36 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a662b1b1e9d96d5cc15cada6688bdef9fa723011;p=lilypond.git use new-line-spanner for dynamic texts too. --- diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 49687a6b9b..fd22a33bf6 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -24,6 +24,7 @@ #include "stream-event.hh" #include "warn.hh" #include "spanner.hh" +#include "text-interface.hh" #include "translator.icc" @@ -255,13 +256,9 @@ Dynamic_engraver::process_music () context ()->set_property ((start_type + "Spanner").c_str (), SCM_EOL); s = get_property ((start_type + "Text").c_str ()); - /* - FIXME: use get_markup () to check type. - */ - if (scm_is_string (s) || scm_is_pair (s)) + if (Text_interface::is_markup (s)) { - cresc_->set_property ("edge-text", - scm_cons (s, scm_from_locale_string (""))); + cresc_->set_property ("text", s); context ()->set_property ((start_type + "Text").c_str (), SCM_EOL); } diff --git a/lily/dynamic-text-spanner.cc b/lily/dynamic-text-spanner.cc deleted file mode 100644 index e6a9f336a1..0000000000 --- a/lily/dynamic-text-spanner.cc +++ /dev/null @@ -1,165 +0,0 @@ -/* - dynamic-text-spanner.cc -- implement Text_spanner - - source file of the GNU LilyPond music typesetter - - (c) 2000--2007 Jan Nieuwenhuizen - - Revised over good by Han-Wen. -*/ - -#include "text-interface.hh" -#include "text-spanner.hh" -#include "line-spanner.hh" -#include "spanner.hh" -#include "font-interface.hh" -#include "dimensions.hh" -#include "output-def.hh" -#include "warn.hh" -#include "paper-column.hh" - -class Dynamic_text_spanner -{ -public: - DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE(); -}; - -/* - This is a partial C&P from text-spanner.cc - - Dynamic_text_spanner is similar, but - - * 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 - - - - - 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) -{ - 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 *layout = me->layout (); - - Interval span_points; - Drul_array broken; - Direction d = LEFT; - do - { - Item *b = spanner->get_bound (d); - broken[d] = b->break_status_dir () != CENTER; - - if (broken[d]) - { - if (d == LEFT) - span_points[d] = spanner->get_broken_left_end_align (); - else - span_points[d] = b->relative_coordinate (common, X_AXIS); - } - else - { - Real pad = 0.0; - Real encl = d; - if (b->internal_has_interface (ly_symbol2scm ("dynamic-interface"))) - { - 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 - - 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); - - SCM properties = Font_interface::text_font_alist_chain (me); - SCM edge_text = me->get_property ("edge-text"); - Drul_array edge; - if (scm_is_pair (edge_text)) - { - Direction d = LEFT; - do - { - if (broken[d]) - continue; - - SCM text = index_get_cell (edge_text, d); - - 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] + pad); - } - } - while (flip (&d) != LEFT); - - 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)); - m.add_stencil (l); - } - m.translate_axis (- me->relative_coordinate (common, X_AXIS), X_AXIS); - return m.smobbed_copy (); -} - -ADD_INTERFACE (Dynamic_text_spanner, - "A text spanner for crescendo texts", - - "bound-padding " - "dash-period " - "dash-fraction " - "edge-text " - "style " - "thickness"); - diff --git a/lily/new-line-spanner.cc b/lily/new-line-spanner.cc index 3f78d364f8..122ba66b80 100644 --- a/lily/new-line-spanner.cc +++ b/lily/new-line-spanner.cc @@ -28,6 +28,7 @@ public: DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); DECLARE_SCHEME_CALLBACK (calc_left_bound_info, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_left_bound_info_and_text, (SCM)); DECLARE_SCHEME_CALLBACK (calc_right_bound_info, (SCM)); DECLARE_SCHEME_CALLBACK (calc_bound_info, (SCM, Direction)); DECLARE_GROB_INTERFACE(); @@ -159,6 +160,29 @@ New_line_spanner::calc_left_bound_info (SCM smob) return New_line_spanner::calc_bound_info (smob, LEFT); } +MAKE_SCHEME_CALLBACK (New_line_spanner, calc_left_bound_info_and_text, 1); +SCM +New_line_spanner::calc_left_bound_info_and_text (SCM smob) +{ + SCM alist = New_line_spanner::calc_bound_info (smob, LEFT); + Spanner *me = unsmob_spanner (smob); + + SCM text = me->get_property ("text"); + if (Text_interface::is_markup (text) + && me->get_bound (LEFT)->break_status_dir () == CENTER + && ly_assoc_get (ly_symbol2scm ("stencil"), alist, SCM_BOOL_F) == SCM_BOOL_F) + { + Output_def *layout = me->layout (); + SCM properties = Font_interface::text_font_alist_chain (me); + alist = scm_acons (ly_symbol2scm ("stencil"), + Text_interface::interpret_markup (layout->self_scm (), + properties, text), + alist); + } + + return alist; +} + MAKE_SCHEME_CALLBACK (New_line_spanner, print, 1); SCM New_line_spanner::print (SCM smob) diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index e99b6bd197..909f33fb9b 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -632,22 +632,40 @@ (DynamicTextSpanner . ( - (stencil . ,ly:dynamic-text-spanner::print) - ;; rather ugh with NCSB ;; (font-series . bold) (font-shape . italic) (style . dashed-line) + (bound-details . ((right . ((attach-dir . ,LEFT) + (Y . 0) + (padding . 0.75) + )) + (left . ((attach-dir . ,LEFT) + (Y . 0) + (padding . 1.5) + )) + (left-broken . ((attach-dir . ,RIGHT) + (padding . 0.5) + (Y . 0) + + ;; make sure the - - - stays at reasonable + ;; distance from staff. + (text . " ") + )) + )) + (stencil . ,ly:new-line-spanner::print) + (left-bound-info . ,ly:new-line-spanner::calc-left-bound-info-and-text) + (right-bound-info . ,ly:new-line-spanner::calc-right-bound-info) + ;; need to blend with dynamic texts. (font-size . 1) - (bound-padding . 0.75) (dash-fraction . 0.2) (dash-period . 3.0) (meta . ((class . Spanner) (interfaces . (font-interface text-interface - line-spanner-interface + new-line-spanner-interface dynamic-interface dynamic-text-spanner-interface spanner-interface)))))) @@ -706,7 +724,7 @@ (meta . ((class . Spanner) (interfaces . (line-interface unbreakable-spanner-interface - line-spanner-interface)))))) + new-line-spanner-interface)))))) (GraceSpacing . ( @@ -1874,6 +1892,7 @@ . ( (left-bound-info . ,ly:new-line-spanner::calc-left-bound-info) (right-bound-info . ,ly:new-line-spanner::calc-right-bound-info) + (bound-details . ((left . ((text . ,(make-translate-scaled-markup '(0 . -0.6) (make-musicglyph-markup "scripts.trill"))) @@ -1882,6 +1901,7 @@ )) (right . ((Y . 0))) )) + (stencil . ,ly:new-line-spanner::print) (style . trill) @@ -1893,7 +1913,7 @@ (outside-staff-priority . 50) (meta . ((class . Spanner) (interfaces . (text-spanner-interface - line-spanner-interface + new-line-spanner-interface side-position-interface font-interface)))))) diff --git a/scm/stencil.scm b/scm/stencil.scm index 463a082fd3..283f04fe2d 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -382,6 +382,7 @@ grestore (input (if (ly:stream-event? cause) (ly:event-property cause 'origin) #f)) (location (if (ly:input-location? input) (ly:input-file-line-char-column input) '())) + ;; todo: use stencil extent if available. (x-ext (ly:grob-extent grob system-grob X)) (y-ext (ly:grob-extent grob system-grob Y)) )