X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparation-item.cc;h=5e93a13e4c73b00e7928594757526be42175686a;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=b3e574dad8978488b96de7cf80d4728041ef5485;hpb=d61cf3bbdb1c6670a127ba3baddf2f04d3e34fd3;p=lilypond.git diff --git a/lily/separation-item.cc b/lily/separation-item.cc index b3e574dad8..5e93a13e4c 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,24 +80,37 @@ Skyline Separation_item::conditional_skyline (Grob *me, Grob *left) { vector bs = boxes (me, left); - Real horizon_padding = robust_scm2double (me->get_property ("skyline-vertical-padding"), 0.0); - return Skyline (bs, horizon_padding, Y_AXIS, LEFT); + return Skyline (bs, Y_AXIS, LEFT); } MAKE_SCHEME_CALLBACK (Separation_item, calc_skylines, 1); SCM Separation_item::calc_skylines (SCM smob) { - Item *me = unsmob_item (smob); + Item *me = Item::unsmob (smob); vector bs = boxes (me, 0); - Real horizon_padding = robust_scm2double (me->get_property ("skyline-vertical-padding"), 0.0); - return Skyline_pair (bs, horizon_padding, Y_AXIS).smobbed_copy (); + Skyline_pair sp (bs, Y_AXIS); + /* + TODO: We need to decide if padding is 'intrinsic' + to a skyline or if it is something that is only added on in + distance calculations. Here, we make it intrinsic, which copies + the behavior from the old code but no longer corresponds to how + vertical skylines are handled (where padding is not built into + the skyline). + */ + Real vp = robust_scm2double (me->get_property ("skyline-vertical-padding"), 0.0); + sp[LEFT] = sp[LEFT].padded (vp); + sp[RIGHT] = sp[RIGHT].padded (vp); + return sp.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. +/* + If left is non-NULL, get the boxes corresponding to the + conditional-elements (conditioned on the grob LEFT). + Conditional elements are, for now, arpeggios and accidental + placements. Based on the left grob, the accidentals will + be printed or not, so we filter using + Accidental_placement::get_relevant_accidentals. */ vector Separation_item::boxes (Grob *me, Grob *left) @@ -111,7 +124,19 @@ Separation_item::boxes (Grob *me, Grob *left) vector elts; if (left) - elts = Accidental_placement::get_relevant_accidentals (read_only_elts, left); + { + vector accidental_elts; + vector other_elts; // for now only arpeggios + for (vsize i = 0; i < read_only_elts.size (); i++) + { + if (Accidental_placement::has_interface (read_only_elts[i])) + accidental_elts.push_back (read_only_elts[i]); + else + other_elts.push_back (read_only_elts[i]); + } + elts = Accidental_placement::get_relevant_accidentals (accidental_elts, left); + elts.insert (elts.end (), other_elts.begin (), other_elts.end ()); + } else elts = read_only_elts; @@ -140,10 +165,19 @@ Separation_item::boxes (Grob *me, Grob *left) Interval extra_height = robust_scm2interval (elts[i]->get_property ("extra-spacing-height"), Interval (0.0, 0.0)); - x[LEFT] += extra_width[LEFT]; - x[RIGHT] += extra_width[RIGHT]; - y[DOWN] += extra_height[DOWN]; - y[UP] += extra_height[UP]; + // The conventional empty extent is (+inf.0 . -inf.0) + // but (-inf.0 . +inf.0) is used as extra-spacing-height + // on items that must not overlap other note-columns. + // If these two uses of inf combine, leave the empty extent. + + if (!isinf (x[LEFT])) + x[LEFT] += extra_width[LEFT]; + if (!isinf (x[RIGHT])) + x[RIGHT] += extra_width[RIGHT]; + if (!isinf (y[DOWN])) + y[DOWN] += extra_height[DOWN]; + if (!isinf (y[UP])) + y[UP] += extra_height[UP]; if (!x.is_empty () && !y.is_empty ()) out.push_back (Box (x, y)); @@ -152,14 +186,22 @@ Separation_item::boxes (Grob *me, Grob *left) return out; } -MAKE_SCHEME_CALLBACK (Separation_item, print, 1) +MAKE_DOCUMENTED_SCHEME_CALLBACK (Separation_item, print, 1, + "Optional stencil for @code{PaperColumn} or" + "@code{NonMusicalPaperColumn}.\n" + "Draws the @code{horizontal-skylines} of each" + " @code{PaperColumn}, showing the shapes used" + " to determine the minimum distances between" + " @code{PaperColumns} at the note-spacing step," + " before staves have been spaced (vertically)" + " on the page.") SCM Separation_item::print (SCM smob) { if (!debug_skylines) return SCM_BOOL_F; - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); Stencil ret; if (Skyline_pair *s = Skyline_pair::unsmob (me->get_property ("horizontal-skylines"))) {