From: Han-Wen Nienhuys Date: Mon, 10 Oct 2005 13:08:13 +0000 (+0000) Subject: * lily/volta-bracket.cc (after_line_breaking): new function. Set X-Git-Tag: release/2.7.13~34 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=48060abd765e6d6346e644535fff58b5479d9d0e;p=lilypond.git * 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/define-grobs.scm (all-grob-descriptions): set between-length-limit to 1.0 --- diff --git a/ChangeLog b/ChangeLog index bddcc87f9e..967f1f0d6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2005-10-10 Han-Wen Nienhuys + * 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 diff --git a/lily/enclosing-bracket.cc b/lily/enclosing-bracket.cc index 90b9211c63..c75d5daaa4 100644 --- a/lily/enclosing-bracket.cc +++ b/lily/enclosing-bracket.cc @@ -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); diff --git a/lily/horizontal-bracket.cc b/lily/horizontal-bracket.cc index f3abaa5e61..fc19ab7bac 100644 --- a/lily/horizontal-bracket.cc +++ b/lily/horizontal-bracket.cc @@ -6,25 +6,23 @@ (c) 2002--2005 Han-Wen Nienhuys */ -#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 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 edge_height = robust_scm2interval (me->get_property ("edge-height"), Interval (1.0, 1.0)); Drul_array 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 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 (); } diff --git a/lily/include/horizontal-bracket.hh b/lily/include/horizontal-bracket.hh index 2645f21798..a71c8a00b4 100644 --- a/lily/include/horizontal-bracket.hh +++ b/lily/include/horizontal-bracket.hh @@ -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, Axis, Direction); + static Stencil make_bracket (Grob *, Real, Axis, Direction); + static Stencil make_enclosing_bracket (Grob *me, Grob *refpoint, + Link_array grobs, + Axis a, Direction dir); static bool has_interface (Grob *); }; diff --git a/lily/include/volta-bracket.hh b/lily/include/volta-bracket.hh index 227c09dce6..3f8f2e081f 100644 --- a/lily/include/volta-bracket.hh +++ b/lily/include/volta-bracket.hh @@ -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); }; diff --git a/lily/ottava-bracket.cc b/lily/ottava-bracket.cc index a9df448d62..f025a6f0c7 100644 --- a/lily/ottava-bracket.cc +++ b/lily/ottava-bracket.cc @@ -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"); diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index 36b7e5cf0d..4237aed303 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -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 (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 (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 (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 edge_height = robust_scm2interval (me->get_property ("edge-height"), + Interval (1.0, 1.0)); + Drul_array flare = robust_scm2interval (me->get_property ("bracket-flare"), + Interval (0, 0)); + Drul_array 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 (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 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 diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index 210b4552a0..a3d4df37e0 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -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" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 96de6cb512..3214924d4a 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1000,6 +1000,7 @@ (direction . 1) (meta . ((class . Spanner) (interfaces . (ottava-bracket-interface + horizontal-bracket-interface line-interface side-position-interface font-interface @@ -1683,18 +1684,21 @@ (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))))))