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)
41 Lookup::half_slur_middlepart (Real &dx, int dir) const
43 if (dx >= 400 PT) {// todo
44 WARN<<"halfslur too large" <<print_dimen (dx)<< "shrinking (ugh)\n";
47 int widx = int (floor (dx / 4.0));
52 WARN << "slur too narrow\n";
57 s.dim.y() = Interval (min (0,0), max (0,0)); // todo
58 s.dim.x() = Interval (0,dx);
60 String f = String ("\\hslurchar");
61 f += direction_char (0);
69 f+=String ("{") + String (idx ) + "}";
72 a.translate (dx/2, X_AXIS);
73 s.tex = a.TeX_string();
78 Lookup::half_slur (int dy, Real &dx, int dir, int xpart) const
82 return half_slur_middlepart (dx, dir);
88 WARN << "Slur half too wide." << print_dimen (orig_dx) << " shrinking (ugh)\n";
92 widx = int (rint (dx/12.0));
98 WARN << "slur too narrow " << print_dimen (orig_dx)<<"\n";
102 s.dim.x() = Interval (0,dx);
103 s.dim.y() = Interval (min (0,dy), max (0,dy));
106 String f = String ("\\hslurchar");
108 f+= direction_char (dir);
116 idx = widx * 16 + hidx;
121 f+=String ("{") + String (idx ) + "}";
130 Lookup::slur (int dy , Real &dx, int dir) const
132 assert (dx >=0 && abs (dir) <= 1);
133 int y_sign = sign (dy);
135 bool large = abs (dy) > 8;
139 large |= dx>= 4*16 PT;
142 large |= dx>= 4*54 PT;
146 return big_slur (dy, dx, dir);
149 int widx = int (floor (dx/4.0)); // slurs better too small..
155 WARN << "slur too narrow: " << print_dimen (orig_dx) << "\n";
164 WARN<<"slur to steep: " << dy << " shrinking (ugh)\n";
168 s.dim.x() = Interval (0,dx);
169 s.dim.y() = Interval (min (0,dy), max (0,dy));
171 String f = String ("\\slurchar") + String (direction_char (y_sign));
175 idx = hidx * 16 + widx;
183 WARN << "slur too wide: " << print_dimen (dx) <<
184 " shrinking (ugh)\n";
193 f+=String ("{") + String (idx ) + "}";
197 a.translate (dx/2, X_AXIS);
199 s.tex = a.TeX_string();
204 Lookup::big_slur (int dy , Real &dx, int dir) const
206 assert (dx >= 24 PT);
207 Real slur_extra =abs (dy) /2.0 + 2;
208 int l_dy = int (Real (dy)/2 + slur_extra*dir);
209 int r_dy = dy - l_dy;
211 Real internote_f = paper_l_->internote_f();
212 Real left_wid = dx/4.0;
213 Real right_wid = left_wid;
215 Atom l = half_slur (l_dy, left_wid, dir, -1);
216 Atom r = half_slur (r_dy, right_wid, dir, 1);
217 Real mid_wid = dx - left_wid - right_wid;
219 Atom m = half_slur (0, mid_wid, dir, 0);
224 a.translate (slur_extra * internote_f, Y_AXIS);
227 mol.translate (l_dy * internote_f, Y_AXIS);
229 s.tex = mol.TeX_string();
230 s.dim = mol.extent();