]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/piano-pedal-bracket.cc
* scm/music-functions.scm (determine-split-list): bugfixes.
[lilypond.git] / lily / piano-pedal-bracket.cc
index 09203303240ccc92ce8857f5f7d34ca2a4455a0d..362ff2a2ae5ef45d45e0283f8bd7aefbd753b3b5 100644 (file)
@@ -5,95 +5,87 @@ source file of the GNU LilyPond music typesetter
 
 (c) 2003 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-based on smouldering remains by
-
-   Chris Jackson <chris@fluffhouse.org.uk>
-
-
-*/
-/* 
-   Piano pedal brackets are a special case of a text spanner.
-   Pedal up-down (restart) indicated by the angled right and left edges 
-   of consecutive pedals touching exactly to form an __/\__
-
 */
 
-
-/*
-  TODO: this should be moved somewhere else (?).
-
-  Perhaps make separate function for pedal-bracket.
- */
 #include "molecule.hh"
 #include "spanner.hh"
 #include "item.hh"
-#include "paper-def.hh"
+#include "tuplet-bracket.hh"
 
 struct Piano_pedal_bracket
 {
-  DECLARE_SCHEME_CALLBACK(after_line_breaking,(SCM));
+  DECLARE_SCHEME_CALLBACK(brew_molecule,(SCM));
   static bool has_interface (Grob*);
 };
 
-ADD_INTERFACE (Piano_pedal_bracket,"piano-pedal-bracket-interface",
-              "",
-              "pedal-text");
 
-MAKE_SCHEME_CALLBACK(Piano_pedal_bracket,after_line_breaking,1);
+MAKE_SCHEME_CALLBACK(Piano_pedal_bracket,brew_molecule,1);
 SCM
-Piano_pedal_bracket::after_line_breaking (SCM smob)
+Piano_pedal_bracket::brew_molecule (SCM smob)
 {
   Spanner *me = dynamic_cast<Spanner*> (unsmob_grob (smob));
-
-  Drul_array<bool> broken;
-  Drul_array<Real> height(0,0), shorten(0,0);
-
-  SCM eh = me->get_grob_property ("edge-height");
-  SCM sp = me->get_grob_property ("shorten-pair");
   
+  Drul_array<bool> broken (false,false);
+  Drul_array<Real> height = robust_scm2drul
+    (me->get_grob_property ("edge-height"), Interval (0,0));
+  Drul_array<Real> shorten = robust_scm2drul
+    (me->get_grob_property ("shorten-pair"), Interval (0,0));
+  Drul_array<Real> flare = robust_scm2drul
+    (me->get_grob_property ("bracket-flare"), Interval (0,0));
+
+  Grob *common = me->get_bound (LEFT)
+    ->common_refpoint (me->get_bound (RIGHT), X_AXIS);
+  Grob *textbit = unsmob_grob (me->get_grob_property("pedal-text"));
+
+  if (textbit)
+    common = common->common_refpoint (textbit, X_AXIS);
+
+  Interval span_points (0,0);
   Direction d = LEFT;
-
   do
     {
       Item *b = me->get_bound (d);
       broken[d] = b->break_status_dir () != CENTER;
+      if (broken[d])
+       height[d] = 0.0;
 
-      if (!broken[d] && (is_number_pair (eh)))
-       height[d] += gh_scm2double (index_get_cell (eh, d));
-      if (is_number_pair (sp))
-       shorten[d] +=  gh_scm2double (index_get_cell (sp, d));
+      Interval ext   = b->extent (common,  X_AXIS);
+      span_points[d] = ext [broken[d] ?  RIGHT : LEFT];
     }
   while (flip (&d) != LEFT);
+
   
   /* For 'Mixed' style pedals, i.e.  a bracket preceded by text:  Ped._____|
    need to shorten by the extent of the text grob
-
-
-   Urg. - why not hang bracket between text items? --hwn
   */
-  if (Grob *textbit = unsmob_grob (me->get_grob_property("pedal-text")))
+  if (textbit)
     {
       height[LEFT] = 0;
-      SCM pa = me->get_grob_property ("if-text-padding"); // UGH.
-      Real padding =0.;
-      if (gh_number_p (pa))
-       padding = gh_scm2double (pa);
-         
-      shorten[LEFT] += padding + textbit->extent (textbit, X_AXIS)[RIGHT];
+      
+      Real padding = robust_scm2double (me->get_grob_property ("if-text-padding"), 0);
+      
+      span_points[LEFT] = padding
+       + textbit->extent (common, X_AXIS)[RIGHT];
     }
   
-  if (broken[LEFT])
+
+  Molecule m ;
+  if (!span_points.is_empty () &&
+      span_points.length () > 0.001)
     {
-      shorten[LEFT]  -=  me->get_broken_left_end_align () ;
+      m = Tuplet_bracket::make_bracket (me, Y_AXIS,
+                                       Offset (span_points.length (), 0),
+                                       height,
+                                       0.0,
+                                       flare, shorten);
     }
+  m.translate_axis (span_points[LEFT]
+                   - me->relative_coordinate (common, X_AXIS), X_AXIS);
+  return m.smobbed_copy ();
+}
 
-  // Also shorten so that it ends just before the spanned note.
-  Grob  *rb = me->get_bound (RIGHT);
-  shorten[RIGHT]  += rb->extent (rb, X_AXIS)[RIGHT];
-    
-  me->set_grob_property ("edge-height", ly_interval2scm (height));
-  me->set_grob_property ("shorten-pair", ly_interval2scm (shorten));
 
-  return SCM_UNSPECIFIED;
-}
 
+ADD_INTERFACE (Piano_pedal_bracket,"piano-pedal-bracket-interface",
+              "The bracket of the piano pedal.  It can be tuned through the regular bracket properties (bracket-flare, edge-height, shorten-pair).",
+              "edge-height shorten-pair bracket-flare pedal-text");