]> git.donarmstrong.com Git - lilypond.git/commitdiff
Reduce number of Stem::is_invisible() calls.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 4 Jan 2007 20:40:45 +0000 (21:40 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 4 Jan 2007 20:40:45 +0000 (21:40 +0100)
Cache stems with is_normal_stem() in normal-stems in Beam grob

lily/beam-quanting.cc
lily/beam.cc
lily/dynamic-engraver.cc
lily/include/beam.hh
lily/stem-tremolo.cc
lily/stem.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 0d7cca3e88950a50638add5fadbd6be80f768476..0338ecd7ecccc6b1caccfa26f0905385790ed06e 100644 (file)
@@ -154,8 +154,8 @@ Beam::quanting (SCM smob, SCM posns)
   for (int a = 2; a--;)
     common[a] = common_refpoint_of_array (stems, me, Axis (a));
 
-  Grob *fvs = first_visible_stem (me);
-  Grob *lvs = last_visible_stem (me);
+  Grob *fvs = first_normal_stem (me);
+  Grob *lvs = last_normal_stem (me);
   Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
   Real xr = fvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
 
index a1beb8009a6bf0bf13f5c40ec0288aad76e6091a..ba6dc277e9c87c8c163f6e07e3c0d3e9bfac84dc 100644 (file)
@@ -41,6 +41,7 @@
 #include "staff-symbol-referencer.hh"
 #include "stem.hh"
 #include "warn.hh"
+#include "grob-array.hh"
 
 #if DEBUG_BEAM_SCORING
 #include "text-interface.hh" // debug output.
@@ -119,6 +120,21 @@ Beam::get_beam_count (Grob *me)
   return m;
 }
 
+MAKE_SCHEME_CALLBACK (Beam, calc_normal_stems, 1);
+SCM
+Beam::calc_normal_stems (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  
+  extract_grob_set (me, "stems", stems);
+  SCM val = Grob_array::make_array ();
+  Grob_array *ga = unsmob_grob_array (val);
+  for (vsize i = 0; i < stems.size ();  i++)
+    if (Stem::is_normal_stem (stems[i]))
+      ga->add (stems[i]);
+  
+  return val;  
+}
 
 MAKE_SCHEME_CALLBACK (Beam, calc_direction, 1);
 SCM
@@ -135,7 +151,7 @@ Beam::calc_direction (SCM smob)
 
   Direction dir = CENTER;
 
