X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flookup.cc;h=8ba88483f5f080c3bf4fdf17d0a2274863318bf8;hb=30270f615f32a6b93e7b09bf55d1b8a7d7aad7ca;hp=119c52e449e0a805f6c0b86e0800cb2c45b36af5;hpb=2181534bd94587fcac8f1769f2dda7bece693649;p=lilypond.git diff --git a/lily/lookup.cc b/lily/lookup.cc index 119c52e449..8ba88483f5 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -3,283 +3,367 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1998 Han-Wen Nienhuys + + Jan Nieuwenhuizen TODO - This doth suck. We should have PS output, and read spacing info from TFMs - - Glissando, bracket - + Read spacing info from AFMs + Glissando */ #include "lookup.hh" #include "debug.hh" +#include "dimensions.hh" #include "symtable.hh" -#include "dimen.hh" -#include "tex.hh" #include "scalar.hh" #include "paper-def.hh" +#include "string-convert.hh" +#include "main.hh" -Lookup::Lookup() +Lookup::Lookup () { paper_l_ = 0; - texsetting = "\\unknowntexsetting"; - symtables_ = new Symtables; + symtables_p_ = new Symtables; + afm_p_ =0; } -Lookup::Lookup (Lookup const &s) +Lookup::Lookup (Lookup const& s) { + font_ = s.font_; + font_path_ = s.font_path_; paper_l_ = s.paper_l_; - texsetting = s.texsetting; - symtables_ = new Symtables (*s.symtables_); + symtables_p_ = new Symtables (*s.symtables_p_); + afm_p_ = 0; } -Lookup::~Lookup() + +Lookup::Lookup (Symtables const& s) { - delete symtables_; + font_ = s.font_; + font_path_ = s.font_path_; + paper_l_ = 0; + symtables_p_ = new Symtables (s); + afm_p_ = 0; } -void -Lookup::add (String s, Symtable*p) +Lookup::~Lookup () { - symtables_->add (s, p); + delete afm_p_; + delete symtables_p_; } -void -Lookup::print() const +Atom +Lookup::accidental (int j) const { -#ifndef NPRINT - DOUT << "Lookup: " << texsetting << " {\n"; - symtables_->print(); - DOUT << "}\n"; -#endif + return afm_find (String ("accidentals") + String ("-") + to_str (j)); } -Symbol -Lookup::text (String style, String text, int dir) const +void +Lookup::add (String s, Symtable*p) { - Array a; - - a.push (text); - Symbol tsym = (*symtables_)("style")->lookup (style); - a[0] = substitute_args (tsym.tex,a); - - Symbol s = (*symtables_)("align")->lookup (dir); - s.tex = substitute_args (s.tex,a); - s.dim = tsym.dim; - return s; + symtables_p_->add (s, p); } +Atom +Lookup::afm_find (String s, String str) const +{ + if (!afm_p_) + { + *mlog << "[" << font_path_; + ( (Lookup*)this)->afm_p_ = new Adobe_font_metric (read_afm (font_path_)); + *mlog << "]" << flush ; + DOUT << this->afm_p_->str (); + } + Adobe_font_char_metric m = afm_p_->find_char (s); + Atom a; + if (m.code () < 0) + return a; + + a.dim_ = m.B_; + a.dim_[X_AXIS] *= 1 / 1000.0; + a.dim_[Y_AXIS] *= 1 / 1000.0; + a.str_ = String_convert::form_str (str.ch_C (), m.code ()); + a.font_ = font_; + return a; +} -Symbol +Atom Lookup::ball (int j) const { if (j > 2) j = 2; - Symtable * st = (*symtables_)("balls"); - return st->lookup (String (j)); + return afm_find (String ("balls") + String ("-") + to_str (j)); } -Symbol -Lookup::rest (int j, bool o) const +Atom +Lookup::bar (String str, Real h) const { - return (*symtables_)("rests")->lookup (String (j) + (o ? "o" : "")); + Array a; + a.push (print_dimen (h)); + Atom s = (*symtables_p_) ("bars")->lookup (str); + s.str_ = substitute_args (s.str_, a); + s.dim_.y () = Interval (-h/2, h/2); + s.font_ = font_; + return s; } -Symbol -Lookup::fill (Box b) const +String +Lookup::base_output_str () const { - Symbol s ((*symtables_)("param")->lookup ("fill")); - s.dim = b; - return s; + assert (paper_l_); + String str = paper_l_->get_default_output (); + + if (str.empty_b ()) + { + str = default_outname_base_global; + int def = paper_l_->get_next_default_count (); + if (def) + str += "-" + to_str (def); + } + return str; } -Symbol -Lookup::accidental (int j) const +Atom +Lookup::beam (Real slope, Real width, Real thick) const { - return (*symtables_)("accidentals")->lookup (String (j)); + Atom a (ps_beam (slope, width, thick)); + Real height = slope * width; + Real min_y = (0 ? height) + thick/2; + + a.dim_[X_AXIS] = Interval (0, width); + a.dim_[Y_AXIS] = Interval (min_y, max_y); + return a; } - -Symbol -Lookup::bar (String s, Real h) const +String +Lookup::character_str (int i) const { - Array a; - a.push (print_dimen (h)); - Symbol ret=(*symtables_)("bars")->lookup (s);; - ret.tex = substitute_args (ret.tex, a); - ret.dim.y() = Interval (0, h); - return ret; + return to_str (i); } -Symbol -Lookup::script (String s) const +Atom +Lookup::clef (String st) const { - return (*symtables_)("scripts")->lookup (s); + return afm_find (String ("clefs") + String ("-") + st); } -Symbol -Lookup::dynamic (String s) const +Atom +Lookup::dots () const { - return (*symtables_)("dynamics")->lookup (s); + return afm_find (String ("dots") + String ("-") + String ("dot")); } -Symbol -Lookup::clef (String s) const +Atom +Lookup::dynamic (String st) const { - return (*symtables_)("clefs")->lookup (s); + return (*symtables_p_) ("dynamics")->lookup (st); } - -Symbol -Lookup::dots (int j) const + +Atom +Lookup::fill (Box b) const { - if (j>3) - { - j = 3; - warning ("max 3 dots"); // todo - } - return (*symtables_)("dots")->lookup (j); + Atom a; + a.dim_ = b; + return a; } -Symbol +Atom Lookup::flag (int j, Direction d) const { char c = (d == UP) ? 'u' : 'd'; - return (*symtables_)("flags")->lookup (c + String (j)); + return afm_find (String ("flags") + String ("-") + to_str (c) + to_str (j)); } -Symbol -Lookup::streepjes (int i) const +void +Lookup::print () const { - assert (i); - - int arg; - String idx; - - if (i < 0) - { - idx = "botlines"; - arg = -i; - } - else +#ifndef NPRINT + DOUT << "Lookup {\n"; + symtables_p_->print (); + DOUT << "}\n"; +#endif +} + +String +Lookup::print_dimen (Real r) const +{ + String s = to_str (r, "%.3f"); + if (s.index_i ("NaN") != -1) { - arg = i; - idx = "toplines"; + warning (_ ("NaN")); + s = "0.0"; } - Symbol ret = (*symtables_)("streepjes")->lookup (idx); - - Array a; - a.push (arg); - ret.tex = substitute_args (ret.tex, a); + return s; +} - return ret; +Atom +Lookup::rest (int j, bool o) const +{ + return afm_find (String ("rests") + + String ("-") + to_str (j) + (o ? "o" : "")); } -Symbol -Lookup::hairpin (Real &wid, bool decresc) const +Atom +Lookup::rule_symbol (Real height, Real width) const { - int idx = int (rint (wid / 6 PT)); - if (!idx) idx ++; - wid = idx*6 PT; - String idxstr = (decresc)? "decrescendosym" : "crescendosym"; - Symbol ret=(*symtables_)("param")->lookup (idxstr); - - Array a; - a.push (idx); - ret.tex = substitute_args (ret.tex, a); - ret.dim.x() = Interval (0,wid); - return ret; + Atom bs= (*symtables_p_) ("param")->lookup ("rule"); + Array args; + args.push (print_dimen (height)); + args.push (print_dimen (width)); + bs.str_ = substitute_args (bs.str_, args); + bs.dim_.x () = Interval (0, width); + bs.dim_.y () = Interval (0, height); + return bs; } -Symbol -Lookup::linestaff (int lines, Real wid) const +Atom +Lookup::script (String str) const { - Real internote_f = paper_l_ ->internote_f(); - Symbol s; - Real dy = (lines >0) ? (lines-1)*internote_f : 0; - s.dim = Box (Interval (0,wid), Interval (0,dy)); + return afm_find (String ("scripts") + String ("-") + str); +} - Array a; - a.push (lines); - a.push (print_dimen (wid)); +Atom +Lookup::special_time_signature (String s, Array arr) const +{ + String symbolname = "timesig-"+s+"%/%"; + Atom a (afm_find (substitute_args (symbolname, arr))); + if (!a.empty ()) + return a; + // Try if the full name was given + a = afm_find ("timesig-"+s); + if (!a.empty ()) + return a; + // Resort to default layout with numbers + return time_signature (arr); +} - s.tex = (*symtables_)("param")->lookup ("linestaf").tex; - s.tex = substitute_args (s.tex, a); +static void +substitute_arg (String& r, String arg) +{ + int p = r.index_i ('%'); + if (p < 0) + return ; - return s; + r = r.left_str (p) + arg + r.right_str (r.length_i () - p - 1); } - -Symbol -Lookup::meter (Array a) const +String +Lookup::substitute_args (String source, Array args) const { - Symbol s; - s.dim.x() = Interval (0 PT, 10 PT); - s.dim.y() = Interval (0, 20 PT); // todo - String src = (*symtables_)("param")->lookup ("meter").tex; - s.tex = substitute_args (src,a); - return s; + String str (source); + for (int i = 0 ; i < args.size (); i++) + substitute_arg (str, args[i]); + return str; } +String +Lookup::substitute_args (String source, Array args) const +{ + Array sv; + for (int i = 0 ; i < args.size (); i++) + sv.push (args[i]); + return substitute_args (source, sv); +} -Symbol -Lookup::stem (Real y1,Real y2) const +Atom +Lookup::stem (Real y1, Real y2, String str) const { - if (y1 > y2) + if (y1 > y2) { Real t = y1; y1 = y2; y2 = t; } - Symbol s; - - s.dim.x() = Interval (0,0); - s.dim.y() = Interval (y1,y2); - + Atom s; + + s.dim_.x () = Interval (0,0); + s.dim_.y () = Interval (y1,y2); + Array a; - a.push (print_dimen (y1)); + + Real stem_width = paper_l_->get_var ("stemthickness"); + a.push (print_dimen (-stem_width /2)); + a.push (print_dimen (stem_width)); a.push (print_dimen (y2)); - - String src = (*symtables_)("param")->lookup ("stem").tex; - s.tex = substitute_args (src,a); + a.push (print_dimen (-y1)); + + s.str_ = substitute_args (str, a); + s.font_ = font_; + return s; +} + +Atom +Lookup::streepje (int type) const +{ + if (type > 2) + type = 2; + + return afm_find ("balls" + String ("-") +to_str (type) + "l"); +} + +Atom +Lookup::text (String style, String text) const +{ + Array a; + + a.push (text); + Atom s = (*symtables_p_) ("style")->lookup (style); + s.str_ = substitute_args (s.str_,a); + s.font_ = font_; + + return s; +} + +Atom +Lookup::time_signature (Array a) const +{ + Atom s ((*symtables_p_) ("param")->lookup ("time_signature")); + s.str_ = substitute_args (s.str_, a); + return s; } /* - should be handled via TeX code and Lookup::bar() + should be handled via Tex_ code and Lookup::bar () */ -Symbol +Atom Lookup::vbrace (Real &y) const { - if (y < 2* 20 PT) + Atom brace = (*symtables_p_) ("param")->lookup ( "brace"); + Interval ydims = brace.dim_[Y_AXIS]; + Real min_y = ydims[LEFT]; + Real max_y = ydims[RIGHT]; + Real step = 1.0 PT; + + if (y < min_y) { - warning ("piano brace too small (" + print_dimen (y)+ ")"); - y = 2*20 PT; + warning (_ ("piano brace") + + " " + _ ("too small") + " (" + print_dimen (y) + ")"); + y = min_y; } - if (y > 67 * 2 PT) + if (y > max_y) { - warning ("piano brace too big (" + print_dimen (y)+ ")"); - y = 67 *2 PT; + warning (_ ("piano brace") + + " " + _ ("too big") + " (" + print_dimen (y) + ")"); + y = max_y; } + - int idx = int (rint ((y/2.0 - 20) + 148)); + int idx = int (rint ( (y- min_y)/step)) + 1; - Symbol s = (*symtables_)("param")->lookup ("brace"); - { - Array a; - a.push (idx); - s.tex = substitute_args (s.tex,a); - s.dim.y() = Interval (0,y); - } { Array a; - a.push (print_dimen (y/2)); - a.push (print_dimen (0)); - a.push (s.tex); - s.tex = substitute_args ("\\placebox{%}{%}{%}", a); + a.push (character_str (idx)); + brace.str_ = substitute_args (brace.str_,a); + brace.dim_[Y_AXIS] = Interval (-y/2,y/2); } - - return s; + brace.font_ = font_; + + return brace; } + +