X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-def.cc;h=eb209453def09d5b610567b7ace6f1c8b21e13a5;hb=refs%2Ftags%2Frelease%2F1.3.8;hp=aafc2319289b20daf1a1a56ba4ace96b4e4ead21;hpb=1cf3d59c1559fb9774c4c1c8cae155cfe54a927c;p=lilypond.git diff --git a/lily/paper-def.cc b/lily/paper-def.cc index aafc231928..eb209453de 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -3,110 +3,121 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include +#include "all-font-metrics.hh" #include "string.hh" -#include "assoc.hh" #include "misc.hh" #include "paper-def.hh" #include "debug.hh" #include "lookup.hh" -#include "dimension.hh" -#include "assoc-iter.hh" #include "score-engraver.hh" -#include "p-score.hh" +#include "paper-score.hh" #include "identifier.hh" #include "main.hh" #include "scope.hh" -#include "assoc.hh" -#include "assoc-iter.hh" +#include "dictionary-iter.hh" +#include "file-results.hh" // urg? header_global_p +#include "paper-outputter.hh" +#include "paper-stream.hh" + Paper_def::Paper_def () { - lookup_p_assoc_p_ = new Assoc; - scope_p_ = new Scope; + lookup_p_tab_p_ = new Hash_table; + lookup_p_tab_p_->hash_func_ = int_hash; } + Paper_def::~Paper_def () { - for (Assoc_iter ai(*lookup_p_assoc_p_); ai.ok (); ai++) + for (Hash_table_iter ai(*lookup_p_tab_p_); ai.ok (); ai++) { delete ai.val (); } - delete scope_p_; - delete lookup_p_assoc_p_; + delete lookup_p_tab_p_; } Paper_def::Paper_def (Paper_def const&s) : Music_output_def (s) { - lookup_p_assoc_p_ = new Assoc; - for (Assoc_iter ai(*s.lookup_p_assoc_p_); ai.ok (); ai++) + shape_int_a_ = s.shape_int_a_; + lookup_p_tab_p_ = new Hash_table; + lookup_p_tab_p_->hash_func_ = int_hash; + + for (Hash_table_iter ai(*s.lookup_p_tab_p_); ai.ok (); ai++) { - Lookup * l=new Lookup (*ai.val ()); - l->paper_l_ = this; + Lookup * l = new Lookup (*ai.val ()); set_lookup (ai.key(), l); } - - scope_p_ = new Scope (*s.scope_p_); } + Real Paper_def::get_var (String s) const { - if (!scope_p_->elt_b (s)) - error (_f ("unknown paper variable: `%s\'", s)); - Real * p = scope_p_->elem (s)->access_Real (false); + return get_realvar (ly_symbol2scm (s.ch_C())); +} + +Real +Paper_def::get_realvar (SCM s) const +{ + if (!scope_p_->elem_b (s)) + error (_f ("unknown paper variable: `%s'", ly_symbol2string (s))); + Real * p = scope_p_->elem (s)->access_content_Real (false); if (!p) { - error (_ ("not a real variable")); + error (_("not a real variable")); return 0.0; } return *p; } + Interval Paper_def::line_dimensions_int (int n) const { - if (!shape_int_a_.size ()) - if (n) - return Interval (0, linewidth_f ()); - else - return Interval (get_var ("indent"), linewidth_f ()); + SCM s = default_properties_ [ly_symbol2scm ("margin-shape")]; + if (!gh_pair_p (s)) + { + Real lw = get_var ("linewidth"); + Real ind = n? 0.0:get_var ("indent"); - if (n >= shape_int_a_.size ()) - n = shape_int_a_.size () -1; + return Interval (ind, lw); + } - return shape_int_a_[n]; -} + + SCM last = SCM_EOL; + while (gh_pair_p (s) && n --) + { + last = s; + s = gh_cdr (s); + } -Real -Paper_def::beam_thickness_f () const -{ - return get_var ("beam_thickness"); -} + if (s == SCM_EOL) + { + s = last; + } -Real -Paper_def::linewidth_f () const -{ - return get_var ("linewidth"); + SCM pair = gh_car (s); + + return Interval (gh_scm2double (gh_car (pair)), + gh_scm2double (gh_cdr (pair))); } Real -Paper_def::duration_to_dist (Moment d,Real k) const +Paper_def::length_mom_to_dist (Moment d,Real k) const { - if (get_var ("geometric")) - return geometric_spacing (d); return arithmetic_spacing (d,k); } /** - Get the measure wide constant for arithmetic. + Get the measure wide constant for arithmetic spacing. @see John S. Gourlay. ``Spacing a Line of Music,'' Technical Report @@ -126,47 +137,16 @@ Paper_def::arithmetic_spacing (Moment d ,Real k) const return (log_2 (d) + k)* get_var ("arithmetic_multiplier"); } -Real -Paper_def::geometric_spacing (Moment d) const -{ - Real dur_f = (d) ?pow (get_var ("geometric"), log_2 (d)) : 0; - return get_var ("basicspace") + get_var ("unitspace") * dur_f; -} - void Paper_def::set_lookup (int i, Lookup*l) { - if (lookup_p_assoc_p_->elt_b (i)) + if (lookup_p_tab_p_->elem_b (i)) { - delete lookup_p_assoc_p_->elem (i); + delete lookup_p_tab_p_->elem (i); } - l ->paper_l_ = this; - (*lookup_p_assoc_p_)[i] = l; -} - -Real -Paper_def::interline_f () const -{ - return get_var ("interline"); + (*lookup_p_tab_p_)[i] = l; } -Real -Paper_def::rule_thickness () const -{ - return get_var ("rulethickness"); -} - -Real -Paper_def::staffline_f () const -{ - return get_var ("rulethickness"); -} - -Real -Paper_def::staffheight_f () const -{ - return get_var ("staffheight"); -} Real Paper_def::interbeam_f (int multiplicity_i) const @@ -177,58 +157,30 @@ Paper_def::interbeam_f (int multiplicity_i) const return get_var ("interbeam4"); } -Real -Paper_def::internote_f () const -{ - return get_var ("internote"); -} - -Real -Paper_def::note_width () const -{ - return get_var ("notewidth"); -} void Paper_def::print () const { #ifndef NPRINT Music_output_def::print (); - DOUT << "Paper {"; + DEBUG_OUT << "Paper {"; - for (Assoc_iter ai(*lookup_p_assoc_p_); ai.ok (); ai++) + for (Hash_table_iter ai(*lookup_p_tab_p_); ai.ok (); ai++) { - DOUT << "Lookup: " << ai.key () ; - ai.val ()->print (); + DEBUG_OUT << "Lookup: " << ai.key () << " = " << ai.val ()->font_name_ << '\n'; } - for (Assoc_iter i (*scope_p_); i.ok (); i++) - { - DOUT << i.key () << "= "; - DOUT << i.val ()->str () << '\n'; - } - DOUT << "}\n"; + DEBUG_OUT << "}\n"; #endif } Lookup const * Paper_def::lookup_l (int i) const { - return (*lookup_p_assoc_p_)[i]; + return (*lookup_p_tab_p_)[i]; } -IMPLEMENT_IS_TYPE_B1 (Paper_def, Music_output_def); -String -Paper_def::TeX_output_settings_str () const -{ - String s ("\n "); - for (Assoc_iter i (*scope_p_); i.ok (); i++) - s += String ("\\def\\mudelapaper") + i.key () - + "{" + i.val ()->str () + "}\n"; - s += *scope_p_->elem ("texsetting")->access_String (); - return s; -} int Paper_def::default_count_i_ = 0; @@ -238,3 +190,41 @@ Paper_def::get_next_default_count () const return default_count_i_ ++; } +void +Paper_def::reset_default_count() +{ + default_count_i_ = 0; +} + + +Paper_stream* +Paper_def::paper_stream_p () const +{ + String outname = base_output_str (); + + if (outname != "-") + outname += String (".") + output_global_ch; + *mlog << _f ("paper output to %s...", + outname == "-" ? String ("") : outname) << endl; + + target_str_global_array.push (outname); + return new Paper_stream (outname); +} + + +String +Paper_def::base_output_str () const +{ + String str = get_default_output (); + + if (str.empty_b ()) + { + str = default_outname_base_global; + int def = get_next_default_count (); + if (def) + str += "-" + to_str (def); + } + return str; +} + +