-  int count = visible_stem_count (me);
+  int count = normal_stem_count (me);
   if (count < 2)
     {
       extract_grob_set (me, "stems", stems);
@@ -148,7 +164,7 @@ Beam::calc_direction (SCM smob)
        }
       else 
        {
-         Grob *stem = first_visible_stem (me);
+         Grob *stem = first_normal_stem (me);
 
          /*
            ugh: stems[0] case happens for chord tremolo.
@@ -463,10 +479,10 @@ Beam::print (SCM grob)
   vector<Beam_segment> segments = get_beam_segments (me, &commonx);
 
   Interval span;
-  if (visible_stem_count (me))
+  if (normal_stem_count (me))
     {
-      span[LEFT] = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS);
-      span[RIGHT] = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS);
+      span[LEFT] = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS);
+      span[RIGHT] = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS);
     }
   else
     {
@@ -657,7 +673,7 @@ Beam::consider_auto_knees (Grob *me)
 
   gaps.set_full ();
 
-  extract_grob_set (me, "stems", stems);
+  extract_grob_set (me, "normal-stems", stems);
 
   Grob *common = common_refpoint_of_array (stems, me, Y_AXIS);
   Real staff_space = Staff_symbol_referencer::staff_space (me);
@@ -666,8 +682,6 @@ Beam::consider_auto_knees (Grob *me)
   for (vsize i = 0; i < stems.size (); i++)
     {
       Grob *stem = stems[i];
-      if (Stem::is_invisible (stem))
-       continue;
 
       Interval head_extents = Stem::head_positions (stem);
       if (!head_extents.is_empty ())
@@ -727,9 +741,6 @@ Beam::consider_auto_knees (Grob *me)
       for (vsize i = 0; i < stems.size (); i++)
        {
          Grob *stem = stems[i];
-         if (Stem::is_invisible (stem))
-           continue;
-
          Interval head_extents = head_extents_array[j++];
 
          Direction d = (head_extents.center () < max_gap.center ())
@@ -792,7 +803,7 @@ Beam::calc_stem_shorten (SCM smob)
     return scm_from_int (0);
 
   Real forced_fraction = 1.0 * forced_stem_count (me)
-    / visible_stem_count (me);
+    / normal_stem_count (me);
 
   int beam_count = get_beam_count (me);
 
@@ -828,27 +839,27 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns)
   
   Grob *me = unsmob_grob (smob);
 
-  int count = visible_stem_count (me);
+  int count = normal_stem_count (me);
   Interval pos (0,0);
   if (count < 1)
     return ly_interval2scm (pos);
 
   vector<Real> x_posns;
-  extract_grob_set (me, "stems", stems);
+  extract_grob_set (me, "normal-stems", stems);
   Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS);
   Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS);
 
   Real my_y = me->relative_coordinate (commony, Y_AXIS);
 
-  Grob *fvs = first_visible_stem (me);
-  Grob *lvs = last_visible_stem (me);
+  Grob *fvs = first_normal_stem (me);
+  Grob *lvs = last_normal_stem (me);
 
   Interval ideal (Stem::get_stem_info (fvs).ideal_y_
                  + fvs->relative_coordinate (commony, Y_AXIS) - my_y,
                  Stem::get_stem_info (lvs).ideal_y_
                  + lvs->relative_coordinate (commony, Y_AXIS) - my_y);
 
-  Real x0 = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS);
+  Real x0 = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS);
   for (vsize i = 0; i < stems.size (); i++)
     {
       Grob *s = stems[i];
@@ -856,7 +867,7 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns)
       Real x = s->relative_coordinate (commonx, X_AXIS) - x0;
       x_posns.push_back (x);
     }
-  Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - x0;
+  Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS) - x0;
 
   Real y = 0;
   Real slope = 0;
@@ -864,8 +875,8 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns)
   Real ldy = 0.0;
   if (!ideal.delta ())
     {
-      Interval chord (Stem::chord_start_y (first_visible_stem (me)),
-                     Stem::chord_start_y (last_visible_stem (me)));
+      Interval chord (Stem::chord_start_y (stems[0]),
+                     Stem::chord_start_y (stems.back ()));
 
       /* Simple beams (2 stems) on middle line should be allowed to be
         slightly sloped.
@@ -897,9 +908,6 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns)
       for (vsize i = 0; i < stems.size (); i++)
        {
          Grob *s = stems[i];
-         if (!Stem::is_normal_stem (s))
-           continue;
-
          ideals.push_back (Offset (x_posns[i],
                               Stem::get_stem_info (s).ideal_y_
                               + s->relative_coordinate (commony, Y_AXIS)
@@ -945,7 +953,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns)
   Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS);
   Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS);
 
-  Grob *fvs = first_visible_stem (me);
+  Grob *fvs = first_normal_stem (me);
 
   if (!fvs)
     return posns;
@@ -959,7 +967,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns)
       x_posns.push_back (x);
     }
 
-  Grob *lvs = last_visible_stem (me);
+  Grob *lvs = last_normal_stem (me);
   if (!lvs)
     return posns;
 
@@ -1036,7 +1044,7 @@ Beam::slope_damping (SCM smob, SCM posns)
   Grob *me = unsmob_grob (smob);
   Drul_array<Real> pos = ly_scm2interval (posns);
 
-  if (visible_stem_count (me) <= 1)
+  if (normal_stem_count (me) <= 1)
     return posns;
 
   
@@ -1056,13 +1064,13 @@ Beam::slope_damping (SCM smob, SCM posns)
 
       Real dy = pos[RIGHT] - pos[LEFT];
 
-      Grob *fvs = first_visible_stem (me);
-      Grob *lvs = last_visible_stem (me);
+      Grob *fvs = first_normal_stem (me);
+      Grob *lvs = last_normal_stem (me);
 
       Grob *commonx = fvs->common_refpoint (lvs, X_AXIS);
 
-      Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS)
-       - first_visible_stem (me)->relative_coordinate (commonx, X_AXIS);
+      Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS)
+       - first_normal_stem (me)->relative_coordinate (commonx, X_AXIS);
 
       Real slope = dy && dx ? dy / dx : 0;
 
@@ -1176,8 +1184,8 @@ Beam::set_stem_lengths (SCM smob)
       thick = get_thickness (me);
     }
 
-  Grob *fvs = first_visible_stem (me);
-  Grob *lvs = last_visible_stem (me);
+  Grob *fvs = first_normal_stem (me);
+  Grob *lvs = last_normal_stem (me);
 
   Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
   Real xr = lvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
@@ -1249,16 +1257,13 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming)
 int
 Beam::forced_stem_count (Grob *me)
 {
-  extract_grob_set (me, "stems", stems);
+  extract_grob_set (me, "normal-stems", stems);
 
   int f = 0;
   for (vsize i = 0; i < stems.size (); i++)
     {
       Grob *s = stems[i];
 
-      if (Stem::is_invisible (s))
-       continue;
-
       /* I can imagine counting those boundaries as a half forced stem,
         but let's count them full for now. */
       Direction defdir = to_dir (s->get_property ("default-direction"));
@@ -1272,42 +1277,24 @@ Beam::forced_stem_count (Grob *me)
 }
 
 int
