2 tex-slur.cc -- implement Lookup::*slur
4 source file of the GNU LilyPond music typesetter
6 (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
12 #include "molecule.hh"
15 #include "paper-def.hh"
20 char direction_char(int y_sign)
40 Lookup::half_slur_middlepart(Real &dx, int dir) const
42 if (dx >= 400 PT) {// todo
43 WARN<<"halfslur too large" <<print_dimen(dx)<< "shrinking (ugh)\n";
46 int widx = int(floor(dx / 4.0));
50 WARN << "slur too narrow\n";
55 s.dim.y() = Interval(min(0,0), max(0,0)); // todo
56 s.dim.x() = Interval(0,dx);
58 String f = String("\\hslurchar");
59 f += direction_char(0);
67 f+=String( "{" ) + String( idx ) + "}";
70 a.translate(dx/2, X_AXIS);
71 s.tex = a.TeX_string();
76 Lookup::half_slur(int dy, Real &dx, int dir, int xpart) const
80 return half_slur_middlepart(dx, dir);
85 WARN << "Slur half too wide." << print_dimen(orig_dx) << " shrinking (ugh)\n";
89 widx = int(rint(dx/12.0));
94 WARN << "slur too narrow " << print_dimen(orig_dx)<<"\n";
98 s.dim.x() = Interval(0,dx);
99 s.dim.y() = Interval(min(0,dy), max(0,dy));
102 String f = String("\\hslurchar");
104 f+= direction_char(dir);
112 idx = widx * 16 + hidx;
117 f+=String( "{" ) + String( idx ) + "}";
126 Lookup::slur (int dy , Real &dx, int dir) const
128 assert(dx >=0 && abs(dir) <= 1);
129 int y_sign = sign(dy);
131 bool large = abs(dy) > 8;
134 large |= dx>= 4*16 PT;
136 large |= dx>= 4*54 PT;
139 return big_slur(dy, dx, dir);
142 int widx = int(floor(dx/4.0)); // slurs better too small..
147 WARN << "slur too narrow: " << print_dimen(orig_dx) << "\n";
155 WARN<<"slur to steep: " << dy << " shrinking (ugh)\n";
159 s.dim.x() = Interval(0,dx);
160 s.dim.y() = Interval(min(0,dy), max(0,dy));
162 String f = String("\\slurchar") + String( direction_char(y_sign) );
166 idx = hidx * 16 + widx;
171 WARN << "slur too wide: " << print_dimen(dx) <<
172 " shrinking (ugh)\n";
181 f+=String( "{" ) + String( idx ) + "}";
185 a.translate(dx/2, X_AXIS);
187 s.tex = a.TeX_string();
192 Lookup::big_slur(int dy , Real &dx, int dir) const
195 Real slur_extra =abs(dy) /2.0 + 2;
196 int l_dy = int(Real (dy)/2 + slur_extra*dir);
197 int r_dy = dy - l_dy;
199 Real internote_f = paper_l_->internote_f();
200 Real left_wid = dx/4.0;
201 Real right_wid = left_wid;
203 Atom l = half_slur(l_dy, left_wid, dir, -1);
204 Atom r = half_slur(r_dy, right_wid, dir, 1);
205 Real mid_wid = dx - left_wid - right_wid;
207 Atom m = half_slur(0, mid_wid, dir, 0);
212 a.translate(slur_extra * internote_f, Y_AXIS);
215 mol.translate( l_dy * internote_f, Y_AXIS);
217 s.tex = mol.TeX_string();
218 s.dim = mol.extent();