]> git.donarmstrong.com Git - lilypond.git/commitdiff
use new-line-spanner for dynamic texts too.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 24 Jan 2007 13:46:12 +0000 (14:46 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 24 Jan 2007 13:46:12 +0000 (14:46 +0100)
lily/dynamic-engraver.cc
lily/dynamic-text-spanner.cc [deleted file]
lily/new-line-spanner.cc
scm/define-grobs.scm
scm/stencil.scm

index 49687a6b9bf7534233204b1b2822e827551fe2f6..fd22a33bf60f557ba73a4355310edda7708a57e1 100644 (file)
@@ -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 (file)
index e6a9f33..0000000
+++ /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");
-
index 3f78d364f8d83e8667d307a7ce6794bcf680856b..122ba66b807dd1d4809b1f01fd6fc6ccd81ad52e 100644 (file)
@@ -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)
index e99b6bd197db052117c948bb48de2e0922ec88df..909f33fb9b97534e5d9933077b9d135475cdc635 100644 (file)
 
     (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))))))
        (meta . ((class . Spanner)
                 (interfaces . (line-interface
                                unbreakable-spanner-interface
-                               line-spanner-interface))))))
+                               new-line-spanner-interface))))))
 
     (GraceSpacing
      . (
      . (
        (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")))
                                   ))
                          (right . ((Y . 0)))
                          ))
+       
        (stencil . ,ly:new-line-spanner::print)
 
        (style . trill)
        (outside-staff-priority . 50)
        (meta . ((class . Spanner)
                 (interfaces . (text-spanner-interface
-                               line-spanner-interface
+                               new-line-spanner-interface
                                side-position-interface
                                font-interface))))))
 
index 463a082fd337e63e25230fc4fe89f70c3091206f..283f04fe2d6665055ab605b3eb564a0b63e8f874 100644 (file)
@@ -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))
         )