From: Han-Wen Nienhuys Date: Fri, 1 Dec 2006 00:12:10 +0000 (+0100) Subject: use skyline spacing for separation items. X-Git-Tag: release/2.11.1-1~27 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e7efc4248dcdcf4f10844b00a71745cce1b9bf5f;p=lilypond.git use skyline spacing for separation items. --- diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index 92620565af..5750716c72 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -23,7 +23,8 @@ struct Separation_item static Interval width (Grob *); static Interval relative_width (Grob *, Grob *); static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *); - static void set_distance (Item *, Item *, Real); + static void set_distance (Drul_array, Real); + static void set_skyline_distance (Drul_array, Real); static void add_item (Grob *, Item *); static void add_conditional_item (Grob *, Grob *); }; diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 8c07d8e65d..bf02d7a564 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -34,10 +34,10 @@ Separating_group_spanner::find_rods (Item *r, if (lb) { - Separation_item::set_distance (lb, r, padding); + Separation_item::set_distance (Drul_array (lb, r), padding); } - Separation_item::set_distance (l, r, padding); + Separation_item::set_distance (Drul_array (l, r), padding); /* this grob doesn't cause a constraint. We look further until we diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 36807989b2..b2aeb9b2ab 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -108,11 +108,11 @@ Separating_line_group_engraver::finalize () void Separating_line_group_engraver::acknowledge_item (Grob_info i) { - Item *it = dynamic_cast (i.grob ()); - if (!it) - return; + Item *it = i.item (); if (it->get_parent (X_AXIS) - && Axis_group_interface::has_axis (it->get_parent (X_AXIS), X_AXIS)) + && it->get_parent (X_AXIS) == it->get_parent (Y_AXIS) + && Axis_group_interface::has_axis (it->get_parent (X_AXIS), X_AXIS) + && Axis_group_interface::has_axis (it->get_parent (Y_AXIS), Y_AXIS)) return; if (to_boolean (it->get_property ("no-spacing-rods"))) diff --git a/lily/separation-item.cc b/lily/separation-item.cc index cd73e38a9d..f4271c3898 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -28,17 +28,54 @@ Separation_item::add_conditional_item (Grob *me, Grob *e) } void -Separation_item::set_distance (Item *l, Item *r, +Separation_item::set_skyline_distance (Drul_array items, + Real padding) +{ + Drul_array lines; + Direction d = LEFT; + + do + { + SCM prop = items[d]->get_property ("skylines"); + lines[d] = + Skyline (ly_scm2offsets (index_get_cell (prop, -d)), + 2.0, + -d); + } + while (flip (&d) != LEFT); + + Real dist = padding + lines[LEFT].distance (lines[RIGHT]); + if (dist > 0) + { + Rod rod; + + rod.item_drul_ = items; + + rod.distance_ = dist; + rod.add_to_cols (); + } +} + +void +Separation_item::set_distance (Drul_array items, Real padding) { - Interval li (Separation_item::width (l)); - Interval ri (Separation_item::conditional_width (r, l)); +#if 0 + if (0 && !Item::is_non_musical (items[LEFT]) + && !Item::is_non_musical (items[RIGHT])) + { + set_skyline_distance (items, padding); + return; + } +#endif + + 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_[LEFT] = l; - rod.item_drul_[RIGHT] = r; + rod.item_drul_ = items; rod.distance_ = li[RIGHT] - ri[LEFT] + padding; @@ -65,9 +102,8 @@ Separation_item::conditional_width (Grob *me, Grob *left) 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*/ + programming_error ("Separation_item element from wrong column"); + continue; } if (to_boolean (il->get_property ("no-spacing-rods"))) @@ -92,9 +128,10 @@ Separation_item::calc_skylines (SCM smob) SCM lines = scm_cons (SCM_BOOL_F,SCM_BOOL_F); Direction d = LEFT; + vector bs = boxes (me); do { - Skyline l (boxes (me), X_AXIS, d); + Skyline l (bs, Y_AXIS, d); index_set_cell (lines, d, ly_offsets2scm (l.to_points ())); } while (flip (&d) != LEFT); @@ -126,8 +163,9 @@ Separation_item::boxes (Grob *me) if (to_boolean (il->get_property ("no-spacing-rods"))) continue; - Box b (il->extent (pc, X_AXIS), - il->pure_height (ycommon, 0, very_large)); + Interval y (il->pure_height (ycommon, 0, very_large)); + y.widen (0.01); // fixme + Box b (il->extent (pc, X_AXIS), y); out.push_back (b); } @@ -229,4 +267,5 @@ ADD_INTERFACE (Separation_item, "conditional-elements " "elements" "padding " + "skylines " ); diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 38fe501282..5e9c175702 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -342,6 +342,7 @@ note that starts here.") object.") (side-axis ,number? "If the value is #X (or equivalently 1), the object is placed horizontally next to the other object. If the value is #Y or 0, it is placed vertically.") (size ,number? "Size of object, relative to standard size.") + (skylines ,pair? "A pair of lists of (x height) pairs.") (slope ,number? "The slope of this object.") (slur-padding ,number? "Extra distance between slur and script.") (space-alist ,list? "A table that specifies distances between