]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/volta-bracket.cc (after_line_breaking): new function. Set
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 10 Oct 2005 13:08:13 +0000 (13:08 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 10 Oct 2005 13:08:13 +0000 (13:08 +0000)
edge-height.

* lily/horizontal-bracket.cc (make_enclosing_bracket): rename from
make_bracket.
(make_bracket): new function.

* scm/define-grobs.scm (all-grob-descriptions): set
between-length-limit to 1.0

ChangeLog
lily/enclosing-bracket.cc
lily/horizontal-bracket.cc
lily/include/horizontal-bracket.hh
lily/include/volta-bracket.hh
lily/ottava-bracket.cc
lily/volta-bracket.cc
scm/define-grob-interfaces.scm
scm/define-grobs.scm

index bddcc87f9ef9ed38b6ed22379ae7ea6baf58c9f3..967f1f0d6ca315e95d4a36af4b96553374c06770 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2005-10-10  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
+       * lily/volta-bracket.cc (after_line_breaking): new function. Set
+       edge-height.
+
+       * lily/horizontal-bracket.cc (make_enclosing_bracket): rename from
+       make_bracket.
+       (make_bracket): new function.
+
        * scm/lily.scm (define-scheme-options): add paper-size option.
 
        * ly/declarations-init.ly (laissezVibrer): get paper size from
index 90b9211c63f49e80cc9db0bd7a425c2517369ca2..c75d5daaa4034674f49a5511151cdd0ff7440e82 100644 (file)
@@ -54,10 +54,10 @@ Enclosing_bracket::print (SCM grob)
   Interval xext = Axis_group_interface::relative_group_extent (elements, common_x, X_AXIS);
 
 
-  Stencil left_br = Horizontal_bracket::make_bracket (me, me, elements,
-                                                     Y_AXIS, LEFT);
-  Stencil right_br = Horizontal_bracket::make_bracket (me, me, elements,
-                                                      Y_AXIS, RIGHT);
+  Stencil left_br = Horizontal_bracket::make_enclosing_bracket (me, me, elements,
+                                                               Y_AXIS, LEFT);
+  Stencil right_br = Horizontal_bracket::make_enclosing_bracket (me, me, elements,
+                                                                Y_AXIS, RIGHT);
 
   xext.widen (robust_scm2double (me->get_property ("padding"), 0.25));
   left_br.translate_axis (xext[LEFT], X_AXIS);
index f3abaa5e6148419f4e27ff24b4fd02c8815c4be6..fc19ab7bac16ebfd6c49de515a5b47a4a454c66e 100644 (file)
@@ -6,25 +6,23 @@
   (c) 2002--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
-#include "side-position-interface.hh"
+#include "horizontal-bracket.hh"       
+
 #include "lookup.hh"
+#include "side-position-interface.hh"
 #include "pointer-group-interface.hh"
 #include "directional-element-interface.hh"
 #include "output-def.hh"
 #include "staff-symbol-referencer.hh"
 #include "tuplet-bracket.hh"
-#include "horizontal-bracket.hh"       
 #include "axis-group-interface.hh"
 
+
 Stencil
-Horizontal_bracket::make_bracket (Grob *me, Grob *refpoint,
-                                 Link_array<Grob> grobs,
-                                 Axis a, Direction dir)
+Horizontal_bracket::make_bracket (Grob *me,
+                                 Real length,
+                                 Axis a, Direction dir)                                 
 {
-  Axis other = other_axis (a);
-  Grob *common = common_refpoint_of_array (grobs, refpoint, a);
-  Interval ext = Axis_group_interface::relative_group_extent (grobs, common, a);
-
   Drul_array<Real> edge_height = robust_scm2interval (me->get_property ("edge-height"),
                                                      Interval (1.0, 1.0));
   Drul_array<Real> flare = robust_scm2interval (me->get_property ("bracket-flare"),
@@ -34,20 +32,29 @@ Horizontal_bracket::make_bracket (Grob *me, Grob *refpoint,
 
   // Make sure that it points in the correct direction:
   scale_drul (&edge_height, Real (-dir));
-
   Interval empty;
   Offset start;
-  start[a] = ext.length ();
+  start[a] = length;
 
   /*
     ugh, Tuplet_bracket should use Horizontal_bracket, not the other way around. 
   */
-  Stencil b
-    = Tuplet_bracket::make_bracket (me, other, start, 
-                                   edge_height, empty, flare, shorten);
+  return Tuplet_bracket::make_bracket (me, other_axis (a), start, 
+                                      edge_height, empty, flare, shorten);
+}
+
+
+Stencil
+Horizontal_bracket::make_enclosing_bracket (Grob *me, Grob *refpoint,
+                                           Link_array<Grob> grobs,
+                                           Axis a, Direction dir)
+{
+  Grob *common = common_refpoint_of_array (grobs, refpoint, a);
+  Interval ext = Axis_group_interface::relative_group_extent (grobs, common, a);
 
-  b.translate_axis (ext[LEFT] - refpoint->relative_coordinate (common, a)
-                   , a);
+  Stencil b = make_bracket (me, ext.length(), a, dir);
+  b.translate_axis (ext[LEFT] - refpoint->relative_coordinate (common, a), a);
 
   return b;
 }
@@ -71,7 +78,7 @@ Horizontal_bracket::print (SCM smob)
       return SCM_EOL;
     }
 
-  Stencil b = make_bracket (me, me, gs, X_AXIS, get_grob_direction (me));
+  Stencil b = make_enclosing_bracket (me, me, gs, X_AXIS, get_grob_direction (me));
   return b.smobbed_copy ();
 }
 
index 2645f2179819ad4fe1dea892258a770e0adb74d4..a71c8a00b4910903b97f45dd5f4ce5986d93438d 100644 (file)
@@ -9,10 +9,16 @@
 #ifndef HORIZONTAL_BRACKET_HH
 #define HORIZONTAL_BRACKET_HH
 
+#include "lily-guile.hh"
+#include "lily-proto.hh"
+
 struct Horizontal_bracket
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  static Stencil make_bracket (Grob *, Grob *, Link_array<Grob>, Axis, Direction);
+  static Stencil make_bracket (Grob *, Real, Axis, Direction);
+  static Stencil make_enclosing_bracket (Grob *me, Grob *refpoint,
+                                        Link_array<Grob> grobs,
+                                        Axis a, Direction dir);
   static bool has_interface (Grob *);
 };
 
