]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/line-interface.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / line-interface.cc
index cac08cc08e607b2191d83e12851377f2fbd9de2c..6401b3896ae942ced9333c9b101ab43582275ef4 100644 (file)
-/*   
-line-interface.cc --  implement Line_interface
-
-source file of the GNU LilyPond music typesetter
+/*
+  line-interface.cc -- implement Line_interface
 
-(c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  source file of the GNU LilyPond music typesetter
 
- */
+  (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
 
 #include "line-interface.hh"
-#include "molecule.hh"
-#include "grob.hh"
+
 #include "staff-symbol-referencer.hh"
 #include "lookup.hh"
+#include "output-def.hh"
+
+Stencil
+Line_interface::make_arrow (Offset begin, Offset end,
+                           Real thick,
+                           Real length, Real width)
+{
+  Real angle = (end - begin).arg ();
+  vector<Offset> points;
 
+  points.push_back (Offset (0, 0));
+  points.push_back (Offset (-length, width));
+  points.push_back (Offset (-length, -width));
 
+  for (vsize i = 0; i < points.size (); i++)
+    points[i] = points[i] * complex_exp (Offset (0, angle)) + end;
 
-Molecule
+  return Lookup::round_filled_polygon (points, thick);
+}
+
+Stencil
 Line_interface::make_dashed_line (Real thick, Offset from, Offset to,
-                            Real dash_period, Real dash_fraction)
+                                 Real dash_period, Real dash_fraction)
 {
-  dash_fraction = (dash_fraction >? 0) <? 1.0;
-  Real on = dash_fraction * dash_period + thick; 
+  dash_fraction = min (max (dash_fraction, 0.0), 1.0);
+  Real on = dash_fraction * dash_period + thick;
   Real off = dash_period - on;
-  
+
   SCM at = scm_list_n (ly_symbol2scm ("dashed-line"),
-                       gh_double2scm (thick), 
-                       gh_double2scm (on),
-                       gh_double2scm (off),
-                       gh_double2scm (to[X_AXIS] - from[X_AXIS]),
-                       gh_double2scm (to[Y_AXIS] - from[Y_AXIS]),
-                       SCM_UNDEFINED);
-  
+                      scm_from_double (thick),
+                      scm_from_double (on),
+                      scm_from_double (off),
+                      scm_from_double (to[X_AXIS] - from[X_AXIS]),
+                      scm_from_double (to[Y_AXIS] - from[Y_AXIS]),
+                      SCM_UNDEFINED);
+
   Box box;
-  box.add_point (Offset (0,0));
+  box.add_point (Offset (0, 0));
   box.add_point (to - from);
 
-  box[X_AXIS].widen (thick/2);
-  box[Y_AXIS].widen (thick/2);  
+  box[X_AXIS].widen (thick / 2);
+  box[Y_AXIS].widen (thick / 2);
 
-  Molecule m = Molecule (box, at);
+  Stencil m = Stencil (box, at);
   m.translate (from);
   return m;
 }
-/*
-  TODO: read THICK from ME
- */
-Molecule
-Line_interface::dashed_line (Grob *me, Real thick, Offset from, Offset to)
+
+Stencil
+Line_interface::make_line (Real th, Offset from, Offset to)
+{
+  SCM at = scm_list_n (ly_symbol2scm ("draw-line"),
+                      scm_from_double (th),
+                      scm_from_double (from[X_AXIS]),
+                      scm_from_double (from[Y_AXIS]),
+                      scm_from_double (to[X_AXIS]),
+                      scm_from_double (to[Y_AXIS]),
+                      SCM_UNDEFINED);
+
+  Box box;
+  box.add_point (from);
+  box.add_point (to);
+
+  box[X_AXIS].widen (th / 2);
+  box[Y_AXIS].widen (th / 2);
+
+  return Stencil (box, at);
+}
+
+Stencil
+Line_interface::arrows (Grob *me, Offset from, Offset to,
+                       bool from_arrow,
+                       bool to_arrow)
 {
-  SCM type = me->get_grob_property ("style");
-  if (type == ly_symbol2scm ("dotted-line")
-      || type == ly_symbol2scm ("dashed-line"))
+  Stencil a;
+  if (from_arrow || to_arrow)
     {
-      Real fraction =
-       robust_scm2double (me->get_grob_property ("dash-fraction"),
-                          (type == ly_symbol2scm ("dotted-line")) ? 0.0 : 0.4);
+      Real thick = Staff_symbol_referencer::line_thickness (me)
+       * robust_scm2double (me->get_property ("thickness"), 1);
+      Real ss = Staff_symbol_referencer::staff_space (me);
 
-      fraction = (fraction >? 0) <? 1.0;
+      Real len = robust_scm2double (me->get_property ("arrow-length"), 1.3 * ss);
+      Real wid = robust_scm2double (me->get_property ("arrow-width"), 0.5 * ss);
+
+      if (to_arrow)
+       a.add_stencil (make_arrow (from, to, thick, len, wid));
+
+      if (from_arrow)
+       a.add_stencil (make_arrow (to, from, thick, len, wid));
+    }
+
+  return a;
+}
+
+Stencil
+Line_interface::line (Grob *me, Offset from, Offset to)
+{
+  Real thick = Staff_symbol_referencer::line_thickness (me)
+    * robust_scm2double (me->get_property ("thickness"), 1);
+
+  SCM type = me->get_property ("style");
+
+  Stencil stil;
+
+  SCM dash_fraction = me->get_property ("dash-fraction");
+  if (scm_is_number (dash_fraction) || type == ly_symbol2scm ("dotted-line"))
+    {
+
+      Real fraction
+       = type == ly_symbol2scm ("dotted-line")
+       ? 0.0
+       : robust_scm2double (dash_fraction, 0.4);
+
+      fraction = min (max (fraction, 0.0), 1.0);
       Real period = Staff_symbol_referencer::staff_space (me)
-       * robust_scm2double (me->get_grob_property ("dash-period"), 1.0);
+       * robust_scm2double (me->get_property ("dash-period"), 1.0);
 
       if (period < 0)
-       return Molecule ();
-       
-      return make_dashed_line (thick, from, to, period, fraction);
+       return Stencil ();
+
+      stil = make_dashed_line (thick, from, to, period, fraction);
     }
   else
-    {
-      return Lookup::line (thick, from, to);
-    }
+    stil = make_line (thick, from, to);
+
+  return stil;
 }
 
-ADD_INTERFACE(Line_interface, "line-interface",
-             "Generic line objects. Any object using lines supports this. ",
-             "dash-period dash-fraction thickness style")
+ADD_INTERFACE (Line_interface, "line-interface",
+              "Generic line objects. Any object using lines supports this.  Normally, "
+              "you get a straight line. If @code{dash-period} is defined, a dashed line is "
+              "produced; the length of the dashes is tuned with "
+              "@code{dash-fraction}. If the latter is set to 0, a dotted line is "
+              "produced. If @code{dash-fraction} is negative, the line is made "
+              "transparent.",
+
+              /* properties */
+              "dash-period "
+              "dash-fraction "
+              "thickness "
+              "style "
+              "arrow-length "
+              "arrow-width")