]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dynamic-text-spanner.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / dynamic-text-spanner.cc
index d81246dccd1893a9428740e3993d5e2ce4e21621..a5d76e4bca52b5f5197be5a6a67fbd85462fd381 100644 (file)
@@ -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 <janneke@gnu.org>
+  (c) 2000--2006 Jan Nieuwenhuizen <janneke@gnu.org>
 
-  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"
 #include "warn.hh"
 #include "paper-column.hh"
 
-
-
 class Dynamic_text_spanner
 {
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  static bool has_interface (Grob*);
+  static bool has_interface (Grob *);
 };
 
-
-
 /*
   This is a partial C&P from text-spanner.cc
 
@@ -39,28 +33,26 @@ 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<Spanner*> (me);
+  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 * paper = me->get_paper ();
+  Output_def *layout = me->layout ();
 
   Interval span_points;
   Drul_array<bool> broken;
@@ -87,15 +79,14 @@ Dynamic_text_spanner::print (SCM smob)
              encl = -d;
            }
 
-         Interval ext  = b->extent (common, X_AXIS);
-         span_points[d] = -d  * pad
-           + robust_relative_extent (b,common, X_AXIS)
+         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");
@@ -107,12 +98,12 @@ Dynamic_text_spanner::print (SCM smob)
        {
          if (broken[d])
            continue;
-         
+
          SCM text = index_get_cell (edge_text, d);
 
-         if (Text_interface::markup_p (text)) 
-           edge[d] = *unsmob_stencil (Text_interface::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);
        }
@@ -122,21 +113,22 @@ Dynamic_text_spanner::print (SCM smob)
   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);
@@ -146,5 +138,11 @@ 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");