From a662b1b1e9d96d5cc15cada6688bdef9fa723011 Mon Sep 17 00:00:00 2001
From: Han-Wen Nienhuys <hanwen@xs4all.nl>
Date: Wed, 24 Jan 2007 14:46:12 +0100
Subject: [PATCH] use new-line-spanner for dynamic texts too.

---
 lily/dynamic-engraver.cc     |   9 +-
 lily/dynamic-text-spanner.cc | 165 -----------------------------------
 lily/new-line-spanner.cc     |  24 +++++
 scm/define-grobs.scm         |  32 +++++--
 scm/stencil.scm              |   1 +
 5 files changed, 54 insertions(+), 177 deletions(-)
 delete mode 100644 lily/dynamic-text-spanner.cc

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 <janneke@gnu.org>
-
-  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<Spanner *> (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<bool> 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<Stencil> 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))
 	 )
-- 
2.39.5