From 10df64df53761085e182ebdfe3a47123601d93dd Mon Sep 17 00:00:00 2001 From: fred Date: Sun, 24 Nov 1996 13:30:12 +0000 Subject: [PATCH] lilypond-0.0.11 --- src/texslur.cc | 187 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 src/texslur.cc diff --git a/src/texslur.cc b/src/texslur.cc new file mode 100644 index 0000000000..413c21869d --- /dev/null +++ b/src/texslur.cc @@ -0,0 +1,187 @@ +#include "lookup.hh" +#include "molecule.hh" +#include +#include "dimen.hh" +#include "debug.hh" + +static +char direction_char(int y_sign) +{ + char c; + switch(y_sign){ + case -1: + c = 'd'; + break; + case 0: + c = 'h'; + break; + case 1: + c = 'u'; + break; + default: + assert(false); + } + return c; +} + +Symbol +Lookup::half_slur_middlepart(Real &dx, int dir) +{ + if (dx >= convert_dimen(400,"pt")) // todo + error ("halfslur too large"); + int widx = int(floor(dx / 4.0)); + dx = widx * 4.0; + widx --; + + Symbol s; + + s.dim.y = Interval(MIN(0,0), MAX(0,0)); + s.dim.x = Interval(0,dx); + + String f = String("\\hslurchar"); + f += direction_char(0); + + int idx = widx; + if (dir < 0) + idx += 128; + + + f+=String( "{" ) + idx + "}"; + s.tex = f; + Atom a(s); + a.translate(Offset(dx/2,0)); + s.tex = a.TeXstring(); + + return s; +} +Symbol +Lookup::half_slur(int dy, Real &dx, int dir, int xpart) +{ + if (!xpart) + return half_slur_middlepart(dx, dir); + + int widx; + + if (dx >= convert_dimen(96,"pt")) + dx = convert_dimen(96,"pt"); + + widx = int(rint(dx/12.0)); + dx = widx*12.0; + widx --; + + Symbol s; + s.dim.x = Interval(0,dx); + s.dim.y = Interval(MIN(0,dy), MAX(0,dy)); + + + String f = String("\\hslurchar"); + + f+= direction_char(dir); + + int hidx = dy; + if (hidx <0) + hidx = -hidx; + hidx --; + int idx =-1; + + + idx = widx * 16 + hidx; + if (xpart < 0) + idx += 128; + + f+=String( "{" ) + idx + "}"; + + + s.tex = f; + + return s; +} + +Symbol +Lookup::slur (int dy , Real &dx, int dir) +{ // ugh. assuming pt here. + assert(dx >=0); + int y_sign = sgn(dy); + + bool large = dy > 16; + + if (y_sign) { + large |= dx>= convert_dimen(4*16, "pt"); + } else + large |= dx>= convert_dimen(4*54, "pt"); + + if (large) { + return big_slur(dy, dx, dir); + } + + int widx = int(floor(dx/4.0)); // slurs better too small.. + dx = 4.0 * widx; + widx--; + int hidx = dy; + if (hidx <0) + hidx = -hidx; + hidx --; + if (hidx > 16) + error("slur to steep"); + + + Symbol s; + s.dim.x = Interval(0,dx); + s.dim.y = Interval(MIN(0,dy), MAX(0,dy)); + + String f = String("\\slurchar") + direction_char(y_sign); + + int idx=-1; + if (y_sign) { + idx = hidx * 16 + widx; + if (dir < 0) + idx += 128; + } else { + if (dx >= convert_dimen(4*54, "pt")) + error("slur too wide"); + idx = widx; + if (dir > 0) + idx += 54; + } + + f+=String( "{" ) + idx + "}"; + s.tex = f; + + Atom a(s); + a.translate(Offset(dx/2,0)); + s.dim = a.extent(); + s.tex = a.TeXstring(); + return s; +} + +Symbol +Lookup::big_slur(int dy , Real &dx, int dir) +{ + assert(dx >= convert_dimen(24,"pt")); + + Real slur_extra =ABS(dy) /2.0 + 2; + int l_dy = Real (dy)/2 + slur_extra*dir; + int r_dy = dy - l_dy; + + Real left_wid = dx/4.0; + Real right_wid = left_wid; + + Atom l = half_slur(l_dy, left_wid, dir, -1); + Atom r = half_slur(r_dy, right_wid, dir, 1); + Real mid_wid = dx - left_wid - right_wid; + Atom m = half_slur(0, mid_wid, dir, 0); + + Molecule mol; + mol.add(l); + Atom a(m); + a.translate(Offset(0,slur_extra * internote())); + mol.add_right(m); + mol.add_right(r); + mol.translate(Offset(l_dy * internote(), 0)); + Symbol s; + s.tex = mol.TeXstring(); + s.dim = mol.extent(); + return s; +} + + -- 2.39.5