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);
66 f+=String( "{" ) + String( idx ) + "}";
70 s.tex = a.TeX_string();
75 Lookup::half_slur(int dy, Real &dx, int dir, int xpart) const
79 return half_slur_middlepart(dx, dir);
84 WARN << "Slur half too wide." << print_dimen(orig_dx) << " shrinking (ugh)\n";
88 widx = int(rint(dx/12.0));
93 WARN << "slur too narrow " << print_dimen(orig_dx)<<"\n";
97 s.dim.x = Interval(0,dx);
98 s.dim.y = Interval(min(0,dy), max(0,dy));
101 String f = String("\\hslurchar");
103 f+= direction_char(dir);
112 idx = widx * 16 + hidx;
116 f+=String( "{" ) + String( idx ) + "}";
125 Lookup::slur (int dy , Real &dx, int dir) const
127 assert(dx >=0 && abs(dir) <= 1);
128 int y_sign = sign(dy);
130 bool large = dy > 16;
133 large |= dx>= 4*16 PT;
135 large |= dx>= 4*54 PT;
138 return big_slur(dy, dx, dir);
141 int widx = int(floor(dx/4.0)); // slurs better too small..
146 WARN << "slur too narrow: " << print_dimen(orig_dx) << "\n";
154 WARN<<"slur to steep: " << dy << " shrinking (ugh)\n";
158 s.dim.x = Interval(0,dx);
159 s.dim.y = Interval(min(0,dy), max(0,dy));
161 String f = String("\\slurchar") + String( direction_char(y_sign) );
165 idx = hidx * 16 + widx;
170 WARN << "slur too wide: " << print_dimen(dx) <<
171 " shrinking (ugh)\n";
179 f+=String( "{" ) + String( idx ) + "}";
185 s.tex = a.TeX_string();
190 Lookup::big_slur(int dy , Real &dx, int dir) const
193 Real slur_extra =abs(dy) /2.0 + 2;
194 int l_dy = int(Real (dy)/2 + slur_extra*dir);
195 int r_dy = dy - l_dy;
197 Real internote_f = paper_l_->internote_f();
198 Real left_wid = dx/4.0;
199 Real right_wid = left_wid;
201 Atom l = half_slur(l_dy, left_wid, dir, -1);
202 Atom r = half_slur(r_dy, right_wid, dir, 1);
203 Real mid_wid = dx - left_wid - right_wid;
205 Atom m = half_slur(0, mid_wid, dir, 0);
210 a.translate_y(slur_extra * internote_f);
213 mol.translate_y( l_dy * internote_f);
215 s.tex = mol.TeX_string();
216 s.dim = mol.extent();