From 1e7c646a6e134d17896f8895fe6780678a4b0c27 Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Sun, 17 Dec 2006 12:28:51 +0200 Subject: [PATCH] use skyline-spacing even in non-musical columns --- lily/include/separation-item.hh | 5 +- lily/separation-item.cc | 120 ++++++++------------------------ scm/define-grobs.scm | 2 +- 3 files changed, 34 insertions(+), 93 deletions(-) diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index ca63294852..4fb59b5e62 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -12,14 +12,15 @@ #include "lily-proto.hh" #include "direction.hh" #include "grob-interface.hh" +#include "skyline.hh" struct Separation_item { DECLARE_GROB_INTERFACE(); DECLARE_SCHEME_CALLBACK(calc_skylines, (SCM)); - static vector boxes (Grob *me); - static Interval conditional_width (Grob *, Grob *); + static vector boxes (Grob *me, Grob *left); + static Skyline conditional_skyline (Grob *, Grob *); static Interval width (Grob *); static Interval relative_width (Grob *, Grob *); static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index ecb4e5d71f..0f1d461021 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -33,8 +33,10 @@ Separation_item::set_skyline_distance (Drul_array items, { Drul_array lines (Skyline_pair::unsmob (items[LEFT]->get_property ("skylines")), Skyline_pair::unsmob (items[RIGHT]->get_property ("skylines"))); + Skyline right = conditional_skyline (items[RIGHT], items[LEFT]); + right.merge ((*lines[RIGHT])[LEFT]); - Real dist = padding + (*lines[LEFT])[RIGHT].distance ((*lines[RIGHT])[LEFT]); + Real dist = padding + (*lines[LEFT])[RIGHT].distance (right); if (dist > 0) { Rod rod; @@ -50,63 +52,19 @@ bool Separation_item::set_distance (Drul_array items, Real padding) { - if (!Item::is_non_musical (items[LEFT]) - && !Item::is_non_musical (items[RIGHT])) - { - set_skyline_distance (items, padding); - return true; - } - - Interval li (Separation_item::width (items[LEFT])); - Interval ri (Separation_item::conditional_width (items[RIGHT], items[LEFT])); - if (!li.is_empty () && !ri.is_empty ()) - { - Rod rod; - - rod.item_drul_ = items; - - rod.distance_ = li[RIGHT] - ri[LEFT] + padding; - - if (rod.distance_ > 0) - rod.add_to_cols (); - return true; - } - return false; + set_skyline_distance (items, padding); + return true; } /* Return the width of ME given that we are considering the object on the LEFT. */ -Interval -Separation_item::conditional_width (Grob *me, Grob *left) +Skyline +Separation_item::conditional_skyline (Grob *me, Grob *left) { - Interval w = width (me); - - Item *item = dynamic_cast (me); - Paper_column *pc = item->get_column (); - - extract_grob_set (me, "conditional-elements", elts); - for (vsize i = 0; i < elts.size (); i++) - { - Item *il = dynamic_cast (elts[i]); - if (pc != il->get_column ()) - { - programming_error ("Separation_item element from wrong column"); - continue; - } - - if (to_boolean (il->get_property ("no-spacing-rods"))) - continue; - - if (Accidental_placement::has_interface (il)) - w.unite (Accidental_placement::get_relevant_accidental_extent (il, pc, left)); - } - - SCM pad = me->get_property ("padding"); - - w.widen (robust_scm2double (pad, 0.0)); - return w; + vector bs = boxes (me, left); + return Skyline (bs, 0.1, Y_AXIS, LEFT); } @@ -115,21 +73,25 @@ SCM Separation_item::calc_skylines (SCM smob) { Item *me = unsmob_item (smob); - vector bs = boxes (me); + vector bs = boxes (me, 0); /* todo: the horizon_padding is somewhat arbitrary */ return Skyline_pair (bs, 0.1, Y_AXIS).smobbed_copy (); } - +/* if left is non-NULL, get the boxes corresponding to the + conditional-elements (conditioned on the grob LEFT). This + sounds more general than it is: conditional-elements are + always accidentals attached to a tied note. +*/ vector -Separation_item::boxes (Grob *me) +Separation_item::boxes (Grob *me, Grob *left) { Item *item = dynamic_cast (me); int very_large = INT_MAX; Paper_column *pc = item->get_column (); vector out; - extract_grob_set (me, "elements", elts); + extract_grob_set (me, left ? "conditional-elements" : "elements", elts); Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS); @@ -145,9 +107,19 @@ Separation_item::boxes (Grob *me) continue; Interval y (il->pure_height (ycommon, 0, very_large)); - Box b (il->extent (pc, X_AXIS), y); + Interval x; + + if (!left) + x = il->extent (pc, X_AXIS); + else if (Accidental_placement::has_interface (il)) + x = Accidental_placement::get_relevant_accidental_extent (il, pc, left); + else + continue; + + SCM padding = elts[i]->get_property ("padding"); + x.widen (robust_scm2double (padding, 0)); - out.push_back (b); + out.push_back (Box (x, y)); } return out; @@ -157,39 +129,7 @@ Interval Separation_item::width (Grob *me) { SCM sw = me->get_property ("X-extent"); - if (is_number_pair (sw)) - return ly_scm2interval (sw); - - Item *item = dynamic_cast (me); - Paper_column *pc = item->get_column (); - Interval w; - - extract_grob_set (me, "elements", elts); - for (vsize i = 0; i < elts.size (); i++) - { - Item *il = dynamic_cast (elts[i]); - if (pc != il->get_column ()) - { - /* this shouldn't happen, but let's continue anyway. */ - programming_error ("Separation_item: I've been drinking too much"); - continue; /*UGH UGH*/ - } - - if (to_boolean (il->get_property ("no-spacing-rods"))) - continue; - - Interval iv (il->extent (pc, X_AXIS)); - if (!iv.is_empty ()) - w.unite (iv); - } - - SCM pad = me->get_property ("padding"); - - w.widen (robust_scm2double (pad, 0.0)); - - me->set_property ("X-extent", ly_interval2scm (w)); - - return w; + return ly_scm2interval (sw); } Interval diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index becbc1c597..7ab7023fc3 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -2080,6 +2080,7 @@ (define pure-print-callbacks (list + ly:bar-line::print ly:note-head::print ly:accidental-interface::print ly:dots::print @@ -2094,7 +2095,6 @@ (ly:stencil? sten) (memq sten pure-print-callbacks)) (ly:grob::stencil-height grob) - '(0 . 0)))) (define pure-conversions-alist -- 2.39.5