X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fline-spanner.cc;h=c7b2677f5d478ddda5d0d7e0cd2b8ad4e50e5dcc;hb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;hp=c73fd28948185a5cd6f52e1da7674d3f1d92bd39;hpb=7e72a1e50e94a7f9738d62599de79fe7745f600c;p=lilypond.git diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index c73fd28948..c7b2677f5d 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -3,16 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2004 Jan Nieuwenhuizen + (c) 2000--2005 Jan Nieuwenhuizen */ +#include "line-spanner.hh" + #include -#include "molecule.hh" -#include "item.hh" #include "spanner.hh" -#include "line-spanner.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "paper-column.hh" #include "staff-symbol-referencer.hh" #include "font-interface.hh" @@ -21,47 +20,47 @@ #include "lookup.hh" #include "line-interface.hh" -Molecule -zigzag_molecule (Grob *me, - Offset from, - Offset to) +Stencil +zigzag_stencil (Grob *me, + Offset from, + Offset to) { Offset dz = to -from; Real dx = dz[X_AXIS]; Real dy = dz[Y_AXIS]; Real thick = Staff_symbol_referencer::line_thickness (me); - thick *= robust_scm2double (me->get_grob_property ("thickness"), 1.0); // todo: staff sym referencer? - + thick *= robust_scm2double (me->get_property ("thickness"), 1.0); // todo: staff sym referencer? + Real staff_space = Staff_symbol_referencer::staff_space (me); - double w = robust_scm2double (me->get_grob_property ("zigzag-width"), 1)*staff_space; - double l = robust_scm2double ( me->get_grob_property ("zigzag-length"), 1)* w; - double h = l>w/2 ? sqrt(l*l-w*w/4) : 0; - + double w = robust_scm2double (me->get_property ("zigzag-width"), 1)*staff_space; + double l = robust_scm2double (me->get_property ("zigzag-length"), 1)* w; + double h = l > w / 2 ? sqrt (l*l - w*w / 4) : 0; + SCM list = scm_list_n (ly_symbol2scm ("zigzag-line"), - gh_bool2scm (true), - gh_double2scm (w), - gh_double2scm (h), - gh_double2scm (thick), - gh_double2scm (dx), - gh_double2scm (dy), - SCM_UNDEFINED); + ly_bool2scm (true), + scm_make_real (w), + scm_make_real (h), + scm_make_real (thick), + scm_make_real (dx), + scm_make_real (dy), + SCM_UNDEFINED); Box b; - b.add_point (Offset (0,0)); + b.add_point (Offset (0, 0)); b.add_point (dz); - b[X_AXIS].widen (thick/2); - b[Y_AXIS].widen (thick/2); - - return Molecule (b, list); + b[X_AXIS].widen (thick / 2); + b[Y_AXIS].widen (thick / 2); + + return Stencil (b, list); } -MAKE_SCHEME_CALLBACK(Line_spanner, after_line_breaking, 1); +MAKE_SCHEME_CALLBACK (Line_spanner, after_line_breaking, 1); SCM -Line_spanner::after_line_breaking (SCM g) +Line_spanner::after_line_breaking (SCM g) { - Grob *me = unsmob_grob (g); - Spanner*sp = dynamic_cast (me); + Grob *me = unsmob_grob (g); + Spanner *sp = dynamic_cast (me); /* We remove the line at the start of the line. For piano voice @@ -76,80 +75,79 @@ Line_spanner::after_line_breaking (SCM g) space left of a note at the start of a line is very small. --hwn. - - */ - if (sp->get_bound (LEFT)->break_status_dir() - && !sp->get_bound (RIGHT)->break_status_dir()) + + */ + if (sp->get_bound (LEFT)->break_status_dir () + && !sp->get_bound (RIGHT)->break_status_dir ()) { /* Can't do suicide, since this mucks up finding the trend. - */ - me->set_grob_property ("molecule-callback", SCM_EOL); - + */ + me->set_property ("print-function", SCM_EOL); + } return SCM_EOL; } - -Molecule -Line_spanner::line_molecule (Grob *me, - Offset from, - Offset to) +Stencil +Line_spanner::line_stencil (Grob *me, + Offset from, + Offset to) { - Offset dz = to -from ; - SCM type = me->get_grob_property ("style"); - if (gh_symbol_p (type) + Offset dz = to -from; + SCM type = me->get_property ("style"); + if (scm_is_symbol (type) && (type == ly_symbol2scm ("line") || type == ly_symbol2scm ("dashed-line") || type == ly_symbol2scm ("dotted-line") - || type == ly_symbol2scm ("zigzag") + || type == ly_symbol2scm ("zigzag") || (type == ly_symbol2scm ("trill") && dz[Y_AXIS] != 0))) { - return (type == ly_symbol2scm ("zigzag")) - ? zigzag_molecule (me, from, to) + return (type == ly_symbol2scm ("zigzag")) + ? zigzag_stencil (me, from, to) : Line_interface::line (me, from, to); } - else if (gh_symbol_p (type) + else if (scm_is_symbol (type) && type == ly_symbol2scm ("trill")) { - SCM alist_chain = Font_interface::font_alist_chain (me); - SCM style_alist = scm_list_n (gh_cons (ly_symbol2scm ("font-family"), - ly_symbol2scm ("music")), + SCM alist_chain = Font_interface::text_font_alist_chain (me); + SCM style_alist = scm_list_n (scm_cons (ly_symbol2scm ("font-encoding"), + ly_symbol2scm ("fetaMusic")), SCM_UNDEFINED); - - Font_metric *fm = select_font (me->get_paper (), - gh_cons (style_alist, - alist_chain)); - Molecule m = fm->find_by_name ("scripts-trill-element"); - Molecule mol; + + Font_metric *fm = select_font (me->get_layout (), + scm_cons (style_alist, + alist_chain)); + Stencil m = fm->find_by_name ("scripts.trill_element"); + Stencil mol; do - mol.add_at_edge (X_AXIS, RIGHT, m, 0,0); + mol.add_at_edge (X_AXIS, RIGHT, m, 0, 0); while (m.extent (X_AXIS).length () && mol.extent (X_AXIS).length () + m.extent (X_AXIS).length () < dz[X_AXIS]); /* FIXME: should center element on x/y - */ + */ mol.translate_axis (m.extent (X_AXIS).length () / 2, X_AXIS); - mol.translate_axis (-(mol.extent (Y_AXIS)[DOWN] - + mol.extent (Y_AXIS).length ())/2, Y_AXIS); + mol.translate_axis (- (mol.extent (Y_AXIS)[DOWN] + + mol.extent (Y_AXIS).length ()) / 2, Y_AXIS); mol.translate (from); return mol; } - return Molecule(); + return Stencil (); } /* Find a common Y parent, which --if found-- should be the fixed-distance alignment. - */ +*/ Grob * line_spanner_common_parent (Grob *me) { - Grob * common = find_fixed_alignment_parent (me); + Grob *common = find_fixed_alignment_parent (me); if (!common) { common = Staff_symbol_referencer::get_staff_symbol (me); @@ -165,135 +163,131 @@ line_spanner_common_parent (Grob *me) /* Warning: this thing is a cross-staff object, so it should have empty Y-dimensions. - (If not, you risk that this is called from the staff-alignment - routine, via molecule_extent. At this point, the staves aren't + (If not, you risk that this is called from the staff-alignment + routine, via stencil_extent. At this point, the staves aren't separated yet, so it doesn't work cross-staff. + (huh? crossable staves have fixed distance? --hwn) */ - -MAKE_SCHEME_CALLBACK (Line_spanner, brew_molecule, 1); +MAKE_SCHEME_CALLBACK (Line_spanner, print, 1); SCM -Line_spanner::brew_molecule (SCM smob) +Line_spanner::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = dynamic_cast (unsmob_grob (smob)); - Drul_array bound (me->get_bound (LEFT), + Drul_array bound (me->get_bound (LEFT), me->get_bound (RIGHT)); - - - Real gap = robust_scm2double (me->get_grob_property ("gap"), 0.0); + + Real gap = robust_scm2double (me->get_property ("gap"), 0.0); Offset ofxy (gap, 0); /*offset from start point to start of line*/ - Offset dxy ; + Offset dxy; Offset my_off; Offset his_off; - - if (bound[RIGHT]->break_status_dir()) + if (bound[RIGHT]->break_status_dir ()) { if (bound[LEFT]->break_status_dir ()) { programming_error ("line-spanner with two broken ends. Farewell sweet world."); - me->suicide(); + me->suicide (); return SCM_EOL; } /* This is hairy. For the normal case, we simply find common parents, and draw a line between the bounds. When two note - heads are on different lines, there is no common parent + heads are on different systems, there is no common parent anymore. We have to find the piano-staff object. */ - + int k = broken_spanner_index (me); - Spanner *parent_sp = dynamic_cast (me->original_); - Spanner *next_sp = parent_sp->broken_intos_ [k+1]; + Spanner *parent_sp = dynamic_cast (me->original_); + Spanner *next_sp = parent_sp->broken_intos_ [k + 1]; Item *next_bound = next_sp->get_bound (RIGHT); if (next_bound->break_status_dir ()) { programming_error ("no note heads for the line spanner on next line?" " Confused."); - me->suicide(); + me->suicide (); return SCM_EOL; } - + Grob *commonx = bound[LEFT]->common_refpoint (bound[RIGHT], X_AXIS); commonx = me->common_refpoint (commonx, X_AXIS); - + Grob *next_common_y = line_spanner_common_parent (next_bound); Grob *this_common_y = line_spanner_common_parent (bound[LEFT]); Grob *all_common_y = me->common_refpoint (this_common_y, Y_AXIS); - - Interval next_ext = next_bound->extent (next_common_y, Y_AXIS); - Interval this_ext = bound[LEFT]->extent (this_common_y, Y_AXIS); + + Interval next_ext = next_bound->extent (next_common_y, Y_AXIS); + Interval this_ext = bound[LEFT]->extent (this_common_y, Y_AXIS); Real yoff = this_common_y->relative_coordinate (all_common_y, Y_AXIS); - + Offset p1 (bound[LEFT]->extent (commonx, X_AXIS)[RIGHT], - this_ext.center () + yoff); + this_ext.center () + yoff); Offset p2 (bound[RIGHT]->extent (commonx, X_AXIS)[LEFT], next_ext.center () + yoff); - + Offset dz (p2 -p1); Real len = dz.length (); - Offset dir = dz *(1/ len); + Offset dir = dz * (1/ len); dz = (dz.length () - 2*gap) *dir; - - - Molecule l (line_molecule (me, Offset(0, 0), dz)); - l.translate (dir * gap + p1 + Stencil l (line_stencil (me, Offset (0, 0), dz)); + + l.translate (dir * gap + p1 - Offset (me->relative_coordinate (commonx, X_AXIS), me->relative_coordinate (all_common_y, Y_AXIS))); - return l.smobbed_copy (); + return l.smobbed_copy (); } else { Grob *common[] = { me, me }; - for (int a = X_AXIS; a < NO_AXES; a++) + for (int a = X_AXIS; a < NO_AXES; a++) { common[a] = me->common_refpoint (bound[RIGHT], Axis (a)); common[a] = common[a]->common_refpoint (bound[LEFT], Axis (a)); } // distance from center to start of line - Real off = gap + ((bound[LEFT]->extent (bound[LEFT], X_AXIS).length ()*3)/4); + Real off = gap + ((bound[LEFT]->extent (bound[LEFT], X_AXIS).length ()*3) / 4); for (int a = X_AXIS; a < NO_AXES; a++) { Axis ax = (Axis)a; - dxy[ax] = - + bound[RIGHT]->extent (common[X_AXIS], ax).center () + dxy[ax] + = + bound[RIGHT]->extent (common[X_AXIS], ax).center () - bound[LEFT]->extent (common[X_AXIS], ax).center (); - my_off[ax] =me->relative_coordinate (common[a], ax); + my_off[ax] = me->relative_coordinate (common[a], ax); his_off[ax] = bound[LEFT]->relative_coordinate (common[a], ax); - + } - ofxy = dxy * (off/dxy.length ()); + ofxy = dxy * (off / dxy.length ()); dxy -= 2*ofxy; - - Molecule line = line_molecule (me, Offset (0,0),dxy); - line.translate_axis (bound[LEFT]->extent (bound[LEFT], X_AXIS).length ()/2, X_AXIS); + Stencil line = line_stencil (me, Offset (0, 0), dxy); + + line.translate_axis (bound[LEFT]->extent (bound[LEFT], X_AXIS).length () / 2, X_AXIS); line.translate (ofxy - my_off + his_off); return line.smobbed_copy (); } } - ADD_INTERFACE (Line_spanner, "line-spanner-interface", - "Generic line drawn between two objects, eg. for use with glissandi.\n" -"gap is measured in staff-spaces.\n" -"The property 'type is one of: line, dashed-line, trill, dotted-line or zigzag.\n" -"\n", - "gap zigzag-width zigzag-length thickness"); - + "Generic line drawn between two objects, e.g. for use with glissandi.\n" + "The property @code{style} can be @code{line}, " + "@code{dashed-line}, @code{trill}, \n" + "@code{dotted-line} or @code{zigzag}.\n" + "\n", + "gap zigzag-width zigzag-length thickness");