X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=ba5b36b13e114062f6d9fc79d80dc6e510c98e07;hb=c7c92b9904a95633f73b6d09096c8f3267d390d2;hp=4dba6bbbd58f08784b55e5cbef2e38e96edc8355;hpb=f9214bac21e9926dc3248416f58190c98c4167a9;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 4dba6bbbd5..ba5b36b13e 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -8,6 +8,7 @@ #include "paper-column.hh" +#include "break-align-interface.hh" #include "moment.hh" #include "paper-score.hh" #include "warn.hh" @@ -22,6 +23,7 @@ #include "system.hh" #include "spring.hh" #include "lookup.hh" +#include "separation-item.hh" #include "string-convert.hh" Grob * @@ -136,6 +138,45 @@ Paper_column::is_breakable (Grob *me) return scm_is_symbol (me->get_property ("line-break-permission")); } +Real +Paper_column::minimum_distance (Grob *left, Grob *right) +{ + Drul_array cols (left, right); + Drul_array skys = Drul_array (Skyline (RIGHT), Skyline (LEFT)); + + Direction d = LEFT; + do + { + Skyline_pair *sp = Skyline_pair::unsmob (cols[d]->get_property ("horizontal-skylines")); + if (sp) + skys[d] = (*sp)[-d]; + } + while (flip (&d) != LEFT); + + skys[RIGHT].merge (Separation_item::conditional_skyline (right, left)); + + return max (0.0, skys[LEFT].distance (skys[RIGHT])); +} + +Interval +Paper_column::break_align_width (Grob *me) +{ + Grob *p = me->get_parent (X_AXIS); + + if (is_musical (me)) + { + me->programming_error ("tried to get break-align-width of a non-musical column"); + return Interval (0, 0) + me->relative_coordinate (p, X_AXIS); + } + + Grob *align = Pointer_group_interface::find_grob (me, ly_symbol2scm ("elements"), + Break_alignment_interface::has_interface); + if (!align) + return Interval (0, 0) + me->relative_coordinate (p, X_AXIS); + + return align->extent (p, X_AXIS); +} + /* Print a vertical line and the rank number, to aid debugging. */ @@ -175,8 +216,9 @@ Paper_column::print (SCM p) for (SCM s = me->get_object ("ideal-distances"); scm_is_pair (s); s = scm_cdr (s)) { - Spring_smob *sp = unsmob_spring (scm_car (s)); - if (!sp->other_->get_system ()) + Spring *sp = unsmob_spring (scm_caar (s)); + if (!unsmob_grob (scm_cdar (s)) + || !unsmob_grob (scm_cdar (s))->get_system ()) continue; j++; @@ -184,7 +226,7 @@ Paper_column::print (SCM p) vector pts; pts.push_back (Offset (0, y)); - Offset p2 (sp->distance_, y); + Offset p2 (sp->distance (), y); pts.push_back (p2); Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); @@ -192,9 +234,9 @@ Paper_column::print (SCM p) SCM distance_stc = Text_interface::interpret_markup (me->layout ()->self_scm (), small_letters, - ly_string2scm (String_convert::form_string ("%5.2lf", sp->distance_))); + ly_string2scm (String_convert::form_string ("%5.2lf", sp->distance ()))); - id_stencil.add_stencil (unsmob_stencil (distance_stc)->translated (Offset (sp->distance_/3, y+1))); + id_stencil.add_stencil (unsmob_stencil (distance_stc)->translated (Offset (sp->distance ()/3, y+1))); id_stencil.add_stencil (head.translated (p2)); id_stencil = id_stencil.in_color (0,0,1); l.add_stencil (id_stencil); @@ -289,7 +331,8 @@ ADD_INTERFACE (Paper_column, /* properties */ "between-cols " "bounded-by-me " - "grace-spacing " + "grace-spacing " + "labels " "line-break-system-details " "line-break-penalty " "line-break-permission "