]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/tuplet-engraver.cc (start_translation_timestep): only read
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 23 Jul 2005 12:22:00 +0000 (12:22 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 23 Jul 2005 12:22:00 +0000 (12:22 +0000)
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
lily/auto-beam-engraver.cc
lily/context.cc
lily/engraver-group-engraver.cc
lily/font-size-engraver.cc
lily/grob-property.cc
lily/measure-grouping-engraver.cc
lily/translator-dispatch-list.cc
lily/tuplet-engraver.cc

index aa338a369852dd9919cb852a68074a599647cfbe..629a49fc86718991e5eb483ec174f96d061fa343 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 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.
index b05200a5f4714bb18ed7b65ca044a2de28603333..9559e044cd1ab303809def3f71f6ae11c80daeb1 100644 (file)
@@ -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;
index bf70e7a28cf874265f3948d887d1d8dfa094d91c..663c57eeb82540bed897b3656e25f47cc7ebbfad 100644 (file)
@@ -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;
index 20d2b87f4b16bbfb00324a2447cd7294f117df08..79ff78f90f146e5d2055fa797e759781c3ba77a9 100644 (file)
@@ -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<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?
@@ -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
index b91107a8a9db608a021fac7e627bdbc987d15b98..3c644b37fcd8499408b556864ff57d09cd8c54f1 100644 (file)
@@ -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));
     }
 }
index 84bea0c6bc3f6ace23c055d8275f834fefa30033..17d643bdfbdaa3b22a6d167a62e3d4f2fb178aa4 100644 (file)
@@ -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);
index 6484f98df585284f8906f9e2b1dcff748ecbd1fd..f2075348093e8b40063e45e93f8020d79c717bd2 100644 (file)
@@ -101,6 +101,7 @@ Measure_grouping_engraver::process_music ()
        }
     }
 }
+
 Measure_grouping_engraver::Measure_grouping_engraver ()
 {
   grouping_ = 0;
index 11d3d62166f9795c8d680685880eeb91965ec401..21b6514556c0a5040b3b4fbd13c822b7ec756d72 100644 (file)
@@ -60,7 +60,7 @@ Engraver_dispatch_list::create (SCM trans_list,
     }
 
   
-  return found ? retval : SCM_BOOL_F;
+  return found ? retval : SCM_EOL;
 }
 
 SCM
index 57e819c2c8eab822c8e0dcbb7141871c186c4544..f0a4844a6e714ff498ef72a2ca7e5c3066f3e13a 100644 (file)
@@ -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_)