]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix 1062.
authorJoe Neeman <joeneeman@gmail.com>
Sun, 27 Jun 2010 20:44:45 +0000 (23:44 +0300)
committerJoe Neeman <joeneeman@gmail.com>
Tue, 29 Jun 2010 22:17:27 +0000 (01:17 +0300)
Add RehearsalMarks, etc. to system skylines (this time with
proper caching).

lily/axis-group-interface.cc
lily/include/system.hh
lily/system.cc
scm/define-grobs.scm

index 578549a3d4abc10cfd2027708167b58bdfcbb3c2..18994f19fd94ae575f8cd090cc5c6c1518b0704b 100644 (file)
@@ -170,6 +170,12 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
       int start = Paper_column::get_rank (cols[breaks[i]]);
       int end = Paper_column::get_rank (cols[breaks[i+1]]);
 
+      // Take grobs that are visible with respect to a slightly longer line.
+      // Otherwise, we will never include grobs at breakpoints which aren't
+      // end-of-line-visible.
+      int visibility_end = i + 2 < breaks.size () ?
+       Paper_column::get_rank (cols[breaks[i+2]]) : end;
+
       Interval begin_line_iv;
       Interval mid_line_iv;
 
@@ -178,7 +184,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
          Item *it = dynamic_cast<Item*> (items[j]);
          int rank = it->get_column ()->get_rank ();
 
-         if (rank <= end && it->pure_is_visible (start, end)
+         if (rank <= end && it->pure_is_visible (start, visibility_end)
              && !to_boolean (it->get_property ("cross-staff")))
            {
              Interval dims = items[j]->pure_height (common, start, end);
@@ -203,7 +209,11 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
              Interval dims = spanners[j]->pure_height (common, start, end);
 
              if (!dims.is_empty ())
-               mid_line_iv.unite (dims);
+               {
+                 mid_line_iv.unite (dims);
+                 if (rank_span[LEFT] <= start)
+                   begin_line_iv.unite (dims);
+               }
            }
        }
 
index b8fa6644d43b3359ffbe81badeeba0e37be996c7..ee9f82f1e000b9a1fbfc3c48bc32a34ad04afdc3 100644 (file)
@@ -48,6 +48,10 @@ public:
   SCM get_paper_systems ();
   SCM get_broken_system_grobs ();
 
+  DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM));
+  DECLARE_SCHEME_CALLBACK (height, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_pure_height, (SCM, SCM, SCM));
+
   System (SCM);
   System (System const &);
 
index e440bed35ed12e8ae97c5efe5e21cd8c2ef6b2e6..628603fa84921fee160994f3e15271bec6cbdf8d 100644 (file)
@@ -585,7 +585,7 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin)
   Interval ret;
   for (vsize i = 0; i < staves.size(); ++i)
     {
-      Interval iv = begin?
+      Interval iv = begin ?
         Axis_group_interface::begin_of_line_pure_height (staves[i], start) :
         Axis_group_interface::rest_of_line_pure_height (staves[i], start, end);
       if (i<offsets.size())
@@ -593,6 +593,12 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin)
       ret.unite (iv);
     }
 
+  Interval other_elements = begin ?
+    Axis_group_interface::begin_of_line_pure_height (this, start) :
+    Axis_group_interface::rest_of_line_pure_height (this, start, end);
+
+  ret.unite (other_elements);
+
   return ret;
 }
 
@@ -608,6 +614,54 @@ System::rest_of_line_pure_height (vsize start, vsize end)
   return part_of_line_pure_height (start, end, false);
 }
 
+// This differs from Axis_group_interface::calc_pure_relevant_grobs
+// because here, we are only interested in those few elements that aren't
+// descended from VerticalAlignment (ie. things like RehearsalMark, BarLine).
+MAKE_SCHEME_CALLBACK (System, calc_pure_relevant_grobs, 1);
+SCM
+System::calc_pure_relevant_grobs (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+
+  extract_grob_set (me, "elements", elts);
+  vector<Grob*> relevant_grobs;
+  SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?");
+
+  for (vsize i = 0; i < elts.size (); ++i)
+    {
+      if (!Axis_group_interface::has_interface (elts[i])
+         && to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL)))
+       relevant_grobs.push_back (elts[i]);
+    }
+
+  SCM grobs_scm = Grob_array::make_array ();
+
+  unsmob_grob_array (grobs_scm)->set_array (relevant_grobs);
+  return grobs_scm;
+}
+
+MAKE_SCHEME_CALLBACK (System, height, 1);
+SCM
+System::height (SCM smob)
+{
+  return Axis_group_interface::height (smob);
+}
+
+MAKE_SCHEME_CALLBACK (System, calc_pure_height, 3);
+SCM
+System::calc_pure_height (SCM smob, SCM start_scm, SCM end_scm)
+{
+  System *me = dynamic_cast<System*> (unsmob_grob (smob));
+  int start = scm_to_int (start_scm);
+  int end = scm_to_int (end_scm);
+
+  Interval begin = me->begin_of_line_pure_height (start, end);
+  Interval rest = me->rest_of_line_pure_height (start, end);
+  begin.unite (rest);
+
+  return ly_interval2scm (begin);
+}
+
 ADD_INTERFACE (System,
               "This is the top-level object: Each object in a score"
               " ultimately has a @code{System} object as its X and"
index 8ae81d7f65d2100100a949be25d03e573f2bb968..3f3bcc6410b0dc41c91b756034b260f16defe7fa 100644 (file)
        (axes . (,X ,Y))
        (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
        (X-extent . ,ly:axis-group-interface::width)
-       (Y-extent . ,ly:axis-group-interface::height)
+       (Y-extent . ,ly:system::height)
        (meta . ((class . System)
-                (object-callbacks . ((pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+                (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
                                      (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
                                      (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
                                      (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
     (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
     (,ly:slur::height . ,ly:slur::pure-height)
     (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
-    (,ly:stem::height . ,ly:stem::pure-height)))
+    (,ly:stem::height . ,ly:stem::pure-height)
+    (,ly:system::height . ,ly:system::calc-pure-height)))
 
 (define pure-functions
   (list