2 lookup.cc -- implement simple Lookup methods.
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 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"
26 texsetting = "\\unknowntexsetting";
27 symtables_ = new Symtables;
30 Lookup::Lookup (Lookup const &s)
32 paper_l_ = s.paper_l_;
33 texsetting = s.texsetting;
34 symtables_ = new Symtables (*s.symtables_);
42 Lookup::add (String s, Symtable*p)
44 symtables_->add (s, p);
51 DOUT << "Lookup: " << texsetting << " {\n";
58 Lookup::text (String style, String text, int dir) const
63 Atom tsym = (*symtables_)("style")->lookup (style);
64 a[0] = substitute_args (tsym.tex_,a);
66 Atom s = (*symtables_)("align")->lookup (dir);
67 s.tex_ = substitute_args (s.tex_,a);
75 Lookup::ball (int j) const
80 Symtable * st = (*symtables_)("balls");
81 return st->lookup (String (j));
85 Lookup::rest (int j, bool o) const
87 return (*symtables_)("rests")->lookup (String (j) + (o ? "o" : ""));
91 Lookup::fill (Box b) const
93 Atom s ((*symtables_)("param")->lookup ("fill"));
99 Lookup::accidental (int j) const
101 return (*symtables_)("accidentals")->lookup (String (j));
106 Lookup::bar (String s, Real h) const
109 a.push (print_dimen (h));
110 Atom ret=(*symtables_)("bars")->lookup (s);;
111 ret.tex_ = substitute_args (ret.tex_, a);
112 ret.dim_.y() = Interval (0, h);
117 Lookup::script (String s) const
119 return (*symtables_)("scripts")->lookup (s);
123 Lookup::dynamic (String s) const
125 return (*symtables_)("dynamics")->lookup (s);
129 Lookup::clef (String s) const
131 return (*symtables_)("clefs")->lookup (s);
135 Lookup::dots (int j) const
140 warning ("max 3 dots"); // todo
142 return (*symtables_)("dots")->lookup (j);
146 Lookup::flag (int j, Direction d) const
148 char c = (d == UP) ? 'u' : 'd';
149 return (*symtables_)("flags")->lookup (c + String (j));
153 Lookup::streepjes (int type, int i) const
172 Real w = ball (type).dim_[X_AXIS].length ();
174 Atom ret = (*symtables_)("streepjes")->lookup (idx);
177 a.push (String (w) + "pt");
179 ret.tex_ = substitute_args (ret.tex_, a);
185 Lookup::hairpin (Real &wid, bool decresc) const
187 int idx = int (rint (wid / 6 PT));
190 String idxstr = (decresc)? "decrescendosym" : "crescendosym";
191 Atom ret=(*symtables_)("param")->lookup (idxstr);
195 ret.tex_ = substitute_args (ret.tex_, a);
196 ret.dim_.x() = Interval (0,wid);
201 Lookup::linestaff (int lines, Real wid) const
203 Real internote_f = paper_l_ ->internote_f();
205 Real dy = (lines >0) ? (lines-1)*internote_f : 0;
206 s.dim_ = Box (Interval (0,wid), Interval (0,dy));
210 a.push (print_dimen (wid));
212 s.tex_ = (*symtables_)("param")->lookup ("linestaf").tex_;
213 s.tex_ = substitute_args (s.tex_, a);
220 Lookup::meter (Array<Scalar> a) const
223 s.dim_.x() = Interval (0 PT, 10 PT);
224 s.dim_.y() = Interval (0, 20 PT); // todo
225 String src = (*symtables_)("param")->lookup ("meter").tex_;
226 s.tex_ = substitute_args (src,a);
232 Lookup::stem (Real y1,Real y2) const
242 s.dim_.x() = Interval (0,0);
243 s.dim_.y() = Interval (y1,y2);
246 a.push (print_dimen (y1));
247 a.push (print_dimen (y2));
249 String src = (*symtables_)("param")->lookup ("stem").tex_;
250 s.tex_ = substitute_args (src,a);
255 should be handled via Tex_ code and Lookup::bar()
258 Lookup::vbrace (Real &y) const
262 warning ("piano brace too small (" + print_dimen (y)+ ")");
267 warning ("piano brace too big (" + print_dimen (y)+ ")");
271 int idx = int (rint ((y/2.0 - 20) + 148));
273 Atom s = (*symtables_)("param")->lookup ("brace");
277 s.tex_ = substitute_args (s.tex_,a);
278 s.dim_.y() = Interval (0,y);
282 a.push (print_dimen (y/2));
283 a.push (print_dimen (0));
285 s.tex_ = substitute_args ("\\placebox{%}{%}{%}", a);