]> git.donarmstrong.com Git - lilypond.git/commitdiff
move zigzag to line-interface.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 24 Jan 2007 01:28:19 +0000 (02:28 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 24 Jan 2007 01:28:19 +0000 (02:28 +0100)
lily/include/line-interface.hh
lily/line-interface.cc
lily/line-spanner.cc

index 7746a735e8ed9c0c8a297ff393bb200149f1345a..ccbd83eba121f648bd21e483a9ec02b4afef01c3 100644 (file)
@@ -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,
index 894d1089cfa6a545cad8835a7ca96c88b0a49b16..fcfa28e93cf3d86b6e47daa5826deb16059ab47b 100644 (file)
@@ -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 ")
 
index f6809cda266d7f69ffb33487cbe018f2d90129b3..0bbe92ad3480d53485e1919209d0e8ed7397fe6c 100644 (file)
 #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 "
               );