X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flookup.cc;h=d8c20c044fcd871b36f831b83adf022ed28c0c54;hb=e21e3fd69d0204424e93983460926bc0b90f448c;hp=10dee7ad441e45b90281ff7c7082b26eea86dd8c;hpb=b4d2043223a86826764bc531e684a864c97605fe;p=lilypond.git diff --git a/lily/lookup.cc b/lily/lookup.cc index 10dee7ad44..d8c20c044f 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -3,15 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys Jan Nieuwenhuizen */ #include "lookup.hh" -#include +#include #include +using namespace std; #include "line-interface.hh" #include "warn.hh" @@ -44,49 +45,46 @@ Lookup::beam (Real slope, Real width, Real thick, Real blot) Offset p; - p = Offset (0, thick/2); + p = Offset (0, thick / 2); b.add_point (p); - p += Offset (1,-1) * (blot/2); + p += Offset (1, -1) * (blot / 2); SCM points = SCM_EOL; - + points = scm_cons (scm_from_double (p[X_AXIS]), scm_cons (scm_from_double (p[Y_AXIS]), points)); - - - p = Offset (0, -thick/2); + + p = Offset (0, -thick / 2); b.add_point (p); - p += Offset (1,1) * (blot/2); + p += Offset (1, 1) * (blot / 2); points = scm_cons (scm_from_double (p[X_AXIS]), scm_cons (scm_from_double (p[Y_AXIS]), points)); - - - p = Offset (width, width * slope - thick/2); + + p = Offset (width, width * slope - thick / 2); b.add_point (p); - p += Offset (-1, 1) * (blot/2); + p += Offset (-1, 1) * (blot / 2); points = scm_cons (scm_from_double (p[X_AXIS]), scm_cons (scm_from_double (p[Y_AXIS]), points)); - - - p = Offset (width, width * slope + thick/2); + + p = Offset (width, width * slope + thick / 2); b.add_point (p); - p += Offset (-1, -1) * (blot/2); + p += Offset (-1, -1) * (blot / 2); points = scm_cons (scm_from_double (p[X_AXIS]), scm_cons (scm_from_double (p[Y_AXIS]), points)); - + SCM expr = scm_list_n (ly_symbol2scm ("polygon"), ly_quote_scm (points), scm_from_double (blot), SCM_BOOL_T, SCM_UNDEFINED); - + return Stencil (b, expr); } @@ -99,9 +97,7 @@ Lookup::dashed_slur (Bezier b, Real thick, Real dash_period, Real dash_fraction) Real off = dash_period - on; for (int i = 4; i--;) - { - l = scm_cons (ly_offset2scm (b.control_[i]), l); - } + l = scm_cons (ly_offset2scm (b.control_[i]), l); SCM at = (scm_list_n (ly_symbol2scm ("dashed-slur"), scm_from_double (thick), @@ -114,6 +110,22 @@ Lookup::dashed_slur (Bezier b, Real thick, Real dash_period, Real dash_fraction) return Stencil (box, at); } +Stencil +Lookup::rotated_box (Real slope, Real width, Real thick, Real blot) +{ + vector pts; + Offset rot (1, slope); + + thick -= 2*blot; + width -= 2*blot; + rot /= sqrt (1 + slope*slope); + pts.push_back (Offset (0, -thick / 2) * rot); + pts.push_back (Offset (width, -thick / 2) * rot); + pts.push_back (Offset (width, thick / 2) * rot); + pts.push_back (Offset (0, thick / 2) * rot); + return Lookup::round_filled_polygon (pts, blot); +} + Stencil Lookup::horizontal_line (Interval w, Real th) { @@ -175,13 +187,9 @@ Stencil Lookup::round_filled_box (Box b, Real blotdiameter) { if (b.x ().length () < blotdiameter) - { - blotdiameter = b.x ().length (); - } + blotdiameter = b.x ().length (); if (b.y ().length () < blotdiameter) - { - blotdiameter = b.y ().length (); - } + blotdiameter = b.y ().length (); SCM at = (scm_list_n (ly_symbol2scm ("round-filled-box"), scm_from_double (-b[X_AXIS][LEFT]), @@ -235,7 +243,7 @@ Lookup::round_filled_box (Box b, Real blotdiameter) * shrinked polygon). --jr */ Stencil -Lookup::round_filled_polygon (Array const &points, +Lookup::round_filled_polygon (vector const &points, Real blotdiameter) { /* TODO: Maybe print a warning if one of the above limitations @@ -246,7 +254,7 @@ Lookup::round_filled_polygon (Array const &points, #ifndef NDEBUG /* remove consecutive duplicate points */ - for (int i = 0; i < points.size (); i++) + for (vsize i = 0; i < points.size (); i++) { int next_i = (i + 1) % points.size (); Real d = (points[i] - points[next_i]).length (); @@ -254,7 +262,7 @@ Lookup::round_filled_polygon (Array const &points, programming_error ("Polygon should not have duplicate points"); } #endif - + /* special cases: degenerated polygons */ if (points.size () == 0) return Stencil (); @@ -264,10 +272,10 @@ Lookup::round_filled_polygon (Array const &points, return Line_interface::make_line (blotdiameter, points[0], points[1]); /* shrink polygon in size by 0.5 * blotdiameter */ - Array shrunk_points; - shrunk_points.set_size (points.size ()); + vector shrunk_points; + shrunk_points.resize (points.size ()); bool ccw = 1; // true, if three adjacent points are counterclockwise ordered - for (int i = 0; i < points.size (); i++) + for (vsize i = 0; i < points.size (); i++) { int i0 = i; int i1 = (i + 1) % points.size (); @@ -312,7 +320,7 @@ Lookup::round_filled_polygon (Array const &points, /* build scm expression and bounding box */ SCM shrunk_points_scm = SCM_EOL; Box box; - for (int i = 0; i < shrunk_points.size (); i++) + for (vsize i = 0; i < shrunk_points.size (); i++) { SCM x = scm_from_double (shrunk_points[i][X_AXIS]); SCM y = scm_from_double (shrunk_points[i][Y_AXIS]); @@ -373,9 +381,9 @@ Lookup::slur (Bezier curve, Real curvethick, Real linethick) SCM scontrols[8]; - for (int i = 4; i--;) - scontrols[ i ] = ly_offset2scm (back.control_[i]); - for (int i = 4; i--;) + for (int i = 0; i < 4; i++) + scontrols[i] = ly_offset2scm (back.control_[i]); + for (int i = 0; i < 4; i++) scontrols[i + 4] = ly_offset2scm (curve.control_[i]); /* @@ -384,9 +392,7 @@ Lookup::slur (Bezier curve, Real curvethick, Real linethick) int indices[] = {5, 6, 7, 4, 1, 2, 3, 0}; SCM list = SCM_EOL; for (int i = 8; i--;) - { - list = scm_cons (scontrols[indices[i]], list); - } + list = scm_cons (scontrols[indices[i]], list); SCM at = (scm_list_n (ly_symbol2scm ("bezier-sandwich"), ly_quote_scm (list), @@ -461,40 +467,40 @@ Stencil Lookup::accordion (SCM s, Real staff_space, Font_metric *fm) { Stencil m; - String sym = ly_scm2string (scm_car (s)); - String reg = ly_scm2string (scm_car (scm_cdr (s))); + string sym = ly_scm2string (scm_car (s)); + string reg = ly_scm2string (scm_car (scm_cdr (s))); if (sym == "Discant") { Stencil r = fm->find_by_name ("accordion.accDiscant"); m.add_stencil (r); - if (reg.left_string (1) == "F") + if (reg.substr (0, 1) == "F") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 2.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } int eflag = 0x00; - if (reg.left_string (3) == "EEE") + if (reg.substr (0, 3) == "EEE") { eflag = 0x07; - reg = reg.right_string (reg.length () - 3); + reg = reg.substr (3); } - else if (reg.left_string (2) == "EE") + else if (reg.substr (0, 2) == "EE") { eflag = 0x05; - reg = reg.right_string (reg.length () - 2); + reg = reg.substr (2); } - else if (reg.left_string (2) == "Eh") + else if (reg.substr (0, 2) == "Eh") { eflag = 0x04; - reg = reg.right_string (reg.length () - 2); + reg = reg.substr (2); } - else if (reg.left_string (1) == "E") + else if (reg.substr (0, 1) == "E") { eflag = 0x02; - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } if (eflag & 0x02) { @@ -516,7 +522,7 @@ Lookup::accordion (SCM s, Real staff_space, Font_metric *fm) d.translate_axis (-0.8 * staff_space PT, X_AXIS); m.add_stencil (d); } - if (reg.left_string (2) == "SS") + if (reg.substr (0, 2) == "SS") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (0.5 * staff_space PT, Y_AXIS); @@ -524,26 +530,26 @@ Lookup::accordion (SCM s, Real staff_space, Font_metric *fm) m.add_stencil (d); d.translate_axis (-0.8 * staff_space PT, X_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 2); + reg = reg.substr (2); } - if (reg.left_string (1) == "S") + if (reg.substr (0, 1) == "S") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (0.5 * staff_space PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } } else if (sym == "Freebase") { Stencil r = fm->find_by_name ("accordion.accFreebase"); m.add_stencil (r); - if (reg.left_string (1) == "F") + if (reg.substr (0, 1) == "F") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 1.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } if (reg == "E") { @@ -556,22 +562,22 @@ Lookup::accordion (SCM s, Real staff_space, Font_metric *fm) { Stencil r = fm->find_by_name ("accordion.accBayanbase"); m.add_stencil (r); - if (reg.left_string (1) == "T") + if (reg.substr (0, 1) == "T") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 2.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } /* include 4' reed just for completeness. You don't want to use this. */ - if (reg.left_string (1) == "F") + if (reg.substr (0, 1) == "F") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 1.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } - if (reg.left_string (2) == "EE") + if (reg.substr (0, 2) == "EE") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 0.5 PT, Y_AXIS); @@ -579,55 +585,55 @@ Lookup::accordion (SCM s, Real staff_space, Font_metric *fm) m.add_stencil (d); d.translate_axis (-0.8 * staff_space PT, X_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 2); + reg = reg.substr (2); } - if (reg.left_string (1) == "E") + if (reg.substr (0, 1) == "E") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 0.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } } else if (sym == "Stdbase") { Stencil r = fm->find_by_name ("accordion.accStdbase"); m.add_stencil (r); - if (reg.left_string (1) == "T") + if (reg.substr (0, 1) == "T") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 3.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } - if (reg.left_string (1) == "F") + if (reg.substr (0, 1) == "F") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 2.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } - if (reg.left_string (1) == "M") + if (reg.substr (0, 1) == "M") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 2 PT, Y_AXIS); d.translate_axis (staff_space PT, X_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } - if (reg.left_string (1) == "E") + if (reg.substr (0, 1) == "E") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 1.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } - if (reg.left_string (1) == "S") + if (reg.substr (0, 1) == "S") { Stencil d = fm->find_by_name ("accordion.accDot"); d.translate_axis (staff_space * 0.5 PT, Y_AXIS); m.add_stencil (d); - reg = reg.right_string (reg.length () - 1); + reg = reg.substr (1); } } /* ugh maybe try to use regular font for S.B. and B.B and only use one font @@ -659,17 +665,15 @@ Stencil Lookup::repeat_slash (Real w, Real s, Real t) { #if 0 /* TODO */ - Array points ; + vector points; Real blotdiameter = 0.0; - Offset p1(0, 0); - Offset p2(w, w*s); - - - + 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);