index 227c09dce6d1c39159940b64760898c65be18af0..3f8f2e081f7b473f4bc33c6a038fbe3c4d706580 100644 (file)
@@ -14,6 +14,7 @@ class Volta_bracket_interface
 public:
   static bool has_interface (Grob *);
   DECLARE_SCHEME_CALLBACK (print, (SCM));
+  DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
   static void add_column (Grob *, Grob *col);
   static void add_bar (Grob *me, Item *bar);
 };
index a9df448d62f0d6023582bb3e46dc7f11ad5c6fd7..f025a6f0c7b5b54b9aa700de291a487b85a5c01f 100644 (file)
@@ -175,7 +175,16 @@ Ottava_bracket::print (SCM smob)
   return b.smobbed_copy ();
 }
 
-ADD_INTERFACE (Ottava_bracket, "ottava-bracket-interface",
+ADD_INTERFACE (Ottava_bracket,
+              "ottava-bracket-interface",
+              
               "An ottava bracket",
-              "edge-height bracket-flare shorten-pair minimum-length");
+
+              /*
+                properties
+               */
+              "edge-height "
+              "bracket-flare "
+              "shorten-pair "
+              "minimum-length");
 
index 36b7e5cf0d4937f4a009f297ae3303477d1aa888..4237aed303596bb3e5f27336a65e7dfe1d5f860b 100644 (file)
@@ -20,6 +20,7 @@ using namespace std;
 #include "side-position-interface.hh"
 #include "directional-element-interface.hh"
 #include "lookup.hh"
