X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fspanner.hh;h=79032dfb305c2d52dc2eef5f3d057e52565240c7;hb=3af0951f9a11677240efa6228683dd4fcea13eaf;hp=e7745cb528ba70214ddc82065855d3d11b6d5f6e;hpb=5d1ddaf889233f8e5c32a118f9e843e1becca2d2;p=lilypond.git diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index e7745cb528..79032dfb30 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -1,7 +1,20 @@ /* - spanner.hh -- part of GNU LilyPond + This file is part of LilyPond, the GNU music typesetter. - (c) 1996--2005 Han-Wen Nienhuys + Copyright (C) 1996--2015 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 . */ #ifndef SPANNER_HH @@ -11,61 +24,73 @@ #include "rod.hh" /** A symbol which is attached between two columns. A spanner is a - symbol which spans across several columns, so its final appearance - can only be calculated after the breaking problem is solved. - - Examples - - * (de)crescendo - * slur - * beam - * bracket - - Spanner should know about the items which it should consider: - e.g. slurs should be steep enough to "enclose" all those items. This - is absolutely necessary for beams, since they have to adjust the - length of stems of notes they encompass. - - */ -class Spanner : public Grob { - Drul_array spanned_drul_; - int break_index_; - + symbol which spans across several columns, so its final appearance + can only be calculated after the breaking problem is solved. + + Examples + + * (de)crescendo + * slur + * beam + * bracket + + Spanner should know about the items which it should consider: + e.g. slurs should be steep enough to "enclose" all those items. This + is absolutely necessary for beams, since they have to adjust the + length of stems of notes they encompass. +*/ +class Spanner : public Grob +{ + Drul_array spanned_drul_; + vsize break_index_; + + DECLARE_CLASSNAME (Spanner); + public: DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); - - Link_array broken_intos_; + DECLARE_SCHEME_CALLBACK (calc_normalized_endpoints, (SCM)); + DECLARE_SCHEME_CALLBACK (bounds_width, (SCM)); + DECLARE_SCHEME_CALLBACK (kill_zero_spanned_time, (SCM)); + + vector broken_intos_; + + vsize get_break_index () const; + Spanner *broken_neighbor (Direction d) const; - int get_break_index () const; // todo: move to somewhere else. Real get_broken_left_end_align () const; - void substitute_one_mutable_property (SCM sym, SCM val) ; - bool fast_fubstitute_grob_list (SCM sym, SCM grob_list); - // TODO: make virtual and do this for Items as well. - Interval_t spanned_rank_iv (); - void set_bound (Direction d, Grob*); + void substitute_one_mutable_property (SCM sym, SCM val); + + Interval_t spanned_time () const; + virtual Interval_t spanned_rank_interval () const; + void set_bound (Direction d, Grob *); Item *get_bound (Direction d) const; - - Spanner (SCM, Object_key const*); - Spanner (Spanner const &, int copy_count); + + Spanner (SCM); + Spanner (Spanner const &); bool is_broken () const; void do_break (); Real spanner_length () const; - static int compare (Spanner * const &, Spanner * const &); - virtual Grob* find_broken_piece (System*) const; - virtual SCM do_derived_mark () const; - static bool has_interface (Grob*); + static int compare (Spanner *const &, Spanner *const &); + static bool less (Spanner *const &, Spanner *const &); + virtual Grob *find_broken_piece (System *) const; + virtual void derived_mark () const; virtual System *get_system () const; + SCM get_cached_pure_property (SCM sym, int start, int end); + void cache_pure_property (SCM sym, int start, int end, SCM value); + protected: + SCM pure_property_cache_; + void set_my_columns (); - virtual Grob *clone (int count) const; + virtual Grob *clone () const; virtual void do_break_processing (); + bool fast_substitute_grob_array (SCM sym, Grob_array *); }; -void add_bound_item (Spanner*, Grob*); +void add_bound_item (Spanner *, Grob *); -bool spanner_less ( Spanner *s1, Spanner* s2); -int broken_spanner_index (Spanner * sp); +bool spanner_less (Spanner *s1, Spanner *s2); #endif