X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fstencil-integral.cc;h=0f1f14ff50485e09ff3933cc6db261ec6a7ab17e;hb=94dc452301cc0d1e9983f5aeb784884f7fe8c964;hp=601893b5cb23913bbc5d925c31a29edde89aba23;hpb=2f7fe0c6bc80ad57ae73e213f9b20bc9719ba2ce;p=lilypond.git diff --git a/lily/stencil-integral.cc b/lily/stencil-integral.cc index 601893b5cb..0f1f14ff50 100644 --- a/lily/stencil-integral.cc +++ b/lily/stencil-integral.cc @@ -981,16 +981,6 @@ Grob::maybe_pure_internal_simple_skylines_from_extents (Grob *me, Axis a, bool p ? Interval (-infinity_f, infinity_f) : me->maybe_pure_extent (me, Y_AXIS, pure, beg, end); - // In horizontal spacing, there are grobs like SystemStartBracket - // that take up no vertical spcae. So, if the y extent is empty, - // we use the entire Y extent ot make the X a sort of horizontal wall. - // Ditto for vertical spacing and grobs like BassFigureAlginmentPositioning. - if (a == Y_AXIS && yex.is_empty ()) - yex.set_full (); - - if (a == X_AXIS && xex.is_empty ()) - xex.set_full (); - if (xex.is_empty () || yex.is_empty ()) return Skyline_pair ().smobbed_copy (); @@ -1005,6 +995,8 @@ Grob::pure_simple_vertical_skylines_from_extents (SCM smob, SCM begscm, SCM ends Grob *me = unsmob_grob (smob); int beg = robust_scm2int (begscm, 0); int end = robust_scm2int (endscm, INT_MAX); + // We cannot measure the width of a spanner before line breaking, + // so we assume that the width is infinite. return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, true, beg, end, dynamic_cast (me), false); } @@ -1023,6 +1015,9 @@ Grob::pure_simple_horizontal_skylines_from_extents (SCM smob, SCM begscm, SCM en Grob *me = unsmob_grob (smob); int beg = robust_scm2int (begscm, 0); int end = robust_scm2int (endscm, INT_MAX); + // If the grob is cross staff, we cannot measure its Y-extent before + // wayyyy downstream (after spacing of axis groups is done). + // Thus, we assume that the Y extent is infinite for cross staff grobs. return maybe_pure_internal_simple_skylines_from_extents (me, Y_AXIS, true, beg, end, false, to_boolean (me->get_property ("cross-staff"))); } @@ -1031,6 +1026,7 @@ SCM Grob::simple_horizontal_skylines_from_extents (SCM smob) { Grob *me = unsmob_grob (smob); + // See comment in function above. return maybe_pure_internal_simple_skylines_from_extents (me, Y_AXIS, false, 0, 0, false, to_boolean (me->get_property ("cross-staff"))); } @@ -1088,9 +1084,8 @@ Grob::horizontal_skylines_from_stencil (SCM smob) } SCM -Grob::internal_skylines_from_element_stencils (SCM smob, Axis a) +Grob::internal_skylines_from_element_stencils (Grob *me, Axis a, bool pure, int beg, int end) { - Grob *me = unsmob_grob (smob); extract_grob_set (me, "elements", elts); vector x_pos; @@ -1100,14 +1095,15 @@ Grob::internal_skylines_from_element_stencils (SCM smob, Axis a) for (vsize i = 0; i < elts.size (); i++) { x_pos.push_back (elts[i]->relative_coordinate (x_common, X_AXIS)); - y_pos.push_back (elts[i]->relative_coordinate (y_common, Y_AXIS)); + y_pos.push_back (elts[i]->maybe_pure_coordinate (y_common, Y_AXIS, pure, beg, end)); } Real my_x = me->relative_coordinate (x_common, X_AXIS); - Real my_y = me->relative_coordinate (y_common, Y_AXIS); + Real my_y = me->maybe_pure_coordinate (y_common, Y_AXIS, pure, beg, end); + Skyline_pair res; for (vsize i = 0; i < elts.size (); i++) { - Skyline_pair *skyp = Skyline_pair::unsmob (elts[i]->get_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines")); + Skyline_pair *skyp = Skyline_pair::unsmob (elts[i]->get_maybe_pure_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines", pure, beg, end)); if (skyp) { /* @@ -1141,12 +1137,34 @@ MAKE_SCHEME_CALLBACK (Grob, vertical_skylines_from_element_stencils, 1); SCM Grob::vertical_skylines_from_element_stencils (SCM smob) { - return internal_skylines_from_element_stencils (smob, X_AXIS); + Grob *me = unsmob_grob (smob); + return internal_skylines_from_element_stencils (me, X_AXIS, false, 0, INT_MAX); } MAKE_SCHEME_CALLBACK (Grob, horizontal_skylines_from_element_stencils, 1); SCM Grob::horizontal_skylines_from_element_stencils (SCM smob) { - return internal_skylines_from_element_stencils (smob, Y_AXIS); + Grob *me = unsmob_grob (smob); + return internal_skylines_from_element_stencils (me, Y_AXIS, false, 0, INT_MAX); +} + +MAKE_SCHEME_CALLBACK (Grob, pure_vertical_skylines_from_element_stencils, 3); +SCM +Grob::pure_vertical_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm) +{ + Grob *me = unsmob_grob (smob); + int beg = robust_scm2int (beg_scm, 0); + int end = robust_scm2int (end_scm, 0); + return internal_skylines_from_element_stencils (me, X_AXIS, true, beg, end); +} + +MAKE_SCHEME_CALLBACK (Grob, pure_horizontal_skylines_from_element_stencils, 3); +SCM +Grob::pure_horizontal_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm) +{ + Grob *me = unsmob_grob (smob); + int beg = robust_scm2int (beg_scm, 0); + int end = robust_scm2int (end_scm, 0); + return internal_skylines_from_element_stencils (me, Y_AXIS, true, beg, end); }