X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flookup.cc;h=e903d5a9a403b18f1ce1192642f8f769619b741e;hb=9352789b729682d683482c2852cc7b53e9dcdc70;hp=f19e4d2703885095a3eecf42e974a95e6c7489fa;hpb=08560a1b8076630c4fc6cb9b902614d8b74fd6fc;p=lilypond.git diff --git a/lily/lookup.cc b/lily/lookup.cc index f19e4d2703..e903d5a9a4 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -27,26 +27,13 @@ using namespace std; #include "line-interface.hh" #include "warn.hh" +#include "international.hh" #include "dimensions.hh" #include "bezier.hh" #include "file-path.hh" #include "main.hh" #include "lily-guile.hh" -Stencil -Lookup::dot (Offset p, Real radius) -{ - SCM at = (scm_list_n (ly_symbol2scm ("dot"), - scm_from_double (p[X_AXIS]), - scm_from_double (p[Y_AXIS]), - scm_from_double (radius), - SCM_UNDEFINED)); - Box box; - box.add_point (p - Offset (radius, radius)); - box.add_point (p + Offset (radius, radius)); - return Stencil (box, at); -} - Stencil Lookup::beam (Real slope, Real width, Real thick, Real blot) { @@ -137,6 +124,16 @@ Lookup::blank (Box b) return Stencil (b, scm_from_locale_string ("")); } +Stencil +Lookup::circle (Real rad, Real thick, bool filled) +{ + Box b (Interval (-rad, rad), Interval (-rad, rad)); + return Stencil (b, scm_list_4 (ly_symbol2scm ("circle"), + scm_from_double (rad), + scm_from_double (thick), + scm_from_bool (filled))); +} + Stencil Lookup::filled_box (Box b) { @@ -173,10 +170,18 @@ Lookup::filled_box (Box b) Stencil Lookup::round_filled_box (Box b, Real blotdiameter) { - if (b.x ().length () < blotdiameter) - blotdiameter = b.x ().length (); - if (b.y ().length () < blotdiameter) - blotdiameter = b.y ().length (); + Real width = b.x ().delta (); + blotdiameter = min (blotdiameter, width); + Real height = b.y ().delta (); + blotdiameter = min (blotdiameter, height); + + if (blotdiameter < 0.0) + { + if (!isinf (blotdiameter)) + warning (_f ("Not drawing a box with negative dimension, %.2f by %.2f.", + width, height)); + return Stencil (b, SCM_EOL); + } SCM at = (scm_list_n (ly_symbol2scm ("round-filled-box"), scm_from_double (-b[X_AXIS][LEFT]), @@ -254,7 +259,11 @@ Lookup::round_filled_polygon (vector const &points, if (points.size () == 0) return Stencil (); if (points.size () == 1) - return dot (points[0], 0.5 * blotdiameter); + { + Stencil circ = circle (0.5 * blotdiameter, 0, true); + circ.translate (points[0]); + return circ; + } if (points.size () == 2) return Line_interface::make_line (blotdiameter, points[0], points[1]); @@ -333,11 +342,10 @@ Stencil Lookup::frame (Box b, Real thick, Real blot) { Stencil m; - Direction d = LEFT; for (Axis a = X_AXIS; a < NO_AXES; a = Axis (a + 1)) { Axis o = Axis ((a + 1) % NO_AXES); - do + for (LEFT_and_RIGHT (d)) { Box edges; edges[a] = b[a][d] + 0.5 * thick * Interval (-1, 1); @@ -346,7 +354,6 @@ Lookup::frame (Box b, Real thick, Real blot) m.add_stencil (round_filled_box (edges, blot)); } - while (flip (&d) != LEFT); } return m; } @@ -449,22 +456,32 @@ Lookup::slur (Bezier curve, Real curvethick, Real linethick, Stencil Lookup::bezier_sandwich (Bezier top_curve, Bezier bottom_curve, Real thickness) { - /* - Need the weird order b.o. the way PS want its arguments - */ - SCM list = SCM_EOL; - list = scm_cons (ly_offset2scm (bottom_curve.control_[3]), list); - list = scm_cons (ly_offset2scm (bottom_curve.control_[0]), list); - list = scm_cons (ly_offset2scm (bottom_curve.control_[1]), list); - list = scm_cons (ly_offset2scm (bottom_curve.control_[2]), list); - list = scm_cons (ly_offset2scm (top_curve.control_[0]), list); - list = scm_cons (ly_offset2scm (top_curve.control_[3]), list); - list = scm_cons (ly_offset2scm (top_curve.control_[2]), list); - list = scm_cons (ly_offset2scm (top_curve.control_[1]), list); - - SCM horizontal_bend = scm_list_n (ly_symbol2scm ("bezier-sandwich"), - ly_quote_scm (list), + SCM commands = scm_list_n (ly_symbol2scm ("moveto"), + scm_from_double (top_curve.control_[0][X_AXIS]), + scm_from_double (top_curve.control_[0][Y_AXIS]), + ly_symbol2scm ("curveto"), + scm_from_double (top_curve.control_[1][X_AXIS]), + scm_from_double (top_curve.control_[1][Y_AXIS]), + scm_from_double (top_curve.control_[2][X_AXIS]), + scm_from_double (top_curve.control_[2][Y_AXIS]), + scm_from_double (top_curve.control_[3][X_AXIS]), + scm_from_double (top_curve.control_[3][Y_AXIS]), + ly_symbol2scm ("curveto"), + scm_from_double (bottom_curve.control_[2][X_AXIS]), + scm_from_double (bottom_curve.control_[2][Y_AXIS]), + scm_from_double (bottom_curve.control_[1][X_AXIS]), + scm_from_double (bottom_curve.control_[1][Y_AXIS]), + scm_from_double (bottom_curve.control_[0][X_AXIS]), + scm_from_double (bottom_curve.control_[0][Y_AXIS]), + ly_symbol2scm ("closepath"), + SCM_UNDEFINED); + + SCM horizontal_bend = scm_list_n (ly_symbol2scm ("path"), scm_from_double (thickness), + ly_quote_scm (commands), + ly_quote_scm (ly_symbol2scm ("round")), + ly_quote_scm (ly_symbol2scm ("round")), + SCM_BOOL_T, SCM_UNDEFINED); Interval x_extent = top_curve.extent (X_AXIS); @@ -480,21 +497,32 @@ Lookup::bezier_sandwich (Bezier top_curve, Bezier bottom_curve, Real thickness) Stencil Lookup::repeat_slash (Real w, Real s, Real t) { -#if 0 /* TODO */ - vector points; - Real blotdiameter = 0.0; - - Offset p1 (0, 0); - Offset p2 (w, w * s); - - return Lookup::round_filled_polygon (points, blotdiameter); -#endif - SCM wid = scm_from_double (w); - SCM sl = scm_from_double (s); - SCM thick = scm_from_double (t); - SCM slashnodot = scm_list_n (ly_symbol2scm ("repeat-slash"), - wid, sl, thick, SCM_UNDEFINED); + Real x_width = sqrt ((t * t) + ((t / s) * (t / s))); + Real height = w * s; + + SCM controls = scm_list_n (ly_symbol2scm ("moveto"), + scm_from_double (0), + scm_from_double (0), + ly_symbol2scm ("rlineto"), + scm_from_double (x_width), + scm_from_double (0), + ly_symbol2scm ("rlineto"), + scm_from_double (w), + scm_from_double (height), + ly_symbol2scm ("rlineto"), + scm_from_double (-x_width), + scm_from_double (0), + ly_symbol2scm ("closepath"), + SCM_UNDEFINED); + + SCM slashnodot = scm_list_n (ly_symbol2scm ("path"), + scm_from_double (0), + ly_quote_scm (controls), + ly_quote_scm (ly_symbol2scm ("round")), + ly_quote_scm (ly_symbol2scm ("round")), + SCM_BOOL_T, + SCM_UNDEFINED); Box b (Interval (0, w + sqrt (sqr (t / s) + sqr (t))), Interval (0, w * s));