X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=c6b7c9c85c1aec0f9f5f9957937bd2b785f6b495;hb=7f3f0083f89d87c5ed0422858e9648fc759e98a4;hp=e42a3417e22001df09314c455a52695f7a877bfb;hpb=965f52a64e989bb9f3f03b08e5f43dff1156a9eb;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index e42a3417e2..c6b7c9c85c 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,31 +3,35 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys */ #include "paper-column.hh" -#include "moment.hh" -#include "paper-score.hh" -#include "warn.hh" #include "axis-group-interface.hh" -#include "spaceable-grob.hh" -#include "text-interface.hh" -#include "lookup.hh" +#include "break-align-interface.hh" #include "font-interface.hh" +#include "grob-array.hh" +#include "lookup.hh" +#include "lookup.hh" +#include "moment.hh" #include "output-def.hh" +#include "paper-score.hh" #include "pointer-group-interface.hh" -#include "grob-array.hh" -#include "system.hh" +#include "rhythmic-head.hh" +#include "separation-item.hh" +#include "skyline-pair.hh" +#include "spaceable-grob.hh" #include "spring.hh" -#include "lookup.hh" #include "string-convert.hh" +#include "system.hh" +#include "text-interface.hh" +#include "warn.hh" Grob * -Paper_column::clone (int count) const +Paper_column::clone () const { - return new Paper_column (*this, count); + return new Paper_column (*this); } void @@ -60,15 +64,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_; @@ -136,6 +140,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. */ @@ -160,7 +203,7 @@ Paper_column::print (SCM p) properties, 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); @@ -175,13 +218,17 @@ 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)); + 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); + Offset p2 (sp->distance (), y); pts.push_back (p2); Stencil id_stencil = Lookup::points_to_line_stencil (0.1, pts); @@ -189,9 +236,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); @@ -201,8 +248,13 @@ Paper_column::print (SCM p) 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; - Real y = -j * 0.1 -3.5; + j++; + + Real y = -j * 1.0 -3.5; vector pts; pts.push_back (Offset (0, y)); @@ -262,26 +314,53 @@ Paper_column::before_line_breaking (SCM grob) return SCM_UNSPECIFIED; } +/* FIXME: This is a hack that we use to identify columns that used to + contain note-heads but whose note-heads were moved by one of the ligature + engravers. Once the ligature engravers are fixed to behave nicely, this + function can be removed. +*/ +bool +Paper_column::is_extraneous_column_from_ligature (Grob *me) +{ + if (!is_musical (me)) + return false; + + // If all the note-heads that I think are my children actually belong + // to another column, then I am extraneous. + extract_grob_set (me, "elements", elts); + bool has_notehead = false; + for (vsize i = 0; i < elts.size (); i++) + { + if (Rhythmic_head::has_interface (elts[i])) + { + has_notehead = true; + if (dynamic_cast (elts[i])->get_column () == me) + return false; + } + } + return has_notehead; +} + ADD_INTERFACE (Paper_column, - "@code{Paper_column} objects form the top-most X-parents for items." - " The are two types of columns: musical columns, where are attached to, and " - " non-musical columns, where bar-lines, clefs etc. are attached to. " - " The spacing engine determines the X-positions of these objects." - - "\n\n" - "They are\n" - " numbered, the first (leftmost) is column 0. Numbering happens before\n" - " line-breaking, and columns are not renumbered after line breaking.\n" - " Since many columns go unused, you should only use the rank field to\n" - " get ordering information. Two adjacent columns may have\n" - " non-adjacent numbers.\n", - + "@code{Paper_column} objects form the top-most X@tie{}parents" + " for items. There are two types of columns: musical columns," + " where are attached to, and non-musical columns, where" + " bar-lines, clefs, etc., are attached to. The spacing engine" + " determines the X@tie{}positions of these objects.\n" + "\n" + "They are numbered, the first (leftmost) is column@tie{}0." + " Numbering happens before line breaking, and columns are not" + " renumbered after line breaking. Since many columns go" + " unused, you should only use the rank field to get ordering" + " information. Two adjacent columns may have non-adjacent" + " numbers.", /* properties */ "between-cols " "bounded-by-me " - "grace-spacing " + "grace-spacing " + "labels " "line-break-system-details " "line-break-penalty " "line-break-permission " @@ -294,5 +373,6 @@ ADD_INTERFACE (Paper_column, "shortest-starter-duration " "spacing " "used " - "when "); + "when " + );