]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/line-spanner.cc
Nitpick run.
[lilypond.git] / lily / line-spanner.cc
index 3aaf75f2886d276d7f14ca8c13aa116d83691751..96841816a5d25e618b5fd20dc710f94c7981b1b3 100644 (file)
@@ -26,33 +26,46 @@ zigzag_stencil (Grob *me,
                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_property ("thickness"), 1.0); // todo: staff sym referencer? 
 
   Real staff_space = Staff_symbol_referencer::staff_space (me);
 
-  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"),
-                        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);
+  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, list);
+  return Stencil (b, total.expr ());
 }
 
 MAKE_SCHEME_CALLBACK (Line_spanner, after_line_breaking, 1);
@@ -95,6 +108,9 @@ Line_spanner::line_stencil (Grob *me,
 {
   Offset dz = to -from;
   SCM type = me->get_property ("style");
+
+  Stencil line;
+
   if (scm_is_symbol (type)
       && (type == ly_symbol2scm ("line")
          || type == ly_symbol2scm ("dashed-line")
@@ -102,7 +118,7 @@ Line_spanner::line_stencil (Grob *me,
          || type == ly_symbol2scm ("zigzag")
          || (type == ly_symbol2scm ("trill") && dz[Y_AXIS] != 0)))
     {
-      return (type == ly_symbol2scm ("zigzag"))
+      line = (type == ly_symbol2scm ("zigzag"))
        ? zigzag_stencil (me, from, to)
        : Line_interface::line (me, from, to);
     }
@@ -135,9 +151,13 @@ Line_spanner::line_stencil (Grob *me,
                             + mol.extent (Y_AXIS).length ()) / 2, Y_AXIS);
 
       mol.translate (from);
-      return mol;
+      line = mol;
     }
-  return Stencil ();
+
+  if (to_boolean (me->get_property ("arrow")))
+    line.add_stencil (Line_interface::arrows (me, from, to, false, true));
+
+  return line;
 }
 
 /*
@@ -181,7 +201,7 @@ Line_spanner::print (SCM smob)
 
   Real gap = robust_scm2double (me->get_property ("gap"), 0.0);
 
-  Offset ofxy (gap, 0); /*offset from start point to start of line*/
+  Offset ofxy (gap, 0); /* offset from start point to start of line */
   Offset dxy;
   Offset my_off;
   Offset his_off;
@@ -288,5 +308,5 @@ ADD_INTERFACE (Line_spanner, "line-spanner-interface",
               "@code{dashed-line}, @code{trill}, \n"
               "@code{dotted-line} or @code{zigzag}.\n"
               "\n",
-              "gap zigzag-width zigzag-length thickness");
+              "gap zigzag-width zigzag-length thickness arrow");