X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fspanner.hh;h=074c303036877afe40c8536479719eebb6b18f51;hb=b76b7a662bda941f22b9e94434a973c8f3f7c0fd;hp=43a3567fa52faf609869d1d3b9bc7aa3117fa391;hpb=daee8243ff1c66bc714455a2d265ab02f03546ec;p=lilypond.git diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index 43a3567fa5..074c303036 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -1,54 +1,74 @@ /* - spanner.hh -- part of LilyPond + spanner.hh -- part of GNU LilyPond - (c) 1996,97 Han-Wen Nienhuys + (c) 1996--2006 Han-Wen Nienhuys */ #ifndef SPANNER_HH #define SPANNER_HH -#include "proto.hh" -#include "staff-elem.hh" +#include "grob.hh" +#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. -/** 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 - Examples + * (de)crescendo + * slur + * beam + * bracket - - (de)crescendo - - slur - - beam - - bracket - - - Spanner should know about the items which it should consider: + 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_; - */ -struct Spanner:Staff_elem { - PCol *left, *right; + DECLARE_CLASSNAME(Spanner); - - /* *************** */ - - Spanner(); - virtual Interval width()const; - void do_print()const; +public: + DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); - Spanner *broken_at(PCol *c1, PCol *c2) const; - virtual Spanner* spanner() { return this; } -protected: + vector broken_intos_; + + vsize 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_substitute_grob_array (SCM sym, Grob_array *); + + virtual Interval_t spanned_rank_iv (); + void set_bound (Direction d, Grob *); + Item *get_bound (Direction d) const; - /** - clone a piece of this spanner. - PRE - c1 >= start, c2 <= stop - */ - virtual Spanner *do_break_at( PCol *c1, PCol *c2) const=0; - NAME_MEMBERS(Spanner); + Spanner (SCM, Object_key const *); + Spanner (Spanner const &, int copy_count); + 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 void derived_mark () const; + static bool has_interface (Grob *); + virtual System *get_system () const; + +protected: + void set_my_columns (); + virtual Grob *clone (int count) const; + virtual void do_break_processing (); }; + +void add_bound_item (Spanner *, Grob *); + +bool spanner_less (Spanner *s1, Spanner *s2); +int broken_spanner_index (Spanner *sp); #endif