]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/spanner.hh
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / include / spanner.hh
index 43a3567fa52faf609869d1d3b9bc7aa3117fa391..e4a09cc0cf8395e6dc0ec5da6a2c3926230a43d6 100644 (file)
@@ -1,54 +1,77 @@
 /*
 /*
-  spanner.hh -- part of LilyPond
+  spanner.hh -- part of GNU LilyPond
 
 
-  (c) 1996,97 Han-Wen Nienhuys
+  (c) 1996--2007 Han-Wen Nienhuys
 */
 
 #ifndef SPANNER_HH
 #define SPANNER_HH
 
 */
 
 #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.
     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<Item *> 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));
+  DECLARE_SCHEME_CALLBACK (bounds_width, (SCM));
 
 
-    Spanner *broken_at(PCol *c1,  PCol *c2) const;
-    virtual Spanner* spanner() { return this; }
-protected:
+  vector<Spanner*> broken_intos_;
+
+  vsize get_break_index () const;
+  Spanner *broken_neighbor (Direction d) 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 *);
 
 
-    /**
-  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);
+  virtual Interval_t<int> spanned_rank_iv ();
+  void set_bound (Direction d, Grob *);
+  Item *get_bound (Direction d) const;
+
+  Spanner (SCM);
+  Spanner (Spanner const &);
+  bool is_broken () const;
+  void do_break ();
+  Real spanner_length () const;
+
+  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;
+  DECLARE_GROB_INTERFACE();
+  virtual System *get_system () const;
+
+protected:
+  void set_my_columns ();
+  virtual Grob *clone () const;
+  virtual void do_break_processing ();
 };
 };
+
+void add_bound_item (Spanner *, Grob *);
+
+bool spanner_less (Spanner *s1, Spanner *s2);
+int broken_spanner_index (Spanner const *sp);
 #endif
 #endif