X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fitem.cc;h=173df20ed87fd7b19451d2f4b212ea9c0dc18eea;hb=9e69cb84d6ee5b0a861cd97869b10e3bdf0c833c;hp=973a574c5736ceb76ed8ca65ddcc1028647b5774;hpb=e6caaa132f59006e5c47d0007b24bfedd07ad145;p=lilypond.git diff --git a/lily/item.cc b/lily/item.cc index 973a574c57..173df20ed8 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -3,11 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "item.hh" +#include "axis-group-interface.hh" #include "paper-score.hh" #include "warn.hh" #include "paper-column.hh" @@ -25,7 +26,6 @@ Item::Item (SCM s, Object_key const *key) : Grob (s, key) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; - interfaces_ = scm_cons (ly_symbol2scm ("item-interface"), interfaces_); } /** @@ -38,16 +38,13 @@ Item::Item (Item const &s, int copy_count) } bool -Item::is_breakable (Grob *me) +Item::is_non_musical (Grob *me) { - if (me->original_) + if (me->original ()) return false; - if (!dynamic_cast (me)) - me->programming_error ("only items can be breakable."); - Item *i = dynamic_cast (me->get_parent (X_AXIS)); - return (i) ? Item::is_breakable (i) : to_boolean (me->get_property ("breakable")); + return i ? Item::is_non_musical (i) : to_boolean (me->get_property ("non-musical")); } Paper_column * @@ -74,7 +71,7 @@ Item::copy_breakable_items () { Grob *dolly = clone (count++); Item *item = dynamic_cast (dolly); - pscore_->root_system ()->typeset_grob (item); + get_root_system (this)->typeset_grob (item); new_copies[i] = item; } while (flip (&i) != LEFT); @@ -97,7 +94,7 @@ Item::discretionary_processing () if (is_broken ()) return; - if (Item::is_breakable (this)) + if (Item::is_non_musical (this)) copy_breakable_items (); } @@ -131,9 +128,9 @@ Item::find_prebroken_piece (Direction d) const Direction Item::break_status_dir () const { - if (original_) + if (original ()) { - Item *i = dynamic_cast (original_); + Item *i = dynamic_cast (original ()); return (i->broken_to_drul_[LEFT] == this) ? LEFT : RIGHT; } @@ -149,40 +146,48 @@ Item::handle_prebroken_dependencies () /* Can't do this earlier, because try_visibility_lambda () might set the elt property transparent, which would then be copied. - - TODO: - - give the item to break-visibility itself, so the function can do - more complicated things. */ SCM vis = get_property ("break-visibility"); - if (ly_is_procedure (vis)) + if (scm_is_vector (vis)) { - SCM args = scm_list_n (scm_int2num (break_status_dir ()), SCM_UNDEFINED); - SCM result = scm_apply_0 (vis, args); - bool trans = ly_scm2bool (scm_car (result)); - bool empty = ly_scm2bool (scm_cdr (result)); + bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1)); - if (empty && trans) + if (!visible) suicide (); - else if (empty) - { - set_extent (SCM_EOL, X_AXIS); - set_extent (SCM_EOL, Y_AXIS); - } - else if (trans) - set_property ("print-function", SCM_EOL); } } -SCM -Item::do_derived_mark () const +bool +Item::pure_is_visible (int start, int end) const +{ + SCM vis = get_property ("break-visibility"); + if (scm_is_vector (vis)) + { + int pos = 1; + int pc_rank = Paper_column::get_rank (get_column ()); + if (pc_rank == start) + pos = 2; + else if (pc_rank == end) + pos = 0; + return to_boolean (scm_vector_ref (vis, scm_from_int (pos))); + } + return true; +} + +Interval_t +Item::spanned_rank_iv () +{ + int c = get_column ()->get_rank (); + return Interval_t (c, c); +} + +void +Item::derived_mark () const { if (broken_to_drul_[LEFT]) scm_gc_mark (broken_to_drul_[LEFT]->self_scm ()); if (broken_to_drul_[RIGHT]) scm_gc_mark (broken_to_drul_[RIGHT]->self_scm ()); - return SCM_EOL; } Item * @@ -192,9 +197,7 @@ unsmob_item (SCM s) } ADD_INTERFACE (Item, - "item-interface", - "\n" - "\n" + "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" @@ -225,5 +228,10 @@ ADD_INTERFACE (Item, " all-visible yes yes yes\n" " 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", - "no-spacing-rods break-visibility breakable") + + /* properties */ + "break-visibility " + "no-spacing-rods " + "non-musical")