+#include "tuplet-bracket.hh"
 
 /*
   this is too complicated. Yet another version of side-positioning,
@@ -34,33 +35,24 @@ MAKE_SCHEME_CALLBACK (Volta_bracket_interface, print, 1);
 SCM
 Volta_bracket_interface::print (SCM smob)
 {
-  Grob *me = unsmob_grob (smob);
-  Spanner *orig_span = dynamic_cast<Spanner *> (me->original_);
-
-  bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] == (Spanner *)me);
-
-  bool broken_last_bracket = orig_span && (orig_span->broken_intos_.top () == (Spanner *)me);
-
-  bool no_vertical_start = orig_span && !broken_first_bracket;
-  bool no_vertical_end = orig_span && !broken_last_bracket;
+  Spanner *me = unsmob_spanner (smob);
 
-  extract_grob_set (me, "bars", bars);
-  Grob *endbar = bars.size () ? bars.top () : 0;
-  SCM glyph = endbar ? endbar->get_property ("glyph") : SCM_EOL;
+  /*
+    UGH UGH  dependency tracking.
+  */
+  SCM proc = me->get_property ("after-line-breaking-callback");
+  if (ly_is_procedure (proc))
+    {
+      me->set_property ("after-line-breaking-callback", SCM_EOL);
+      scm_call_1  (proc, me->self_scm ());
+    }
 
-  String str;
-  if (scm_is_string (glyph))
-    str = ly_scm2string (glyph);
-  else
-    str = "|";
+  Spanner *orig_span = dynamic_cast<Spanner *> (me->original_);
+  bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0]
+                                           == (Spanner *)me);
 
-  no_vertical_end
-    |= (str != ":|"
-       && str != "|:"
-       && str != "|."
-       && str != ":|:"
-       && str != ".|");
 
+  
   Output_def *layout = me->get_layout ();
   Real half_space = 0.5;
 
@@ -73,7 +65,8 @@ Volta_bracket_interface::print (SCM smob)
   if (bound->break_status_dir () == RIGHT)
     {
       Paper_column *pc = bound->get_column ();
-      left = pc->extent (pc, X_AXIS)[RIGHT] - bound->relative_coordinate (pc, X_AXIS);
+      left = pc->extent (pc, X_AXIS)[RIGHT]
+       - bound->relative_coordinate (pc, X_AXIS);
     }
   else
     {
@@ -83,19 +76,25 @@ Volta_bracket_interface::print (SCM smob)
       */
     }
 
-  Real w = dynamic_cast<Spanner *> (me)->spanner_length () - left - half_space;
-  Real h = robust_scm2double (me->get_property ("height"), 1);
-
-  Stencil start, end;
-  if (!no_vertical_start)
-    start = Line_interface::line (me, Offset (0, 0), Offset (0, h));
+  Drul_array<Real> edge_height = robust_scm2interval (me->get_property ("edge-height"),
+                                                     Interval (1.0, 1.0));
+  Drul_array<Real> flare = robust_scm2interval (me->get_property ("bracket-flare"),
+                                               Interval (0, 0));
+  Drul_array<Real> shorten = robust_scm2interval (me->get_property ("shorten-pair"),
+                                                 Interval (0, 0));
 
-  if (!no_vertical_end)
-    end = Line_interface::line (me, Offset (w, 0), Offset (w, h));
+  scale_drul (&edge_height, - Real (get_grob_direction (me)));
 
