X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-def.cc;h=d3d4a6795476f3d07af96b7cc857b9c7e1ef7207;hb=88d259d05cbd7ff6e077d58278a615fcedd844c7;hp=b2602dd355a0e6c8add89ed4a4de5b34b9be14ae;hpb=7c9b553acad88d5cd62461989f0f20652dc04dda;p=lilypond.git diff --git a/lily/paper-def.cc b/lily/paper-def.cc index b2602dd355..d3d4a67954 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -1,104 +1,244 @@ /* paper-def.cc -- implement Paper_def - source file of the LilyPond music typesetter + source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1998 Han-Wen Nienhuys */ #include +#include "string.hh" +#include "assoc.hh" #include "misc.hh" #include "paper-def.hh" #include "debug.hh" #include "lookup.hh" -#include "dimen.hh" +#include "ps-lookup.hh" +#include "tex-lookup.hh" +#include "assoc-iter.hh" +#include "score-engraver.hh" +#include "p-score.hh" +#include "identifier.hh" +#include "main.hh" +#include "scope.hh" +#include "assoc.hh" +#include "assoc-iter.hh" +Paper_def::Paper_def () +{ + lookup_p_assoc_p_ = new Assoc; +} + + +Paper_def::~Paper_def () +{ + for (Assoc_iter ai(*lookup_p_assoc_p_); ai.ok (); ai++) + { + delete ai.val (); + } + + delete lookup_p_assoc_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++) + { + Lookup * l = global_lookup_l->lookup_p (*ai.val ()); + l->paper_l_ = this; + set_lookup (ai.key(), l); + } +} + +Real +Paper_def::get_var (String s) const +{ + if (!scope_p_->elem_b (s)) + error (_f ("unknown paper variable: `%s\'", s)); + Real * p = scope_p_->elem (s)->access_Real (false); + if (!p) + { + 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 ()); + if (n >= shape_int_a_.size ()) + n = shape_int_a_.size () -1; -// golden ratio -const Real PHI = (1+sqrt(5))/2; + return shape_int_a_[n]; +} -// see Roelofs, p. 57 Real -Paper_def::duration_to_dist(Moment d) +Paper_def::beam_thickness_f () const { - if (!d) - return 0; - - return whole_width * pow(geometric_, log_2(d)); + return get_var ("beam_thickness"); } Real -Paper_def::rule_thickness()const +Paper_def::linewidth_f () const { - return 0.4 PT; + return get_var ("linewidth"); } -Paper_def::Paper_def(Lookup *l) +Real +Paper_def::duration_to_dist (Moment d,Real k) const { - lookup_p_ = l; - linewidth = 15 *CM_TO_PT; // in cm for now - whole_width = 8 * note_width(); - geometric_ = sqrt(2); - outfile = "lelie.out"; + return arithmetic_spacing (d,k); } -Paper_def::~Paper_def() + +/** + Get the measure wide constant for arithmetic. + + @see + John S. Gourlay. ``Spacing a Line of Music,'' Technical Report + OSU-CISRC-10/87-TR35, Department of Computer and Information Science, + The Ohio State University, 1987. + + */ +Real +Paper_def::arithmetic_constant (Moment d) const { - delete lookup_p_; + return get_var ("arithmetic_basicspace") - log_2 (Moment (1,8) elem_b (i)) + { + delete lookup_p_assoc_p_->elem (i); + } + l ->paper_l_ = this; + (*lookup_p_assoc_p_)[i] = l; } Real -Paper_def::interline() const +Paper_def::interline_f () const { - return lookup_p_->ball(4).dim.y.length(); + return get_var ("interline"); } Real -Paper_def::internote() const +Paper_def::rule_thickness () const { - return lookup_p_->internote(); + return get_var ("rulethickness"); } + Real -Paper_def::note_width()const +Paper_def::staffline_f () const { - return lookup_p_->ball(4).dim.x.length( ); + return get_var ("rulethickness"); } + Real -Paper_def::standard_height() const +Paper_def::staffheight_f () const { - return 20 PT; + return get_var ("staffheight"); +} + +Real +Paper_def::interbeam_f (int multiplicity_i) const +{ + if (multiplicity_i <= 3) + return get_var ("interbeam"); + else + return get_var ("interbeam4"); +} + +Real +Paper_def::internote_f () const +{ + return get_var ("interline") /2.0 ; +} + +Real +Paper_def::note_width () const +{ + return get_var ("notewidth"); } void -Paper_def::print() const +Paper_def::print () const { #ifndef NPRINT - mtor << "Paper {width: " << print_dimen(linewidth); - mtor << "whole: " << print_dimen(whole_width); - mtor << "out: " <print(); - mtor << "}\n"; + Music_output_def::print (); + DOUT << "Paper {"; + + for (Assoc_iter ai(*lookup_p_assoc_p_); ai.ok (); ai++) + { + DOUT << "Lookup: " << ai.key () ; + ai.val ()->print (); + } + + DOUT << "}\n"; #endif } + Lookup const * -Paper_def::lookup_l() +Paper_def::lookup_l (int i) const { - return lookup_p_; + return (*lookup_p_assoc_p_)[i]; } + +IMPLEMENT_IS_TYPE_B1 (Paper_def, Music_output_def); + +String +Paper_def::ps_output_settings_str () const +{ + String s ("\n "); + for (Assoc_iter i (*scope_p_); i.ok (); i++) + s += String ("/mudelapaper") + i.key () + + "{" + i.val ()->str () + "} bind def\n"; + s += *scope_p_->elem ("pssetting")->access_String (); + return s; +} + +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; + +int +Paper_def::get_next_default_count () const +{ + return default_count_i_ ++; +} + + +