/*
score-element.hh -- declare Score_element
- (c) 1996-1999 Han-Wen Nienhuys
+ (c) 1996-1999--2000 Han-Wen Nienhuys
*/
#ifndef STAFFELEM_HH
#include "parray.hh"
#include "virtual-methods.hh"
-#include "graphical-element.hh"
#include "lily-guile.hh"
+#include "lily-proto.hh"
+#include "smobs.hh"
+#include "dimension-cache.hh"
+/**
+ for administration of what was done already
+ */
+enum Score_element_status {
+ ORPHAN=0, // not yet added to Paper_score
+ VIRGIN,
+ PRECALCING,
+ PRECALCED, // calcs before spacing done
+ POSTCALCING, // busy calculating. This is used to trap cyclic deps.
+ POSTCALCED, // after spacing calcs done
+};
typedef void (Score_element::*Score_element_method_pointer) (void);
-/** Both Spanner and Item are Score_element's. Most Score_element's depend
- on other Score_element's, eg, Beam needs to know and set direction of
- Stem. So the Beam has to be calculated *before* Stem. This is
- accomplished with the dependencies fields of struct Score_element,
- which are implemented in the Directed_graph_node class: all elements
- form an acyclic graph.
-
- (elem)
-
-
-Element Properties:
-
-Boolean (true iff defined)
-
- break_helper_only -- if defined try to junk this after calcing breakpoints.
-
- transparent -- do not calc. output
-
+/*
+ Basic output object.
*/
-class Score_element : public virtual Graphical_element {
- /**
- properties specific for this element. Destructor will not call
- scm_unprotect, so as to allow more flexible GC arrangements. The
- real alist is in (cdr element_property_alist_), to reduce the
- need for more scm_protect calls.
-
- */
- SCM element_property_alist_;
- Link_array<Score_element> dependency_arr_;
+class Score_element {
/**
The lookup, determined by the font size. Cache this value.
*/
Lookup * lookup_l_;
+
public:
+ SCM immutable_property_alist_;
+ SCM mutable_property_alist_;
Score_element *original_l_;
/**
Score_element::calcalute_dependencies ()
0 means ORPHAN,
- -1 means deleted
-
*/
- int status_i_;
+ char status_i_;
+ String name () const;
+ /*
+ IDEA: make this a global variable. This is the same for all
+ elements, I think it is safe to assume that we will not have
+ scores being formatted multithreadedly.
+ */
Paper_score *pscore_l_;
- Molecule * output_p_;
- Score_element ();
+
+ Score_element (SCM basic_props);
Score_element (Score_element const&);
- virtual void print () const;
/*
properties
*/
- SCM get_elt_property (SCM sym) const;
- void set_elt_property (SCM sym, SCM val);
- SCM remove_elt_property (SCM key);
+ SCM get_elt_property (const char*) const;
+ SCM get_elt_property (SCM) const;
+ void set_elt_property (const char * , SCM val);
+ void set_immutable_elt_property (const char * , SCM val);
+ void set_immutable_elt_property (SCM key, SCM val);
+ void set_elt_property (SCM , SCM val);
+ void set_elt_pointer (const char*, SCM val);
+ friend class Property_engraver; // UGHUGHUGH.
+ SCM remove_elt_property (const char* nm);
/*
related classes.
Paper_def *paper_l () const;
Lookup const *lookup_l () const;
- void add_processing ();
-
- void substitute_dependency (Score_element*,Score_element*);
- void remove_dependency (Score_element*);
/**
add a dependency. It may be the 0 pointer, in which case, it is ignored.
*/
void add_dependency (Score_element*);
virtual Line_of_score * line_l () const;
bool linked_b () const;
+
+
VIRTUAL_COPY_CONS(Score_element);
/**
#funcptr# is the function to call to update this element.
*/
- void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr);
-
+ void calculate_dependencies (int final, int busy, SCM funcname);
+ static SCM handle_broken_smobs (SCM, SCM criterion);
+ virtual void do_break_processing ();
virtual Score_element *find_broken_piece (Line_of_score*) const;
-protected:
+ virtual void discretionary_processing ();
+ virtual SCM do_derived_mark ();
- /**
- Junk score element. This is protected because this is supposed to
- be handled by GUILE gc. */
- virtual ~Score_element ();
-
- Score_element* dependency (int) const;
- int dependency_size () const;
+ Molecule get_molecule () const;
+ void suicide ();
- virtual void output_processing ();
- virtual Interval do_height () const;
- virtual Interval do_width () const;
-
+ DECLARE_SCHEME_CALLBACK(preset_extent, (SCM smob, SCM axis));
+ DECLARE_SCHEME_CALLBACK(point_dimension_callback, (SCM smob, SCM axis));
+ DECLARE_SCHEME_CALLBACK(molecule_extent, (SCM smob, SCM axis));
- /// do printing of derived info.
- virtual void do_print () const;
- /// generate the molecule
- virtual Molecule* do_brew_molecule_p () const;
- ///executed directly after the item is added to the Paper_score
- virtual void do_add_processing ();
- /// do calculations before determining horizontal spacing
- virtual void do_pre_processing ();
- /// generate rods & springs
- virtual void do_space_processing ();
+ static SCM ly_set_elt_property (SCM, SCM,SCM);
+ static SCM ly_get_elt_property (SCM, SCM);
- /// do postbreak substs on array of pointers.
- virtual void do_substitute_arrays ();
+ bool has_interface (SCM intf);
+ void set_interface (SCM intf);
- virtual void do_breakable_col_processing ();
- /// do calculations after determining horizontal spacing
- virtual void do_post_processing ();
-
- virtual void do_substitute_element_pointer (Score_element * , Score_element *);
- virtual void do_break_processing ();
virtual void handle_broken_dependencies ();
virtual void handle_prebroken_dependencies ();
- virtual void handle_prebroken_dependents ();
- virtual void handle_broken_dependents ();
- virtual Link_array<Score_element> get_extra_dependencies () const;
- static Interval dim_cache_callback (Dimension_cache*);
+
+ DECLARE_SMOBS(Score_element,foo);
+
+ void init ();
+
+ Dimension_cache dim_cache_[NO_AXES];
+
public:
- SCM smobify_self ();
- static SCM mark_smob (SCM);
- static scm_sizet free_smob (SCM s);
- static int print_smob (SCM s, SCM p, scm_print_state*);
- static long smob_tag;
- static void init_smobs();
- SCM self_scm_;
-};
+ bool empty_b (Axis a) const;
+
+ Interval extent (Score_element * refpoint, Axis) const;
+
+ /**
+ translate in one direction
+ */
+
+ void translate_axis (Real, Axis);
+ /**
+ Find the offset relative to D. If D equals THIS, then it is 0.
+ Otherwise, it recursively defd as
+
+ OFFSET_ + PARENT_L_->relative_coordinate (D)
+ */
+ Real relative_coordinate (Score_element const* refp, Axis) const;
+ /**
+ Find the group-element which has both #this# and #s#
+ */
+ Score_element*common_refpoint (Score_element const* s, Axis a) const;
+ Score_element*common_refpoint (SCM elt_list, Axis a) const;
-template<class T>
-void
-substitute_element_array (Link_array<T> &arr, Line_of_score * to)
-{
- Link_array<T> newarr;
- for (int i =0; i < arr.size (); i++)
- {
- T * t = arr[i];
- if (t->line_l () != to)
- {
- t = dynamic_cast<T*> (t->find_broken_piece (to));
- }
-
- if (t)
- newarr.push (t);
- }
- arr = newarr;
-}
+ // duh. slim down interface here. (todo)
+ bool has_offset_callback_b (SCM callback, Axis)const;
+ void add_offset_callback (SCM callback, Axis);
+ bool has_extent_callback_b (SCM, Axis)const;
+ void set_extent_callback (SCM , Axis);
+ bool has_extent_callback_b (Axis) const;
+
+ /**
+ Invoke callbacks to get offset relative to parent.
+ */
+ Real get_offset (Axis a) const;
+ /**
+ Set the parent refpoint of THIS to E
+ */
+ void set_parent (Score_element* e, Axis);
+
+ Score_element *parent_l (Axis a) const;
+ DECLARE_SCHEME_CALLBACK(fixup_refpoint, (SCM));
+};
+Score_element * unsmob_element (SCM);
#endif // STAFFELEM_HH