From: Han-Wen Nienhuys Date: Wed, 24 Jan 2007 01:28:19 +0000 (+0100) Subject: move zigzag to line-interface. X-Git-Tag: release/2.11.14-1~50 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=ac12cc20ac5fd477ddea0db8066f56e4dd8b06ea;p=lilypond.git move zigzag to line-interface. --- diff --git a/lily/include/line-interface.hh b/lily/include/line-interface.hh index 7746a735e8..ccbd83eba1 100644 --- a/lily/include/line-interface.hh +++ b/lily/include/line-interface.hh @@ -16,6 +16,9 @@ struct Line_interface { static Stencil line (Grob *me, Offset from, Offset to); DECLARE_GROB_INTERFACE(); + static Stencil zigzag_stencil (Grob *me, + Offset from, + Offset to); static Stencil make_dashed_line (Real th, Offset from, Offset to, Real, Real); static Stencil make_line (Real th, Offset from, Offset to); static Stencil make_arrow (Offset beg, Offset end, Real thick, diff --git a/lily/line-interface.cc b/lily/line-interface.cc index 894d1089cf..fcfa28e93c 100644 --- a/lily/line-interface.cc +++ b/lily/line-interface.cc @@ -31,6 +31,55 @@ Line_interface::make_arrow (Offset begin, Offset end, return Lookup::round_filled_polygon (points, thick); } +Stencil +Line_interface::zigzag_stencil (Grob *me, + Offset from, + Offset to) +{ + Offset dz = to -from; + + Real thick = Staff_symbol_referencer::line_thickness (me); + thick *= robust_scm2double (me->get_property ("thickness"), 1.0); // todo: staff sym referencer? + + Real staff_space = Staff_symbol_referencer::staff_space (me); + + Real w = robust_scm2double (me->get_property ("zigzag-width"), 1) * staff_space; + int count = (int) ceil (dz.length () / w); + w = dz.length () / count; + + Real l = robust_scm2double (me->get_property ("zigzag-length"), 1) * w; + Real h = l > w / 2 ? sqrt (l * l - w * w / 4) : 0; + + Offset rotation_factor = complex_exp (Offset (0, dz.arg ())); + + Offset points[3]; + points[0] = Offset (0, -h / 2); + points[1] = Offset (w / 2, h / 2); + points[2] = Offset (w, -h / 2); + for (int i = 0; i < 3; i++) + points[i] = complex_multiply (points[i], rotation_factor); + + Stencil squiggle (Line_interface::make_line (thick, points[0], points[1])); + squiggle.add_stencil (Line_interface::make_line (thick, points[1], points[2])); + + Stencil total; + for (int i = 0; i < count; i++) + { + Stencil moved_squiggle (squiggle); + moved_squiggle.translate (from + Offset (i * w, 0) * rotation_factor); + total.add_stencil (moved_squiggle); + } + + 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 Stencil (b, total.expr ()); +} + + Stencil Line_interface::make_dashed_line (Real thick, Offset from, Offset to, Real dash_period, Real dash_fraction) @@ -113,7 +162,10 @@ Line_interface::line (Grob *me, Offset from, Offset to) * robust_scm2double (me->get_property ("thickness"), 1); SCM type = me->get_property ("style"); - + if (type == ly_symbol2scm ("zigzag")) + { + return zigzag_stencil (me, from, to); + } Stencil stil; SCM dash_fraction = me->get_property ("dash-fraction"); @@ -153,6 +205,8 @@ ADD_INTERFACE (Line_interface, "dash-fraction " "thickness " "style " + "zigzag-length " + "zigzag-width " "arrow-length " "arrow-width ") diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index f6809cda26..0bbe92ad34 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -19,54 +19,6 @@ #include "lookup.hh" #include "line-interface.hh" -Stencil -zigzag_stencil (Grob *me, - Offset from, - Offset to) -{ - Offset dz = to -from; - - Real thick = Staff_symbol_referencer::line_thickness (me); - thick *= robust_scm2double (me->get_property ("thickness"), 1.0); // todo: staff sym referencer? - - Real staff_space = Staff_symbol_referencer::staff_space (me); - - Real w = robust_scm2double (me->get_property ("zigzag-width"), 1) * staff_space; - int count = (int) ceil (dz.length () / w); - w = dz.length () / count; - - Real l = robust_scm2double (me->get_property ("zigzag-length"), 1) * w; - Real h = l > w / 2 ? sqrt (l * l - w * w / 4) : 0; - - Offset rotation_factor = complex_exp (Offset (0, dz.arg ())); - - Offset points[3]; - points[0] = Offset (0, -h / 2); - points[1] = Offset (w / 2, h / 2); - points[2] = Offset (w, -h / 2); - for (int i = 0; i < 3; i++) - points[i] = complex_multiply (points[i], rotation_factor); - - Stencil squiggle (Line_interface::make_line (thick, points[0], points[1])); - squiggle.add_stencil (Line_interface::make_line (thick, points[1], points[2])); - - Stencil total; - for (int i = 0; i < count; i++) - { - Stencil moved_squiggle (squiggle); - moved_squiggle.translate (from + Offset (i * w, 0) * rotation_factor); - total.add_stencil (moved_squiggle); - } - - 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 Stencil (b, total.expr ()); -} - MAKE_SCHEME_CALLBACK (Line_spanner, after_line_breaking, 1); SCM Line_spanner::after_line_breaking (SCM g) @@ -117,9 +69,7 @@ Line_spanner::line_stencil (Grob *me, || type == ly_symbol2scm ("zigzag") || (type == ly_symbol2scm ("trill") && dz[Y_AXIS] != 0))) { - line = (type == ly_symbol2scm ("zigzag")) - ? zigzag_stencil (me, from, to) - : Line_interface::line (me, from, to); + line = Line_interface::line (me, from, to); } else if (scm_is_symbol (type) && type == ly_symbol2scm ("trill")) @@ -315,7 +265,5 @@ ADD_INTERFACE (Line_spanner, "arrow " "gap " "thickness " - "zigzag-length " - "zigzag-width " );