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>
13 #include "molecule.hh"
16 #include "paper-def.hh"
17 #include "string-convert.hh"
21 direction_char (Direction y_sign)
42 Lookup::half_slur_middlepart (Real &dx, Direction dir) const
47 WARN<<_("halfslur too large") <<print_dimen (dx)<< _("shrinking (ugh)\n");
50 int widx = int (floor (dx / 4.0));
55 WARN << _("slur too narrow\n");
60 s.dim_[Y_AXIS] = Interval (min (0, 0), max (0, 0)); // todo
61 s.dim_[X_AXIS] = Interval (-dx/2, dx/2);
63 String f = String ("\\hslurchar");
64 f += direction_char (CENTER);
72 f +=String ("{") + String (idx) + "}";
74 s.translate_axis (dx/2, X_AXIS);
80 The halfslurs have their center at the end pointing away from the notehead.
81 This lookup translates so that width() == [0, w]
85 Lookup::half_slur (int dy, Real &dx, Direction dir, int xpart) const
89 return half_slur_middlepart (dx, dir);
95 WARN << _("Slur half too wide.") << print_dimen (orig_dx) << _(" shrinking (ugh)\n");
99 widx = int (rint (dx/12.0));
105 WARN << _("slur too narrow ") << print_dimen (orig_dx)<<"\n";
109 s.dim_[X_AXIS] = Interval (0, dx);
110 s.dim_[Y_AXIS] = Interval (min (0, dy), max (0, dy));
113 String f = String ("\\hslurchar");
115 f+= direction_char (dir);
123 idx = widx * 16 + hidx;
128 f+=String ("{") + String (idx) + "}";
137 Lookup::slur (int dy , Real &dx, Direction dir) const
139 assert (abs (dir) <= 1);
142 warning (_("Negative slur/tie length: ") + print_dimen (dx));
147 s.dim_[X_AXIS] = Interval (0, dx);
148 s.dim_[Y_AXIS] = Interval (min (0, dy), max (0, dy));
151 // let's try the embedded stuff
153 /* bool embedded_b = experimental_features_global_b;
154 // embedded stuff still sucks for slurs
156 bool embedded_b = false;
160 Real fdy = dy*paper_l_->internote_f ();
162 String ps = "\\embeddedps{\n";
163 // ugh, how bout " /draw_slur { ... } def "
164 ps += String_convert::double_str (fdx) + " "
165 + String_convert::double_str (fdy) + " "
166 + String_convert::double_str (dir) +
169 String mf = "\\embeddedmf{\n";
170 mf += "input feta-sleur;\n";
171 mf += "draw_slur((0,0),";
172 mf += "(" + String_convert::double_str (fdx) + ","
173 + String_convert::double_str (fdy) + "),";
174 mf += String_convert::double_str (dir) + ");\n";
181 Direction y_sign = (Direction) sign (dy);
183 bool large = abs (dy) > 8;
187 large |= dx>= 4*16 PT;
190 large |= dx>= 4*54 PT;
194 s = big_slur (dy, dx, dir);
197 s.tex_ = "\\embeddedtex{\n" + s.tex_ + "\n}\n";
203 int widx = int (floor (dx/4.0)); // slurs better too small..
209 WARN << _("slur too narrow: ") << print_dimen (orig_dx) << "\n";
218 WARN<<_("slur to steep: ") << dy << _(" shrinking (ugh)\n");
221 String f = String ("\\slurchar") + String (direction_char (y_sign));
226 idx = hidx * 16 + widx;
234 WARN << _("slur too wide: ") << print_dimen (dx) <<
235 _(" shrinking (ugh)\n");
244 f+=String ("{") + String (idx) + "}";
248 s.tex_ = "\\embeddedtex{\n" + s.tex_ + "\n}\n";
252 s.translate_axis (dx/2, X_AXIS);
257 Lookup::big_slur (int dy , Real &dx, Direction dir) const
261 warning (_("big_slur too small ") + print_dimen (dx) + _(" (stretching)"));
265 Real slur_extra =abs (dy) /2.0 + 2;
266 int l_dy = int (Real (dy)/2 + slur_extra*dir);
267 int r_dy = dy - l_dy;
269 Real internote_f = paper_l_->internote_f();
270 Real left_wid = dx/4.0;
271 Real right_wid = left_wid;
273 Atom l = half_slur (l_dy, left_wid, dir, -1);
276 Atom r = half_slur (r_dy, right_wid, dir, 1);
277 Real mid_wid = dx - left_wid - right_wid;
281 Atom a (half_slur (0, mid_wid, dir, 0));
282 mol.add_at_edge (X_AXIS, RIGHT, a);
283 mol.add_at_edge (X_AXIS, RIGHT, r);
285 mol.translate_axis (l_dy * internote_f, Y_AXIS);
287 s.tex_ = mol.TeX_string();
288 s.dim_ = mol.extent();