X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-bracket.cc;h=494cbfb1c336ec74d2d62e56abbe92bee02f5402;hb=079be3c9a14d13e594cb1c1924058322a93ca1b5;hp=6899cba2c1cf1286993a7fced9ed02d8e8554f45;hpb=2c22efe5a46a37065b10c3f51c5d7db00d07d318;p=lilypond.git diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index 6899cba2c1..494cbfb1c3 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -3,10 +3,11 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Jan Nieuwenhuizen + (c) 1997--2008 Jan Nieuwenhuizen */ #include +using namespace std; #include "warn.hh" #include "font-interface.hh" @@ -19,6 +20,7 @@ #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, @@ -33,32 +35,12 @@ 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; - - 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 = "|"; - - char const *cs = str.to_str0 (); - no_vertical_end - |= (strcmp (cs, ":|") != 0 && strcmp (cs, "|:") != 0 && strcmp (cs, "|.") != 0 - && strcmp (cs, ":|:") != 0 && strcmp (cs, ".|") != 0); - - Output_def *layout = me->get_layout (); + 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); + + Output_def *layout = me->layout (); Real half_space = 0.5; Item *bound = dynamic_cast (me)->get_bound (LEFT); @@ -70,7 +52,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 { @@ -80,49 +63,110 @@ 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)); - - if (!no_vertical_end) - end = Line_interface::line (me, Offset (w, 0), Offset (w, h)); - - Stencil mol = Line_interface::line (me, Offset (0, h), Offset (w, h)); - mol.add_stencil (start); - mol.add_stencil (end); + modify_edge_height (me); + if (!me->is_live ()) + return SCM_EOL; + + 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)); + + + + scale_drul (&edge_height, - Real (get_grob_direction (me))); + + 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 text = me->get_property ("text"); SCM properties = me->get_property_alist_chain (SCM_EOL); - SCM snum = Text_interface::interpret_markup (layout->self_scm (), properties, text); + 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); + } + + total.translate_axis (left, X_AXIS); + return total.smobbed_copy (); +} - mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () - - 1.0, 0); + +void +Volta_bracket_interface::modify_edge_height (Spanner *me) +{ + 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_.back () == (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.back () : 0; + SCM glyph = endbar ? endbar->get_property ("glyph-name") : SCM_EOL; + + string str; + if (scm_is_string (glyph)) + str = ly_scm2string (glyph); + else + str = "|"; + + no_vertical_end + |= (str != ":|" + && str != "|:" + && 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; + + me->set_property ("edge-height", ly_interval2scm (edge_height)); } - mol.translate_axis (left, X_AXIS); - return mol.smobbed_copy (); + + if (broken_last_bracket && no_vertical_end && no_vertical_start + && !broken_first_bracket) + me->suicide (); } void Volta_bracket_interface::add_bar (Grob *me, Item *b) { Pointer_group_interface::add_grob (me, ly_symbol2scm ("bars"), b); - Side_position_interface::add_support (me, b); add_bound_item (dynamic_cast (me), b); } -void -Volta_bracket_interface::add_column (Grob *me, Grob *c) -{ - Side_position_interface::add_support (me, c); -} +ADD_INTERFACE (Volta_bracket_interface, + "Volta bracket with number.", -ADD_INTERFACE (Volta_bracket_interface, "volta-bracket-interface", - "Volta bracket with number", - "bars thickness height"); + /* properties */ + "bars " + "thickness " + "height " + );