]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/score-element.hh
768152545e7e6fb88dbfc43c7db7fc1a86e1772f
[lilypond.git] / lily / include / score-element.hh
1 /*
2   score-element.hh -- declare Score_element
3
4   (c) 1996-1999--2000 Han-Wen Nienhuys
5 */
6
7 #ifndef STAFFELEM_HH
8 #define STAFFELEM_HH
9
10 #include "parray.hh"
11 #include "virtual-methods.hh"
12 #include "lily-guile.hh"
13 #include "lily-proto.hh"
14 #include "smobs.hh"
15 #include "dimension-cache-callback.hh"
16
17
18
19
20
21 /**
22     for administration of what was done already
23     */
24 enum Score_element_status {
25   ORPHAN=0,                     // not yet added to pstaff
26   VIRGIN,                       // added to pstaff
27   PRECALCING,
28   PRECALCED,            // calcs before spacing done
29   POSTCALCING,          // busy calculating. This is used to trap cyclic deps.
30   POSTCALCED,           // after spacing calcs done
31   BREWING,
32   BREWED,
33 };
34
35 typedef void (Score_element::*Score_element_method_pointer) (void);
36
37 /**
38    Basic output object.
39
40     Element Properties:
41
42    transparent -- boolean: if true, do not print anything black.
43
44    dependencies -- list of score-element pointers that indicate who to
45    compute first.
46
47    interfaces -- list of symbols indicating the interfaces supported
48    by this object.
49
50    extra-offset -- pair of reals (a cons) forcing an extra offset
51    before outputting
52
53    glyph -- afm character name to output.
54    
55 */
56 class Score_element  {
57   /**
58      The lookup, determined by the font size. Cache this value.
59    */
60   Lookup * lookup_l_;
61 public:
62   /**
63      properties specific for this element. Destructor will not call
64      scm_unprotect, so as to allow more flexible GC arrangements.  The
65      real alist is in (cdr element_property_alist_), to reduce the
66      need for more scm_protect calls.
67
68   */
69   SCM element_property_alist_;
70   
71   Score_element *original_l_;
72
73   /**
74     Administration: Where are we?. This is mainly used by Super_element and
75     Score_element::calcalute_dependencies ()
76
77     0 means ORPHAN,
78     -1 means deleted
79     
80    */
81   int status_i_;
82
83   Paper_score *pscore_l_;
84
85   Score_element ();
86   Score_element (Score_element const&);
87   virtual void print () const;
88
89   /*
90     properties
91    */
92   SCM get_elt_property (String nm) const;
93   void set_elt_property (String, SCM val);
94
95   /**
96      UGH! JUNKME ?
97
98      This gets messy because it changes state
99
100      calling 
101
102      Bar::proc ()
103      {
104        s->remove_elt_property ("foo")
105      } 
106
107      twice may do weird things if Bar::foo has a default set.
108      
109    */
110   SCM remove_elt_property (String nm);
111
112   void Score_element::set_real (String, Real);
113   Real Score_element::get_real (String s) const;
114
115   /*
116     related classes.
117    */
118   Paper_def *paper_l () const;
119   Lookup const *lookup_l () const;
120
121   void add_processing ();
122
123   /**
124     add a dependency. It may be the 0 pointer, in which case, it is ignored.
125     */
126   void add_dependency (Score_element*);    
127   virtual Line_of_score * line_l () const;
128   bool linked_b () const;
129
130
131   VIRTUAL_COPY_CONS(Score_element);
132  
133   /**
134      Recursively track all dependencies of this Score_element.  The
135      status_i_ field is used as a mark-field.  It is marked with
136      #busy# during execution of this function, and marked with #final#
137      when finished.
138
139      #funcptr# is the function to call to update this element.
140    */
141   void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr);
142
143   static SCM handle_broken_smobs (SCM, SCM criterion);
144   void recurse_into_smobs (SCM s, void (Score_element::*meth_ptr)());
145
146   virtual void do_break_processing ();
147   virtual Score_element *find_broken_piece (Line_of_score*) const;
148   /// generate rods & springs
149   virtual void do_space_processing ();
150   virtual void do_breakable_col_processing ();
151
152   /// do calculations before determining horizontal spacing
153   virtual void before_line_breaking ();
154   /// do calculations after determining horizontal spacing
155   virtual void after_line_breaking ();
156   virtual void output_processing ();
157   
158
159   static Interval preset_extent (Dimension_cache const*);
160   static Interval molecule_extent (Dimension_cache const*);
161
162 protected:
163
164   /**
165     Junk score element. This is protected because this is supposed to
166     be handled by GUILE gc.  */
167   virtual ~Score_element ();
168   
169   /// do printing of derived info.
170   virtual void do_print () const;
171   /// generate the molecule    
172   virtual Molecule do_brew_molecule () const;
173   ///executed directly after the item is added to the Paper_score
174   virtual void do_add_processing ();
175
176     
177   static Interval dim_cache_callback (Dimension_cache const*);
178   
179 public:
180   static SCM ly_set_elt_property (SCM, SCM,SCM);
181   static SCM ly_get_elt_property (SCM, SCM);  
182
183   virtual void handle_broken_dependencies ();
184   virtual void handle_prebroken_dependencies ();
185
186
187   DECLARE_SMOBS;
188
189   void init ();
190
191 public:
192   Dimension_cache *dim_cache_[NO_AXES];
193
194   /**
195      Set this if anyone points to me, or if I point to anyone.
196
197      JUNKME.
198    */
199   bool used_b_;
200   
201   char const * name () const;
202   /**
203      Set empty in direction A.
204      JUNKME
205    */
206   void set_empty (Axis a);
207   bool empty_b (Axis a) const;
208   Interval extent (Axis) const;
209  
210   /**
211     translate in one direction
212     */
213     
214   void translate_axis (Real, Axis);
215
216   Real relative_coordinate (Score_element const* refp, Axis) const;
217   /**
218     Find the group-element which has both #this# and #s#
219    */
220   Score_element*common_refpoint (Score_element const* s, Axis a) const;
221   Score_element*common_refpoint (Link_array<Score_element> elems, Axis a) const;
222
223
224   bool has_offset_callback_b (Offset_cache_callback, Axis)const;
225   void add_offset_callback (Offset_cache_callback, Axis);
226   void set_extent_callback (Dim_cache_callback , Axis);
227   
228   /**
229      Set the  parent refpoint of THIS to E
230    */
231   void set_parent (Score_element* e, Axis);
232   
233   Score_element *parent_l (Axis a) const;
234   void fixup_refpoint ();
235 };
236
237 Score_element * unsmob_element (SCM);
238
239
240
241 #endif // STAFFELEM_HH
242