*/
#include <cstring>
+using namespace std;
#include "warn.hh"
#include "font-interface.hh"
#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