X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=56b96469975d71cac75b73346ce54ceee3c108b9;hb=6b876e65197de4fcc073ebc19a5ef744db92c1c9;hp=78b09c3875ba254781959298b420e874565d5813;hpb=44ad1d66c072e4d6545e75c769c86a460cb1df13;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 78b09c3875..56b9646997 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "paper-column.hh" @@ -19,24 +19,28 @@ #include "output-def.hh" #include "pointer-group-interface.hh" #include "grob-array.hh" +#include "system.hh" +#include "spring.hh" +#include "lookup.hh" +#include "separation-item.hh" +#include "string-convert.hh" Grob * -Paper_column::clone (int count) const +Paper_column::clone () const { - return new Paper_column (*this, count); + return new Paper_column (*this); } void Paper_column::do_break_processing () { - Spaceable_grob::remove_interface (this); Item::do_break_processing (); } int -Paper_column::get_rank (Grob *me) +Paper_column::get_rank (Grob const *me) { - return dynamic_cast (me)->rank_; + return dynamic_cast (me)->rank_; } System * @@ -57,15 +61,15 @@ Paper_column::get_column () const return (Paper_column *) (this); } -Paper_column::Paper_column (SCM l, Object_key const *key) - : Item (l, key) // guh.? +Paper_column::Paper_column (SCM l) + : Item (l) { system_ = 0; rank_ = -1; } -Paper_column::Paper_column (Paper_column const &src, int count) - : Item (src, count) +Paper_column::Paper_column (Paper_column const &src) + : Item (src) { system_ = 0; rank_ = src.rank_; @@ -133,37 +137,128 @@ 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 + { + extract_grob_set (cols[d], "elements", elts); + + for (vsize i = 0; i < elts.size (); i++) + if (Separation_item::has_interface (elts[i])) + { + Skyline_pair *sp = Skyline_pair::unsmob (elts[i]->get_property ("horizontal-skylines")); + if (sp) + skys[d].merge ((*sp)[-d]); + } + } + while (flip (&d) != LEFT); + + return min (0.0, skys[LEFT].distance (skys[RIGHT])); +} + /* Print a vertical line and the rank number, to aid debugging. */ - MAKE_SCHEME_CALLBACK (Paper_column, print, 1); SCM Paper_column::print (SCM p) { - Grob *me = unsmob_grob (p); + Paper_column *me = dynamic_cast (unsmob_grob (p)); string r = to_string (Paper_column::get_rank (me)); Moment *mom = unsmob_moment (me->get_property ("when")); string when = mom ? mom->to_string () : "?/?"; + Font_metric *musfont = Font_interface::get_default_font (me); SCM properties = Font_interface::text_font_alist_chain (me); SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (r.c_str ())); + ly_string2scm (r)); SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (when.c_str ())); + ly_string2scm (when)); Stencil t = *unsmob_stencil (scm_mol); - t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1); + t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1); t.align_to (X_AXIS, CENTER); t.align_to (Y_AXIS, DOWN); Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01), Interval (-2, -1))); - + + SCM small_letters = scm_cons (scm_acons (ly_symbol2scm ("font-size"), + scm_from_int (-6), SCM_EOL), + properties); + + int j = 0; + for (SCM s = me->get_object ("ideal-distances"); + scm_is_pair (s); s = scm_cdr (s)) + { + Spring *sp = unsmob_spring (scm_caar (s)); + if (!unsmob_grob (scm_cdar (s)) + || !unsmob_grob (scm_cdar (s))->get_system ()) + continue; + + j++; + Real y = -j * 1 -3; + vector pts; + pts.push_back (Offset (0, y)); + + Offset p2 (sp->distance (), y); + pts.push_back (p2); + + Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); + Stencil head (musfont->find_by_name ("arrowheads.open.01")); + + SCM distance_stc = Text_interface::interpret_markup (me->layout ()->self_scm (), + small_letters, + 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 (head.translated (p2)); + id_stencil = id_stencil.in_color (0,0,1); + l.add_stencil (id_stencil); + } + + for (SCM s = me->get_object ("minimum-distances"); + scm_is_pair (s); s = scm_cdr (s)) + { + Real dist = scm_to_double (scm_cdar (s)); + Grob *other = unsmob_grob (scm_caar (s)); + if (!other || other->get_system () != me->get_system ()) + continue; + + j++; + + Real y = -j * 1.0 -3.5; + vector pts; + pts.push_back (Offset (0, y)); + + Offset p2 (dist, y); + pts.push_back (p2); + + Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); + Stencil head (musfont->find_by_name ("arrowheads.open.0M1")); + head.translate_axis (y, Y_AXIS); + id_stencil.add_stencil (head); + + SCM distance_stc = Text_interface::interpret_markup (me->layout ()->self_scm (), + small_letters, + ly_string2scm (String_convert::form_string ("%5.2lf", + dist))); + + id_stencil.add_stencil (unsmob_stencil (distance_stc)->translated (Offset (dist/3, y-1))); + + + id_stencil = id_stencil.in_color (1,0,0); + l.add_stencil (id_stencil); + } t.add_stencil (l); return t.smobbed_copy (); } @@ -220,7 +315,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 "