-Beam::visible_stem_count (Grob *me)
+Beam::normal_stem_count (Grob *me)
 {
-  extract_grob_set (me, "stems", stems);
-  int c = 0;
-  for (vsize i = stems.size (); i--;)
-    {
-      if (!Stem::is_invisible (stems[i]))
-       c++;
-    }
-  return c;
+  extract_grob_set (me, "normal-stems", stems);
+  return stems.size ();
 }
 
 Grob *
-Beam::first_visible_stem (Grob *me)
+Beam::first_normal_stem (Grob *me)
 {
-  extract_grob_set (me, "stems", stems);
-
-  for (vsize i = 0; i < stems.size (); i++)
-    {
-      if (Stem::is_normal_stem (stems[i]))
-       return stems[i];
-    }
-  return 0;
+  extract_grob_set (me, "normal-stems", stems);
+  return stems.size () ? stems[0] : 0;
 }
 
 Grob *
-Beam::last_visible_stem (Grob *me)
+Beam::last_normal_stem (Grob *me)
 {
-  extract_grob_set (me, "stems", stems);
-
-  for (vsize i = stems.size (); i--;)
-    {
-      if (Stem::is_normal_stem (stems[i]))
-       return stems[i];
-    }
-  return 0;
+  extract_grob_set (me, "normal-stems", stems);
+  return stems.size () ? stems.back () : 0;
 }
 
 /*
@@ -1337,7 +1324,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset)
   Grob *beam = unsmob_grob (stem->get_object ("beam"));
   if (!beam
       || !Beam::has_interface (beam)
-      || !Beam::visible_stem_count (beam))
+      || !Beam::normal_stem_count (beam))
     return scm_from_double (0.0);
 
   Drul_array<Real> pos (robust_scm2drul (beam->get_property ("positions"),
@@ -1349,8 +1336,8 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset)
 
   Real dy = pos[RIGHT] - pos[LEFT];
 
-  Drul_array<Grob*> visible_stems (first_visible_stem (beam),
-                                  last_visible_stem (beam));
+  Drul_array<Grob*> visible_stems (first_normal_stem (beam),
+                                  last_normal_stem (beam));
   extract_grob_set (beam, "stems", stems);
   
   Grob *common = common_refpoint_of_array (stems, beam, X_AXIS);
@@ -1480,6 +1467,7 @@ ADD_INTERFACE (Beam,
               "length-fraction "
               "least-squares-dy "
               "neutral-direction "
+              "normal-stems "
               "positions "
               "quant-score "
               "quantized-positions "
index 0bacd813fd932ce21762c86bbc6dc1cfb5604afd..e3d4f095815eec9ad06fe95f6004fbc33beb39ed 100644 (file)
@@ -390,7 +390,6 @@ Dynamic_engraver::typeset_all ()
     }
 }
 
-
 void
 Dynamic_engraver::acknowledge_accidental (Grob_info info)
 {
@@ -398,7 +397,6 @@ Dynamic_engraver::acknowledge_accidental (Grob_info info)
     Side_position_interface::add_support (line_spanner_, info.grob ());
 }
 
-
 void
 Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info)
 {
@@ -406,7 +404,6 @@ Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info)
     Side_position_interface::add_support (line_spanner_, info.grob ());
 }
 
-
 void
 Dynamic_engraver::acknowledge_slur (Grob_info info)
 {
@@ -414,7 +411,6 @@ Dynamic_engraver::acknowledge_slur (Grob_info info)
     Side_position_interface::add_support (line_spanner_, info.grob ());
 }
 
-
 void
 Dynamic_engraver::acknowledge_note_column (Grob_info info)
 {
index 3eb8027f49c59769de3c18c827c0d565e0955206..f521f180c233376c32eaf160729acc8e046bcfef 100644 (file)
@@ -69,9 +69,9 @@ bool operator <(Beam_stem_segment const &a, Beam_stem_segment const &b);
 class Beam
 {
 public:
-  static int visible_stem_count (Grob *);
-  static Grob *first_visible_stem (Grob *);
-  static Grob *last_visible_stem (Grob *);
+  static int normal_stem_count (Grob *);
+  static Grob *first_normal_stem (Grob *);
+  static Grob *last_normal_stem (Grob *);
   DECLARE_GROB_INTERFACE();
   static void add_stem (Grob *, Grob *);
   static bool is_knee (Grob *);
@@ -90,6 +90,7 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positions, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_least_squares_positions, (SCM, SCM));
+  DECLARE_SCHEME_CALLBACK (calc_normal_stems, (SCM));  
   DECLARE_SCHEME_CALLBACK (calc_concaveness, (SCM));
   DECLARE_SCHEME_CALLBACK (set_stem_lengths, (SCM));
 
index cf927a5e51a8253a8df1ae5b45f5dc9693dad597..60cde74744edbf31b59b8c75ecb0ff0051705d60 100644 (file)
@@ -33,8 +33,8 @@ Stem_tremolo::calc_slope (SCM smob)
       if (is_number_pair (s))
        dy = - scm_to_double (scm_car (s)) + scm_to_double (scm_cdr (s));
 
-      Grob *s2 = Beam::last_visible_stem (beam);
-      Grob *s1 = Beam::first_visible_stem (beam);
+      Grob *s2 = Beam::last_normal_stem (beam);
+      Grob *s1 = Beam::first_normal_stem (beam);
       
       Grob *common = s1->common_refpoint (s2, X_AXIS);
       Real dx = s2->relative_coordinate (common, X_AXIS) -
index 89f656031855f1de44fb18caf559c1f2dc2d831d..e155a0611e628b64657a09bf6a0f54241f5d80e0 100644 (file)
@@ -214,12 +214,9 @@ Stem::add_head (Grob *me, Grob *n)
 bool
 Stem::is_invisible (Grob *me)
 {
-  Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"),
-                                          0.0);
-
-  return !((head_count (me)
-           || stemlet_length > 0.0)
-          && scm_to_int (me->get_property ("duration-log")) >= 1);
+  return !is_normal_stem (me)
+    && (robust_scm2double (me->get_property ("stemlet-length"),
+                          0.0) == 0.0);
 }
 
 
index 918fe5d11f24711e19b3d0207a5392d4f07f1414..9d354b8d22e5d8b32e6c02e67ac5ebeb43824487 100644 (file)
@@ -508,6 +508,7 @@ where this is set in.")
 
      (note-columns ,pair? "list of NoteColumn grobs.")
 
+     (normal-stems ,ly:grob-array? "Array of visible stems.") 
      (note-heads ,ly:grob-array? "List of note head grobs")
      (note-head ,ly:grob? "A single note head")
      (right-items ,ly:grob-array? "")
index 5e17ff84b98490fb8826790d0ddf88dcbdfa314f..34618b9b774d0bb65719ca1722618fb8c89b1844 100644 (file)
        ;; only for debugging.
        (font-family . roman)
        (meta . ((class . Spanner)
+                (object-callbacks . ((normal-stems . ,ly:beam::calc-normal-stems))) 
                 (interfaces . (staff-symbol-referencer-interface
                                beam-interface))))))