]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/piano-pedal-bracket.cc
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / piano-pedal-bracket.cc
index 09203303240ccc92ce8857f5f7d34ca2a4455a0d..d13f56414f4f52c3f8939f6b7c306a94360477d9 100644 (file)
-/*   
-  piano-pedal-bracket.cc --  implement  Piano_pedal_bracket
-
-source file of the GNU LilyPond music typesetter
-
-(c) 2003 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-based on smouldering remains by
+/*
+  This file is part of LilyPond, the GNU music typesetter.
 
-   Chris Jackson <chris@fluffhouse.org.uk>
+  Copyright (C) 2003--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-*/
-/* 
-   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 __/\__
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-
-/*
-  TODO: this should be moved somewhere else (?).
-
-  Perhaps make separate function for pedal-bracket.
- */
-#include "molecule.hh"
+#include "stencil.hh"
 #include "spanner.hh"
 #include "item.hh"
-#include "paper-def.hh"
+#include "bracket.hh"
+#include "axis-group-interface.hh"
 
 struct Piano_pedal_bracket
 {
-  DECLARE_SCHEME_CALLBACK(after_line_breaking,(SCM));
-  static bool has_interface (Grob*);
+  DECLARE_SCHEME_CALLBACK (print, (SCM));
 };
 
-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, print, 1);
 SCM
-Piano_pedal_bracket::after_line_breaking (SCM smob)
+Piano_pedal_bracket::print (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");
-  
-  Direction d = LEFT;
-
-  do
+  Spanner *me = unsmob<Spanner> (smob);
+  Spanner *orig = dynamic_cast<Spanner *> (me->original ());
+
+  Drul_array<bool> broken (false, false);
+  Drul_array<Real> height = robust_scm2drul
+                            (me->get_property ("edge-height"), Interval (0, 0));
+  Drul_array<Real> shorten = robust_scm2drul
+                             (me->get_property ("shorten-pair"), Interval (0, 0));
+  Drul_array<Real> flare = robust_scm2drul
+                           (me->get_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_object ("pedal-text"));
+
+  if (textbit)
+    common = common->common_refpoint (textbit, X_AXIS);
+
+  Interval span_points (0, 0);
+  for (LEFT_and_RIGHT (d))
     {
       Item *b = me->get_bound (d);
       broken[d] = b->break_status_dir () != CENTER;
-
-      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));
+      if (broken[d])
+        {
+          if (orig
+              && ((d == RIGHT
+                   && me->get_break_index () != orig->broken_intos_.size () - 1)
+                  || (d == LEFT && me->get_break_index ())))
+            height[d] = 0.0;
+          else
+            flare[d] = 0.0;
+
+          span_points[d]
+            = Axis_group_interface::generic_bound_extent (b, common, X_AXIS)[RIGHT];
+        }
+      else
+        span_points[d] = b->relative_coordinate (common, X_AXIS);
     }
-  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
+  /* For 'Mixed' style pedals, i.e.  a bracket preceded by text:  Ped._____|
+     need to shorten by the extent of the text grob
   */
-  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_property ("bound-padding"), 0);
+
+      span_points[LEFT] = padding
+                          + robust_relative_extent (textbit, common, X_AXIS)[RIGHT];
     }
-  
-  if (broken[LEFT])
+
+  Stencil m;
+  if (!span_points.is_empty ()
+      && span_points.length () > 0.001)
     {
-      shorten[LEFT]  -=  me->get_broken_left_end_align () ;
+      m = Bracket::make_bracket (
+        me, Y_AXIS, Offset (span_points.length (), 0), height,
+        Interval (), flare, shorten);
     }
-
-  // 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;
+  m.translate_axis (span_points[LEFT]
+                    - me->relative_coordinate (common, X_AXIS), X_AXIS);
+  return m.smobbed_copy ();
 }
 
+ADD_INTERFACE (Piano_pedal_bracket,
+               "The bracket of the piano pedal.  It can be tuned through"
+               " the regular bracket properties.",
+
+               /* properties */
+               "bound-padding "
+               "edge-height "
+               "shorten-pair "
+               "bracket-flare "
+               "pedal-text "
+              );