X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fline-interface.cc;h=ff7fae57837ddb738f4d9cf352dd91bdab1de9ba;hb=0326ce088e5d81235df8ff360a7f22f61fa36a09;hp=58b8e378e3135f6e5135dae402d3a26b11bd08ca;hpb=e24df7c27635dc996c466295eacf2981bddccaf7;p=lilypond.git diff --git a/lily/line-interface.cc b/lily/line-interface.cc index 58b8e378e3..ff7fae5783 100644 --- a/lily/line-interface.cc +++ b/lily/line-interface.cc @@ -1,11 +1,10 @@ -/* -line-interface.cc -- implement Line_interface +/* + line-interface.cc -- implement Line_interface -source file of the GNU LilyPond music typesetter + source file of the GNU LilyPond music typesetter -(c) 2004--2005 Han-Wen Nienhuys - - */ + (c) 2004--2006 Han-Wen Nienhuys +*/ #include "line-interface.hh" @@ -13,28 +12,47 @@ source file of the GNU LilyPond music typesetter #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 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; + + 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) get_property ("thickness"), 1); + Real ss = Staff_symbol_referencer::staff_space (me); + + 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); - + * 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 = (fraction >? 0) get_property ("dash-period"), 1.0); if (period < 0) return Stencil (); - - return make_dashed_line (thick, from, to, period, fraction); + + stil = make_dashed_line (thick, from, to, period, fraction); } else - { - return make_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. 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.", - - "dash-period dash-fraction thickness style") + "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")