]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ottava-bracket.cc
Doc-es: various updates.
[lilypond.git] / lily / ottava-bracket.cc
index 3aced1d37f26c614e304c9c1d55b67c25a89725e..cc33d8b152fd4a311a769d980184d2800bb1b37f 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2004--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 2004--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
@@ -17,6 +17,7 @@
   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "axis-group-interface.hh"
 #include "text-interface.hh"
 #include "spanner.hh"
 #include "font-interface.hh"
 #include "staff-symbol-referencer.hh"
 #include "note-column.hh"
 #include "directional-element-interface.hh"
-#include "tuplet-bracket.hh"
+#include "bracket.hh"
 #include "rhythmic-head.hh"
 #include "pointer-group-interface.hh"
 
 struct Ottava_bracket
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 /*
@@ -48,20 +48,19 @@ MAKE_SCHEME_CALLBACK (Ottava_bracket, print, 1);
 SCM
 Ottava_bracket::print (SCM smob)
 {
-  Spanner *me = dynamic_cast<Spanner *> (unsmob_grob (smob));
+  Spanner *me = unsmob<Spanner> (smob);
   Interval span_points;
 
   Grob *common = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS);
   Output_def *layout = me->layout ();
 
   Drul_array<bool> broken;
-  Direction d = LEFT;
-  do
+  for (LEFT_and_RIGHT (d))
     {
       Item *b = me->get_bound (d);
       broken[d] = (b->break_status_dir () != CENTER);
 
-      if (Note_column::has_interface (b))
+      if (has_interface<Note_column> (b))
         {
           extract_grob_set (b, "note-heads", heads);
           common = common_refpoint_of_array (heads, common, X_AXIS);
@@ -74,13 +73,12 @@ Ottava_bracket::print (SCM smob)
             }
         }
     }
-  while (flip (&d) != LEFT);
 
   SCM properties = Font_interface::text_font_alist_chain (me);
   SCM markup = me->get_property ("text");
   Stencil text;
   if (Text_interface::is_markup (markup))
-    text = *unsmob_stencil (Text_interface::interpret_markup (layout->self_scm (),
+    text = *unsmob<Stencil> (Text_interface::interpret_markup (layout->self_scm (),
                                                               properties, markup));
 
   Drul_array<Real> shorten = robust_scm2interval (me->get_property ("shorten-pair"),
@@ -90,12 +88,12 @@ Ottava_bracket::print (SCM smob)
     TODO: we should check if there are ledgers, and modify length of
     the spanner to that.
   */
-  do
+  for (LEFT_and_RIGHT (d))
     {
       Item *b = me->get_bound (d);
 
       Interval ext;
-      if (Note_column::has_interface (b))
+      if (has_interface<Note_column> (b))
         {
           extract_grob_set (b, "note-heads", heads);
           for (vsize i = 0; i < heads.size (); i++)
@@ -114,14 +112,15 @@ Ottava_bracket::print (SCM smob)
 
       if (broken[d])
         {
-          span_points[d] = b->extent (common, X_AXIS)[RIGHT];
+          span_points[d] = Axis_group_interface::generic_bound_extent (b, common, X_AXIS)[RIGHT];
           shorten[d] = 0.;
         }
 
       else
         span_points[d] = ext[d];
+
+      span_points[d] -= d * shorten[d];
     }
-  while (flip (&d) != LEFT);
 
   /*
     0.3 is ~ italic correction.
@@ -143,36 +142,32 @@ Ottava_bracket::print (SCM smob)
   Drul_array<Real> flare = robust_scm2interval (me->get_property ("bracket-flare"),
                                                 Interval (0, 0));
 
-  do
+  for (LEFT_and_RIGHT (d))
     {
       edge_height[d] *= -get_grob_direction (me);
       if (broken[d])
         edge_height[d] = 0.0;
     }
-  while (flip (&d) != LEFT);
 
   Stencil b;
   Interval empty;
+
   if (!bracket_span_points.is_empty () && bracket_span_points.length () > 0.001)
-    b = Tuplet_bracket::make_bracket (me,
-                                      Y_AXIS, Offset (bracket_span_points.length (), 0),
-                                      edge_height,
-                                      empty,
-                                      flare, shorten);
+    b = Bracket::make_bracket (
+      me, Y_AXIS, Offset (bracket_span_points.length (), 0),
+      edge_height, empty, flare, Drul_array<Real> (0, 0));
 
   /*
-    The vertical lines should not take space, for the following scenario:
-
-    8 -----+
-    o  |
-    |
-    |
-
-
-    Just a small amount, yes.  In tight situations, it is even
-    possible to center the `8' directly below the note, dropping the
-    ottava line completely...
-
+   * The vertical lines should not take space, for the following scenario:
+   *
+   * 8 -----+
+   *     o  |
+   *    |
+   *    |
+   *
+   * Just a small amount, yes.  In tight situations, it is even
+   * possible to center the `8' directly below the note, dropping the
+   * ottava line completely...
   */
 
   b = Stencil (Box (b.extent (X_AXIS),