X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fitem.cc;h=e71bc4190b4f5f3fe8aa3d8026bdf5eb4520f29f;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=6a468a6830607f6522f786c7dc15cfefdebdd5b8;hpb=f875ef39c544bd3499dae5360e9e24f69933575f;p=lilypond.git diff --git a/lily/item.cc b/lily/item.cc index 6a468a6830..e71bc4190b 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2014 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 @@ -43,7 +43,7 @@ Item::Item (SCM s) } /** - Item copy ctor. Copy nothing: everything should be a elt property + Item copy ctor. Copy nothing: everything should be an elt property or a special purpose pointer (such as broken_to_drul_[]) */ Item::Item (Item const &s) : Grob (s) @@ -55,9 +55,6 @@ Item::Item (Item const &s) bool Item::is_non_musical (Grob *me) { - if (me->original ()) - return false; - Item *i = dynamic_cast (me->get_parent (X_AXIS)); return i ? Item::is_non_musical (i) : to_boolean (me->get_property ("non-musical")); } @@ -80,15 +77,13 @@ void Item::copy_breakable_items () { Drul_array new_copies; - Direction i = LEFT; - do + for (LEFT_and_RIGHT (d)) { Grob *dolly = clone (); Item *item = dynamic_cast (dolly); get_root_system (this)->typeset_grob (item); - new_copies[i] = item; + new_copies[d] = item; } - while (flip (&i) != LEFT); broken_to_drul_ = new_copies; } @@ -105,7 +100,7 @@ Item::is_broken () const void Item::discretionary_processing () { - if (is_broken ()) + if (is_broken () || original ()) return; if (Item::is_non_musical (this)) @@ -118,14 +113,12 @@ Item::find_broken_piece (System *l) const if (get_system () == l) return (Item *) (this); - Direction d = LEFT; - do + for (LEFT_and_RIGHT (d)) { Grob *s = broken_to_drul_[d]; if (s && s->get_system () == l) return s; } - while (flip (&d) != LEFT); return 0; } @@ -205,21 +198,18 @@ spanned_time_interval (Item *l, Item *r) Drul_array bounds (l, r); Interval_t iv; - Direction d = LEFT; - do + for (LEFT_and_RIGHT (d)) { if (bounds[d] && bounds[d]->get_column ()) iv[d] = robust_scm2moment (bounds[d]->get_column ()->get_property ("when"), iv[d]); } - while (flip (&d) != LEFT); - do + for (LEFT_and_RIGHT (d)) { if (!bounds[d] || !bounds[d]->get_column ()) iv[d] = iv[-d]; } - while (flip (&d) != LEFT); return iv; } @@ -244,6 +234,10 @@ 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); + /* Note: cached_pure_height_ does not notice if start changes, implicitly + assuming that Items' pure_heights do not depend on 'start' or 'end'. + Accidental_interface::pure_height(), however, does depend on 'start'. + */ cache_pure_height (Grob::pure_height (this, start, end)); return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);