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
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
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);
(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"),
// 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;
}
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 ();
}
#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 *);
};
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);
};
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");
#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,
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;
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
{
*/
}
- 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)
{
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
"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"
(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))))))