X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-bracket.cc;h=9ac2b44637f5fab3d24cd0d6235ea384d6faada9;hb=f94e2ee62c8915158af82047acaf49b6165bf88a;hp=ffe9e5b887fc451117fcdc22f3a9f0862f12e3a6;hpb=2210b90dc27efb3abd756dfccd9048785130ad4a;p=lilypond.git diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index ffe9e5b887..9ac2b44637 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -1,25 +1,38 @@ /* - volta-bracket.cc -- implement Volta_bracket_interface + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2015 Jan Nieuwenhuizen - (c) 1997--2002 Jan Nieuwenhuizen + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ -#include +#include +using namespace std; -#include "box.hh" -#include "debug.hh" +#include "warn.hh" #include "font-interface.hh" -#include "molecule.hh" +#include "line-interface.hh" #include "paper-column.hh" -#include "paper-def.hh" -#include "text-item.hh" +#include "output-def.hh" +#include "text-interface.hh" #include "volta-bracket.hh" -#include "group-interface.hh" +#include "pointer-group-interface.hh" #include "side-position-interface.hh" #include "directional-element-interface.hh" - +#include "lookup.hh" +#include "tuplet-bracket.hh" +#include "lily-imports.hh" /* this is too complicated. Yet another version of side-positioning, @@ -28,103 +41,138 @@ -- * Should look for system_start_delim to find left edge of staff. - -*/ + */ -MAKE_SCHEME_CALLBACK (Volta_bracket_interface,brew_molecule,1); +MAKE_SCHEME_CALLBACK (Volta_bracket_interface, print, 1); SCM -Volta_bracket_interface::brew_molecule (SCM smob) +Volta_bracket_interface::print (SCM smob) { - Grob *me = unsmob_grob (smob); - Link_array bar_arr - = Pointer_group_interface__extract_grobs (me, (Item*)0, "bars"); - - if (!bar_arr.size ()) - return SCM_EOL; - - Spanner *orig_span = dynamic_cast (me->original_l_); + Spanner *me = unsmob (smob); + Spanner *orig_span = dynamic_cast (me->original ()); + bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] + == (Spanner *)me); - bool first_bracket = orig_span && (orig_span->broken_into_l_arr_[0] == (Spanner*)me); - - bool last_bracket = orig_span && (orig_span->broken_into_l_arr_.top () == (Spanner*)me); + Output_def *layout = me->layout (); - bool no_vertical_start = orig_span && !first_bracket; - bool no_vertical_end = orig_span && !last_bracket; - SCM bars = me->get_grob_property ("bars"); - Grob * endbar = unsmob_grob (ly_car (bars)); - SCM glyph = endbar->get_grob_property("glyph"); - String str = ly_scm2string(glyph); - const char* cs = str.ch_C(); - no_vertical_end |= - (strcmp(cs,":|")!=0 && strcmp(cs,"|:")!=0 && strcmp(cs,"|.")!=0 - && strcmp(cs,":|:")!=0 && strcmp(cs,".|")!=0); - - Real staff_thick = me->paper_l ()->get_var ("linethickness"); - Real half_space = 0.5; - - Item * bound = dynamic_cast (me)->get_bound (LEFT); + Item *bound = dynamic_cast (me)->get_bound (LEFT); /* - not a start, but really broken in two - */ - Real left =0.; + If the volta bracket appears after a line-break, make + it start after the prefatory matter. + */ + Real left = 0.; if (bound->break_status_dir () == RIGHT) - { - Paper_column *pc = bound->column_l (); - left = pc->extent (pc, X_AXIS)[RIGHT] - bound->relative_coordinate (pc, X_AXIS); - } + { + Paper_column *pc = bound->get_column (); + left = pc->break_align_width (pc, ly_symbol2scm ("break-alignment"))[RIGHT] + // For some reason, break_align_width is relative to + // the x-parent of the column. + - bound->relative_coordinate (pc->get_parent (X_AXIS), X_AXIS); + } else - { - /* - the volta spanner is attached to the bar-line, which is moved - to the right. We don't need to compensate for the left edge. - */ - } + { + /* + the volta spanner is attached to the bar-line, which is moved + to the right. We don't need to compensate for the left edge. + */ + } + + modify_edge_height (me); + if (!me->is_live ()) + return SCM_EOL; - Real w = dynamic_cast (me)->spanner_length () - left - half_space; - Real h = gh_scm2double (me->get_grob_property ("height")); - Real t = staff_thick * gh_scm2double (me->get_grob_property ("thickness")); + 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; /* - ugh: should build from line segments. - */ - SCM at = (scm_list_n (ly_symbol2scm ("volta"), - gh_double2scm (h), - gh_double2scm (w), - gh_double2scm (t), - gh_int2scm (no_vertical_start), - gh_int2scm (no_vertical_end), - SCM_UNDEFINED)); - - Box b (Interval (0, w), Interval (0, h)); - Molecule mol (b, at); - SCM text = me->get_grob_property ("text"); - SCM properties = scm_list_n (me->mutable_property_alist_, - me->immutable_property_alist_,SCM_UNDEFINED); - Molecule num = Text_item::text2molecule (me, text, properties); - - mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () - - 1.0); - mol.translate_axis (left, X_AXIS); - return mol.smobbed_copy (); + 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); + Stencil num = *unsmob (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 (); } - void -Volta_bracket_interface::add_bar (Grob *me, Item* b) +Volta_bracket_interface::modify_edge_height (Spanner *me) { - Pointer_group_interface::add_grob (me, ly_symbol2scm ("bars"), b); - Side_position_interface::add_support (me,b); - add_bound_item (dynamic_cast (me), b); + 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 |= ly_scm2bool (Lily::volta_bracket_calc_hook_visibility + (ly_string2scm (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)); + } + + if (broken_last_bracket && no_vertical_end && no_vertical_start + && !broken_first_bracket) + me->suicide (); } void -Volta_bracket_interface::add_column (Grob*me, Grob* c) +Volta_bracket_interface::add_bar (Grob *me, Item *b) { - Side_position_interface::add_support (me,c); + Pointer_group_interface::add_grob (me, ly_symbol2scm ("bars"), b); + add_bound_item (dynamic_cast (me), b); } -ADD_INTERFACE (Volta_bracket_interface,"volta-bracket-interface", - "Volta bracket with number", - "bars thickness height"); +ADD_INTERFACE (Volta_bracket_interface, + "Volta bracket with number.", + + /* properties */ + "bars " + "thickness " + "height " + "shorten-pair " + );