]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/score-element.hh
patch::: 1.3.49.hwn1: deze dus
[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
144   static SCM handle_broken_smobs (SCM, SCM criterion);
145   void recurse_into_smobs (SCM s, void (Score_element::*meth_ptr)());
146
147   virtual void do_break_processing ();
148   virtual Score_element *find_broken_piece (Line_of_score*) const;
149   /// generate rods & springs
150   virtual void do_space_processing ();
151   virtual void do_breakable_col_processing ();
152
153   /// do calculations before determining horizontal spacing
154   virtual void before_line_breaking ();
155   /// do calculations after determining horizontal spacing
156   virtual void after_line_breaking ();
157   virtual void output_processing ();
158   
159
160   static Interval preset_extent (Dimension_cache const*);
161   static Interval molecule_extent (Dimension_cache const*);
162
163 protected:
164
165   /**
166     Junk score element. This is protected because this is supposed to
167     be handled by GUILE gc.  */
168   virtual ~Score_element ();
169   
170   /// do printing of derived info.
171   virtual void do_print () const;
172   /// generate the molecule    
173   virtual Molecule do_brew_molecule () const;
174   ///executed directly after the item is added to the Paper_score
175   virtual void do_add_processing ();
176
177     
178   static Interval dim_cache_callback (Dimension_cache const*);
179   
180 public:
181   static SCM ly_set_elt_property (SCM, SCM,SCM);
182   static SCM ly_get_elt_property (SCM, SCM);  
183
184   virtual void handle_broken_dependencies ();
185   virtual void handle_prebroken_dependencies ();
186
187
188   DECLARE_SMOBS;
189
190   void init ();
191
192 public:
193   Dimension_cache *dim_cache_[NO_AXES];
194
195   /**
196      Set this if anyone points to me, or if I point to anyone.
197
198      JUNKME.
199    */
200   bool used_b_;
201   
202   char const * name () const;
203
204   bool empty_b (Axis a) const;
205   Interval extent (Axis) const;
206  
207   /**
208     translate in one direction
209     */
210     
211   void translate_axis (Real, Axis);
212
213   Real relative_coordinate (Score_element const* refp, Axis) const;
214   /**
215     Find the group-element which has both #this# and #s#
216    */
217   Score_element*common_refpoint (Score_element const* s, Axis a) const;
218   Score_element*common_refpoint (Link_array<Score_element> elems, Axis a) const;
219
220
221   bool has_offset_callback_b (Offset_cache_callback, Axis)const;
222   void add_offset_callback (Offset_cache_callback, Axis);
223   void set_extent_callback (Dim_cache_callback , Axis);
224   
225   /**
226      Set the  parent refpoint of THIS to E
227    */
228   void set_parent (Score_element* e, Axis);
229   
230   Score_element *parent_l (Axis a) const;
231   void fixup_refpoint ();
232 };
233
234 Score_element * unsmob_element (SCM);
235
236
237
238 #endif // STAFFELEM_HH
239