2 lookup.cc -- implement simple Lookup methods.
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
9 This doth suck. We should have PS output, and read spacing info from TFMs
17 #include "symtable.hh"
21 #include "paper-def.hh"
22 #include "string-convert.hh"
28 texsetting = "\\unknowntexsetting";
29 symtables_p_ = new Symtables;
32 Lookup::Lookup (Lookup const &s)
34 paper_l_ = s.paper_l_;
35 texsetting = s.texsetting;
36 symtables_p_ = new Symtables (*s.symtables_p_);
44 Lookup::add (String s, Symtable*p)
46 symtables_p_->add (s, p);
53 DOUT << "Lookup: " << texsetting << " {\n";
54 symtables_p_->print();
60 Lookup::text (String style, String text, int dir) const
65 Atom tsym = (*symtables_p_)("style")->lookup (style);
66 a[0] = substitute_args (tsym.tex_,a);
68 Atom s = (*symtables_p_)("align")->lookup (dir);
69 s.tex_ = substitute_args (s.tex_,a);
77 Lookup::ball (int j) const
82 Symtable * st = (*symtables_p_)("balls");
83 return st->lookup (String (j));
87 Lookup::rest (int j, bool o) const
89 return (*symtables_p_)("rests")->lookup (String (j) + (o ? "o" : ""));
93 Lookup::fill (Box b) const
95 Atom s ((*symtables_p_)("param")->lookup ("fill"));
101 Lookup::accidental (int j) const
103 return (*symtables_p_)("accidentals")->lookup (String (j));
108 Lookup::bar (String s, Real h) const
111 a.push (print_dimen (h));
112 Atom ret=(*symtables_p_)("bars")->lookup (s);
113 ret.tex_ = substitute_args (ret.tex_, a);
114 ret.dim_.y() = Interval (-h/2, h/2);
119 Lookup::script (String s) const
121 return (*symtables_p_)("scripts")->lookup (s);
125 Lookup::dynamic (String s) const
127 return (*symtables_p_)("dynamics")->lookup (s);
131 Lookup::clef (String s) const
133 return (*symtables_p_)("clefs")->lookup (s);
137 Lookup::dots () const
139 return (*symtables_p_)("dots")->lookup ("dot");
143 Lookup::flag (int j, Direction d) const
145 char c = (d == UP) ? 'u' : 'd';
146 return (*symtables_p_)("flags")->lookup (c + String (j));
150 Lookup::dashed_slur (Array<Offset> controls, Real thick, Real dash) const
152 assert (controls.size () == 8);
154 String ps = "\\embeddedps{\n";
156 Real dx = controls[3].x () - controls[0].x ();
157 Real dy = controls[3].y () - controls[0].y ();
159 for (int i = 1; i < 4; i++)
160 ps += String_convert::double_str (controls[i].x ()) + " "
161 + String_convert::double_str (controls[i].y ()) + " ";
163 ps += String_convert::double_str (controls[0].x ()) + " "
164 + String_convert::double_str (controls[0].y ()) + " ";
166 ps += String_convert::double_str (thick) + " ";
167 Real on = dash > 1? thick * dash - thick : 0;
168 Real off = 2 * thick;
169 ps += "[" + String_convert::double_str (on) + " ";
170 ps += String_convert::double_str (off) + "] ";
171 ps += String_convert::int_str (0) + " ";
172 ps += " draw_dashed_slur}";
177 s.dim_[X_AXIS] = Interval (0, dx);
178 s.dim_[Y_AXIS] = Interval (0 <? dy, 0 >? dy);
183 Lookup::slur (Array<Offset> controls) const
185 assert (controls.size () == 8);
187 String ps = "\\embeddedps{\n";
189 Real dx = controls[3].x () - controls[0].x ();
190 Real dy = controls[3].y () - controls[0].y ();
192 for (int i = 5; i < 8; i++)
193 ps += String_convert::double_str (controls[i].x ()) + " "
194 + String_convert::double_str (controls[i].y ()) + " ";
196 ps += String_convert::double_str (controls[4].x ()) + " "
197 + String_convert::double_str (controls[4].y ()) + " ";
199 for (int i = 1; i < 4; i++)
200 ps += String_convert::double_str (controls[i].x ()) + " "
201 + String_convert::double_str (controls[i].y ()) + " ";
203 ps += String_convert::double_str (controls[0].x ()) + " "
204 + String_convert::double_str (controls[0].y ()) + " ";
211 s.dim_[X_AXIS] = Interval (0, dx);
212 s.dim_[Y_AXIS] = Interval (0 <? dy, 0 >? dy);
217 Lookup::streepje (int type) const
222 Symtable * st = (*symtables_p_)("balls");
224 return st->lookup (String (type) + 'l');
228 Lookup::hairpin (Real width, bool decresc, bool continued) const
232 Real height = paper_l_->staffheight_f () / 6;
233 embed = "\\embeddedps{\n" ;
234 embed += String (width) + " "
235 + String (height) + " "
236 + String (continued ? height/2 : 0) +
237 + " draw_" + String(decresc ? "de" : "") + "cresc}\n";
241 ret.dim_.x () = Interval (0, width);
242 ret.dim_.y () = Interval (-2*height, 2*height);
248 Lookup::meter (Array<Scalar> a) const
250 Atom s((*symtables_p_)("param")->lookup ("meter"));
251 s.tex_ = substitute_args (s.tex_,a);
257 Lookup::stem (Real y1,Real y2) const
267 s.dim_.x() = Interval (0,0);
268 s.dim_.y() = Interval (y1,y2);
271 a.push (print_dimen (y1));
272 a.push (print_dimen (y2));
274 String src = (*symtables_p_)("param")->lookup ("stem").tex_;
275 s.tex_ = substitute_args (src,a);
280 should be handled via Tex_ code and Lookup::bar()
283 Lookup::vbrace (Real &y) const
285 Atom brace = (*symtables_p_)("param")->lookup ("brace");
286 Interval ydims = brace.dim_[Y_AXIS];
287 Real min_y = ydims[LEFT];
288 Real max_y = ydims[RIGHT];
293 warning (_("piano brace too small (") + print_dimen (y)+ ")");
298 warning (_("piano brace too big (") + print_dimen (y)+ ")");
303 int idx = int (rint ((y- min_y)/step)) + 1;
308 brace.tex_ = substitute_args (brace.tex_,a);
309 brace.dim_[Y_AXIS] = Interval (-y/2,y/2);
316 Lookup::vbracket (Real &y) const
319 psbracket.tex_ = String ("\\embeddedps{ ") + y + " draw_bracket}";
320 psbracket.dim_[Y_AXIS] = Interval (-y/2,y/2);
321 psbracket.dim_[X_AXIS] = Interval (0,4 PT);
323 Atom bracket = (*symtables_p_)("param")->lookup ("bracket");
324 Interval ydims = bracket.dim_[Y_AXIS];
326 Real min_y = ydims[LEFT];
327 Real max_y = ydims[RIGHT];
332 warning (_("bracket too small (") + print_dimen (y)+ ")");
337 warning (_("bracket too big (") + print_dimen (y)+ ")");
342 int idx = int (rint ((y- min_y)/step)) + 1;
347 bracket.tex_ = substitute_args (bracket.tex_,a);
348 bracket.dim_[Y_AXIS] = Interval (-y/2,y/2);