/*
- p-score.hh -- declare PScore
+ p-score.hh -- declare Paper_score
- source file of the LilyPond music typesetter
+ source file of the GNU LilyPond music typesetter
- (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1996, 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#define P_SCORE_HH
#include "colhpos.hh"
-#include "varray.hh"
+#include "parray.hh"
#include "lily-proto.hh"
-#include "p-col.hh"
-#include "p-staff.hh"
+#include "plist.hh"
+#include "music-output.hh"
-
-/** all stuff which goes onto paper. notes, signs, symbols in a score can be grouped in two ways:
- horizontally (staffwise), and vertically (columns). #PScore#
- contains the items, the columns and the staffs.
- */
-
-struct PScore {
- Paper_def *paper_l_;
+/** all stuff which goes onto paper. notes, signs, symbols in a score
+ #Paper_score# contains the items, the columns.
- /// the columns, ordered left to right
- Pointer_list<PCol *> cols;
+ */
- /// the idealspacings, no particular order
- Pointer_list<Idealspacing*> suz;
+class Paper_score : public Music_output
+{
+public:
+ Paper_def *paper_l_;
- /// the staffs ordered top to bottom
- Pointer_list<PStaff*> staffs;
+ /// the columns, ordered left to right
+ Link_list<Paper_column *> col_p_list_;
- /// all symbols in score. No particular order.
- Pointer_list<Item*> its;
+ /// crescs etc; no particular order
+ Pointer_list<Spanner *> span_p_list_;
- /// if broken, the different lines
- Pointer_list<Line_of_score*> lines;
+ /// other elements
+ Pointer_list<Score_element*> elem_p_list_;
+
+ Paper_outputter *outputter_l_;
+ Line_of_score * line_l_;
+
+ Paper_score ();
- /// crescs etc; no particular order
- Pointer_list<Spanner *> spanners;
- /// broken spanners
- Pointer_list<Spanner*> broken_spans;
+ /// add to bottom of pcols
+ void add_column (Paper_column*);
- Pointer_list<Vertical_spanner*> vspan_p_list_;
- /* *************** */
- /* CONSTRUCTION */
-
- PScore(Paper_def*);
- /// add a line to the broken stuff. Positions given in #config#
- void set_breaking(Array<Col_hpositions> const &);
+ /**
+ @return argument as a cursor of the list
+ */
+ PCursor<Paper_column *> find_col (Paper_column const *) const;
- void add(PStaff *);
+ Link_array<Paper_column> col_range (Paper_column *left_l, Paper_column *right_l) const;
+ Link_array<Paper_column> breakable_col_range (Paper_column*,Paper_column*) const;
+ Link_array<Item> broken_col_range (Item const*,Item const*) const;
-
- /** add an item.
- add the item in specified containers. If breakstatus is set
- properly, add it to the {pre,post}break of the pcol.
- */
- void typeset_item(Item *item_p, PCol *pcol_l,PStaff*pstaf_l,int breakstatus=1);
-
- /// add a Spanner
- void typeset_spanner(Spanner*, PStaff*);
+
+ /* STANDARD ROUTINES */
+ void print() const;
+
+ void typeset_element (Score_element*);
+ void typeset_broken_spanner (Spanner*);
+ /// add a Spanner
+ void typeset_unbroken_spanner (Spanner*);
- /// add to bottom of pcols
- void add(PCol*);
- void add_broken(Spanner*);
-
- /* INSPECTION */
- Array<Item*> select_items(PStaff*, PCol*);
-
- /**
- @return argument as a cursor of the list
- */
- PCursor<PCol *> find_col(PCol const *)const;
+
+ virtual ~Paper_score();
+protected:
+
/* MAIN ROUTINES */
- void process();
-
- /// last deed of this struct
- void output(Tex_stream &ts);
-
- /* UTILITY ROUTINES */
-
- /// get the spacing between c1 and c2, create one if necessary.
- Idealspacing* get_spacing(PCol *c1, PCol *c2);
+ virtual void process();
+// can't instantiate template with cygnus' gcc...
+// virtual ~Paper_score();
- /// connect c1 and c2
- void do_connect(PCol *c1, PCol *c2, Real distance_f, Real strength_f);
-
- /// connect c1 and c2 and any children of c1 and c2
- void connect(PCol* c1, PCol *c2, Real distance_f,Real strength_f= 1.0);
-
- /* STANDARD ROUTINES */
- void OK()const;
- void print() const;
private:
- /// before calc_breaking
- void preprocess();
- /// calculate where the lines are to be broken, and use results
- void calc_breaking();
+ void remove_line (Line_of_score*);
+ /// before calc_breaking
+ void preprocess();
+
+ void calc_idealspacing();
+ /// calculate where the lines are to be broken, and use results
+ Array<Column_x_positions> calc_breaking();
- /// after calc_breaking
- void postprocess();
+ /// after calc_breaking
+ void postprocess();
- /// delete unused columns
- void clean_cols();
+ /// delete unused columns
+ void clean_cols();
};
#endif