tupletSpannerDuration if applicable.
* lily/font-size-engraver.cc (process_music): read fontSize only
once per timestep.
* lily/engraver-group-engraver.cc (Engraver_group_engraver):
change acknowledgeHashTable to C++ member.
2005-07-23 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * lily/tuplet-engraver.cc (start_translation_timestep): only read
+ tupletSpannerDuration if applicable.
+
+ * lily/font-size-engraver.cc (process_music): read fontSize only
+ once per timestep.
+
* lily/engraver*cc: use throughout.
* lily/include/translator.icc (ADD_ACKNOWLEDGER): new macro.
Auto_beam_engraver::Auto_beam_engraver ()
{
forbid_ = 0;
-process_acknowledged_count_ = 0;
+ process_acknowledged_count_ = 0;
stems_ = 0;
shortest_mom_ = Moment (Rational (1, 8));
finished_beam_ = 0;
return (daddy_context_) ? daddy_context_->where_defined (sym) : 0;
}
+//#define PROFILE_PROPERTY_ACCESSES
+
+SCM context_property_lookup_table;
+LY_DEFINE(ly_context_property_lookup_stats, "ly:context-property-lookup-stats",
+ 0,0,0, (),
+ "")
+{
+ return context_property_lookup_table ? context_property_lookup_table
+ : scm_c_make_hash_table (1);
+}
+
+
/*
return SCM_EOL when not found.
*/
SCM
Context::internal_get_property (SCM sym) const
{
+#ifdef PROFILE_PROPERTY_ACCESSES
+ extern void note_property_access (SCM *table, SCM sym);
+ note_property_access (&context_property_lookup_table, sym);
+#endif
+
SCM val = SCM_EOL;
if (properties_dict ()->try_retrieve (sym, &val))
return val;
dad_eng->announce_grob (info);
}
-SCM find_acknowledge_engravers (SCM gravlist, SCM meta);
-SCM find_accept_engravers (SCM gravlist, SCM music_descr);
-
void
Engraver_group_engraver::acknowledge_grobs ()
{
if (scm_is_pair (nm))
nm = scm_cdr (nm);
else
- {
- /*
- it's tempting to put an assert for
- immutable_property_alist_ == '(), but in fact, some
- engravers (clef-engraver) add some more information to the
- immutable_property_alist_ (after it has been '()-ed).
-
- We ignore the grob anyway. He who has no name, shall not
- be helped. */
-
- continue;
- }
+ continue;
- SCM acklist = scm_hashq_ref (acknowledge_hash_table_, nm, SCM_UNDEFINED);
+ SCM acklist = scm_hashq_ref (acknowledge_hash_table_, nm, SCM_BOOL_F);
Engraver_dispatch_list *dispatch
= Engraver_dispatch_list::unsmob (acklist);
SCM ifaces
= scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta));
acklist = Engraver_dispatch_list::create (get_simple_trans_list (),
- ifaces);
+ ifaces);
dispatch
= Engraver_dispatch_list::unsmob (acklist);
- if (dispatch)
- scm_hashq_set_x (acknowledge_hash_table_, nm, acklist);
+ scm_hashq_set_x (acknowledge_hash_table_, nm, acklist);
}
{
dispatch->apply (info);
}
- else
- {
- if (acklist == SCM_BOOL_F)
- {
- acklist = find_acknowledge_engravers (get_simple_trans_list (),
- meta);
- scm_hashq_set_x (acknowledge_hash_table_, nm, acklist);
- }
-
- for (SCM p = acklist; scm_is_pair (p); p = scm_cdr (p))
- {
- Translator *t = unsmob_translator (scm_car (p));
- Engraver *eng = dynamic_cast<Engraver *> (t);
- if (eng && eng != info.origin_translator ())
- eng->acknowledge_grob (info);
- }
- }
}
}
+
/*
Ugh. This is slightly expensive. We could/should cache the value of
the group count?
/* write */ "");
-bool
-engraver_valid (Translator *tr, SCM ifaces)
-{
- SCM ack_ifs = scm_assoc (ly_symbol2scm ("interfaces-acked"),
- tr->translator_description ());
- ack_ifs = scm_cdr (ack_ifs);
- for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s))
- if (scm_c_memq (scm_car (s), ack_ifs) != SCM_BOOL_F)
- return true;
- return false;
-}
-
-SCM
-find_acknowledge_engravers (SCM gravlist, SCM ifaces)
-{
- SCM l = SCM_EOL;
- for (SCM s = gravlist; scm_is_pair (s); s = scm_cdr (s))
- {
- Translator *tr = unsmob_translator (scm_car (s));
- if (engraver_valid (tr, ifaces))
- l = scm_cons (tr->self_scm (), l);
- }
- l = scm_reverse_x (l, SCM_EOL);
-
- return l;
-}
void
Engraver_group_engraver::derived_mark () const
TRANSLATOR_DECLARATIONS (Font_size_engraver);
protected:
DECLARE_ACKNOWLEDGER(font);
+ virtual void process_music ();
+ Real size;
private:
};
Font_size_engraver::Font_size_engraver ()
{
+ size = 0.0;
}
+
void
-Font_size_engraver::acknowledge_font (Grob_info gi)
+Font_size_engraver::process_music ()
{
- SCM sz = get_property ("fontSize");
+ size = robust_scm2double (get_property ("fontSize"), 0.0);
+}
+void
+Font_size_engraver::acknowledge_font (Grob_info gi)
+{
/*
We only want to process a grob once.
*/
if (gi.context () != context ())
return;
- if (scm_is_number (sz) && scm_to_double (sz))
+ if (size)
{
- Real font_size = scm_to_double (sz);
-
- font_size += robust_scm2double (gi.grob ()->get_property ("font-size"), 0);
+ Real font_size = size
+ + robust_scm2double (gi.grob ()->get_property ("font-size"), 0);
gi.grob ()->set_property ("font-size", scm_make_real (font_size));
}
}
mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, sym, v);
}
-#ifdef DEBUG_PROFILE_ACCESSES
-Protected_scm property_lookup_table;
-LY_DEFINE(ly_property_lookup_stats, "ly:property-lookup-stats",
+//#define PROFILE_PROPERTY_ACCESSES
+
+SCM grob_property_lookup_table;
+LY_DEFINE(ly_property_lookup_stats, "ly:grob-property-lookup-stats",
0,0,0, (),
"")
{
- return (SCM) property_lookup_table;
+ return grob_property_lookup_table ? grob_property_lookup_table :
+ scm_c_make_hash_table (1);
}
-#endif
-SCM
-Grob::internal_get_property (SCM sym) const
+void
+note_property_access (SCM *table, SCM sym)
{
-#ifndef NDEBUG
- SCM grob_p = ly_lily_module_constant ("ly:grob?");
- SCM grob_list_p = ly_lily_module_constant ("grob-list?");
- SCM type = scm_object_property (sym, ly_symbol2scm ("backend-type?"));
-
- if (type == grob_p
- || type == grob_list_p)
- {
- scm_display (scm_list_2 (sym, type), scm_current_output_port());
- assert (0);
- }
-#endif
-
-#ifdef DEBUG_PROFILE_ACCESSES
/*
Statistics: which properties are looked up?
*/
- if (scm_hash_table_p (property_lookup_table) != SCM_BOOL_T)
- {
- property_lookup_table = scm_c_make_hash_table (259);
- }
-
- SCM hashhandle = scm_hashq_get_handle (property_lookup_table, sym);
+ if (!*table)
+ *table = scm_permanent_object (scm_c_make_hash_table (259));
+
+ SCM hashhandle = scm_hashq_get_handle (*table, sym);
if (hashhandle == SCM_BOOL_F)
{
- scm_hashq_set_x (property_lookup_table, sym, scm_from_int (0));
- hashhandle = scm_hashq_get_handle (property_lookup_table, sym);
+ scm_hashq_set_x (*table, sym, scm_from_int (0));
+ hashhandle = scm_hashq_get_handle (*table, sym);
}
- scm_set_cdr_x (hashhandle, scm_from_int (scm_to_int (scm_cdr (hashhandle)) + 1));
+ int count = scm_to_int (scm_cdr (hashhandle)) + 1;
+ scm_set_cdr_x (hashhandle, scm_from_int (count));
+}
+
+
+SCM
+Grob::internal_get_property (SCM sym) const
+{
+#ifdef PROFILE_PROPERTY_ACCESSES
+ note_property_access (&grob_property_lookup_table, sym);
#endif
SCM s = scm_sloppy_assq (sym, mutable_property_alist_);
SCM
Grob::internal_get_object (SCM sym) const
{
+#ifdef PROFILE_PROPERTY_ACCESSES
+ note_property_access (&grob_property_lookup_table, sym);
+#endif
+
SCM s = scm_sloppy_assq (sym, object_alist_);
return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s);
}
}
}
+
Measure_grouping_engraver::Measure_grouping_engraver ()
{
grouping_ = 0;
}
- return found ? retval : SCM_BOOL_F;
+ return found ? retval : SCM_EOL;
}
SCM
{
Moment now = now_mom ();
- Moment tsd;
- SCM s = get_property ("tupletSpannerDuration");
- if (unsmob_moment (s))
- tsd = unsmob_moment (s)->main_part_;
-
for (int i = tuplets_.size (); i--;)
{
+ Moment tsdmom = robust_scm2moment (get_property ("tupletSpannerDuration"), Moment (0));
+
+ Rational tsd = tsdmom.main_part_;
+
if (now.main_part_ >= tuplets_[i].span_stop_)
{
if (Spanner *sp = tuplets_[i].spanner_)
tuplets_[i].spanner_ = 0;
}
- if (tsd.to_bool ())
- tuplets_[i].span_stop_ += tsd.main_part_;
+ if (tsd)
+ tuplets_[i].span_stop_ += tsd;
}
if (now.main_part_ >= tuplets_[i].stop_)