]> git.donarmstrong.com Git - lilypond.git/blob - lily/lookup.cc
release: 0.1.11
[lilypond.git] / lily / lookup.cc
1 /*
2   lookup.cc -- implement simple Lookup methods.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7
8   TODO
9   This doth suck. We should have PS output, and read spacing info from TFMs
10   
11   Glissando, bracket
12   
13 */
14
15 #include "lookup.hh"
16 #include "debug.hh"
17 #include "symtable.hh"
18 #include "dimen.hh"
19 #include "tex.hh"
20 #include "scalar.hh"
21 #include "paper-def.hh"
22
23 Lookup::Lookup()
24 {
25   paper_l_ = 0;
26   texsetting = "\\unknowntexsetting";
27   symtables_ = new Symtables;
28 }
29
30 Lookup::Lookup (Lookup const &s)
31 {
32   paper_l_ = s.paper_l_;
33   texsetting = s.texsetting;
34   symtables_ = new Symtables (*s.symtables_);
35 }
36 Lookup::~Lookup()
37 {
38   delete symtables_;
39 }
40
41 void
42 Lookup::add (String s, Symtable*p)
43 {
44   symtables_->add (s, p);
45 }
46
47 void
48 Lookup::print() const
49 {
50 #ifndef NPRINT
51   DOUT << "Lookup: " << texsetting << " {\n";
52   symtables_->print();
53   DOUT << "}\n";
54 #endif
55 }
56
57 Symbol
58 Lookup::text (String style, String text, int dir) const
59 {
60   Array<String> a;
61  
62   a.push (text);
63   Symbol tsym =  (*symtables_)("style")->lookup (style);
64   a[0] = substitute_args (tsym.tex,a);
65
66   Symbol s = (*symtables_)("align")->lookup (dir);
67   s.tex = substitute_args (s.tex,a);
68   s.dim = tsym.dim;
69   return s;
70 }
71
72
73
74 Symbol
75 Lookup::ball (int j) const
76 {
77   if (j > 2)
78     j = 2;
79
80   Symtable * st = (*symtables_)("balls");
81   return st->lookup (String (j));
82 }
83
84 Symbol
85 Lookup::rest (int j, bool o) const
86 {
87   return (*symtables_)("rests")->lookup (String (j) + (o ? "o" : ""));
88 }
89
90 Symbol
91 Lookup::fill (Box b) const
92 {
93   Symbol s ((*symtables_)("param")->lookup ("fill"));
94   s.dim = b;
95   return s;
96 }
97
98 Symbol
99 Lookup::accidental (int j) const
100 {
101   return (*symtables_)("accidentals")->lookup (String (j));
102 }
103
104
105 Symbol
106 Lookup::bar (String s, Real h) const
107 {
108   Array<String> a;
109   a.push (print_dimen (h));
110   Symbol ret=(*symtables_)("bars")->lookup (s);;
111   ret.tex = substitute_args (ret.tex, a);
112   ret.dim.y() = Interval (0, h);
113   return ret;
114 }
115
116 Symbol
117 Lookup::script (String s) const
118 {
119   return (*symtables_)("scripts")->lookup (s);
120 }
121
122 Symbol
123 Lookup::dynamic (String s) const
124 {
125   return (*symtables_)("dynamics")->lookup (s);
126 }
127
128 Symbol
129 Lookup::clef (String s) const
130 {
131   return (*symtables_)("clefs")->lookup (s);
132 }
133  
134 Symbol
135 Lookup::dots (int j) const
136 {
137   if (j>3) 
138     {
139       j = 3;
140       warning ("max 3 dots");   // todo
141     }
142   return (*symtables_)("dots")->lookup (j);
143 }
144
145 Symbol
146 Lookup::flag (int j) const
147 {
148   return (*symtables_)("flags")->lookup (j);
149 }
150
151 Symbol
152 Lookup::streepjes (int i) const
153 {
154   assert (i);
155   
156   int arg;
157   String idx;
158   
159   if (i < 0) 
160     {
161       idx = "botlines";
162       arg = -i;
163     }
164   else 
165     {
166       arg = i;
167       idx = "toplines";
168     }
169   Symbol ret = (*symtables_)("streepjes")->lookup (idx);
170   
171   Array<String> a;
172   a.push (arg);
173   ret.tex = substitute_args (ret.tex, a);
174
175   return ret;
176 }
177
178 Symbol
179 Lookup::hairpin (Real &wid, bool decresc) const
180 {
181   int idx = int (rint (wid / 6 PT));
182   if (!idx) idx ++;
183   wid = idx*6 PT;
184   String idxstr = (decresc)? "decrescendosym" : "crescendosym";
185   Symbol ret=(*symtables_)("param")->lookup (idxstr);
186      
187   Array<String> a;
188   a.push (idx);
189   ret.tex = substitute_args (ret.tex, a);
190   ret.dim.x() = Interval (0,wid);
191   return ret;
192 }
193
194 Symbol
195 Lookup::linestaff (int lines, Real wid) const
196 {
197   Real internote_f = paper_l_ ->internote_f();
198   Symbol s;
199   Real dy = (lines >0) ? (lines-1)*internote_f : 0;
200   s.dim = Box (Interval (0,wid), Interval (0,dy));
201
202   Array<String> a;
203   a.push (lines);
204   a.push (print_dimen (wid));
205
206   s.tex = (*symtables_)("param")->lookup ("linestaf").tex;
207   s.tex = substitute_args (s.tex, a);
208
209   return s;
210 }
211
212
213 Symbol
214 Lookup::meter (Array<Scalar> a) const
215 {
216   Symbol s;
217   s.dim.x() = Interval (0 PT, 10 PT);
218   s.dim.y() = Interval (0, 20 PT);      // todo
219   String src = (*symtables_)("param")->lookup ("meter").tex;
220   s.tex = substitute_args (src,a);
221   return s;    
222 }
223
224
225 Symbol
226 Lookup::stem (Real y1,Real y2) const
227 {
228   if (y1 > y2) 
229     {
230       Real t = y1;
231       y1 = y2;
232       y2 = t;
233     }
234   Symbol s;
235   
236   s.dim.x() = Interval (0,0);
237   s.dim.y() = Interval (y1,y2);
238   
239   Array<String> a;
240   a.push (print_dimen (y1));
241   a.push (print_dimen (y2));
242         
243   String src = (*symtables_)("param")->lookup ("stem").tex;
244   s.tex = substitute_args (src,a);
245   return s;
246 }
247
248 /*
249   should be handled via TeX code and Lookup::bar()
250  */
251 Symbol
252 Lookup::vbrace (Real &y) const
253 {
254   if (y < 2* 20 PT) 
255     {
256       warning ("piano brace too small (" + print_dimen (y)+ ")");
257       y = 2*20 PT;
258     }
259   if (y > 67 * 2 PT) 
260     {
261       warning ("piano brace too big (" + print_dimen (y)+ ")"); 
262       y = 67 *2 PT;
263     }
264   
265   int idx = int (rint ((y/2.0 - 20) + 148));
266   
267   Symbol s = (*symtables_)("param")->lookup ("brace");
268   {
269     Array<String> a;
270     a.push (idx);
271     s.tex = substitute_args (s.tex,a);
272     s.dim.y() = Interval (0,y);
273   }
274   {
275     Array<String> a;
276     a.push (print_dimen (y/2));
277     a.push (print_dimen (0));
278     a.push (s.tex);
279     s.tex = substitute_args ("\\placebox{%}{%}{%}", a);
280   }
281
282         
283   return s;
284 }