X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=ac0e1fbde66b1adb2cabd745ddb90e1273d706f8;hb=f018757016404595c92e21346ae0661dafe7ea46;hp=53dfd4a906a2b907baeb59ced8b2ae998bcd3a7e;hpb=d3893f0e1ba5d8cf85b73b9a59fab58d8f675e5b;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 53dfd4a906..ac0e1fbde6 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -1,29 +1,44 @@ /* - paper-column.cc -- implement Paper_column + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2010 Han-Wen Nienhuys - (c) 1997--2007 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #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 "bar-line.hh" +#include "break-align-interface.hh" #include "font-interface.hh" -#include "output-def.hh" -#include "pointer-group-interface.hh" #include "grob-array.hh" -#include "system.hh" -#include "spring.hh" #include "lookup.hh" +#include "lookup.hh" +#include "moment.hh" +#include "output-def.hh" +#include "paper-score.hh" +#include "pointer-group-interface.hh" +#include "rhythmic-head.hh" #include "separation-item.hh" +#include "skyline-pair.hh" +#include "spaceable-grob.hh" +#include "spring.hh" #include "string-convert.hh" +#include "system.hh" +#include "text-interface.hh" +#include "warn.hh" Grob * Paper_column::clone () const @@ -43,6 +58,12 @@ Paper_column::get_rank (Grob const *me) return dynamic_cast (me)->rank_; } +void +Paper_column::set_rank (int rank) +{ + rank_ = rank; +} + System * Paper_column::get_system () const { @@ -76,20 +97,20 @@ Paper_column::Paper_column (Paper_column const &src) } int -Paper_column::compare (Grob * const &a, - Grob * const &b) +Paper_column::compare (Grob *const &a, + Grob *const &b) { - return sign (dynamic_cast (a)->rank_ - - dynamic_cast (b)->rank_); + return sign (dynamic_cast (a)->rank_ + - dynamic_cast (b)->rank_); } bool Paper_column::less_than (Grob *const &a, Grob *const &b) { - Paper_column *pa = dynamic_cast (a); - Paper_column *pb = dynamic_cast (b); - + Paper_column *pa = dynamic_cast (a); + Paper_column *pb = dynamic_cast (b); + return pa->rank_ < pb->rank_; } @@ -122,7 +143,7 @@ Paper_column::is_used (Grob *me) extract_grob_set (me, "bounded-by-me", bbm); if (bbm.size ()) return true; - + if (Paper_column::is_breakable (me)) return true; @@ -140,7 +161,7 @@ Paper_column::is_breakable (Grob *me) Real Paper_column::minimum_distance (Grob *left, Grob *right) { - Drul_array cols (left, right); + Drul_array cols (left, right); Drul_array skys = Drul_array (Skyline (RIGHT), Skyline (LEFT)); Direction d = LEFT; @@ -157,6 +178,44 @@ Paper_column::minimum_distance (Grob *left, Grob *right) return max (0.0, skys[LEFT].distance (skys[RIGHT])); } +Interval +Paper_column::break_align_width (Grob *me, SCM align_sym) +{ + Grob *p = me->get_parent (X_AXIS); + + if (is_musical (me)) + { + me->programming_error ("tried to get break-align-width of a musical column"); + return Interval (0, 0) + me->relative_coordinate (p, X_AXIS); + } + + Grob *align = 0; + if (align_sym == ly_symbol2scm ("staff-bar") + || align_sym == ly_symbol2scm ("break-alignment")) + align + = Pointer_group_interface::find_grob (me, ly_symbol2scm ("elements"), + (align_sym == ly_symbol2scm ("staff-bar") + ? Bar_line::non_empty_barline + : Break_alignment_interface::has_interface)); + else + { + extract_grob_set (me, "elements", elts); + for (vsize i = 0; i < elts.size (); i++) + { + if (elts[i]->get_property ("break-align-symbol") == align_sym) + { + align = elts[i]; + break; + } + } + } + + 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. */ @@ -164,7 +223,7 @@ MAKE_SCHEME_CALLBACK (Paper_column, print, 1); SCM Paper_column::print (SCM p) { - Paper_column *me = dynamic_cast (unsmob_grob (p)); + Paper_column *me = dynamic_cast (unsmob_grob (p)); string r = to_string (Paper_column::get_rank (me)); @@ -187,11 +246,11 @@ Paper_column::print (SCM p) 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)) @@ -200,7 +259,7 @@ Paper_column::print (SCM p) if (!unsmob_grob (scm_cdar (s)) || !unsmob_grob (scm_cdar (s))->get_system ()) continue; - + j++; Real y = -j * 1 -3; vector pts; @@ -208,30 +267,30 @@ Paper_column::print (SCM p) 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 (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)); + 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)); @@ -248,10 +307,9 @@ Paper_column::print (SCM p) 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.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); } @@ -278,7 +336,7 @@ Paper_column::before_line_breaking (SCM grob) if (!ga) return SCM_UNSPECIFIED; - vector &array (ga->array_reference ()); + vector &array (ga->array_reference ()); for (vsize i = array.size (); i--;) { @@ -292,30 +350,57 @@ 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 and" + " non-musical, to which musical and non-musical objects are" + " attached respectively. 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 " + "full-measure-extra-space " "grace-spacing " "labels " "line-break-system-details " "line-break-penalty " "line-break-permission " + "maybe-loose " "page-break-penalty " "page-break-permission " "page-turn-penalty "