X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fitem.cc;h=fc8028e7e42d9f17ed87fa931551b77f0dca6525;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=f7e832b30b866b13b4ad5333f4aba2ac564fdce0;hpb=a3765e1d290e5e49093e7ca7791bf3fe20be1726;p=lilypond.git diff --git a/lily/item.cc b/lily/item.cc index f7e832b30b..fc8028e7e4 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2007 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys */ #include "item.hh" @@ -29,6 +29,7 @@ Item::Item (SCM s) : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; + cached_pure_height_valid_ = false; } /** @@ -38,6 +39,7 @@ Item::Item (Item const &s) : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; + cached_pure_height_valid_ = false; } bool @@ -149,14 +151,18 @@ Item::handle_prebroken_dependencies () Can't do this earlier, because try_visibility_lambda () might set the elt property transparent, which would then be copied. */ - SCM vis = get_property ("break-visibility"); - if (scm_is_vector (vis)) - { - bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1)); + if (!Item::break_visible (this)) + suicide (); +} - if (!visible) - suicide (); - } +bool +Item::break_visible (Grob *g) +{ + Item *it = dynamic_cast (g); + SCM vis = g->get_property ("break-visibility"); + if (scm_is_vector (vis)) + return to_boolean (scm_c_vector_ref (vis, it->break_status_dir () + 1)); + return true; } bool @@ -225,29 +231,49 @@ unsmob_item (SCM s) return dynamic_cast (unsmob_grob (s)); } -ADD_INTERFACE (Item, +Interval +Item::pure_height (Grob *g, int start, int end) +{ + if (cached_pure_height_valid_) + return cached_pure_height_ + pure_relative_y_coordinate (g, start, end); - "Grobs can be distinguished in their role in the horizontal spacing.\n" - "Many grobs define constraints on the spacing by their sizes. For\n" - "example, note heads, clefs, stems, and all other symbols with a fixed\n" - "shape. These grobs form a subtype called @code{Item}.\n" - "\n" + cached_pure_height_ = Grob::pure_height (this, start, end); + cached_pure_height_valid_ = true; + return cached_pure_height_ + pure_relative_y_coordinate (g, start, end); +} + +bool +Item::less (Grob * const &g1, Grob * const &g2) +{ + return dynamic_cast (g1)->get_column ()->get_rank () < dynamic_cast (g2)->get_column ()->get_rank (); +} + +ADD_INTERFACE (Item, + "Grobs can be distinguished in their role in the horizontal" + " spacing. Many grobs define constraints on the spacing by" + " their sizes, for example, note heads, clefs, stems, and all" + " other symbols with a fixed shape. These grobs form a" + " subtype called @code{Item}.\n" "\n" - "Some items need special treatment for line breaking. For example, a\n" - "clef is normally only printed at the start of a line (i.e. after a\n" - "line break). To model this, `breakable' items (clef, key signature,\n" - "bar lines, etc.) are copied twice. Then we have three versions of each\n" - "breakable item: one version if there is no line break, one version\n" - "that is printed before the line break (at the end of a system), one\n" - "version that is printed after the line break.\n" + "Some items need special treatment for line breaking. For" + " example, a clef is normally only printed at the start of a" + " line (i.e., after a line break). To model this," + " @q{breakable} items (clef, key signature, bar lines, etc.)" + " are copied twice. Then we have three versions of each" + " breakable item: one version if there is no line break, one" + " version that is printed before the line break (at the end of" + " a system), and one version that is printed after the line" + " break.\n" "\n" - "Whether these versions are visible and take up space, is determined by\n" - "the outcome of the @code{break-visibility}. This grob property is a\n" - "function taking a direction (-1, 0 or 1) as argument. It returns a\n" - "cons of booleans, signifying whether this grob should be transparent\n" - "and have no extent.\n" + "Whether these versions are visible and take up space is" + " determined by the outcome of the @code{break-visibility}" + " grob property, which is a function taking a direction" + " (@code{-1}, @code{0} or@tie{}@code{1}) as an argument. It" + " returns a cons of booleans, signifying whether this grob" + " should be transparent and have no extent.\n" "\n" - "The following variables for break-visibility are predefined:\n" + "The following variables for @code{break-visibility} are" + " predefined:\n" "@example\n" " grob will show: before no after\n" " break break break\n" @@ -258,10 +284,11 @@ ADD_INTERFACE (Item, " begin-of-line-invisible yes yes no\n" " end-of-line-invisible no yes yes\n" " center-invisible yes no yes\n" - "@end example\n", + "@end example", /* properties */ "break-visibility " + "extra-spacing-height " "extra-spacing-width " - "infinite-spacing-height " - "non-musical") + "non-musical " + );