-  Stencil mol = Line_interface::line (me, Offset (0, h), Offset (w, h));
-  mol.add_stencil (start);
-  mol.add_stencil (end);
+  Interval empty;
+  Offset start;
+  start[X_AXIS] = me->spanner_length () - left - half_space;
+  
+  /*
+    ugh, Tuplet_bracket should use Horizontal_bracket, not the other way around. 
+  */
+  Stencil total
+    = Tuplet_bracket::make_bracket (me, Y_AXIS, start, 
+                                   edge_height, empty, flare, shorten);
 
   if (!orig_span || broken_first_bracket)
     {
@@ -104,12 +103,63 @@ Volta_bracket_interface::print (SCM smob)
       SCM snum = Text_interface::interpret_markup (layout->self_scm (),
                                                   properties, text);
       Stencil num = *unsmob_stencil (snum);
+      num.align_to (Y_AXIS, UP);
+      num.translate_axis (-0.5, Y_AXIS);
+      total.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length ()
+                        - 1.0, 0);
+    }
+  
+  total.translate_axis (left, X_AXIS);
+  return total.smobbed_copy ();
+}
+
+
+MAKE_SCHEME_CALLBACK(Volta_bracket_interface,after_line_breaking, 1);
+SCM
+Volta_bracket_interface::after_line_breaking (SCM smob)
+{
+  Spanner *me = unsmob_spanner (smob);
+  Spanner *orig_span = dynamic_cast<Spanner *> (me->original_);
+  bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] == (Spanner *)me);
+
+  bool broken_last_bracket = orig_span && (orig_span->broken_intos_.top () == (Spanner *)me);
+
+  bool no_vertical_start = orig_span && !broken_first_bracket;
+  bool no_vertical_end = orig_span && !broken_last_bracket;
+
+  extract_grob_set (me, "bars", bars);
+  Grob *endbar = bars.size () ? bars.top () : 0;
+  SCM glyph = endbar ? endbar->get_property ("glyph") : SCM_EOL;
+
+  String str;
+  if (scm_is_string (glyph))
+    str = ly_scm2string (glyph);
+  else
+    str = "|";
+
+  no_vertical_end
+    |= (str != ":|"
+       && str != "|:"
+       && str != "|."
+       && str != ":|:"
+       && str != ".|");
+
+
+  if (no_vertical_end || no_vertical_start)
+    {
+      Drul_array<Real> edge_height = robust_scm2interval (me->get_property ("edge-height"),
+                                                         Interval (1.0, 1.0));
+      if (no_vertical_start)
+       edge_height[LEFT] = 0.0;
+
+      if (no_vertical_end)
+       edge_height[RIGHT] = 0.0;
 
-      mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length ()
-                      - 1.0, 0);
+      me->set_property ("edge-height", ly_interval2scm (edge_height));
     }
-  mol.translate_axis (left, X_AXIS);
-  return mol.smobbed_copy ();
+  
+  return SCM_UNSPECIFIED;
 }
 
 void
index 210b4552a0594952334bc03208fe9b55038db84f..a3d4df37e0c86b668d38300eb2bd53e1c70873a3 100644 (file)
@@ -50,6 +50,7 @@
  "A bracket indicating a ligature in the original edition"
  '(width thickness height ligature-primitive-callback))
 
+
 (ly:add-interface
  'lyric-syllable-interface
  "a single piece of lyrics"
index 96de6cb51297e1bb53b4ecb3973f0d8eb61275bb..3214924d4a74f2f305c286e0b30498bf78591d90 100644 (file)
        (direction . 1)
        (meta . ((class . Spanner)
                 (interfaces . (ottava-bracket-interface
+                               horizontal-bracket-interface
                                line-interface
                                side-position-interface
                                font-interface
     (VoltaBracket
      . (
        (print-function . ,Volta_bracket_interface::print)
-       (direction . 1)
+       (after-line-breaking-callback . ,Volta_bracket_interface::after_line_breaking)
+       (direction . ,UP)
        (padding . 1)
        (font-encoding . fetaNumber)
        (Y-offset-callbacks . (,Side_position_interface::aligned_side))
        (thickness . 1.6)  ;;  linethickness
-       (height . 2.0) ;; staffspace;
+       (edge-height . (2.0 . 2.0)) ;; staffspace;
        (minimum-space . 5)
        (font-size . -4)
        (meta . ((class . Spanner)
                 (interfaces . (volta-bracket-interface
+                               horizontal-bracket-interface                            
                                line-interface
                                text-interface
+                               bracket-interface
                                side-position-interface
                                font-interface))))))