X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fline-spanner.cc;h=e7e59d525948f9fc7186aa8f3eff8dbceded1dcc;hb=5cc390968095201b69f142ad01842ac3f08144a2;hp=03a201fa37f36b5280aa93cd56210aea7fe75db3;hpb=e8936ee66fdd3e7ebe30556590e8dc913908a533;p=lilypond.git diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index 03a201fa37..e7e59d5259 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -3,9 +3,11 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2003 Jan Nieuwenhuizen + (c) 2000--2004 Jan Nieuwenhuizen */ +#include + #include "molecule.hh" #include "item.hh" #include "spanner.hh" @@ -16,73 +18,25 @@ #include "font-interface.hh" #include "warn.hh" #include "align-interface.hh" +#include "lookup.hh" +#include "line-interface.hh" -#include - -/* - TODO: convert all Molecule functions to taking arguments of the form - - Offset FROM, Offset TO. - - - TODO: +Molecule +zigzag_molecule (Grob *me, + Offset from, + Offset to) +{ + Offset dz = to -from; + Real dx = dz[X_AXIS]; + Real dy = dz[Y_AXIS]; - Introduce line-interface that allows dots/dashes/etc. to be set as - grob-properties. Make arbitrary paths. + Real thick = Staff_symbol_referencer::line_thickness (me); + thick *= robust_scm2double (me->get_grob_property ("thickness"), 1.0); // todo: staff sym referencer? - */ - -/* - slightishly clumsy interface? - - Make a Scheme expression for a line going from (0,0) to (dx,dy). - */ - -static SCM -line_atom (Grob *me, Real thick, Real dx, Real dy) -{ - SCM type = me->get_grob_property ("style"); Real staff_space = Staff_symbol_referencer::staff_space (me); - - // maybe these should be in line-thickness? - Real length = staff_space; - SCM s = me->get_grob_property ("dash-length"); - if (gh_number_p (s)) - length = gh_scm2double (s) * staff_space; - - Real period = 2 * length + thick; - s = me->get_grob_property ("dash-period"); - if (gh_number_p (s)) - period = gh_scm2double (s) * staff_space; - - if (type == ly_symbol2scm ("dotted-line")) - length = thick; - - if (type == ly_symbol2scm ("line")) - length = period + thick; - - Real on = length - thick; - Real off = period - on; - - SCM list = scm_list_n (ly_symbol2scm ("dashed-line"), - gh_double2scm (thick), - gh_double2scm (on), - gh_double2scm (off), - gh_double2scm (dx), - gh_double2scm (dy), - SCM_UNDEFINED); - - return list; -} -static SCM -zigzag_atom (Grob *me, Real thick, Real dx, Real dy) -{ - Real staff_space = Staff_symbol_referencer::staff_space (me); - SCM ws = me->get_grob_property ("zigzag-width"); - SCM ls = me->get_grob_property ("zigzag-length"); - double w = (gh_number_p(ws) ? gh_scm2double(ws) : 1)*staff_space; - double l = (gh_number_p(ls) ? gh_scm2double(ls) : 1)*w; + 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; SCM list = scm_list_n (ly_symbol2scm ("zigzag-line"), @@ -93,8 +47,13 @@ zigzag_atom (Grob *me, Real thick, Real dx, Real dy) gh_double2scm (dx), gh_double2scm (dy), SCM_UNDEFINED); - - return list; + Box b; + 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); } MAKE_SCHEME_CALLBACK(Line_spanner, after_line_breaking, 1); @@ -125,7 +84,7 @@ Line_spanner::after_line_breaking (SCM g) /* Can't do suicide, since this mucks up finding the trend. */ - me->set_grob_property ("molecule-callback", SCM_EOL); + me->set_grob_property ("print-function", SCM_EOL); } return SCM_EOL; @@ -133,12 +92,11 @@ Line_spanner::after_line_breaking (SCM g) Molecule -Line_spanner::line_molecule (Grob *me, Real thick, +Line_spanner::line_molecule (Grob *me, Offset from, Offset to) { Offset dz = to -from ; - Molecule mol; SCM type = me->get_grob_property ("style"); if (gh_symbol_p (type) && (type == ly_symbol2scm ("line") @@ -147,18 +105,9 @@ Line_spanner::line_molecule (Grob *me, Real thick, || type == ly_symbol2scm ("zigzag") || (type == ly_symbol2scm ("trill") && dz[Y_AXIS] != 0))) { - Box b; - b.add_point (Offset (0,0)); - b.add_point (dz); - b[X_AXIS].widen (thick/2); - b[Y_AXIS].widen (thick/2); - - SCM atom = (type == ly_symbol2scm ("zigzag")) - ? zigzag_atom (me, thick, dz[X_AXIS], dz[Y_AXIS]) - : line_atom (me, thick, dz[X_AXIS], dz[Y_AXIS]); - - mol = Molecule (b, atom); - mol.translate (from); + return (type == ly_symbol2scm ("zigzag")) + ? zigzag_molecule (me, from, to) + : Line_interface::line (me, from, to); } else if (gh_symbol_p (type) && type == ly_symbol2scm ("trill")) @@ -168,10 +117,12 @@ Line_spanner::line_molecule (Grob *me, Real thick, ly_symbol2scm ("music")), SCM_UNDEFINED); - Font_metric *fm = Font_interface::get_font (me, + 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; + do mol.add_at_edge (X_AXIS, RIGHT, m, 0,0); while (m.extent (X_AXIS).length () @@ -186,9 +137,9 @@ Line_spanner::line_molecule (Grob *me, Real thick, + mol.extent (Y_AXIS).length ())/2, Y_AXIS); mol.translate (from); + return mol; } - - return mol; + return Molecule(); } /* @@ -221,9 +172,9 @@ line_spanner_common_parent (Grob *me) */ -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)); @@ -231,18 +182,13 @@ Line_spanner::brew_molecule (SCM smob) me->get_bound (RIGHT)); - Real gap = gh_scm2double (me->get_grob_property ("gap")); + Real gap = robust_scm2double (me->get_grob_property ("gap"), 0.0); Offset ofxy (gap, 0); /*offset from start point to start of line*/ Offset dxy ; Offset my_off; Offset his_off; - Real thick = me->get_paper ()->get_realvar (ly_symbol2scm ("linethickness")); - - SCM s = me->get_grob_property ("thickness"); - if (gh_number_p (s)) - thick *= gh_scm2double (s); if (bound[RIGHT]->break_status_dir()) { @@ -299,7 +245,7 @@ Line_spanner::brew_molecule (SCM smob) dz = (dz.length () - 2*gap) *dir; - Molecule l (line_molecule (me, thick, Offset(0, 0), dz)); + Molecule l (line_molecule (me, Offset(0, 0), dz)); l.translate (dir * gap + p1 - Offset (me->relative_coordinate (commonx, X_AXIS), @@ -334,7 +280,7 @@ Line_spanner::brew_molecule (SCM smob) ofxy = dxy * (off/dxy.length ()); dxy -= 2*ofxy; - Molecule line = line_molecule (me, thick, Offset (0,0),dxy); + Molecule line = line_molecule (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); @@ -348,6 +294,6 @@ ADD_INTERFACE (Line_spanner, "line-spanner-interface", "gap is measured in staff-spaces.\n" "The property 'type is one of: line, dashed-line, trill, dotted-line or zigzag.\n" "\n", - "gap dash-period dash-length zigzag-width zigzag-length thickness style"); + "gap zigzag-width zigzag-length thickness");