From 7512d98b2fa5f9cea2add48cccb93cc591defe32 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sat, 23 Jul 2005 12:22:00 +0000 Subject: [PATCH] * 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-group-engraver.cc (Engraver_group_engraver): change acknowledgeHashTable to C++ member. --- ChangeLog | 6 +++ lily/auto-beam-engraver.cc | 2 +- lily/context.cc | 17 ++++++++ lily/engraver-group-engraver.cc | 67 +++---------------------------- lily/font-size-engraver.cc | 19 ++++++--- lily/grob-property.cc | 58 +++++++++++++------------- lily/measure-grouping-engraver.cc | 1 + lily/translator-dispatch-list.cc | 2 +- lily/tuplet-engraver.cc | 13 +++--- 9 files changed, 78 insertions(+), 107 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa338a3698..629a49fc86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-07-23 Han-Wen Nienhuys + * 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. diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index b05200a5f4..9559e044cd 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -114,7 +114,7 @@ Auto_beam_engraver::process_music () 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; diff --git a/lily/context.cc b/lily/context.cc index bf70e7a28c..663c57eeb8 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -339,12 +339,29 @@ Context::where_defined (SCM sym) const 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; diff --git a/lily/engraver-group-engraver.cc b/lily/engraver-group-engraver.cc index 20d2b87f4b..79ff78f90f 100644 --- a/lily/engraver-group-engraver.cc +++ b/lily/engraver-group-engraver.cc @@ -27,9 +27,6 @@ Engraver_group_engraver::announce_grob (Grob_info info) 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 () { @@ -48,20 +45,9 @@ 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); @@ -70,13 +56,12 @@ Engraver_group_engraver::acknowledge_grobs () 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); } @@ -84,25 +69,9 @@ Engraver_group_engraver::acknowledge_grobs () { 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 (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? @@ -170,32 +139,6 @@ ADD_TRANSLATOR_GROUP (Engraver_group_engraver, /* 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 diff --git a/lily/font-size-engraver.cc b/lily/font-size-engraver.cc index b91107a8a9..3c644b37fc 100644 --- a/lily/font-size-engraver.cc +++ b/lily/font-size-engraver.cc @@ -15,29 +15,36 @@ class Font_size_engraver : public Engraver 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)); } } diff --git a/lily/grob-property.cc b/lily/grob-property.cc index 84bea0c6bc..17d643bdfb 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -93,49 +93,43 @@ Grob::internal_set_property (SCM sym, SCM v) 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_); @@ -171,6 +165,10 @@ Grob::internal_set_object (SCM s, SCM v) 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); diff --git a/lily/measure-grouping-engraver.cc b/lily/measure-grouping-engraver.cc index 6484f98df5..f207534809 100644 --- a/lily/measure-grouping-engraver.cc +++ b/lily/measure-grouping-engraver.cc @@ -101,6 +101,7 @@ Measure_grouping_engraver::process_music () } } } + Measure_grouping_engraver::Measure_grouping_engraver () { grouping_ = 0; diff --git a/lily/translator-dispatch-list.cc b/lily/translator-dispatch-list.cc index 11d3d62166..21b6514556 100644 --- a/lily/translator-dispatch-list.cc +++ b/lily/translator-dispatch-list.cc @@ -60,7 +60,7 @@ Engraver_dispatch_list::create (SCM trans_list, } - return found ? retval : SCM_BOOL_F; + return found ? retval : SCM_EOL; } SCM diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 57e819c2c8..f0a4844a6e 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -100,13 +100,12 @@ Tuplet_engraver::start_translation_timestep () { 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_) @@ -117,8 +116,8 @@ Tuplet_engraver::start_translation_timestep () 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_) -- 2.39.5