X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=2636b20fe4bccee354e4b9b915f060f8e6f082af;hb=f46bf63b68bac25a5384ce5de93d0d92b9651d5f;hp=ce29a2011a1ce3539f9ec8360087ff8e777c3e23;hpb=a3b7f971958e002aba7d242ba3fe4ccf7fb9800b;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index ce29a2011a..2636b20fe4 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--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "paper-column.hh" @@ -26,29 +26,6 @@ Paper_column::clone (int count) const return new Paper_column (*this, count); } -ADD_INTERFACE (Paper_column, "paper-column-interface", - "@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", - - - "between-cols " - "bounded-by-me " - "page-penalty " - "shortest-playing-duration " - "shortest-starter-duration " - "used " - "when "); - void Paper_column::do_break_processing () { @@ -57,9 +34,9 @@ Paper_column::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 * @@ -68,6 +45,12 @@ Paper_column::get_system () const return system_; } +void +Paper_column::set_system (System *s) +{ + system_ = s; +} + Paper_column * Paper_column::get_column () const { @@ -88,6 +71,24 @@ Paper_column::Paper_column (Paper_column const &src, int count) rank_ = src.rank_; } +int +Paper_column::compare (Grob * const &a, + Grob * const &b) +{ + 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); + + return pa->rank_ < pb->rank_; +} + Moment Paper_column::when_mom (Grob *me) { @@ -118,7 +119,7 @@ Paper_column::is_used (Grob *me) if (bbm.size ()) return true; - if (Item::is_breakable (me)) + if (Paper_column::is_breakable (me)) return true; if (to_boolean (me->get_property ("used"))) @@ -126,6 +127,12 @@ Paper_column::is_used (Grob *me) return false; } +bool +Paper_column::is_breakable (Grob *me) +{ + return scm_is_symbol (me->get_property ("line-break-permission")); +} + /* Print a vertical line and the rank number, to aid debugging. */ @@ -136,19 +143,19 @@ Paper_column::print (SCM p) { Grob *me = unsmob_grob (p); - String r = to_string (Paper_column::get_rank (me)); + string r = to_string (Paper_column::get_rank (me)); Moment *mom = unsmob_moment (me->get_property ("when")); - String when = mom ? mom->to_string () : "?/?"; + string when = mom ? mom->to_string () : "?/?"; SCM properties = Font_interface::text_font_alist_chain (me); - SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (), + SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (r.to_str0 ())); - SCM when_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (), + scm_makfrom0str (r.c_str ())); + SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, - scm_makfrom0str (when.to_str0 ())); + scm_makfrom0str (when.c_str ())); Stencil t = *unsmob_stencil (scm_mol); t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1); t.align_to (X_AXIS, CENTER); @@ -180,17 +187,51 @@ Paper_column::before_line_breaking (SCM grob) if (!ga) return SCM_UNSPECIFIED; - Link_array &array (ga->array_reference ()); + vector &array (ga->array_reference ()); - for (int i = array.size (); i--;) + for (vsize i = array.size (); i--;) { Grob *g = array[i]; if (!g || !g->is_live ()) - { // UGH . potentially quadratic. - array.del (i); - } + /* UGH . potentially quadratic. */ + array.erase (array.begin () + i); } return SCM_UNSPECIFIED; } + + +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", + + + /* properties */ + "between-cols " + "bounded-by-me " + "grace-spacing " + "line-break-system-details " + "line-break-penalty " + "line-break-permission " + "page-break-penalty " + "page-break-permission " + "page-turn-penalty " + "page-turn-permission " + "rhythmic-location " + "shortest-playing-duration " + "shortest-starter-duration " + "spacing " + "used " + "when "); +