]> git.donarmstrong.com Git - lilypond.git/blob - lily/tweak-registration.cc
* configure.in: Test for and accept lmodern if EC fonts not found.
[lilypond.git] / lily / tweak-registration.cc
1 /*
2   tweak-registration.cc --  implement Tweak_registry
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "tweak-registration.hh"
11
12 #include "object-key-undumper.hh"
13 #include "grob.hh"
14
15 #include "ly-smobs.icc"
16
17 void
18 Tweak_registry::clear ()
19 {
20   tweaks_.clear ();
21   undumper_ = new Object_key_undumper();
22   scm_gc_unprotect_object (undumper_->self_scm ());
23 }
24
25 void
26 Tweak_registry::insert_tweak_from_file (SCM tweak)
27 {
28   SCM skey = scm_car (tweak);
29
30   assert(scm_is_pair (skey) &&
31          scm_car (skey) == ly_symbol2scm ("key"));
32
33   Object_key const * key =  undumper_->get_key (scm_to_int (scm_cadr (skey)));
34   if (tweaks_.find (key) == tweaks_.end())
35     {
36       tweaks_[key] = SCM_EOL;
37     }
38
39   tweaks_[key] = scm_cons (scm_cdr (tweak), tweaks_[key]);
40 }
41
42
43 void
44 Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak)
45 {
46   Object_key const * key =  g->get_key ();
47   if (tweaks_.find (key) == tweaks_.end())
48     {
49       tweaks_[key] = SCM_EOL;
50     }
51
52   tweaks_[key] = scm_cons (tweak, tweaks_[key]);
53 }
54
55
56 SCM
57 Tweak_registry::get_tweaks (Grob *g) 
58 {
59   Object_key const *key = g->get_key();
60   if (tweaks_.find (key) == tweaks_.end())
61     {
62       return SCM_EOL;
63     }
64   return tweaks_[key];
65 }
66
67 Tweak_registry::Tweak_registry ()
68 {
69   undumper_ = 0;
70   smobify_self();
71   undumper_ = new Object_key_undumper();
72   scm_gc_unprotect_object (undumper_->self_scm ());
73 }
74
75 Tweak_registry::~Tweak_registry ()
76 {
77 }
78
79 SCM
80 Tweak_registry::list_tweaks ()
81 {
82   SCM retval = SCM_EOL;
83   for (Tweak_map::const_iterator i (tweaks_.begin ());
84        i != tweaks_.end();
85        i++)
86     {
87       const Object_key *  key = (*i).first;
88       for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t))
89         {
90           retval = scm_cons (scm_cons (key->self_scm(), scm_car (t)), retval);
91         }
92     }
93
94   return retval;
95 }
96
97 SCM
98 Tweak_registry::mark_smob (SCM smob)
99 {
100   Tweak_registry *me = (Tweak_registry*) SCM_CELL_WORD_1(smob);
101
102   for (Tweak_map::const_iterator i (me->tweaks_.begin ());
103        i != me->tweaks_.end();
104        i++)
105     {
106       scm_gc_mark ((*i).first->self_scm());
107       scm_gc_mark ((*i).second);
108     }
109
110   if (me->undumper_)
111     scm_gc_mark (me->undumper_->self_scm());
112                       
113   return SCM_EOL;
114 }
115
116 int
117 Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*)
118 {
119   scm_puts ("#<Tweak_registry>", port); 
120   return 1;
121 }
122
123 Object_key_undumper*
124 Tweak_registry::undumper () const
125 {
126   return undumper_;
127 }
128
129 IMPLEMENT_DEFAULT_EQUAL_P(Tweak_registry);
130 IMPLEMENT_SMOBS(Tweak_registry);
131
132
133 Tweak_registry  * global_registry_;
134
135 void
136 init_global_tweak_registry()
137 {
138   global_registry_ = new Tweak_registry();
139 }
140
141
142 LY_DEFINE(ly_clear_tweak_registry, "ly:tweak-clear-registry",
143           0,0,0,(),
144           "Clear global tweak registry"
145           )
146 {
147   global_registry_->clear ();
148   return SCM_UNSPECIFIED;
149 }
150
151 LY_DEFINE(ly_insert_tweak, "ly:insert-tweak",
152           2,0,0,
153           (SCM grob, SCM tweak),
154           "add new tweak for grob."
155           )
156 {
157   Grob *gr = unsmob_grob (grob);
158   SCM_ASSERT_TYPE(gr, grob, SCM_ARG1, __FUNCTION__, "Grob");
159   SCM_ASSERT_TYPE(scm_list_p (tweak) == SCM_BOOL_T
160                   && ly_c_procedure_p (scm_car (tweak)),
161                   tweak, SCM_ARG2, __FUNCTION__, "Tweak");
162   
163   global_registry_->insert_grob_tweak (gr, tweak);
164   return SCM_UNSPECIFIED;
165 }
166
167
168 LY_DEFINE(ly_tweak_read_keys, "ly:tweak-define-keys",
169           1,0,0,(SCM keys),
170           "Read keys"
171           )
172 {
173   global_registry_->undumper ()->parse_contents (keys); 
174   return SCM_UNSPECIFIED;
175 }
176
177
178 LY_DEFINE(ly_all_tweaks, "ly:all-tweaks",
179           0,0,0,(),
180           "all tweaks"
181           )
182 {
183   return global_registry_->list_tweaks();
184 }
185
186
187 LY_DEFINE(ly_tweak_read_tweaks, "ly:tweak-define-tweaks",
188           1,0,0,(SCM tweaks),
189           "Read  tweaks"
190           )
191 {
192   for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s))
193     {
194       global_registry_->insert_tweak_from_file (scm_car (s));
195     }
196   return SCM_UNSPECIFIED;
197 }