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"
19 direction_char (Direction y_sign)
40 Lookup::half_slur_middlepart (Real &dx, Direction dir) const
45 WARN<<"halfslur too large" <<print_dimen (dx)<< "shrinking (ugh)\n";
48 int widx = int (floor (dx / 4.0));
53 WARN << "slur too narrow\n";
58 s.dim_[Y_AXIS] = Interval (min (0, 0), max (0, 0)); // todo
59 s.dim_[X_AXIS] = Interval (-dx/2, dx/2);
61 String f = String ("\\hslurchar");
62 f += direction_char (CENTER);
70 f +=String ("{") + String (idx) + "}";
72 s.translate (dx/2, X_AXIS);
78 The halfslurs have their center at the end pointing away from the notehead.
79 This lookup translates so that width() == [0, w]
83 Lookup::half_slur (int dy, Real &dx, Direction dir, int xpart) const
87 return half_slur_middlepart (dx, dir);
93 WARN << "Slur half too wide." << print_dimen (orig_dx) << " shrinking (ugh)\n";
97 widx = int (rint (dx/12.0));
103 WARN << "slur too narrow " << print_dimen (orig_dx)<<"\n";
107 s.dim_[X_AXIS] = Interval (0, dx);
108 s.dim_[Y_AXIS] = Interval (min (0, dy), max (0, dy));
111 String f = String ("\\hslurchar");
113 f+= direction_char (dir);
121 idx = widx * 16 + hidx;
126 f+=String ("{") + String (idx) + "}";
135 Lookup::slur (int dy , Real &dx, Direction dir) const
138 assert (abs (dir) <= 1);
141 warning ("Negative slur/tie length: " + print_dimen (dx));
144 Direction y_sign = (Direction) sign (dy);
146 bool large = abs (dy) > 8;
150 large |= dx>= 4*16 PT;
153 large |= dx>= 4*54 PT;
157 return big_slur (dy, dx, dir);
160 int widx = int (floor (dx/4.0)); // slurs better too small..
166 WARN << "slur too narrow: " << print_dimen (orig_dx) << "\n";
175 WARN<<"slur to steep: " << dy << " shrinking (ugh)\n";
179 s.dim_[X_AXIS] = Interval (0, dx);
180 s.dim_[Y_AXIS] = Interval (min (0, dy), max (0, dy));
182 String f = String ("\\slurchar") + String (direction_char (y_sign));
187 idx = hidx * 16 + widx;
195 WARN << "slur too wide: " << print_dimen (dx) <<
196 " shrinking (ugh)\n";
205 f+=String ("{") + String (idx) + "}";
209 s.translate (dx/2, X_AXIS);
214 Lookup::big_slur (int dy , Real &dx, Direction dir) const
218 warning ("big_slur too small " + print_dimen (dx) + " (stretching)");
222 Real slur_extra =abs (dy) /2.0 + 2;
223 int l_dy = int (Real (dy)/2 + slur_extra*dir);
224 int r_dy = dy - l_dy;
226 Real internote_f = paper_l_->internote_f();
227 Real left_wid = dx/4.0;
228 Real right_wid = left_wid;
230 Atom l = half_slur (l_dy, left_wid, dir, -1);
233 Atom r = half_slur (r_dy, right_wid, dir, 1);
234 Real mid_wid = dx - left_wid - right_wid;
238 Atom a (half_slur (0, mid_wid, dir, 0));
239 mol.add_at_edge (X_AXIS, RIGHT, a);
240 mol.add_at_edge (X_AXIS, RIGHT, r);
242 mol.translate (l_dy * internote_f, Y_AXIS);
244 s.tex_ = mol.TeX_string();
245 s.dim_ = mol.extent();