2 music-output-def.cc -- implement Music_output_def
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "dictionary.hh"
13 #include "music-output-def.hh"
14 #include "global-translator.hh"
15 #include "translator-def.hh"
17 #include "file-path.hh"
18 #include "lily-guile.hh"
19 #include "ly-modules.hh"
21 #include "ly-smobs.icc"
24 Music_output_def::get_next_score_count () const
29 Music_output_def::Music_output_def ()
31 scaled_fonts_ = SCM_EOL;
32 translator_tab_ = new Scheme_hash_table;
35 scm_gc_unprotect_object (translator_tab_->self_scm ());
37 scope_ = ly_make_anonymous_module();
40 Music_output_def::~Music_output_def ()
44 Music_output_def::Music_output_def (Music_output_def const &s)
47 translator_tab_ = new Scheme_hash_table (*s.translator_tab_);
49 scaled_fonts_ = SCM_EOL;
52 scm_gc_unprotect_object (translator_tab_->self_scm ());
54 scaled_fonts_ = scm_list_copy (s.scaled_fonts_);
56 scope_= ly_make_anonymous_module ();
57 if (ly_module_p (s.scope_))
58 ly_copy_module_variables (scope_, s.scope_);
62 IMPLEMENT_SMOBS (Music_output_def);
63 IMPLEMENT_DEFAULT_EQUAL_P (Music_output_def);
66 Music_output_def::mark_smob (SCM m)
68 Music_output_def * mo = (Music_output_def*) SCM_CELL_WORD_1 (m);
69 scm_gc_mark (mo->translator_tab_->self_scm ());
70 scm_gc_mark (mo->scope_);
72 return mo->scaled_fonts_;
76 Music_output_def::assign_translator (SCM transdef)
78 Translator_def *tp = unsmob_translator_def (transdef);
82 SCM s = ly_symbol2scm ("");
83 if (gh_string_p (tp->type_name_))
84 s = scm_string_to_symbol (tp->type_name_);
86 translator_tab_->set (s, transdef);
90 find the translator for NAME. NAME may be a string or a symbol.
93 Music_output_def::find_translator (SCM name) const
95 if (gh_string_p (name))
96 name = scm_string_to_symbol (name);
99 translator_tab_->try_retrieve (name, &val);
105 Music_output_def::get_global_translator ()
107 SCM key = ly_symbol2scm ("Score");
108 Translator_def * t = unsmob_translator_def (find_translator (key));
111 error (_f ("can't find `%s' context", "Score"));
113 Translator_group * tg = t->instantiate (this);
117 return dynamic_cast <Global_translator *> (tg);
121 Music_output_def::print_smob (SCM s, SCM p, scm_print_state *)
123 Music_output_def * def = unsmob_music_output_def (s);
124 scm_puts ("#<Music_output_def ", p);
126 scm_write (def->type_name_, p);
135 ugh: should move into Music_output_def (complication: .midi and .tex
136 need separate counts.) */
138 Music_output_def::outname_string ()
140 String out = output_name_global;
141 int def = get_next_score_count ();
142 if (def && out != "-")
144 Path p = split_path (out);
145 p.base += "-" + to_string (def);
154 Music_output_def::get_scmvar (String s) const
156 return lookup_variable (ly_symbol2scm (s.to_str0 ()));
161 Music_output_def::set_variable (SCM sym, SCM val)
163 scm_module_define (scope_, sym, val);
167 Music_output_def::lookup_variable (SCM sym) const
169 SCM var = ly_module_lookup (scope_, sym);
171 return scm_variable_ref (var);