2 engraver-group.cc -- implement Engraver_group
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "engraver-group.hh"
12 #include "paper-score.hh"
15 #include "translator-dispatch-list.hh"
18 Engraver_group::announce_grob (Grob_info info)
20 announce_infos_.push_back (info);
22 Engraver_group *dad_eng
23 = context_->get_parent_context ()
24 ? dynamic_cast<Engraver_group *> (context_->get_parent_context ()->implementation ())
28 dad_eng->announce_grob (info);
32 Engraver_group::acknowledge_grobs ()
34 if (!announce_infos_.size ())
37 SCM name_sym = ly_symbol2scm ("name");
38 SCM meta_sym = ly_symbol2scm ("meta");
40 for (vsize j = 0; j < announce_infos_.size (); j++)
42 Grob_info info = announce_infos_[j];
44 SCM meta = info.grob ()->internal_get_property (meta_sym);
45 SCM nm = scm_assoc (name_sym, meta);
51 SCM acklist = scm_hashq_ref (acknowledge_hash_table_drul_[info.start_end()],
54 Engraver_dispatch_list *dispatch
55 = Engraver_dispatch_list::unsmob (acklist);
57 if (acklist == SCM_BOOL_F)
60 = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta));
61 acklist = Engraver_dispatch_list::create (get_simple_trans_list (),
62 ifaces, info.start_end ());
65 = Engraver_dispatch_list::unsmob (acklist);
67 scm_hashq_set_x (acknowledge_hash_table_drul_[info.start_end ()], nm, acklist);
71 dispatch->apply (info);
76 Ugh. This is slightly expensive. We could/should cache the value of
80 Engraver_group::pending_grob_count () const
82 int count = announce_infos_.size ();
83 for (SCM s = context_->children_contexts ();
84 scm_is_pair (s); s = scm_cdr (s))
86 Context *c = unsmob_context (scm_car (s));
88 = dynamic_cast<Engraver_group *> (c->implementation ());
91 count += group->pending_grob_count ();
97 Engraver_group::do_announces ()
102 DOCME: why is this inside the loop?
104 for (SCM s = context ()->children_contexts ();
105 scm_is_pair (s); s = scm_cdr (s))
107 Context *c = unsmob_context (scm_car (s));
108 Engraver_group *group
109 = dynamic_cast<Engraver_group *> (c->implementation ());
111 group->do_announces ();
117 precomputed_translator_foreach (PROCESS_ACKNOWLEDGED);
118 if (announce_infos_.size () == 0)
121 acknowledge_grobs ();
122 announce_infos_.clear ();
125 while (pending_grob_count () > 0);
128 Engraver_group::Engraver_group ()
130 acknowledge_hash_table_drul_[LEFT]
131 = acknowledge_hash_table_drul_[RIGHT]
134 acknowledge_hash_table_drul_[LEFT] = scm_c_make_hash_table (61);
135 acknowledge_hash_table_drul_[RIGHT] = scm_c_make_hash_table (61);
138 #include "translator.icc"
140 ADD_TRANSLATOR_GROUP (Engraver_group,
141 /* doc */ "A group of engravers taken together",
148 Engraver_group::derived_mark () const
150 scm_gc_mark (acknowledge_hash_table_drul_[LEFT]);
151 scm_gc_mark (acknowledge_hash_table_drul_[RIGHT]);