]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/stem.hh
patch::: 1.1.64.lu1
[lilypond.git] / lily / include / stem.hh
1 /*
2   stem.hh -- declare Stem
3
4   (c) 1996--1999 Han-Wen Nienhuys
5 */
6
7 #ifndef STEM_HH
8 #define STEM_HH
9 #include "item.hh"
10 #include "array.hh"
11 #include "moment.hh"
12 #include "molecule.hh"
13 #include "staff-symbol-referencer.hh"
14
15 /**the rule attached to the ball.
16   takes care of:
17
18   \begin{itemize}
19   \item the rule
20   \item the flag
21   \item up/down position.
22   \end{itemize}
23
24   should move beam_{left, right} into Beam
25
26   TODO.
27   
28   Stem size depends on flag.
29
30   elt properties:
31
32   beam_dir: direction of the beam (int)
33
34   dir_force: is direction explicitely specified? (bool)
35
36   /// how many abbrev beam don't reach stem?
37   int beam_gap_i_;
38
39
40   
41   */
42 // todo: remove baseclass Staff_symbol_referencer, since stem
43 // can be across a staff.
44 class Stem : public Item, public Staff_symbol_referencer {
45
46   /**extent of the stem (positions).
47     fractional, since Beam has to adapt them.
48     */
49   Drul_array<Real> yextent_drul_;
50
51 public:
52   Link_array<Note_head> head_l_arr_;
53   Link_array<Rest> rest_l_arr_;
54     
55   /// log of the duration. Eg. 4 -> 16th note -> 2 flags
56   int flag_i_;
57
58   /** 
59     don't print flag when in beam.
60     our beam, for aligning abbrev flags
61    */
62   Beam* beam_l_;
63
64   Drul_array<int> beams_i_drul_;
65
66   void set_direction (Direction d);
67   /// direction stem (that's me)
68   Direction dir_;
69
70
71   Stem ();
72     
73   /// ensure that this Stem also encompasses the Notehead #n#
74   void add_head (Rhythmic_head*n);
75
76   Real hpos_f () const;
77   Real chord_start_f () const;
78   
79   int type_i () const;
80
81   void do_print() const;
82   void set_stemend (Real);
83   Direction get_default_dir() const;
84   Direction get_dir () const;
85
86   int get_center_distance(Direction) const;
87
88   void set_default_stemlen();
89   void set_default_extents();
90   void set_noteheads();
91
92   Real stem_length_f() const;
93   Real stem_end_f() const;
94   Real stem_begin_f() const;
95   Real note_delta_f () const;
96
97   bool invisible_b() const;
98     
99   /// heads that the stem encompasses (positions)
100   Interval_t<int> head_positions() const;
101
102 protected:
103   Molecule flag () const;
104   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
105   virtual void do_pre_processing();
106   virtual Interval do_width() const;
107   virtual Molecule* do_brew_molecule_p() const;
108
109   void set_spacing_hints () ;
110 };
111 #endif