/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2004--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2004--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Real thick,
Real length, Real width)
{
- Real angle = (end - begin).arg ();
+ Offset dir = (end - begin).direction ();
vector<Offset> points;
points.push_back (Offset (0, 0));
points.push_back (Offset (-length, -width));
for (vsize i = 0; i < points.size (); i++)
- points[i] = points[i] * complex_exp (Offset (0, angle)) + end;
+ points[i] = points[i] * dir + end;
return Lookup::round_filled_polygon (points, thick);
}
}
while (len + elt_len < dz.length ());
- line.rotate (dz.arg (), Offset (LEFT, CENTER));
+ line.rotate (dz.angle_degrees (), Offset (LEFT, CENTER));
line.translate (from);
return line;
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 rotation_factor = dz.direction ();
Offset points[3];
points[0] = Offset (0, -h / 2);
Real dash_period, Real dash_fraction)
{
dash_fraction = min (max (dash_fraction, 0.0), 1.0);
- Real on = dash_fraction * dash_period + thick;
+ Real on = dash_fraction * dash_period;
Real off = max (0.0, dash_period - on);
SCM at = scm_list_n (ly_symbol2scm ("dashed-line"),
* robust_scm2double (me->get_property ("thickness"), 1);
SCM type = me->get_property ("style");
- if (type == ly_symbol2scm ("zigzag"))
+ if (scm_is_eq (type, ly_symbol2scm ("zigzag")))
return make_zigzag_line (me, from, to);
- else if (type == ly_symbol2scm ("trill"))
+ else if (scm_is_eq (type, ly_symbol2scm ("trill")))
return make_trill_line (me, from, to);
- else if (type == ly_symbol2scm ("none"))
+ else if (scm_is_eq (type, ly_symbol2scm ("none")))
return Stencil ();
Stencil stencil;
- if (type == ly_symbol2scm ("dashed-line") || type == ly_symbol2scm ("dotted-line"))
+ if (scm_is_eq (type, ly_symbol2scm ("dashed-line"))
+ || scm_is_eq (type, ly_symbol2scm ("dotted-line")))
{
Real fraction
- = type == ly_symbol2scm ("dotted-line")
+ = scm_is_eq (type, ly_symbol2scm ("dotted-line"))
? 0.0
: robust_scm2double (me->get_property ("dash-fraction"), 0.4);
return Stencil ();
Real len = (to - from).length ();
-
- int n = (int) rint ((len - period * fraction) / period);
- n = max (0, n);
- if (n > 0)
+ /*
+ Dashed lines should begin and end with a dash. Therefore,
+ there will be one more dash than complete dash + whitespace
+ units (full periods).
+ */
+ int full_period_count =
+ (int) rint ((len - period * fraction) / period);
+ full_period_count = max (0, full_period_count);
+ if (full_period_count > 0)
{
/*
TODO: figure out something intelligent for really short
sections.
- */
- period = ((to - from).length () - period * fraction) / n;
+ */
+ period = len / (fraction + full_period_count);
}
stencil = make_dashed_line (thick, from, to, period, fraction);
}