2 line-interface.cc -- implement Line_interface
4 source file of the GNU LilyPond music typesetter
6 (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "line-interface.hh"
11 #include "staff-symbol-referencer.hh"
13 #include "output-def.hh"
17 Line_interface::make_arrow (Offset begin, Offset end,
19 Real length, Real width)
21 Real angle = (end - begin).arg ();
22 vector<Offset> points;
24 points.push_back (Offset (0, 0));
25 points.push_back (Offset (-length, width));
26 points.push_back (Offset (-length, -width));
28 for (vsize i = 0; i < points.size (); i++)
29 points[i] = points[i] * complex_exp (Offset (0, angle)) + end;
31 return Lookup::round_filled_polygon (points, thick);
35 Line_interface::make_dashed_line (Real thick, Offset from, Offset to,
36 Real dash_period, Real dash_fraction)
38 dash_fraction = min (max (dash_fraction, 0.0), 1.0);
39 Real on = dash_fraction * dash_period + thick;
40 Real off = dash_period - on;
42 SCM at = scm_list_n (ly_symbol2scm ("dashed-line"),
43 scm_from_double (thick),
45 scm_from_double (off),
46 scm_from_double (to[X_AXIS] - from[X_AXIS]),
47 scm_from_double (to[Y_AXIS] - from[Y_AXIS]),
48 scm_from_double (0.0),
52 box.add_point (Offset (0, 0));
53 box.add_point (to - from);
55 box[X_AXIS].widen (thick / 2);
56 box[Y_AXIS].widen (thick / 2);
58 Stencil m = Stencil (box, at);
64 Line_interface::make_line (Real th, Offset from, Offset to)
66 SCM at = scm_list_n (ly_symbol2scm ("draw-line"),
68 scm_from_double (from[X_AXIS]),
69 scm_from_double (from[Y_AXIS]),
70 scm_from_double (to[X_AXIS]),
71 scm_from_double (to[Y_AXIS]),
78 box[X_AXIS].widen (th / 2);
79 box[Y_AXIS].widen (th / 2);
81 return Stencil (box, at);
85 Line_interface::arrows (Grob *me, Offset from, Offset to,
90 if (from_arrow || to_arrow)
92 Real thick = Staff_symbol_referencer::line_thickness (me)
93 * robust_scm2double (me->get_property ("thickness"), 1);
94 Real ss = Staff_symbol_referencer::staff_space (me);
96 Real len = robust_scm2double (me->get_property ("arrow-length"), 1.3 * ss);
97 Real wid = robust_scm2double (me->get_property ("arrow-width"), 0.5 * ss);
100 a.add_stencil (make_arrow (from, to, thick, len, wid));
103 a.add_stencil (make_arrow (to, from, thick, len, wid));
110 Line_interface::line (Grob *me, Offset from, Offset to)
112 Real thick = Staff_symbol_referencer::line_thickness (me)
113 * robust_scm2double (me->get_property ("thickness"), 1);
115 SCM type = me->get_property ("style");
119 SCM dash_fraction = me->get_property ("dash-fraction");
120 if (scm_is_number (dash_fraction) || type == ly_symbol2scm ("dotted-line"))
124 = type == ly_symbol2scm ("dotted-line")
126 : robust_scm2double (dash_fraction, 0.4);
128 fraction = min (max (fraction, 0.0), 1.0);
129 Real period = Staff_symbol_referencer::staff_space (me)
130 * robust_scm2double (me->get_property ("dash-period"), 1.0);
135 stil = make_dashed_line (thick, from, to, period, fraction);
138 stil = make_line (thick, from, to);
143 ADD_INTERFACE (Line_interface,
144 "Generic line objects. Any object using lines supports this. Normally, "
145 "you get a straight line. If @code{dash-period} is defined, a dashed line is "
146 "produced; the length of the dashes is tuned with "
147 "@code{dash-fraction}. If the latter is set to 0, a dotted line is "
148 "produced. If @code{dash-fraction} is negative, the line is made "
161 /* todo: move this somewhere else? */
163 points_to_line_stencil (vector<Offset> points)
166 for (vsize i = 1; i < points.size (); i++)
168 if (points[i-1].is_sane () && points[i].is_sane ())
171 = Line_interface::make_line (0.1, points[i-1], points[i]);
172 ret.add_stencil (line);