summaryrefslogtreecommitdiff
path: root/lily
diff options
context:
space:
mode:
authorHan-Wen Nienhuys <hanwen@xs4all.nl>2000-07-05 15:41:25 +0200
committerHan-Wen Nienhuys <hanwen@xs4all.nl>2000-07-05 15:41:25 +0200
commit3c2f386f1385a10dafbb811be245f5a75d6b132c (patch)
tree057d298c5fc72aab670c3831e033f9b62d807dc2 /lily
parentcb788160bb99e5c6d1e28ba9dd3be955b2a99edc (diff)
release: 1.3.70
====== * Cleanup auto-beam-engraver: use properties for retrieving timing information. * Fixed: Multi measure rests don't cause crashes. * Fixed: don't invoke Hara_kiri::consider_suicide too early. * Fixed: property engraver. * Fixed: don't crash on multiple ties. * Cleanups of Beam, should also be a little faster. * Reunite properties and pointers. In implementation we make a distinction between mutable and immutable properties * Add {has|set}_interface () static methods to interface classes. * Made Side_position_interface and Staff_symbol_interface an all statics class, and stripped _interface suffix. * Make Align_interface and Axis_group_interface an all-statics class * Rhythmic_head, Staff_symbol, Grace_align_item, Break_align_item, Bar, Span_bar are now interfaces, Staff_bar was removed. Use a callback for determining barsize. * Removed all GLUE_SCORE_ELEMENT callbacks. * Added test for repeats to trip.ly 1.3
Diffstat (limited to 'lily')
-rw-r--r--lily/align-note-column-engraver.cc6
-rw-r--r--lily/all-font-metrics.cc18
-rw-r--r--lily/auto-beam-engraver.cc19
-rw-r--r--lily/axis-group-interface.cc2
-rw-r--r--lily/beam-engraver.cc15
-rw-r--r--lily/beam.cc281
-rw-r--r--lily/break-algorithm.cc17
-rw-r--r--lily/chord-tremolo-engraver.cc11
-rw-r--r--lily/collision-engraver.cc8
-rw-r--r--lily/collision.cc18
-rw-r--r--lily/dynamic-engraver.cc6
-rw-r--r--lily/gourlay-breaking.cc10
-rw-r--r--lily/grace-align-item.cc20
-rw-r--r--lily/include/beam.hh57
-rw-r--r--lily/include/break-algorithm.hh6
-rw-r--r--lily/include/collision.hh2
-rw-r--r--lily/include/column-x-positions.hh2
-rw-r--r--lily/include/item.hh2
-rw-r--r--lily/include/line-of-score.hh2
-rw-r--r--lily/include/multi-measure-rest.hh12
-rw-r--r--lily/include/note-column.hh29
-rw-r--r--lily/include/paper-column.hh44
-rw-r--r--lily/include/rest-collision.hh2
-rw-r--r--lily/include/rod.hh7
-rw-r--r--lily/include/score-element.hh2
-rw-r--r--lily/include/script.hh11
-rw-r--r--lily/include/separating-group-spanner.hh8
-rw-r--r--lily/include/simple-spacer.hh2
-rw-r--r--lily/include/slur.hh38
-rw-r--r--lily/include/spaceable-element.hh29
-rw-r--r--lily/include/spacing-engraver.hh57
-rw-r--r--lily/include/spacing-spanner.hh22
-rw-r--r--lily/include/spanner.hh5
-rw-r--r--lily/include/stem.hh22
-rw-r--r--lily/include/system-start-delimiter.hh17
-rw-r--r--lily/include/tie-column.hh8
-rw-r--r--lily/include/tie.hh2
-rw-r--r--lily/instrument-name-engraver.cc6
-rw-r--r--lily/item.cc25
-rw-r--r--lily/line-of-score.cc26
-rw-r--r--lily/main.cc9
-rw-r--r--lily/multi-measure-rest-engraver.cc3
-rw-r--r--lily/multi-measure-rest.cc32
-rw-r--r--lily/note-column.cc57
-rw-r--r--lily/paper-column.cc76
-rw-r--r--lily/paper-score.cc2
-rw-r--r--lily/rest-collision-engraver.cc6
-rw-r--r--lily/rest-collision.cc22
-rw-r--r--lily/rhythmic-column-engraver.cc23
-rw-r--r--lily/rhythmic-head.cc1
-rw-r--r--lily/rod.cc13
-rw-r--r--lily/score-element.cc4
-rw-r--r--lily/score-engraver.cc2
-rw-r--r--lily/script-column-engraver.cc2
-rw-r--r--lily/script-engraver.cc11
-rw-r--r--lily/script.cc21
-rw-r--r--lily/separating-group-spanner.cc41
-rw-r--r--lily/separating-line-group-engraver.cc7
-rw-r--r--lily/simple-spacer.cc31
-rw-r--r--lily/slur-engraver.cc20
-rw-r--r--lily/slur.cc202
-rw-r--r--lily/spaceable-element.cc84
-rw-r--r--lily/spacing-engraver.cc45
-rw-r--r--lily/spacing-spanner.cc131
-rw-r--r--lily/spanner.cc32
-rw-r--r--lily/spring.cc5
-rw-r--r--lily/stem-engraver.cc7
-rw-r--r--lily/stem-tremolo.cc11
-rw-r--r--lily/stem.cc32
-rw-r--r--lily/system-start-delimiter-engraver.cc10
-rw-r--r--lily/system-start-delimiter.cc65
-rw-r--r--lily/tie-column.cc14
-rw-r--r--lily/tie-engraver.cc4
-rw-r--r--lily/tie.cc25
-rw-r--r--lily/tuplet-engraver.cc9
-rw-r--r--lily/tuplet-spanner.cc27
76 files changed, 949 insertions, 1013 deletions
diff --git a/lily/align-note-column-engraver.cc b/lily/align-note-column-engraver.cc
index cbe7a931f0..05a51c710b 100644
--- a/lily/align-note-column-engraver.cc
+++ b/lily/align-note-column-engraver.cc
@@ -22,7 +22,7 @@
class Align_note_column_engraver: public Engraver
{
Item * align_item_p_;
- Note_column * now_column_l_;
+ Score_element * now_column_l_;
Score_element * accidental_l_;
virtual void process_acknowledged ();
@@ -71,9 +71,9 @@ Align_note_column_engraver::do_removal_processing ()
void
Align_note_column_engraver::acknowledge_element (Score_element_info inf)
{
- if (Note_column * n = dynamic_cast<Note_column*> (inf.elem_l_))
+ if (Note_column::has_interface(inf.elem_l_))
{
- now_column_l_ =n;
+ now_column_l_ =inf.elem_l_;
}
else if (Local_key_item::has_interface (inf.elem_l_))
{
diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc
index f014ef3e46..f8e2c0cee1 100644
--- a/lily/all-font-metrics.cc
+++ b/lily/all-font-metrics.cc
@@ -16,10 +16,6 @@
#include "lily-guile.hh"
#include "tfm-reader.hh"
-extern "C" {
-#include <kpathsea/kpathsea.h>
-}
-
const char * default_font_sz_ = "cmr10";
All_font_metrics::All_font_metrics (String path)
@@ -36,11 +32,8 @@ All_font_metrics::find_afm (String name)
String path = name + ".afm";
path = search_path_.find (path);
if (path.empty_b ())
- {
- path = kpse_find_file(name.ch_C(), kpse_afm_format, true);
- if (path.empty_b())
- return 0;
- }
+ return 0;
+
if (verbose_global_b)
progress_indication ("[" + path);
Adobe_font_metric * afm_p = read_afm_file (path);
@@ -85,13 +78,8 @@ All_font_metrics::find_tfm (String name)
{
String path = name + ".tfm";
path = search_path_.find (path);
- path = search_path_.find (path);
if (path.empty_b ())
- {
- path = kpse_find_tfm(name.ch_C());
- if (path.empty_b())
- return 0;
- }
+ return 0;
if (verbose_global_b)
progress_indication ("[" + path);
Tex_font_metric * tfm_p = Tex_font_metric_reader::read_file (path);
diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc
index d912bb9585..316cc56f62 100644
--- a/lily/auto-beam-engraver.cc
+++ b/lily/auto-beam-engraver.cc
@@ -16,6 +16,8 @@
#include "bar.hh"
#include "rest.hh"
#include "engraver.hh"
+#include "item.hh"
+#include "spanner.hh"
class Auto_beam_engraver : public Engraver
{
@@ -34,14 +36,14 @@ protected:
private:
void begin_beam ();
void consider_end_and_begin (Moment test_mom);
- Beam* create_beam_p ();
+ Spanner* create_beam_p ();
void end_beam ();
void junk_beam ();
bool same_grace_state_b (Score_element* e);
void typeset_beam ();
Moment shortest_mom_;
- Beam *finished_beam_p_;
+ Spanner *finished_beam_p_;
Link_array<Item>* stem_l_arr_p_;
Moment last_add_mom_;
@@ -234,10 +236,11 @@ Auto_beam_engraver::begin_beam ()
beam_start_location_ = *unsmob_moment (get_property ("measurePosition"));
}
-Beam*
+Spanner*
Auto_beam_engraver::create_beam_p ()
{
- Beam* beam_p = new Beam (get_property ("basicBeamProperties"));
+ Spanner* beam_p = new Spanner (get_property ("basicBeamProperties"));
+ Beam::set_interface (beam_p);
for (int i = 0; i < stem_l_arr_p_->size (); i++)
{
@@ -248,7 +251,7 @@ Auto_beam_engraver::create_beam_p ()
{
return 0;
}
- beam_p->add_stem ((*stem_l_arr_p_)[i]);
+ Beam::add_stem (beam_p,(*stem_l_arr_p_)[i]);
}
announce_element (Score_element_info (beam_p, 0));
@@ -281,7 +284,7 @@ Auto_beam_engraver::typeset_beam ()
if (finished_beam_p_)
{
finished_grouping_p_->beamify ();
- finished_beam_p_->set_beaming (finished_grouping_p_);
+ Beam::set_beaming (finished_beam_p_, finished_grouping_p_);
typeset_element (finished_beam_p_);
finished_beam_p_ = 0;
@@ -338,7 +341,7 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
if (stem_l_arr_p_)
{
- if (Beam *b = dynamic_cast<Beam *> (info.elem_l_))
+ if (Beam::has_interface (info.elem_l_))
{
end_beam ();
}
@@ -373,7 +376,7 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
return;
}
- if (!Stem::beam_l (stem_l))
+ if (Stem::beam_l (stem_l))
{
if (stem_l_arr_p_)
junk_beam ();
diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc
index 12eac16329..3b144f624f 100644
--- a/lily/axis-group-interface.cc
+++ b/lily/axis-group-interface.cc
@@ -125,6 +125,6 @@ Axis_group_interface::set_interface (Score_element*me)
if (!has_interface (me))
{
me->set_interface (ly_symbol2scm ("axis-group-interface"));
- me->set_elt_property ("elements", SCM_EOL);
}
+ me->set_elt_property ("elements", SCM_EOL);
}
diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc
index dedbad0dd0..1678dff784 100644
--- a/lily/beam-engraver.cc
+++ b/lily/beam-engraver.cc
@@ -16,13 +16,15 @@
#include "score-engraver.hh"
#include "rest.hh"
#include "drul-array.hh"
+#include "item.hh"
+#include "spanner.hh"
class Beam_engraver : public Engraver
{
Drul_array<Span_req*> reqs_drul_;
- Beam *finished_beam_p_;
- Beam *beam_p_;
+ Spanner *finished_beam_p_;
+ Spanner *beam_p_;
Span_req * prev_start_req_;
Beaming_info_list * beam_info_p_;
@@ -120,8 +122,9 @@ Beam_engraver::do_process_music ()
}
prev_start_req_ = reqs_drul_[START];
- beam_p_ = new Beam (get_property ("basicBeamProperties"));
-
+ beam_p_ = new Spanner (get_property ("basicBeamProperties"));
+ Beam::set_interface (beam_p_);
+
SCM smp = get_property ("measurePosition");
Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
@@ -143,7 +146,7 @@ Beam_engraver::typeset_beam ()
{
finished_beam_info_p_->beamify ();
- finished_beam_p_->set_beaming (finished_beam_info_p_);
+ Beam::set_beaming (finished_beam_p_, finished_beam_info_p_);
typeset_element (finished_beam_p_);
delete finished_beam_info_p_;
finished_beam_info_p_ =0;
@@ -229,7 +232,7 @@ Beam_engraver::acknowledge_element (Score_element_info info)
Moment stem_location = now_mom () - beam_start_mom_ + beam_start_location_;
beam_info_p_->add_stem (stem_location,
(rhythmic_req->duration_.durlog_i_ - 2) >? 1);
- beam_p_->add_stem (stem_l);
+ Beam::add_stem (beam_p_, stem_l);
}
}
}
diff --git a/lily/beam.cc b/lily/beam.cc
index 604c4d356b..9e59ec6485 100644
--- a/lily/beam.cc
+++ b/lily/beam.cc
@@ -18,12 +18,12 @@
#include <math.h> // tanh.
+
+
#include "directional-element-interface.hh"
#include "beaming.hh"
-#include "dimensions.hh"
#include "beam.hh"
#include "misc.hh"
-#include "debug.hh"
#include "least-squares.hh"
#include "stem.hh"
#include "paper-def.hh"
@@ -31,38 +31,27 @@
#include "group-interface.hh"
#include "staff-symbol-referencer.hh"
#include "cross-staff.hh"
-
-Beam::Beam (SCM s)
- : Spanner (s)
-{
- Score_element*me =this;
-
- Pointer_group_interface g (me, "stems");
- g.set_interface ();
-
- set_elt_property ("height", gh_int2scm (0)); // ugh.
- set_elt_property ("y-position" ,gh_int2scm (0));
-}
+#include "item.hh"
+#include "spanner.hh"
+#include "warn.hh"
void
-Beam::add_stem (Score_element*s)
+Beam::add_stem (Score_element*me, Score_element*s)
{
- Score_element*me =this;
Pointer_group_interface gi (me, "stems");
gi.add_element (s);
s->add_dependency (me);
assert (!Stem::beam_l (s));
- s->set_elt_property ("beam", self_scm_);
+ s->set_elt_property ("beam", me->self_scm_);
add_bound_item (dynamic_cast<Spanner*> (me), dynamic_cast<Item*> (s));
}
int
-Beam::get_multiplicity () const
+Beam::get_multiplicity (Score_element*me)
{
- Score_element*me =(Score_element*)this;
int m = 0;
for (SCM s = me->get_elt_property ("stems"); gh_pair_p (s); s = gh_cdr (s))
{
@@ -86,23 +75,20 @@ MAKE_SCHEME_CALLBACK(Beam,before_line_breaking);
SCM
Beam::before_line_breaking (SCM smob)
{
-
- Score_element * beam = unsmob_element (smob);
- Beam * me =dynamic_cast<Beam*> (beam);
+ Score_element * me = unsmob_element (smob);
// Why?
- if (me->visible_stem_count () < 2)
+ if (visible_stem_count (me) < 2)
{
warning (_ ("beam has less than two stems"));
-
}
if (!Directional_element_interface (me).get ())
- Directional_element_interface (me).set (me->get_default_dir ());
+ Directional_element_interface (me).set (get_default_dir (me));
- me->auto_knees ();
- me->set_stem_directions ();
- me->set_stem_shorten ();
+ auto_knees (me);
+ set_stem_directions (me);
+ set_stem_shorten (me);
return SCM_EOL;
}
@@ -111,14 +97,14 @@ Beam::before_line_breaking (SCM smob)
FIXME
*/
Direction
-Beam::get_default_dir () const
+Beam::get_default_dir (Score_element*me)
{
Drul_array<int> total;
total[UP] = total[DOWN] = 0;
Drul_array<int> count;
count[UP] = count[DOWN] = 0;
Direction d = DOWN;
- Spanner*me = (Spanner*)this;
+
Link_array<Item> stems=
Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
@@ -150,7 +136,7 @@ Beam::get_default_dir () const
/*
If dir is not determined: get default
*/
- return to_dir (get_elt_property ("default-neutral-direction"));
+ return to_dir (me->get_elt_property ("default-neutral-direction"));
}
@@ -160,11 +146,11 @@ Beam::get_default_dir () const
once stem gets cleaned-up.
*/
void
-Beam::set_stem_directions ()
+Beam::set_stem_directions (Score_element*me)
{
Link_array<Item> stems
- =Pointer_group_interface__extract_elements (this, (Item*) 0, "stems");
- Direction d = Directional_element_interface (this).get ();
+ =Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+ Direction d = Directional_element_interface (me).get ();
for (int i=0; i <stems.size (); i++)
{
@@ -176,10 +162,10 @@ Beam::set_stem_directions ()
}
void
-Beam::auto_knees ()
+Beam::auto_knees (Score_element*me)
{
- if (!auto_knee ("auto-interstaff-knee-gap", true))
- auto_knee ("auto-knee-gap", false);
+ if (!auto_knee (me,"auto-interstaff-knee-gap", true))
+ auto_knee (me, "auto-knee-gap", false);
}
/*
@@ -190,12 +176,11 @@ Beam::auto_knees ()
don't set, or unset autoKneeGap/autoInterstaffKneeGap.
*/
bool
-Beam::auto_knee (String gap_str, bool interstaff_b)
+Beam::auto_knee (Score_element*me, String gap_str, bool interstaff_b)
{
bool knee_b = false;
int knee_y = 0;
- SCM gap = get_elt_property (gap_str.ch_C());
- Spanner* me = this;
+ SCM gap = me->get_elt_property (gap_str.ch_C());
Direction d = Directional_element_interface (me).get ();
Link_array<Item> stems=
@@ -203,15 +188,16 @@ Beam::auto_knee (String gap_str, bool interstaff_b)
if (gh_number_p (gap))
{
+ Spanner*sp = dynamic_cast<Spanner*> (me);
int auto_gap_i = gh_scm2int (gap);
for (int i=1; i < stems.size (); i++)
{
- bool is_b = (bool)(calc_interstaff_dist (stems[i], me)
- - calc_interstaff_dist (stems[i-1], me));
+ bool is_b = (bool)(calc_interstaff_dist (stems[i], sp)
+ - calc_interstaff_dist (stems[i-1], sp));
int l_y = (int)(Stem::head_positions(stems[i-1])[d])
- + (int)calc_interstaff_dist (stems[i-1], me);
+ + (int)calc_interstaff_dist (stems[i-1], sp);
int r_y = (int)(Stem::head_positions(stems[i])[d])
- + (int)calc_interstaff_dist (stems[i], me);
+ + (int)calc_interstaff_dist (stems[i], sp);
int gap_i = r_y - l_y;
if ((abs (gap_i) >= auto_gap_i) && (!interstaff_b || is_b))
@@ -228,7 +214,7 @@ Beam::auto_knee (String gap_str, bool interstaff_b)
{
Item *s = stems[i];
int y = (int)(Stem::head_positions(s)[d])
- + (int)calc_interstaff_dist (s, me);
+ + (int)calc_interstaff_dist (s, dynamic_cast<Spanner*> (me));
Directional_element_interface (s).set (y < knee_y ? UP : DOWN);
s->set_elt_property ("dir-forced", SCM_BOOL_T);
@@ -244,17 +230,17 @@ Beam::auto_knee (String gap_str, bool interstaff_b)
scmify forced-fraction
*/
void
-Beam::set_stem_shorten ()
+Beam::set_stem_shorten (Score_element*m)
{
- Spanner*me = this;
- if (!visible_stem_count ())
+ Spanner*me = dynamic_cast<Spanner*> (m);
+ if (!visible_stem_count (me))
return;
- Real forced_fraction = forced_stem_count () / visible_stem_count ();
+ Real forced_fraction = forced_stem_count (me) / visible_stem_count (me);
if (forced_fraction < 0.5)
return;
- int multiplicity = get_multiplicity ();
+ int multiplicity = get_multiplicity (me);
// grace stems?
SCM shorten = scm_eval (ly_symbol2scm ("beamed-stem-shorten"));
@@ -268,7 +254,7 @@ Beam::set_stem_shorten ()
SCM shorten_elt = scm_list_ref (shorten, gh_int2scm (multiplicity <? (sz - 1)));
Real shorten_f = gh_scm2double (shorten_elt) * staff_space;
- /* cute, but who invented this -- how to customise ? */
+ /* cute, but who invented me -- how to customise ? */
if (forced_fraction < 1)
shorten_f /= 2;
@@ -293,19 +279,18 @@ MAKE_SCHEME_CALLBACK(Beam,after_line_breaking);
SCM
Beam::after_line_breaking (SCM smob)
{
- Score_element * beam = unsmob_element (smob);
- Beam * me =dynamic_cast<Beam*> (beam);
+ Score_element * me = unsmob_element (smob);
/* first, calculate y, dy */
Real y, dy;
- me->calc_default_position_and_height (&y, &dy);
- if (me->visible_stem_count ())
+calc_default_position_and_height (me, &y, &dy);
+ if (visible_stem_count (me))
{
- if (me->suspect_slope_b (y, dy))
+ if (suspect_slope_b (me, y, dy))
dy = 0;
- Real damped_dy = me->calc_slope_damping_f (dy);
- Real quantised_dy = me->quantise_dy_f (damped_dy);
+ Real damped_dy = calc_slope_damping_f (me, dy);
+ Real quantised_dy = quantise_dy_f (me, damped_dy);
y += (dy - quantised_dy) / 2;
dy = quantised_dy;
@@ -336,11 +321,11 @@ Beam::after_line_breaking (SCM smob)
else
{
/* we can modify y, so we should quantise y */
- Real y_shift = me->check_stem_length_f (y, dy);
+ Real y_shift = check_stem_length_f (me, y, dy);
y += y_shift;
- y = me->quantise_y_f (y, dy, 0);
- me->set_stem_length (y, dy);
- y_shift = me->check_stem_length_f (y, dy);
+ y = quantise_y_f (me,y, dy, 0);
+ set_stem_length (me, y, dy);
+ y_shift = check_stem_length_f (me, y, dy);
if (y_shift > half_space / 4)
{
@@ -353,12 +338,12 @@ Beam::after_line_breaking (SCM smob)
int quant_dir = 0;
if (abs (y_shift) > half_space / 2)
quant_dir = sign (y_shift) * Directional_element_interface (me).get ();
- y = me->quantise_y_f (y, dy, quant_dir);
+ y = quantise_y_f (me, y, dy, quant_dir);
}
}
// UGH. Y is not in staff position unit?
// Ik dacht datwe daar juist van weg wilden?
- me->set_stem_length (y, dy);
+ set_stem_length (me, y, dy);
me->set_elt_property ("y-position", gh_double2scm (y));
return SCM_UNDEFINED;
@@ -368,16 +353,15 @@ Beam::after_line_breaking (SCM smob)
See Documentation/tex/fonts.doc
*/
void
-Beam::calc_default_position_and_height (Real* y, Real* dy) const
+Beam::calc_default_position_and_height (Score_element*me,Real* y, Real* dy)
{
- Spanner*me = (Spanner*)this;
*y = 0;
*dy = 0;
- if (visible_stem_count () <= 1)
+ if (visible_stem_count (me) <= 1)
return;
- Real first_ideal = Stem::calc_stem_info (first_visible_stem ()).idealy_f_;
- if (first_ideal == Stem::calc_stem_info (last_visible_stem ()).idealy_f_)
+ Real first_ideal = Stem::calc_stem_info (first_visible_stem (me)).idealy_f_;
+ if (first_ideal == Stem::calc_stem_info (last_visible_stem (me)).idealy_f_)
{
*dy = 0;
*y = first_ideal;
@@ -385,7 +369,7 @@ Beam::calc_default_position_and_height (Real* y, Real* dy) const
}
Array<Offset> ideals;
- Real x0 = first_visible_stem ()->relative_coordinate (0, X_AXIS);
+ Real x0 = first_visible_stem (me)->relative_coordinate (0, X_AXIS);
Link_array<Item> stems=
Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
@@ -400,23 +384,23 @@ Beam::calc_default_position_and_height (Real* y, Real* dy) const
Real dydx;
minimise_least_squares (&dydx, y, ideals); // duh, takes references
- Real dx = last_visible_stem ()->relative_coordinate (0, X_AXIS) - x0;
+ Real dx = last_visible_stem (me)->relative_coordinate (0, X_AXIS) - x0;
*dy = dydx * dx;
}
bool
-Beam::suspect_slope_b (Real y, Real dy) const
+Beam::suspect_slope_b (Score_element*me, Real y, Real dy)
{
/* first, calculate y, dy */
/*
steep slope running against lengthened stem is suspect
*/
- Real first_ideal = Stem::calc_stem_info (first_visible_stem ()).idealy_f_;
- Real last_ideal = Stem::calc_stem_info (last_visible_stem ()).idealy_f_;
- Real lengthened = paper_l ()->get_var ("beam_lengthened");
- Real steep = paper_l ()->get_var ("beam_steep_slope");
+ Real first_ideal = Stem::calc_stem_info (first_visible_stem (me)).idealy_f_;
+ Real last_ideal = Stem::calc_stem_info (last_visible_stem (me)).idealy_f_;
+ Real lengthened = me->paper_l ()->get_var ("beam_lengthened");
+ Real steep = me->paper_l ()->get_var ("beam_steep_slope");
- Real dx = last_visible_stem ()->relative_coordinate (0, X_AXIS) - first_visible_stem ()->relative_coordinate (0, X_AXIS);
+ Real dx = last_visible_stem (me)->relative_coordinate (0, X_AXIS) - first_visible_stem (me)->relative_coordinate (0, X_AXIS);
Real dydx = dy && dx ? dy/dx : 0;
if (((y - first_ideal > lengthened) && (dydx > steep))
@@ -433,15 +417,15 @@ Beam::suspect_slope_b (Real y, Real dy) const
corresponds with some tables in [Wanske]
*/
Real
-Beam::calc_slope_damping_f (Real dy) const
+Beam::calc_slope_damping_f (Score_element*me,Real dy)
{
- SCM damp = get_elt_property ("damping");
+ SCM damp = me->get_elt_property ("damping");
int damping = gh_scm2int (damp);
if (damping)
{
- Real dx = last_visible_stem ()->relative_coordinate (0, X_AXIS)
- - first_visible_stem ()->relative_coordinate (0, X_AXIS);
+ Real dx = last_visible_stem (me)->relative_coordinate (0, X_AXIS)
+ - first_visible_stem (me)->relative_coordinate (0, X_AXIS);
Real dydx = dy && dx ? dy/dx : 0;
dydx = 0.6 * tanh (dydx) / damping;
return dydx * dx;
@@ -450,18 +434,17 @@ Beam::calc_slope_damping_f (Real dy) const
}
Real
-Beam::calc_stem_y_f (Item* s, Real y, Real dy) const
+Beam::calc_stem_y_f (Score_element*me,Item* s, Real y, Real dy)
{
- Score_element*me = (Score_element*)this;
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));
- thick *= paper_l ()->get_var ("staffspace");
+ Real thick = gh_scm2double (me->get_elt_property ("beam-thickness"));
+ thick *= me->paper_l ()->get_var ("staffspace");
- int beam_multiplicity = get_multiplicity ();
+ int beam_multiplicity = get_multiplicity (me);
int stem_multiplicity = (Stem::flag_i (s) - 2) >? 0;
- Real interbeam_f = paper_l ()->interbeam_f (beam_multiplicity);
- Real x0 = first_visible_stem ()->relative_coordinate (0, X_AXIS);
- Real dx = last_visible_stem ()->relative_coordinate (0, X_AXIS) - x0;
+ Real interbeam_f = me->paper_l ()->interbeam_f (beam_multiplicity);
+ Real x0 = first_visible_stem (me)->relative_coordinate (0, X_AXIS);
+ Real dx = last_visible_stem (me)->relative_coordinate (0, X_AXIS) - x0;
Real stem_y = (dy && dx ? (s->relative_coordinate (0, X_AXIS) - x0) / dx * dy : 0) + y;
/* knee */
@@ -478,7 +461,7 @@ Beam::calc_stem_y_f (Item* s, Real y, Real dy) const
// huh, why not for first visible?
if (Staff_symbol_referencer::staff_symbol_l (s)
- != Staff_symbol_referencer::staff_symbol_l (last_visible_stem ()))
+ != Staff_symbol_referencer::staff_symbol_l (last_visible_stem (me)))
stem_y += Directional_element_interface (me).get ()
* (beam_multiplicity - stem_multiplicity) * interbeam_f;
}
@@ -487,9 +470,8 @@ Beam::calc_stem_y_f (Item* s, Real y, Real dy) const
}
Real
-Beam::check_stem_length_f (Real y, Real dy) const
+Beam::check_stem_length_f (Score_element*me,Real y, Real dy)
{
- Score_element * me = (Score_element*)this;
Real shorten = 0;
Real lengthen = 0;
Direction dir = Directional_element_interface (me).get ();
@@ -503,7 +485,7 @@ Beam::check_stem_length_f (Real y, Real dy) const
if (Stem::invisible_b (s))
continue;
- Real stem_y = calc_stem_y_f (s, y, dy);
+ Real stem_y = calc_stem_y_f (me, s, y, dy);
stem_y *= dir;
Stem_info info = Stem::calc_stem_info (s);
@@ -526,10 +508,8 @@ Beam::check_stem_length_f (Real y, Real dy) const
stem directions and length should set to relative to the chord's
position of the beam. */
void
-Beam::set_stem_length (Real y, Real dy)
+Beam::set_stem_length (Score_element*me,Real y, Real dy)
{
- Beam*me = this;
-
Real half_space = Staff_symbol_referencer::staff_space (me)/2;
Link_array<Item> stems=
Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
@@ -541,10 +521,10 @@ Beam::set_stem_length (Real y, Real dy)
if (Stem::invisible_b (s))
continue;
- Real stem_y = calc_stem_y_f (s, y, dy);
+ Real stem_y = calc_stem_y_f (me, s, y, dy);
/* caution: stem measures in staff-positions */
- Stem::set_stemend (s,(stem_y + calc_interstaff_dist (s, me)) / half_space);
+ Stem::set_stemend (s,(stem_y + calc_interstaff_dist (s, dynamic_cast<Spanner*> (me))) / half_space);
}
}
@@ -557,9 +537,8 @@ Beam::set_stem_length (Real y, Real dy)
+ n * staff_space
*/
Real
-Beam::quantise_dy_f (Real dy) const
+Beam::quantise_dy_f (Score_element*me,Real dy)
{
- Score_element*me = (Score_element*)this;
Array<Real> a;
for (SCM s = scm_eval (ly_symbol2scm ("beam-height-quants")); s !=SCM_EOL; s = gh_cdr (s))
a.push (gh_scm2double (gh_car (s)));
@@ -586,10 +565,9 @@ Beam::quantise_dy_f (Real dy) const
if extend_b then stems must *not* get shorter
*/
Real
-Beam::quantise_y_f (Real y, Real dy, int quant_dir)
+Beam::quantise_y_f (Score_element*me,Real y, Real dy, int quant_dir)
{
- int multiplicity = get_multiplicity ();
- Score_element*me = (Score_element*)this;
+ int multiplicity = get_multiplicity (me);
Real staff_space = Staff_symbol_referencer::staff_space (me);
SCM quants = scm_eval (gh_list (ly_symbol2scm ("beam-vertical-position-quants"),
@@ -617,9 +595,8 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir)
}
void
-Beam::set_beaming (Beaming_info_list *beaming)
+Beam::set_beaming (Score_element*me,Beaming_info_list *beaming)
{
- Score_element*me = this;
Link_array<Score_element> stems=
Pointer_group_interface__extract_elements (me, (Score_element*)0, "stems");
@@ -644,28 +621,27 @@ Beam::set_beaming (Beaming_info_list *beaming)
clean me up.
*/
Molecule
-Beam::stem_beams (Item *here, Item *next, Item *prev) const
+Beam::stem_beams (Score_element*me,Item *here, Item *next, Item *prev)
{
- Score_element*me = (Score_element*)this;
if ((next && !(next->relative_coordinate (0, X_AXIS) > here->relative_coordinate (0, X_AXIS))) ||
(prev && !(prev->relative_coordinate (0, X_AXIS) < here->relative_coordinate (0, X_AXIS))))
programming_error ("Beams are not left-to-right");
- Real staffline_f = paper_l ()->get_var ("stafflinethickness");
- int multiplicity = get_multiplicity ();
+ Real staffline_f = me->paper_l ()->get_var ("stafflinethickness");
+ int multiplicity = get_multiplicity (me);
- Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));
- thick *= paper_l ()->get_var ("staffspace");
+ Real interbeam_f = me->paper_l ()->interbeam_f (multiplicity);
+ Real thick = gh_scm2double (me->get_elt_property ("beam-thickness"));
+ thick *= me->paper_l ()->get_var ("staffspace");
Real bdy = interbeam_f;
Real stemdx = staffline_f;
- Real dx = visible_stem_count () ?
- last_visible_stem ()->relative_coordinate (0, X_AXIS) - first_visible_stem ()->relative_coordinate (0, X_AXIS)
+ Real dx = visible_stem_count (me) ?
+ last_visible_stem (me)->relative_coordinate (0, X_AXIS) - first_visible_stem (me)->relative_coordinate (0, X_AXIS)
: 0.0;
- Real dy = gh_scm2double (get_elt_property ("height"));
+ Real dy = gh_scm2double (me->get_elt_property ("height"));
Real dydx = dy && dx ? dy/dx : 0;
Molecule leftbeams;
@@ -676,11 +652,11 @@ Beam::stem_beams (Item *here, Item *next, Item *prev) const
if (!Stem::first_head (here))
nw_f = 0;
else if (Stem::type_i (here)== 1)
- nw_f = paper_l ()->get_var ("wholewidth");
+ nw_f = me->paper_l ()->get_var ("wholewidth");
else if (Stem::type_i (here) == 2)
- nw_f = paper_l ()->get_var ("notewidth") * 0.8;
+ nw_f = me->paper_l ()->get_var ("notewidth") * 0.8;
else
- nw_f = paper_l ()->get_var ("quartwidth");
+ nw_f = me->paper_l ()->get_var ("quartwidth");
Direction dir = Directional_element_interface (me).get ();
@@ -698,7 +674,7 @@ Beam::stem_beams (Item *here, Item *next, Item *prev) const
w = w/2 <? nw_f;
Molecule a;
if (lhalfs) // generates warnings if not
- a = lookup_l ()->beam (dydx, w, thick);
+ a = me->lookup_l ()->beam (dydx, w, thick);
a.translate (Offset (-w, -w * dydx));
for (int j = 0; j < lhalfs; j++)
{
@@ -714,12 +690,12 @@ Beam::stem_beams (Item *here, Item *next, Item *prev) const
int rwholebeams= Stem::beam_count (here,RIGHT) <? Stem::beam_count (next,LEFT) ;
Real w = next->relative_coordinate (0, X_AXIS) - here->relative_coordinate (0, X_AXIS);
- Molecule a = lookup_l ()->beam (dydx, w + stemdx, thick);
+ Molecule a = me->lookup_l ()->beam (dydx, w + stemdx, thick);
a.translate_axis( - stemdx/2, X_AXIS);
int j = 0;
Real gap_f = 0;
- SCM gap = get_elt_property ("beam-gap");
+ SCM gap = me->get_elt_property ("beam-gap");
if (gh_number_p (gap))
{
int gap_i = gh_scm2int ( (gap));
@@ -734,7 +710,7 @@ Beam::stem_beams (Item *here, Item *next, Item *prev) const
// TODO: notehead widths differ for different types
gap_f = nw_f / 2;
w -= 2 * gap_f;
- a = lookup_l ()->beam (dydx, w + stemdx, thick);
+ a = me->lookup_l ()->beam (dydx, w + stemdx, thick);
}
for (; j < rwholebeams; j++)
@@ -746,7 +722,7 @@ Beam::stem_beams (Item *here, Item *next, Item *prev) const
w = w/2 <? nw_f;
if (rhalfs)
- a = lookup_l ()->beam (dydx, w, thick);
+ a = me->lookup_l ()->beam (dydx, w, thick);
for (; j < rwholebeams + rhalfs; j++)
{
@@ -769,19 +745,18 @@ MAKE_SCHEME_CALLBACK(Beam,brew_molecule);
SCM
Beam::brew_molecule (SCM smob)
{
- Score_element * beam = unsmob_element (smob);
- Beam * me =dynamic_cast<Beam*> (beam);
+ Score_element * me =unsmob_element (smob);
Molecule mol;
if (!gh_pair_p (me->get_elt_property ("stems")))
return SCM_EOL;
Real x0,dx;
Link_array<Item>stems =
- Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems");
- if (me->visible_stem_count ())
+ Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+ if (visible_stem_count (me))
{
- x0 = me->first_visible_stem ()->relative_coordinate (0, X_AXIS);
- dx = me->last_visible_stem ()->relative_coordinate (0, X_AXIS) - x0;
+ x0 = first_visible_stem (me)->relative_coordinate (0, X_AXIS);
+ dx = last_visible_stem (me)->relative_coordinate (0, X_AXIS) - x0;
}
else
{
@@ -801,23 +776,22 @@ Beam::brew_molecule (SCM smob)
Item * prev = (j > 0)? stems[j-1] : 0;
Item * next = (j < stems.size()-1) ? stems[j+1] :0;
- Molecule sb = me->stem_beams (i, next, prev);
+ Molecule sb = stem_beams (me, i, next, prev);
Real x = i->relative_coordinate (0, X_AXIS)-x0;
sb.translate (Offset (x, x * dydx + y));
mol.add_molecule (sb);
}
mol.translate_axis (x0
- - me->get_bound (LEFT)->relative_coordinate (0, X_AXIS), X_AXIS);
+ - dynamic_cast<Spanner*> (me)->get_bound (LEFT)->relative_coordinate (0, X_AXIS), X_AXIS);
return mol.create_scheme ();
}
int
-Beam::forced_stem_count () const
+Beam::forced_stem_count (Score_element*me)
{
- Score_element* me = (Score_element*)this;
Link_array<Item>stems =
- Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems");
+ Pointer_group_interface__extract_elements ( me, (Item*) 0, "stems");
int f = 0;
for (int i=0; i < stems.size (); i++)
{
@@ -840,9 +814,8 @@ Beam::forced_stem_count () const
use filter and standard list functions.
*/
int
-Beam::visible_stem_count () const
+Beam::visible_stem_count (Score_element*me)
{
- Score_element * me = (Score_element*)this;
Link_array<Item>stems =
Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
int c = 0;
@@ -855,11 +828,10 @@ Beam::visible_stem_count () const
}
Item*
-Beam::first_visible_stem() const
+Beam::first_visible_stem(Score_element*me)
{
- Score_element * me = (Score_element*)this;
Link_array<Item>stems =
- Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems");
+ Pointer_group_interface__extract_elements ( me, (Item*) 0, "stems");
for (int i = 0; i < stems.size (); i++)
{
@@ -870,11 +842,10 @@ Beam::first_visible_stem() const
}
Item*
-Beam::last_visible_stem() const
+Beam::last_visible_stem(Score_element*me)
{
- Score_element * me = (Score_element*)this;
Link_array<Item>stems =
- Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems");
+ Pointer_group_interface__extract_elements ( me, (Item*) 0, "stems");
for (int i = stems.size (); i--;)
{
if (!Stem::invisible_b (stems[i]))
@@ -902,8 +873,8 @@ Beam::rest_collision_callback (Score_element *rest, Axis a )
Score_element * stem = st;
if (!stem)
return 0.0;
- Beam * beam = dynamic_cast<Beam*> (unsmob_element (stem->get_elt_property ("beam")));
- if (!beam || !beam->visible_stem_count ())
+ Score_element * beam = unsmob_element (stem->get_elt_property ("beam"));
+ if (!beam || !Beam::has_interface (beam) || !Beam::visible_stem_count (beam))
return 0.0;
// make callback for rest from this.
@@ -920,8 +891,8 @@ Beam::rest_collision_callback (Score_element *rest, Axis a )
if (gh_number_p (s))
beam_y = gh_scm2double (s);
- Real x0 = beam->first_visible_stem()->relative_coordinate (0, X_AXIS);
- Real dx = beam->last_visible_stem()->relative_coordinate (0, X_AXIS) - x0;
+ Real x0 = first_visible_stem(beam)->relative_coordinate (0, X_AXIS);
+ Real dx = last_visible_stem(beam)->relative_coordinate (0, X_AXIS) - x0;
Real dydx = beam_dy && dx ? beam_dy/dx : 0;
Direction d = Stem::get_direction (stem);
@@ -946,3 +917,21 @@ Beam::rest_collision_callback (Score_element *rest, Axis a )
return (-d * discrete_dist);
}
+
+
+bool
+Beam::has_interface (Score_element*me)
+{
+ return me->has_interface (ly_symbol2scm ("beam-interface"));
+}
+
+void
+Beam::set_interface (Score_element*me)
+{
+ Pointer_group_interface g (me, "stems");
+ g.set_interface ();
+
+ me->set_elt_property ("height", gh_int2scm (0)); // ugh.
+ me->set_elt_property ("y-position" ,gh_int2scm (0));
+ me->set_interface (ly_symbol2scm("beam-interface"));
+}
diff --git a/lily/break-algorithm.cc b/lily/break-algorithm.cc
index 7c679d76fb..4802e0507c 100644
--- a/lily/break-algorithm.cc
+++ b/lily/break-algorithm.cc
@@ -22,13 +22,11 @@
Array<int>
Break_algorithm::find_break_indices () const
{
- Link_array<Paper_column> all = pscore_l_->line_l_->column_l_arr ();
-
-
+ Link_array<Score_element> all = pscore_l_->line_l_->column_l_arr ();
Array<int> retval;
for (int i=0; i < all.size (); i++)
- if (all[i]->breakable_b ())
+ if (Item::breakable_b (all[i]))
retval.push (i);
if (linewidth_f_ <=0)
@@ -39,15 +37,14 @@ Break_algorithm::find_break_indices () const
}
-Link_array<Paper_column>
+Link_array<Score_element>
Break_algorithm::find_breaks () const
{
- Link_array<Paper_column> all = pscore_l_->line_l_->column_l_arr ();
-
- Link_array<Paper_column> retval;
+ Link_array<Score_element> all = pscore_l_->line_l_->column_l_arr ();
+ Link_array<Score_element> retval;
for (int i=0; i < all.size (); i++)
- if (all[i]->breakable_b ())
+ if (Item::breakable_b (all[i]))
retval.push (all[i]);
if (linewidth_f_ <=0)
@@ -59,7 +56,7 @@ Break_algorithm::find_breaks () const
Simple_spacer*
-Break_algorithm::generate_spacing_problem (Link_array<Paper_column> curline, Interval line) const
+Break_algorithm::generate_spacing_problem (Link_array<Score_element> curline, Interval line) const
{
Simple_spacer * sp = new Simple_spacer;
Paper_def * d = pscore_l_->paper_l_;
diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc
index d670feb130..87fdecbce8 100644
--- a/lily/chord-tremolo-engraver.cc
+++ b/lily/chord-tremolo-engraver.cc
@@ -17,6 +17,8 @@
#include "warn.hh"
#include "misc.hh"
#include "note-head.hh"
+#include "spanner.hh"
+#include "item.hh"
/**
This acknowledges repeated music with "tremolo" style. It typesets
@@ -49,8 +51,8 @@ protected:
int note_head_i_;
- Beam * beam_p_;
- Beam * finished_beam_p_;
+ Spanner * beam_p_;
+ Spanner * finished_beam_p_;
protected:
virtual void do_removal_processing();
@@ -91,7 +93,8 @@ Chord_tremolo_engraver::do_process_music ()
{
if (repeat_ && !beam_p_)
{
- beam_p_ = new Beam (get_property ("basicBeamProperties"));
+ beam_p_ = new Spanner (get_property ("basicBeamProperties"));
+ Beam::set_interface (beam_p_);
beam_p_->set_elt_property ("chord-tremolo", SCM_BOOL_T);
@@ -160,7 +163,7 @@ Chord_tremolo_engraver::acknowledge_element (Score_element_info info)
if (Rhythmic_req* r = dynamic_cast <Rhythmic_req *> (info.req_l_))
{
- beam_p_->add_stem (s);
+ Beam::add_stem (beam_p_, s);
Moment stem_location = now_mom () -
start_mom_ + beam_start_location_;
}
diff --git a/lily/collision-engraver.cc b/lily/collision-engraver.cc
index 8816100638..9b3218de78 100644
--- a/lily/collision-engraver.cc
+++ b/lily/collision-engraver.cc
@@ -17,7 +17,7 @@
a collision object. */
class Collision_engraver : public Engraver {
Item * col_p_;
- Link_array<Note_column> note_column_l_arr_;
+ Link_array<Score_element> note_column_l_arr_;
protected:
virtual void acknowledge_element (Score_element_info);
@@ -50,13 +50,13 @@ Collision_engraver::process_acknowledged ()
void
Collision_engraver::acknowledge_element (Score_element_info i)
{
- if (Note_column * c = dynamic_cast<Note_column *> (i.elem_l_))
+ if (Note_column::has_interface (i.elem_l_))
{
/*should check Y axis? */
- if (c->rest_b () || c->parent_l(X_AXIS))
+ if (Note_column::rest_b (i.elem_l_) || i.elem_l_->parent_l(X_AXIS))
return ;
- note_column_l_arr_.push (c);
+ note_column_l_arr_.push (i.elem_l_);
}
}
diff --git a/lily/collision.cc b/lily/collision.cc
index a52c130048..8d1f6d1232 100644
--- a/lily/collision.cc
+++ b/lily/collision.cc
@@ -14,7 +14,7 @@
#include "item.hh"
void
-Collision::add_column (Score_element*me,Note_column* ncol_l)
+Collision::add_column (Score_element*me,Score_element* ncol_l)
{
ncol_l->add_offset_callback (force_shift_callback, X_AXIS);
Axis_group_interface::add_element (me, ncol_l);
@@ -77,7 +77,7 @@ Collision::do_shifts(Score_element* me)
SCM
Collision::automatic_shift (Score_element *me)
{
- Drul_array<Link_array<Note_column> > clash_groups;
+ Drul_array<Link_array<Score_element> > clash_groups;
Drul_array<Array<int> > shifts;
SCM tups = SCM_EOL;
@@ -87,8 +87,8 @@ Collision::automatic_shift (Score_element *me)
SCM car = gh_car (s);
Score_element * se = unsmob_element (car);
- if (Note_column * col = dynamic_cast<Note_column*> (se))
- clash_groups[col->dir ()].push (col);
+ if (Note_column::has_interface (se))
+ clash_groups[Note_column::dir (se)].push (se);
}
@@ -96,7 +96,7 @@ Collision::automatic_shift (Score_element *me)
do
{
Array<int> & shift (shifts[d]);
- Link_array<Note_column> & clashes (clash_groups[d]);
+ Link_array<Score_element> & clashes (clash_groups[d]);
clashes.sort (Note_column::shift_compare);
@@ -157,15 +157,15 @@ Collision::automatic_shift (Score_element *me)
all of them again. */
if (extents[UP].size () && extents[DOWN].size ())
{
- Note_column *cu_l =clash_groups[UP][0];
- Note_column *cd_l =clash_groups[DOWN][0];
+ Score_element *cu_l =clash_groups[UP][0];
+ Score_element *cd_l =clash_groups[DOWN][0];
/*
TODO.
*/
- Score_element * nu_l= cu_l->first_head();
- Score_element * nd_l = cd_l->first_head();
+ Score_element * nu_l= Note_column::first_head(cu_l);
+ Score_element * nd_l = Note_column::first_head(cd_l);
int downpos = Note_column::head_positions_interval (cd_l)[BIGGER];
int uppos = Note_column::head_positions_interval (cu_l)[SMALLER];
diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc
index 967dcc1886..f0390d4798 100644
--- a/lily/dynamic-engraver.cc
+++ b/lily/dynamic-engraver.cc
@@ -333,12 +333,12 @@ Dynamic_engraver::typeset_all ()
void
Dynamic_engraver::acknowledge_element (Score_element_info i)
{
- if (Note_column* n = dynamic_cast<Note_column*> (i.elem_l_))
+ if (Note_column::has_interface (i.elem_l_))
{
if (line_spanner_)
{
- Side_position::add_support (line_spanner_,n);
- add_bound_item (line_spanner_,n);
+ Side_position::add_support (line_spanner_,i.elem_l_);
+ add_bound_item (line_spanner_,dynamic_cast<Item*>(i.elem_l_));
}
}
}
diff --git a/lily/gourlay-breaking.cc b/lily/gourlay-breaking.cc
index 3f9662a99a..192ece0a69 100644
--- a/lily/gourlay-breaking.cc
+++ b/lily/gourlay-breaking.cc
@@ -54,7 +54,7 @@ Array<Column_x_positions>
Gourlay_breaking::do_solve () const
{
Array<Break_node> optimal_paths;
- Link_array<Paper_column> all =
+ Link_array<Score_element> all =
pscore_l_->line_l_->column_l_arr ();
Array<int> breaks = find_break_indices ();
@@ -80,10 +80,10 @@ Gourlay_breaking::do_solve () const
for (int start_idx = break_idx; start_idx--;)
{
- Link_array<Paper_column> line = all.slice (breaks[start_idx], breaks[break_idx]+1);
+ Link_array<Score_element> line = all.slice (breaks[start_idx], breaks[break_idx]+1);
- line[0] = dynamic_cast<Paper_column*> (line[0] ->find_prebroken_piece (RIGHT));
- line.top () = dynamic_cast<Paper_column*> (line.top ()->find_prebroken_piece (LEFT));
+ line[0] = dynamic_cast<Item*> (line[0]) ->find_prebroken_piece (RIGHT);
+ line.top () = dynamic_cast<Item*> (line.top ())->find_prebroken_piece (LEFT);
Column_x_positions cp;
cp.cols_ = line;
@@ -177,7 +177,7 @@ Gourlay_breaking::combine_demerits (Column_x_positions const &prev,
Column_x_positions const &this_one) const
{
Real break_penalties = 0.0;
- Paper_column * pc = this_one.cols_.top ();
+ Score_element * pc = this_one.cols_.top ();
if (pc->original_l_)
{
SCM pen = pc->get_elt_property ("penalty");
diff --git a/lily/grace-align-item.cc b/lily/grace-align-item.cc
index 2b7aec2beb..a8150dac67 100644
--- a/lily/grace-align-item.cc
+++ b/lily/grace-align-item.cc
@@ -13,15 +13,6 @@
#include "paper-column.hh"
#include "paper-def.hh"
-void
-Grace_align_item::set_interface (Score_element*me)
-{
- me->set_interface (ly_symbol2scm ("grace-align-interface"));
- me->set_elt_property ("stacking-dir", gh_int2scm (RIGHT));
- Align_interface::set_interface(me);
- Align_interface::set_axis (me,X_AXIS);
-}
-
/*
TODO: cfg-able
*/
@@ -41,6 +32,17 @@ Grace_align_item::before_line_breaking (SCM smob)
return SCM_UNDEFINED;
}
+void
+Grace_align_item::set_interface (Score_element*me)
+{
+ me->set_interface (ly_symbol2scm ("grace-align-interface"));
+ me->set_elt_property ("stacking-dir", gh_int2scm (RIGHT));
+ Align_interface::set_interface(me);
+ Align_interface::set_axis (me,X_AXIS);
+}
+
+
+
bool
Grace_align_item::has_interface (Score_element*m)
{
diff --git a/lily/include/beam.hh b/lily/include/beam.hh
index dba75f2045..b83254e1c5 100644
--- a/lily/include/beam.hh
+++ b/lily/include/beam.hh
@@ -8,7 +8,7 @@
#define BEAM_HH
#include "lily-proto.hh"
-#include "spanner.hh"
+#include "lily-guile.hh"
/** a beam connects multiple stems.
@@ -25,44 +25,41 @@
damping -- amount of beam slope damping. (int)
should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams
*/
-class Beam : public Spanner
+class Beam
{
public:
-
-
- int visible_stem_count () const;
- Item* first_visible_stem () const;
- Item* last_visible_stem () const;
+ static int visible_stem_count (Score_element*);
+ static Item* first_visible_stem (Score_element*);
+ static Item* last_visible_stem (Score_element*);
+ static bool has_interface (Score_element*);
+ static void set_interface (Score_element*);
static Real rest_collision_callback (Score_element *,Axis);
Beam (SCM);
- void add_stem (Score_element*);
- void set_grouping (Rhythmic_grouping def, Rhythmic_grouping current);
- void set_beaming (Beaming_info_list *);
- void set_stemlens ();
- VIRTUAL_COPY_CONS(Score_element);
-
- int get_multiplicity () const;
-
+ static void add_stem (Score_element*,Score_element*);
+ static void set_grouping (Score_element*,Rhythmic_grouping def, Rhythmic_grouping current);
+ static void set_beaming (Score_element*,Beaming_info_list *);
+ static void set_stemlens (Score_element*);
+ static int get_multiplicity (Score_element*me);
static SCM brew_molecule (SCM);
static SCM before_line_breaking (SCM);
static SCM after_line_breaking (SCM);
+ static Molecule stem_beams (Score_element*,Item *here, Item *next, Item *prev);
- Molecule stem_beams (Item *here, Item *next, Item *prev) const;
private:
- Direction get_default_dir () const;
- void set_stem_directions ();
- void auto_knees ();
- bool auto_knee (String gap_str, bool interstaff_b);
- void set_stem_shorten ();
- void calc_default_position_and_height (Real* y, Real* dy) const;
- bool suspect_slope_b (Real y, Real dy) const;
- Real calc_slope_damping_f (Real dy) const;
- Real calc_stem_y_f (Item* s, Real y, Real dy) const;
- Real check_stem_length_f (Real y, Real dy) const;
- void set_stem_length (Real y, Real dy);
- Real quantise_dy_f (Real dy) const;
- Real quantise_y_f (Real y, Real dy, int quant_dir);
- int forced_stem_count () const;
+ static Direction get_default_dir (Score_element*);
+ static void set_stem_directions (Score_element*);
+ static void auto_knees (Score_element*);
+ static bool auto_knee (Score_element*,String gap_str, bool interstaff_b);
+ static void set_stem_shorten (Score_element*);
+ static void calc_default_position_and_height (Score_element*,Real* y, Real* dy);
+ static bool suspect_slope_b (Score_element*, Real y, Real dy);
+ static Real calc_slope_damping_f (Score_element*, Real dy);
+ static Real calc_stem_y_f (Score_element*, Item* s, Real y, Real dy);
+ static Real check_stem_length_f (Score_element*, Real y, Real dy);
+ static void set_stem_length (Score_element*, Real y, Real dy);
+ static Real quantise_dy_f (Score_element*, Real dy);
+ static Real quantise_y_f (Score_element*, Real y, Real dy, int quant_dir);
+ static int forced_stem_count (Score_element*);
};
#endif // BEAM_HH
diff --git a/lily/include/break-algorithm.hh b/lily/include/break-algorithm.hh
index 7e0c341544..fa0b0d7770 100644
--- a/lily/include/break-algorithm.hh
+++ b/lily/include/break-algorithm.hh
@@ -28,7 +28,7 @@ protected:
Real linewidth_f_;
/// search all pcols which are breakable.
- Link_array<Paper_column> find_breaks() const;
+ Link_array<Score_element> find_breaks() const;
Array<int> find_break_indices() const;
@@ -37,10 +37,10 @@ protected:
void solve_line (Column_x_positions*) const;
/// does curline fit on the paper?
- bool feasible (Link_array<Paper_column>) const;
+ bool feasible (Link_array<Score_element>) const;
- Simple_spacer* generate_spacing_problem (Link_array<Paper_column>, Interval) const;
+ Simple_spacer* generate_spacing_problem (Link_array<Score_element>, Interval) const;
virtual Array<Column_x_positions> do_solve() const=0;
diff --git a/lily/include/collision.hh b/lily/include/collision.hh
index 469dfeacbd..10c5397a6e 100644
--- a/lily/include/collision.hh
+++ b/lily/include/collision.hh
@@ -43,6 +43,6 @@ public:
static SCM forced_shift (Score_element*);
static Real force_shift_callback (Score_element *, Axis);
static void do_shifts (Score_element*);
- static void add_column (Score_element*me,Note_column*ncol_l);
+ static void add_column (Score_element*me,Score_element*ncol_l);
};
#endif // COLLISION_HH
diff --git a/lily/include/column-x-positions.hh b/lily/include/column-x-positions.hh
index 23bea78d2e..aec9602223 100644
--- a/lily/include/column-x-positions.hh
+++ b/lily/include/column-x-positions.hh
@@ -13,7 +13,7 @@
struct Column_x_positions
{
- Link_array<Paper_column> cols_;
+ Link_array<Score_element> cols_;
Array<Real> config_;
Real force_f_;
bool satisfies_constraints_b_;
diff --git a/lily/include/item.hh b/lily/include/item.hh
index c036dd2e52..16f298f7f2 100644
--- a/lily/include/item.hh
+++ b/lily/include/item.hh
@@ -43,7 +43,7 @@ public:
Item (SCM);
Item (Item const &);
- bool breakable_b () const;
+ static bool breakable_b (Score_element*me);
bool broken_b () const;
Direction break_status_dir () const;
diff --git a/lily/include/line-of-score.hh b/lily/include/line-of-score.hh
index 9d510c692c..96b3d6b265 100644
--- a/lily/include/line-of-score.hh
+++ b/lily/include/line-of-score.hh
@@ -44,7 +44,7 @@ public:
void output_lines ();
Link_array<Item> broken_col_range (Item const*, Item const*) const;
- Link_array<Paper_column> column_l_arr () const;
+ Link_array<Score_element> column_l_arr () const;
void add_column (Paper_column*);
void typeset_element (Score_element*);
diff --git a/lily/include/multi-measure-rest.hh b/lily/include/multi-measure-rest.hh
index 71353da3b1..4b57a9662c 100644
--- a/lily/include/multi-measure-rest.hh
+++ b/lily/include/multi-measure-rest.hh
@@ -10,20 +10,18 @@
#ifndef MULTI_MEASURE_REST_HH
#define MULTI_MEASURE_REST_HH
-#include "spanner.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
+#include "rod.hh"
-
-class Multi_measure_rest : public Spanner
+class Multi_measure_rest
{
public:
- Multi_measure_rest (SCM);
-
static void set_interface (Score_element*);
static bool has_interface (Score_element*);
static SCM brew_molecule (SCM);
static void add_column (Score_element*,Item*);
- VIRTUAL_COPY_CONS (Score_element);
- virtual Array<Rod> get_rods () const;
+ static SCM set_spacing_rods (SCM);
};
#endif /* MULTI_MEASURE_REST_HH */
diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh
index 7bf51956d5..855d655cd6 100644
--- a/lily/include/note-column.hh
+++ b/lily/include/note-column.hh
@@ -18,33 +18,30 @@
UGR. Junkme. refpoint should be the notehead, dir should come from stem.
*/
-class Note_column : public Item
+class Note_column
{
public:
- static int shift_compare (Note_column *const &, Note_column*const&);
+ static int shift_compare (Score_element *const &, Score_element*const&);
/** The relative position of the "voice" containing this
chord. Normally this would be the same as the stem direction,
JUNKME.
*/
- Direction dir () const;
-
- static Slice head_positions_interval(Score_element* me) ;
+ static Direction dir (Score_element*me);
+ static Slice head_positions_interval(Score_element* me);
static Direction static_dir (Score_element*);
- void translate_rests(int dy);
- Score_element * first_head ()const;
- Interval rest_dim ()const ;
- Note_column (SCM);
- void set_stem (Score_element*);
- void set_dotcol (Score_element*);
- void add_head (Score_element*);
- bool rest_b () const;
-
+ static void translate_rests(Score_element*me,int dy);
+ static Score_element * first_head (Score_element*me);
+ static Interval rest_dim (Score_element*me);
+ static void set_stem (Score_element*me,Score_element*);
+ static void set_dotcol (Score_element*me,Score_element*);
+ static void add_head (Score_element*me,Score_element*);
+ static bool rest_b (Score_element*me);
static bool has_interface (Score_element*);
-
- Item *stem_l()const;
+ static void set_interface (Score_element*);
+ static Item *stem_l(Score_element*);
};
#endif // NOTE_COLUMN_HH
diff --git a/lily/include/paper-column.hh b/lily/include/paper-column.hh
index 3b1756e8f1..5633cb0fb2 100644
--- a/lily/include/paper-column.hh
+++ b/lily/include/paper-column.hh
@@ -15,16 +15,14 @@
#include "spring.hh"
/**
- stuff grouped vertically.
- This is a class to address items vertically. It contains the data for:
- \begin{itemize}
- \item
- unbroken score
- \item
- broken score
- \item
- the linespacing problem
- \end{itemize}
+ bounded-by-me -- list of elts.
+
+ shortest-starter-duration -- rational signifying shortest moment that starts here
+
+
+ Interfaces:
+
+ axis-group, spaceable-element.
*/
class Paper_column : public Item
@@ -33,28 +31,10 @@ public:
VIRTUAL_COPY_CONS(Score_element);
/*
- ugh.
-
- TODO:
-
- * junk these after spacing is done.
-
- * Put these in Scheme.
- */
-
-
- Array<Column_rod> minimal_dists_;
- Array<Column_spring > springs_;
-
-
- /*
Not (yet) in scm, because of messy effects when a column commits suicide.
*/
int rank_i_;
- /// set a minimum distance
- void add_rod (Paper_column * to, Real distance);
- void add_spring (Paper_column * to, Real dist, Real strength);
-
+ virtual void do_break_processing ();
virtual Paper_column *column_l () const;
virtual Line_of_score *line_l () const;
@@ -65,10 +45,10 @@ public:
static int rank_i(Score_element*);
Paper_column (SCM);
- Moment when_mom ()const;
-
bool musical_b () const;
- bool used_b () const;
+ static Moment when_mom (Score_element*);
+
+ static bool used_b (Score_element*) ;
void set_rank (int);
};
diff --git a/lily/include/rest-collision.hh b/lily/include/rest-collision.hh
index 39a9fcd120..79b7b8aa72 100644
--- a/lily/include/rest-collision.hh
+++ b/lily/include/rest-collision.hh
@@ -16,7 +16,7 @@
class Rest_collision // interface
{
public:
- static void add_column (Score_element*me,Note_column*);
+ static void add_column (Score_element*me,Score_element*);
static void set_interface (Score_element*me);
static bool has_interface (Score_element*);
static Real force_shift_callback (Score_element *, Axis);
diff --git a/lily/include/rod.hh b/lily/include/rod.hh
index f76a4e5b0c..d795f539ad 100644
--- a/lily/include/rod.hh
+++ b/lily/include/rod.hh
@@ -13,13 +13,6 @@
#include "direction.hh"
#include "drul-array.hh"
-struct Column_rod
-{
- Paper_column *other_l_;
- Real distance_f_;
-
- Column_rod ();
-};
struct Rod
diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh
index 0fd7fd077f..ebd656070d 100644
--- a/lily/include/score-element.hh
+++ b/lily/include/score-element.hh
@@ -139,8 +139,6 @@ public:
virtual void do_break_processing ();
virtual Score_element *find_broken_piece (Line_of_score*) const;
- /// generate rods & springs
- virtual void do_space_processing ();
virtual void discretionary_processing ();
virtual void do_derived_mark ();
diff --git a/lily/include/script.hh b/lily/include/script.hh
index b983b54716..0e4dfae387 100644
--- a/lily/include/script.hh
+++ b/lily/include/script.hh
@@ -10,19 +10,20 @@
#ifndef SCRIPT_HH
#define SCRIPT_HH
-#include "item.hh"
-#include "drul-array.hh"
+#include "lily-guile.hh"
+#include "lily-proto.hh"
/**
Articulation marks (and the like) that are attached to notes/stems.
Needs support from Staff_side for proper operation. Staff_side
handles the positioning.
*/
-class Script : public Item
+class Script
{
public:
- static Molecule get_molecule (Score_element*,Direction d);
- Script (SCM);
+ static Molecule get_molecule (Score_element*,Direction d);
+ static void set_interface (Score_element*);
+ static bool has_interface (Score_element*);
static SCM brew_molecule (SCM);
static SCM after_line_breaking (SCM);
};
diff --git a/lily/include/separating-group-spanner.hh b/lily/include/separating-group-spanner.hh
index 5c46dc3f8d..d01b6dbb51 100644
--- a/lily/include/separating-group-spanner.hh
+++ b/lily/include/separating-group-spanner.hh
@@ -12,14 +12,12 @@
#include "spanner.hh"
-class Separating_group_spanner : public Spanner
+class Separating_group_spanner
{
public:
static void add_spacing_unit (Score_element*me, Item*);
- Separating_group_spanner(SCM);
-protected:
- VIRTUAL_COPY_CONS(Score_element);
- virtual Array<Rod> get_rods () const;
+ static void set_interface (Score_element*);
+ static SCM set_spacing_rods (SCM);
};
#endif /* SEPARATING_GROUP_SPANNER_HH */
diff --git a/lily/include/simple-spacer.hh b/lily/include/simple-spacer.hh
index 0cc519fdbb..4f317b148a 100644
--- a/lily/include/simple-spacer.hh
+++ b/lily/include/simple-spacer.hh
@@ -73,7 +73,7 @@ struct Simple_spacer
Simple_spacer ();
void solve (Column_x_positions *) const;
- void add_columns (Link_array<Paper_column>);
+ void add_columns (Link_array<Score_element>);
void my_solve_linelen ();
void my_solve_natural_len ();
Real active_springs_stiffness () const;
diff --git a/lily/include/slur.hh b/lily/include/slur.hh
index c9f6052d5a..83d0900834 100644
--- a/lily/include/slur.hh
+++ b/lily/include/slur.hh
@@ -7,34 +7,28 @@
#ifndef SLUR_HH
#define SLUR_HH
-#include "spanner.hh"
+#include "lily-guile.hh"
+#include "lily-proto.hh"
#include "rod.hh"
-/**
- A #Bow# which tries to drape itself around the stems too.
- */
-class Slur : public Spanner
+class Slur
{
public:
- Slur (SCM);
- VIRTUAL_COPY_CONS(Score_element);
-
- void add_column (Note_column*);
- static SCM brew_molecule (SCM);
-
- Array<Offset> get_encompass_offset_arr () const;
- Bezier get_curve () const;
-
- Direction get_default_dir () const;
+ static void add_column (Score_element*me,Score_element*col);
+ static SCM brew_molecule (SCM);
+ static void set_interface (Score_element*);
+ static bool has_interface (Score_element*);
+ static Array<Offset> get_encompass_offset_arr (Score_element*me) ;
+ static Bezier get_curve (Score_element*me) ;
+ static Direction get_default_dir (Score_element*me) ;
static SCM after_line_breaking (SCM);
- Array<Rod> get_rods () const;
- Offset get_attachment (Direction dir, Score_element**common) const;
-
+ static SCM set_spacing_rods (SCM);
private:
- void de_uglyfy (Slur_bezier_bow* bb, Real default_height);
- void set_extremities ();
- void set_control_points ();
- Offset encompass_offset (Score_element *col,Score_element**common)const;
+ static Offset get_attachment (Score_element*me,Direction dir, Score_element**common) ;
+ static void de_uglyfy (Score_element*me,Slur_bezier_bow* bb, Real default_height);
+ static void set_extremities (Score_element*me);
+ static void set_control_points (Score_element*me);
+ static Offset encompass_offset (Score_element*me,Score_element *col,Score_element**common);
};
#endif // SLUR_HH
diff --git a/lily/include/spaceable-element.hh b/lily/include/spaceable-element.hh
new file mode 100644
index 0000000000..72a713ed4c
--- /dev/null
+++ b/lily/include/spaceable-element.hh
@@ -0,0 +1,29 @@
+/*
+ spaceable-element.hh -- declare Spaceable_element
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef SPACEABLE_ELEMENT_HH
+#define SPACEABLE_ELEMENT_HH
+
+#include "lily-guile.hh"
+#include "lily-proto.hh"
+
+
+struct Spaceable_element
+{
+ /// set a minimum distance
+ static void add_rod (Score_element*me, Score_element * to, Real distance);
+ static void add_spring (Score_element*me,Score_element * to, Real dist, Real strength);
+ static void set_interface (Score_element*);
+ static void remove_interface (Score_element*);
+ static SCM get_minimum_distances (Score_element*);
+ static SCM get_ideal_distances (Score_element*);
+};
+
+#endif /* SPACEABLE_ELEMENT_HH */
+
diff --git a/lily/include/spacing-engraver.hh b/lily/include/spacing-engraver.hh
deleted file mode 100644
index be6c44ff3c..0000000000
--- a/lily/include/spacing-engraver.hh
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- spacing-engraver.hh -- declare Spacing_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#ifndef SPACING_ENGRAVER_HH
-#define SPACING_ENGRAVER_HH
-
-#include "engraver.hh"
-#include "pqueue.hh"
-
-struct Rhythmic_tuple
-{
- Score_element_info info_;
- Moment end_;
-
- Rhythmic_tuple ()
- {
- }
- Rhythmic_tuple (Score_element_info i, Moment m )
- {
- info_ = i;
- end_ = m;
- }
- static int time_compare (Rhythmic_tuple const &, Rhythmic_tuple const &);
-};
-
-/**
- Acknowledge rhythmic elements, for initializing spacing fields in
- the columns.
-
- should be the last one of the toplevel context
-*/
-class Spacing_engraver : public Engraver
-{
- PQueue<Rhythmic_tuple> playing_durations_;
- Array<Rhythmic_tuple> now_durations_;
- Array<Rhythmic_tuple> stopped_durations_;
-
- Spacing_spanner * spacing_p_;
-protected:
- VIRTUAL_COPY_CONS(Translator);
- virtual void acknowledge_element (Score_element_info);
- virtual void do_post_move_processing ();
- virtual void do_pre_move_processing ();
- virtual void do_creation_processing ();
- virtual void do_removal_processing ();
-public:
- Spacing_engraver ();
-};
-
-#endif /* SPACING_ENGRAVER_HH */
-
diff --git a/lily/include/spacing-spanner.hh b/lily/include/spacing-spanner.hh
index c6e4bdd7cd..917b5fdc89 100644
--- a/lily/include/spacing-spanner.hh
+++ b/lily/include/spacing-spanner.hh
@@ -12,21 +12,17 @@
#include "spanner.hh"
-class Spacing_spanner : public Spanner
+class Spacing_spanner
{
public:
- Spacing_spanner (SCM);
-
- VIRTUAL_COPY_CONS(Score_element);
- Array<Spring> do_measure (Link_array<Paper_column>) const;
-
-protected:
- virtual Array<Spring> get_springs () const;
-
- Real stem_dir_correction (Paper_column*,Paper_column*) const;
- Real default_bar_spacing (Paper_column*,Paper_column*,Moment) const;
- Real note_spacing (Paper_column*,Paper_column*,Moment) const;
- Real get_duration_space (Moment dur, Moment shortest) const;
+ static void set_interface (Score_element*);
+ static void do_measure (Score_element*,Link_array<Score_element>) ;
+
+ static SCM set_springs (SCM);
+ static Real stem_dir_correction (Score_element*,Score_element*,Score_element*) ;
+ static Real default_bar_spacing (Score_element*,Score_element*,Score_element*,Moment) ;
+ static Real note_spacing (Score_element*,Score_element*,Score_element*,Moment) ;
+ static Real get_duration_space (Score_element*,Moment dur, Moment shortest) ;
};
#endif /* SPACING_SPANNER_HH */
diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh
index 4ce355dd4c..dd5a61b21b 100644
--- a/lily/include/spanner.hh
+++ b/lily/include/spanner.hh
@@ -47,16 +47,11 @@ public:
Real spanner_length () const;
static int compare (Spanner * const &,Spanner * const &);
- virtual Array<Rod> get_rods () const;
- virtual Array<Spring> get_springs () const;
virtual Score_element* find_broken_piece (Line_of_score*) const;
virtual void do_derived_mark ();
protected:
void set_my_columns ();
VIRTUAL_COPY_CONS(Score_element);
-
-
- virtual void do_space_processing ();
virtual void do_break_processing ();
virtual Line_of_score*line_l () const;
};
diff --git a/lily/include/stem.hh b/lily/include/stem.hh
index d3b9eb8a1e..8c3e6f7691 100644
--- a/lily/include/stem.hh
+++ b/lily/include/stem.hh
@@ -7,10 +7,8 @@
#ifndef STEM_HH
#define STEM_HH
-#include "item.hh"
-#include "array.hh"
-#include "moment.hh"
-#include "molecule.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
#include "stem-info.hh"
/**the rule attached to the ball.
@@ -36,36 +34,29 @@
/// how many abbrev beam don't reach stem?
int beam_gap_i_;
-
-
*/
-class Stem : public Item
+class Stem
{
public:
static SCM brew_molecule (SCM);
/// log of the duration. Eg. 4 -> 16th note -> 2 flags
static int flag_i (Score_element*) ;
-
static int beam_count (Score_element*,Direction) ;
static void set_beaming (Score_element*,int, Direction d);
/**
don't print flag when in beam.
our beam, for aligning abbrev flags
*/
- static Beam * beam_l (Score_element*);
+ static Score_element * beam_l (Score_element*);
static Score_element * first_head (Score_element*) ;
static Drul_array<Score_element*> extremal_heads (Score_element*);
-
static Score_element * support_head (Score_element*) ;
- Stem (SCM);
-
+
/// ensure that this Stem also encompasses the Notehead #n#
static void add_head (Score_element*me, Score_element*n);
-
static Stem_info calc_stem_info (Score_element *) ;
-
static Real chord_start_f (Score_element *) ;
static Direction get_direction (Score_element*) ;
static int type_i (Score_element *) ;
@@ -73,13 +64,10 @@ public:
static Direction get_default_dir(Score_element *) ;
static int get_center_distance(Score_element *,Direction) ;
static int heads_i (Score_element *) ;
-
static bool invisible_b(Score_element *) ;
/// heads that the stem encompasses (positions)
static Interval head_positions(Score_element *) ;
-
-
static Real get_default_stem_end_position (Score_element*me) ;
static void position_noteheads(Score_element*);
static Real stem_end_position (Score_element*) ;
diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh
index b5c500c6f7..121713d9e6 100644
--- a/lily/include/system-start-delimiter.hh
+++ b/lily/include/system-start-delimiter.hh
@@ -10,25 +10,24 @@
#ifndef SYSTEM_START_DELIMITER_HH
#define SYSTEM_START_DELIMITER_HH
-#include "spanner.hh"
+#include "lily-guile.hh"
+#include "lily-proto.hh"
/*
Braces/brackets across staffs.
*/
-class System_start_delimiter : public Spanner
+class System_start_delimiter
{
public:
- System_start_delimiter (SCM);
static SCM brew_molecule (SCM);
- VIRTUAL_COPY_CONS (Score_element);
-
+ static void set_interface (Score_element*me);
+ static bool has_interface (Score_element*);
static SCM after_line_breaking (SCM);
static void try_collapse (Score_element*);
-
- Molecule staff_bracket (Real) const;
- Molecule staff_brace (Real) const;
- Molecule simple_bar (Real) const;
+ static Molecule staff_bracket (Score_element*,Real) ;
+ static Molecule staff_brace (Score_element*,Real) ;
+ static Molecule simple_bar (Score_element*,Real) ;
};
#endif /* SYSTEM_START_DELIMITER_HH */
diff --git a/lily/include/tie-column.hh b/lily/include/tie-column.hh
index bbee8fede5..8dfab669bd 100644
--- a/lily/include/tie-column.hh
+++ b/lily/include/tie-column.hh
@@ -11,17 +11,15 @@
#ifndef TIE_COLUMN_HH
#define TIE_COLUMN_HH
-#include "spanner.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
-class Tie_column : public Spanner
+class Tie_column
{
public:
- Tie_column (SCM s);
- VIRTUAL_COPY_CONS (Score_element);
static void set_interface (Score_element*me);
static bool has_interface (Score_element*);
static void add_tie (Score_element*me,Tie*);
-
static SCM after_line_breaking (SCM);
static void set_directions (Score_element*me);
};
diff --git a/lily/include/tie.hh b/lily/include/tie.hh
index ea1f5f97f3..422a9fa375 100644
--- a/lily/include/tie.hh
+++ b/lily/include/tie.hh
@@ -38,7 +38,7 @@ public:
Bezier get_curve () const;
Drul_array<Real> dy_f_drul_;
Drul_array<Real> dx_f_drul_;
- virtual Array<Rod> get_rods () const;
+ static SCM set_spacing_rods (SCM);
Array<Offset> get_controls () const;
};
diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc
index 910a8f8ef5..8b65565b94 100644
--- a/lily/instrument-name-engraver.cc
+++ b/lily/instrument-name-engraver.cc
@@ -17,7 +17,7 @@
class Instrument_name_engraver : public Engraver
{
Item *text_;
- System_start_delimiter * delim_ ;
+ Spanner * delim_ ;
void create_text (SCM s);
public:
@@ -84,10 +84,10 @@ Instrument_name_engraver::acknowledge_element (Score_element_info i)
}
}
- if (dynamic_cast <System_start_delimiter*> (i.elem_l_)
+ if (System_start_delimiter::has_interface (i.elem_l_)
&& i.origin_trans_l_->daddy_trans_l_ == daddy_trans_l_)
{
- delim_ = dynamic_cast<System_start_delimiter*> (i.elem_l_);
+ delim_ = dynamic_cast<Spanner*> (i.elem_l_);
}
}
diff --git a/lily/item.cc b/lily/item.cc
index 319c402842..4e995bfd77 100644
--- a/lily/item.cc
+++ b/lily/item.cc
@@ -31,15 +31,23 @@ Item::Item (Item const &s)
}
-
bool
-Item::breakable_b () const
+Item::breakable_b (Score_element*me)
{
- if (original_l_ )
+ if (me->original_l_)
return false;
+
+ if (!dynamic_cast<Item*>(me))
+ programming_error ("only items can be breakable.");
- Item * i =dynamic_cast<Item*> (parent_l (X_AXIS));
- return (i) ? i->breakable_b () : to_boolean (get_elt_property ("breakable"));
+ Item * i =dynamic_cast<Item*> (me->parent_l (X_AXIS));
+ return (i) ? Item::breakable_b (i) : to_boolean (me->get_elt_property ("breakable"));
+}
+
+Paper_column *
+Item::column_l () const
+{
+ return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
}
Line_of_score *
@@ -83,7 +91,7 @@ Item::discretionary_processing()
if (broken_b ())
return;
- if (breakable_b ())
+ if (Item::breakable_b (this))
copy_breakable_items();
}
@@ -114,11 +122,6 @@ Item::find_prebroken_piece (Direction d) const
return dynamic_cast<Item*> (broken_to_drul_[d]);
}
-Paper_column *
-Item::column_l () const
-{
- return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
-}
Direction
Item::break_status_dir () const
diff --git a/lily/line-of-score.cc b/lily/line-of-score.cc
index 464212d3cb..ff641c0c24 100644
--- a/lily/line-of-score.cc
+++ b/lily/line-of-score.cc
@@ -133,7 +133,7 @@ Line_of_score::break_into_pieces (Array<Column_x_positions> const &breaking)
Line_of_score *line_l = dynamic_cast <Line_of_score*> (clone());
line_l->rank_i_ = i;
// line_l->set_immutable_elt_property ("rank", gh_int2scm( i));
- Link_array<Paper_column> c (breaking[i].cols_);
+ Link_array<Score_element> c (breaking[i].cols_);
pscore_l_->typeset_line (line_l);
line_l->set_bound(LEFT,c[0]);
@@ -141,7 +141,7 @@ Line_of_score::break_into_pieces (Array<Column_x_positions> const &breaking)
for (int j=0; j < c.size(); j++)
{
c[j]->translate_axis (breaking[i].config_[j],X_AXIS);
- c[j]->line_l_ = line_l;
+ dynamic_cast<Paper_column*> (c[j])->line_l_ = line_l;
}
broken_into_l_arr_.push (line_l);
@@ -233,7 +233,12 @@ Line_of_score::pre_processing ()
progress_indication ("\n" + _ ("Calculating column positions...") + " " );
for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
- unsmob_element (gh_car (s))->do_space_processing ();
+ {
+ Score_element * e = unsmob_element (gh_car (s));
+ SCM proc = e->get_elt_property ("spacing-procedure");
+ if (gh_procedure_p (proc))
+ gh_call1 (proc, e->self_scm_);
+ }
}
void
@@ -325,9 +330,8 @@ Line_of_score::broken_col_range (Item const*l, Item const*r) const
while (gh_pair_p (s) && gh_car (s) != l->self_scm_)
{
- Paper_column *c
- = dynamic_cast<Paper_column*> (unsmob_element (gh_car (s)));
- if (c->breakable_b () && !c->line_l_)
+ Paper_column*c = dynamic_cast<Paper_column*> ( unsmob_element (gh_car (s)));
+ if (Item::breakable_b (c) && !c->line_l_)
ret.push (c);
s = gh_cdr (s);
@@ -341,15 +345,15 @@ Line_of_score::broken_col_range (Item const*l, Item const*r) const
Return all columns, but filter out any unused columns , since they might
disrupt the spacing problem.
*/
-Link_array<Paper_column>
+Link_array<Score_element>
Line_of_score::column_l_arr ()const
{
- Link_array<Paper_column> acs
- = Pointer_group_interface__extract_elements (this, (Paper_column*) 0, "columns");
+ Link_array<Score_element> acs
+ = Pointer_group_interface__extract_elements (this, (Score_element*) 0, "columns");
bool bfound = false;
for (int i= acs.size (); i -- ; )
{
- bool brb = acs[i]->breakable_b();
+ bool brb = Item::breakable_b (acs[i]);
bfound = bfound || brb;
/*
@@ -357,7 +361,7 @@ Line_of_score::column_l_arr ()const
seem empty. We need to retain breakable columns, in case
someone forced a breakpoint.
*/
- if (!bfound || !acs[i]->used_b ())
+ if (!bfound || !Paper_column::used_b (acs[i]))
acs.del (i);
}
return acs;
diff --git a/lily/main.cc b/lily/main.cc
index fe92bbafa3..d575245570 100644
--- a/lily/main.cc
+++ b/lily/main.cc
@@ -33,9 +33,6 @@
#include <libintl.h>
#endif
-extern "C" {
-#include <kpathsea/kpathsea.h>
-}
bool verbose_global_b = false;
bool no_paper_global_b = false;
@@ -312,12 +309,6 @@ main (int argc, char **argv)
setenv ("GUILE_INIT_SEGMENT_SIZE_1", "4194304", 0);
setenv ("GUILE_MAX_SEGMENT_SIZE", "8388608", 0);
- /*
- initialize kpathsea
- */
- kpse_set_program_name(argv[0], NULL);
- kpse_maketex_option("tfm", TRUE);
-
oparser_global_p = new Getopt_long(argc, argv,theopts);
while (Long_option_init const * opt = (*oparser_global_p)())
{
diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc
index 84d5061e7f..6a5d06ed7d 100644
--- a/lily/multi-measure-rest-engraver.cc
+++ b/lily/multi-measure-rest-engraver.cc
@@ -111,7 +111,8 @@ Multi_measure_rest_engraver::do_process_music ()
if (busy_span_req_l_ && !mmrest_p_)
{
- mmrest_p_ = new Multi_measure_rest (get_property ("basicMultiMeasureRestProperties"));
+ mmrest_p_ = new Spanner (get_property ("basicMultiMeasureRestProperties"));
+
Multi_measure_rest::set_interface (mmrest_p_);
Staff_symbol_referencer::set_interface (mmrest_p_);
diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc
index 6d95336d3a..ba2e2cbc24 100644
--- a/lily/multi-measure-rest.cc
+++ b/lily/multi-measure-rest.cc
@@ -11,24 +11,20 @@
#include "debug.hh"
#include "paper-def.hh"
#include "paper-column.hh" // urg
-#include "bar.hh"
#include "lookup.hh"
#include "rest.hh"
#include "molecule.hh"
#include "misc.hh"
#include "group-interface.hh"
-#include "stem.hh"
+#include "spanner.hh"
#include "staff-symbol-referencer.hh"
+
void
Multi_measure_rest::set_interface (Score_element*me)
{
me->set_elt_property ("columns", SCM_EOL);
}
-Multi_measure_rest::Multi_measure_rest (SCM s)
- : Spanner(s)
-{}
-
/*
[TODO] 17
* variable-sized multi-measure rest symbol: |====| ??
@@ -151,19 +147,22 @@ Multi_measure_rest::add_column (Score_element*me,Item* c)
}
-Array<Rod>
-Multi_measure_rest::get_rods () const
+MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods);
+
+SCM
+Multi_measure_rest::set_spacing_rods (SCM smob)
{
- Array<Rod> a;
+ Score_element*me = unsmob_element (smob);
- if (!(get_bound (LEFT) && get_bound (RIGHT)))
+ Spanner*sp = dynamic_cast<Spanner*> (me);
+ if (!(sp->get_bound (LEFT) && sp->get_bound (RIGHT)))
{
programming_error ("Multi_measure_rest::get_rods (): I am not spanned!");
- return a;
+ return SCM_UNDEFINED;
}
- Item * l = get_bound (LEFT)->column_l ();
- Item * r = get_bound (RIGHT)->column_l ();
+ Item * l = sp->get_bound (LEFT)->column_l ();
+ Item * r = sp->get_bound (RIGHT)->column_l ();
Item * lb = l->find_prebroken_piece (RIGHT);
Item * rb = r->find_prebroken_piece (LEFT);
@@ -184,11 +183,10 @@ Multi_measure_rest::get_rods () const
should do something more advanced.
*/
rod.distance_f_ = l->extent (X_AXIS)[BIGGER] - r->extent (X_AXIS)[SMALLER]
- + paper_l ()->get_var ("multi_measure_rest_x_minimum");
+ + me->paper_l ()->get_var ("multi_measure_rest_x_minimum");
- a.push (rod);
+ rod.add_to_cols ();
}
-
- return a;
+ return SCM_UNDEFINED;
}
diff --git a/lily/note-column.cc b/lily/note-column.cc
index 7616a119b5..473c014663 100644
--- a/lily/note-column.cc
+++ b/lily/note-column.cc
@@ -18,13 +18,13 @@
#include "note-head.hh"
bool
-Note_column::rest_b () const
+Note_column::rest_b (Score_element*me)
{
- return unsmob_element (get_elt_property ("rest"));
+ return unsmob_element (me->get_elt_property ("rest"));
}
int
-Note_column::shift_compare (Note_column *const &p1, Note_column*const&p2)
+Note_column::shift_compare (Score_element *const &p1, Score_element *const&p2)
{
SCM s1 = p1->get_elt_property ("horizontal-shift");
SCM s2 = p2->get_elt_property ("horizontal-shift");
@@ -34,10 +34,9 @@ Note_column::shift_compare (Note_column *const &p1, Note_column*const&p2)
return h1 - h2;
}
-Note_column::Note_column( SCM s)
- : Item (s)
+void
+Note_column::set_interface (Score_element* me)
{
- Score_element* me = this;
me->set_elt_property ("note-heads", SCM_EOL);
me->set_interface (ly_symbol2scm ("note-column-interface"));
@@ -46,12 +45,11 @@ Note_column::Note_column( SCM s)
}
Item *
-Note_column::stem_l () const
+Note_column::stem_l (Score_element*me)
{
- SCM s = get_elt_property ("stem");
+ SCM s = me->get_elt_property ("stem");
return dynamic_cast<Item*>(unsmob_element (s));
}
-
Slice
Note_column::head_positions_interval(Score_element *me)
@@ -72,7 +70,7 @@ Note_column::head_positions_interval(Score_element *me)
}
Direction
-Note_column::static_dir (Score_element* me)
+Note_column::dir (Score_element* me)
{
Score_element *stem = unsmob_element (me->get_elt_property ("stem"));
if (stem && Stem::has_interface (stem))
@@ -85,43 +83,36 @@ Note_column::static_dir (Score_element* me)
}
-Direction
-Note_column::dir () const
-{
- return static_dir ((Score_element*) this);
-}
-
void
-Note_column::set_stem (Score_element * stem_l)
+Note_column::set_stem (Score_element*me,Score_element * stem_l)
{
- set_elt_property ("stem", stem_l->self_scm_);
-
- add_dependency (stem_l);
- Axis_group_interface::add_element (this, stem_l);
+ me->set_elt_property ("stem", stem_l->self_scm_);
+ me->add_dependency (stem_l);
+ Axis_group_interface::add_element (me, stem_l);
}
void
-Note_column::add_head (Score_element *h)
+Note_column::add_head (Score_element*me,Score_element *h)
{
if (Rest::has_interface (h))
{
- this->set_elt_property ("rest", h->self_scm_);
+ me->set_elt_property ("rest", h->self_scm_);
}
else if (Note_head::has_interface (h))
{
- Pointer_group_interface gi (this, "note-heads");
+ Pointer_group_interface gi (me, "note-heads");
gi.add_element (h);
}
- Axis_group_interface::add_element (this, h);
+ Axis_group_interface::add_element (me, h);
}
/**
translate the rest symbols vertically by amount DY_I.
*/
void
-Note_column::translate_rests (int dy_i)
+Note_column::translate_rests (Score_element*me,int dy_i)
{
- Score_element * r = unsmob_element (get_elt_property ("rest"));
+ Score_element * r = unsmob_element (me->get_elt_property ("rest"));
if (r)
{
r->translate_axis (dy_i * Staff_symbol_referencer::staff_space (r)/2.0, Y_AXIS);
@@ -130,24 +121,24 @@ Note_column::translate_rests (int dy_i)
void
-Note_column::set_dotcol (Score_element *d)
+Note_column::set_dotcol (Score_element*me,Score_element *d)
{
- Axis_group_interface::add_element (this, d);
+ Axis_group_interface::add_element (me, d);
}
Interval
-Note_column::rest_dim () const
+Note_column::rest_dim (Score_element*me)
{
- Score_element * r = unsmob_element (get_elt_property ("rest"));
+ Score_element * r = unsmob_element (me->get_elt_property ("rest"));
return r->extent (Y_AXIS);
}
Score_element*
-Note_column::first_head () const
+Note_column::first_head (Score_element*me)
{
- Score_element * st = stem_l ();
+ Score_element * st = stem_l (me);
return st? Stem::first_head (st): 0;
}
diff --git a/lily/paper-column.cc b/lily/paper-column.cc
index 579d028256..fcdc933f9a 100644
--- a/lily/paper-column.cc
+++ b/lily/paper-column.cc
@@ -10,62 +10,13 @@
#include "paper-score.hh"
#include "debug.hh"
#include "axis-group-interface.hh"
+#include "spaceable-element.hh"
void
-Paper_column::add_rod (Paper_column * p, Real d)
+Paper_column::do_break_processing ()
{
- Direction dir = Direction (sign (rank_i(p) -rank_i (this)));
-
- if (dir != RIGHT)
- {
- programming_error ("Must set minimum distance LTOR.");
- return;
- }
-
- for (int i=0; i < minimal_dists_.size (); i++)
- {
- Column_rod &rod = minimal_dists_[i];
- if (rod.other_l_ == p)
- {
- rod.distance_f_ = rod.distance_f_ >? d;
- return ;
- }
- }
-
- Column_rod cr;
- cr.distance_f_ = d;
- cr.other_l_ = p;
-
- minimal_dists_.push (cr);
-}
-
-void
-Paper_column::add_spring (Paper_column * p, Real d, Real s)
-{
- Direction dir = Direction (sign (rank_i(p) -rank_i (this)));
-
- if (dir != RIGHT)
- {
- programming_error ("Must set springs LTOR");
- return;
- }
-
- for (int i=0; i < springs_.size (); i++)
- {
- Column_spring &spring = springs_[i];
- if (spring.other_l_ == p)
- {
- spring.distance_f_ = spring.distance_f_ >? d;
- return ;
- }
- }
-
- Column_spring cr;
- cr.distance_f_ = d;
- cr.strength_f_ = s;
- cr.other_l_ = p;
-
- springs_.push (cr);
+ Spaceable_element::remove_interface(this);
+ Item::do_break_processing ();
}
int
@@ -91,19 +42,20 @@ Paper_column::Paper_column (SCM l)
{
Axis_group_interface::set_interface (this);
Axis_group_interface::set_axes (this, X_AXIS, X_AXIS);
+ Spaceable_element::set_interface (this);
set_elt_property ("bounded-by-me", SCM_EOL);
line_l_=0;
rank_i_ = -1;
}
Moment
-Paper_column::when_mom () const
+Paper_column::when_mom (Score_element*me)
{
- SCM m = get_elt_property ("when");
+ SCM m = me->get_elt_property ("when");
Moment s (0);
- if (SMOB_IS_TYPE_B(Moment, m))
+ if (unsmob_moment (m))
{
- s = *SMOB_TO_TYPE (Moment,m);
+ return *unsmob_moment (m);
}
return s;
}
@@ -113,17 +65,17 @@ Paper_column::musical_b () const
{
SCM m = get_elt_property ("shortest-starter-duration");
Moment s (0);
- if (SMOB_IS_TYPE_B(Moment, m))
+ if (unsmob_moment (m))
{
- s = *SMOB_TO_TYPE (Moment,m);
+ s = *unsmob_moment (m);
}
return s != Moment(0);
}
bool
-Paper_column::used_b ()const
+Paper_column::used_b (Score_element*me )
{
- return gh_pair_p (get_elt_property ("elements")) || breakable_b ()
- || gh_pair_p (get_elt_property ("bounded-by-me"))
+ return gh_pair_p (me->get_elt_property ("elements")) || Item::breakable_b (me)
+ || gh_pair_p (me->get_elt_property ("bounded-by-me"))
;
}
diff --git a/lily/paper-score.cc b/lily/paper-score.cc
index 601ce748cb..86797de758 100644
--- a/lily/paper-score.cc
+++ b/lily/paper-score.cc
@@ -79,7 +79,7 @@ Paper_score::process ()
/*
Be sure to set breakability on first & last column.
*/
- Link_array<Paper_column> pc (line_l_->column_l_arr ());
+ Link_array<Score_element> pc (line_l_->column_l_arr ());
pc[0]->set_elt_property ("breakable", SCM_BOOL_T);
pc.top ()->set_elt_property ("breakable", SCM_BOOL_T);
diff --git a/lily/rest-collision-engraver.cc b/lily/rest-collision-engraver.cc
index fc310aef05..e748b88c01 100644
--- a/lily/rest-collision-engraver.cc
+++ b/lily/rest-collision-engraver.cc
@@ -16,7 +16,7 @@ class Rest_collision_engraver : public Engraver
{
Item* rest_collision_p_;
- Link_array<Note_column> note_column_l_arr_;
+ Link_array<Score_element> note_column_l_arr_;
protected:
virtual void acknowledge_element (Score_element_info);
virtual void process_acknowledged ();
@@ -50,8 +50,8 @@ Rest_collision_engraver::process_acknowledged ()
void
Rest_collision_engraver::acknowledge_element (Score_element_info i)
{
- if (dynamic_cast<Note_column *> (i.elem_l_))
- note_column_l_arr_.push (dynamic_cast<Note_column *> (i.elem_l_));
+ if (Note_column::has_interface (i.elem_l_))
+ note_column_l_arr_.push (i.elem_l_);
}
void
diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc
index 7a26dee1a9..9d86cbb81b 100644
--- a/lily/rest-collision.cc
+++ b/lily/rest-collision.cc
@@ -41,7 +41,7 @@ Rest_collision::force_shift_callback (Score_element *them, Axis a)
}
void
-Rest_collision::add_column (Score_element*me,Note_column *p)
+Rest_collision::add_column (Score_element*me,Score_element *p)
{
me->add_dependency (p);
Pointer_group_interface gi (me);
@@ -72,16 +72,16 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
/*
ugh. -> score elt type
*/
- Link_array<Note_column> rests;
- Link_array<Note_column> notes;
+ Link_array<Score_element> rests;
+ Link_array<Score_element> notes;
for (SCM s = elts; gh_pair_p (s); s = gh_cdr (s))
{
Score_element * e = unsmob_element (gh_car (s));
if (e && unsmob_element (e->get_elt_property ("rest")))
- rests.push (dynamic_cast<Note_column*> (e));
+ rests.push (e);
else
- notes.push (dynamic_cast<Note_column*> (e));
+ notes.push (e);
}
@@ -147,8 +147,8 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
int dy = display_count > 2 ? 6 : 4;
if (display_count > 1)
{
- rests[0]->translate_rests (dy);
- rests[1]->translate_rests (-dy);
+ Note_column::translate_rests (rests[0],dy);
+ Note_column::translate_rests (rests[1], -dy);
}
}
// meisjes met jongetjes
@@ -162,12 +162,12 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
{
warning (_("too many notes for rest collision"));
}
- Note_column * rcol = rests[0];
+ Score_element * rcol = rests[0];
// try to be opposite of noteheads.
- Direction dir = - notes[0]->dir();
+ Direction dir = - Note_column::dir (notes[0]);
- Interval restdim = rcol->rest_dim ();
+ Interval restdim = Note_column::rest_dim (rcol);
if (restdim.empty_b ())
return SCM_UNDEFINED;
@@ -208,7 +208,7 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
if (discrete_dist < stafflines+1)
discrete_dist = int (ceil (discrete_dist / 2.0)* 2.0);
- rcol->translate_rests (dir * discrete_dist);
+ Note_column::translate_rests (rcol,dir * discrete_dist);
}
return SCM_UNDEFINED;
}
diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc
index b83520535c..82c02d9a4a 100644
--- a/lily/rhythmic-column-engraver.cc
+++ b/lily/rhythmic-column-engraver.cc
@@ -19,9 +19,9 @@
class Rhythmic_column_engraver :public Engraver
{
Link_array<Score_element> rhead_l_arr_;
- Link_array<Slur> grace_slur_endings_;
+ Link_array<Score_element> grace_slur_endings_;
Score_element * stem_l_;
- Note_column *ncol_p_;
+ Score_element *ncol_p_;
Score_element *dotcol_l_;
protected:
@@ -52,14 +52,15 @@ Rhythmic_column_engraver::process_acknowledged ()
{
if (!ncol_p_)
{
- ncol_p_ = new Note_column (get_property("basicNoteColumnProperties"));
+ ncol_p_ = new Item (get_property("basicNoteColumnProperties"));
+ Note_column::set_interface (ncol_p_);
announce_element (Score_element_info (ncol_p_, 0));
}
for (int i=0; i < rhead_l_arr_.size (); i++)
{
if (!rhead_l_arr_[i]->parent_l(X_AXIS))
- ncol_p_->add_head (rhead_l_arr_[i]);
+ Note_column::add_head (ncol_p_, rhead_l_arr_[i]);
}
rhead_l_arr_.set_size (0);
}
@@ -70,13 +71,13 @@ Rhythmic_column_engraver::process_acknowledged ()
if (dotcol_l_
&& !dotcol_l_->parent_l (X_AXIS))
{
- ncol_p_->set_dotcol (dotcol_l_);
+ Note_column::set_dotcol (ncol_p_, dotcol_l_);
}
if (stem_l_
&& !stem_l_->parent_l(X_AXIS))
{
- ncol_p_->set_stem (stem_l_);
+ Note_column::set_stem (ncol_p_, stem_l_);
stem_l_ = 0;
}
@@ -85,7 +86,7 @@ Rhythmic_column_engraver::process_acknowledged ()
if (!wegrace)
for (int i=0; i < grace_slur_endings_.size(); i++)
- grace_slur_endings_[i]->add_column (ncol_p_);
+ Slur::add_column (grace_slur_endings_[i], ncol_p_);
grace_slur_endings_.clear ();
}
}
@@ -96,7 +97,7 @@ Rhythmic_column_engraver::acknowledge_element (Score_element_info i)
SCM wg = get_property ("weAreGraceContext");
bool wegrace = to_boolean (wg);
if (wegrace != to_boolean (i.elem_l_->get_elt_property ("grace"))
- && !dynamic_cast<Slur*> (i.elem_l_))
+ && !Slur::has_interface (i.elem_l_))
return ;
Item * item = dynamic_cast <Item *> (i.elem_l_);
@@ -112,14 +113,14 @@ Rhythmic_column_engraver::acknowledge_element (Score_element_info i)
{
dotcol_l_ = item;
}
- else if (Slur *s = dynamic_cast<Slur*> (i.elem_l_))
+ else if (Slur::has_interface (i.elem_l_))
{
/*
end slurs starting on grace notes
*/
- if (to_boolean (s->get_elt_property ("grace")))
- grace_slur_endings_.push (s);
+ if (to_boolean (i.elem_l_->get_elt_property ("grace")))
+ grace_slur_endings_.push (i.elem_l_);
}
}
diff --git a/lily/rhythmic-head.cc b/lily/rhythmic-head.cc
index 9c8cb00b50..63006674fc 100644
--- a/lily/rhythmic-head.cc
+++ b/lily/rhythmic-head.cc
@@ -16,6 +16,7 @@
#include "paper-score.hh"
#include "stem.hh"
#include "staff-symbol-referencer.hh"
+#include "item.hh"
Item*
diff --git a/lily/rod.cc b/lily/rod.cc
index 15b4c7a808..621fd15de2 100644
--- a/lily/rod.cc
+++ b/lily/rod.cc
@@ -10,8 +10,7 @@
#include "paper-column.hh"
#include "debug.hh"
#include "dimensions.hh"
-#include "separation-item.hh"
-
+#include "spaceable-element.hh"
Rod::Rod ()
{
@@ -20,11 +19,6 @@ Rod::Rod ()
}
-Column_rod::Column_rod ()
-{
- distance_f_ = 0;
- other_l_ = 0;
-}
void
Rod::columnize ()
@@ -43,7 +37,8 @@ Rod::add_to_cols ()
{
columnize();
if (item_l_drul_[LEFT] != item_l_drul_[RIGHT])
- dynamic_cast<Paper_column*> (item_l_drul_[LEFT])->
- add_rod(dynamic_cast<Paper_column*>(item_l_drul_[RIGHT]), distance_f_ );
+ Spaceable_element::add_rod (item_l_drul_[LEFT],
+ item_l_drul_[RIGHT],
+ distance_f_ );
}
diff --git a/lily/score-element.cc b/lily/score-element.cc
index 5b17ffbbd3..47ca5c9eea 100644
--- a/lily/score-element.cc
+++ b/lily/score-element.cc
@@ -265,10 +265,6 @@ Score_element::do_break_processing()
{
}
-void
-Score_element::do_space_processing ()
-{
-}
void
Score_element::do_add_processing()
diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc
index 842a896fb7..1e35503f42 100644
--- a/lily/score-engraver.cc
+++ b/lily/score-engraver.cc
@@ -195,7 +195,7 @@ Score_engraver::set_columns (Paper_column *new_command_l,
if (*current[i])
{
scoreline_l_->add_column ((*current[i]));
- if (!(*current[i])->used_b())
+ if (!Paper_column::used_b (*current[i]))
{
(*current[i])->suicide ();
*current[i] =0;
diff --git a/lily/script-column-engraver.cc b/lily/script-column-engraver.cc
index 47c37cfcaa..02676f0145 100644
--- a/lily/script-column-engraver.cc
+++ b/lily/script-column-engraver.cc
@@ -60,7 +60,7 @@ Script_column_engraver::acknowledge_element( Score_element_info inf)
{
Item *thing = dynamic_cast<Item*> (inf.elem_l_);
if (thing
- && !thing->breakable_b ()
+ && !Item::breakable_b (thing)
&& Side_position::get_axis (inf.elem_l_) == Y_AXIS)
{
script_l_arr_.push (thing);
diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc
index 2f433d9d37..effd5b7123 100644
--- a/lily/script-engraver.cc
+++ b/lily/script-engraver.cc
@@ -10,12 +10,10 @@
#include "musical-request.hh"
#include "stem.hh"
#include "rhythmic-head.hh"
-
-
#include "engraver.hh"
class Script_engraver : public Engraver {
- Link_array<Script> script_p_arr_;
+ Link_array<Score_element> script_p_arr_;
Link_array<Articulation_req> script_req_l_arr_;
public:
@@ -69,7 +67,8 @@ Script_engraver::do_process_music()
continue;
}
// todo -> use result of articulation-to-scriptdef directly as basic prop list.
- Script *p =new Script (get_property ("basicScriptProperties"));
+ Score_element *p =new Item (get_property ("basicScriptProperties"));
+ Script::set_interface (p);
p->add_offset_callback (Side_position::centered_on_parent, X_AXIS);
@@ -157,8 +156,8 @@ Script_engraver::do_pre_move_processing()
{
for (int i=0; i < script_p_arr_.size(); i++)
{
- Script * sc = script_p_arr_[i];
- if (to_boolean (sc->remove_elt_property ("staff-support")))
+ Score_element * sc = script_p_arr_[i];
+ if (to_boolean (sc->get_elt_property ("staff-support")))
{
Side_position::add_staff_support (sc);
}
diff --git a/lily/script.cc b/lily/script.cc
index c4dcc30cd4..c4b3e004de 100644
--- a/lily/script.cc
+++ b/lily/script.cc
@@ -12,12 +12,7 @@
#include "lookup.hh"
#include "side-position-interface.hh"
#include "paper-def.hh"
-
-
-Script ::Script (SCM s)
- : Item (s)
-{
-}
+#include "item.hh"
Molecule
Script::get_molecule(Score_element * me, Direction d)
@@ -41,8 +36,6 @@ Script::get_molecule(Score_element * me, Direction d)
return Molecule ();
}
-
-
MAKE_SCHEME_CALLBACK(Script,after_line_breaking);
SCM
Script::after_line_breaking (SCM smob)
@@ -55,7 +48,6 @@ Script::after_line_breaking (SCM smob)
return SCM_UNDEFINED;
}
-
MAKE_SCHEME_CALLBACK(Script,brew_molecule);
SCM
@@ -70,5 +62,14 @@ Script::brew_molecule (SCM smob)
return get_molecule (me, dir).create_scheme();
}
+bool
+Script::has_interface (Score_element*me)
+{
+ return me->has_interface ("script-interface");
+}
-
+void
+Script::set_interface (Score_element*me)
+{
+ return me->set_interface ("script-interface");
+}
diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc
index 6b5c2302a8..cc6f70c219 100644
--- a/lily/separating-group-spanner.cc
+++ b/lily/separating-group-spanner.cc
@@ -14,8 +14,8 @@
#include "dimensions.hh"
#include "group-interface.hh"
-static Rod
-make_rod (Item *l, Item *r)
+static void
+do_rod (Item *l, Item *r)
{
Rod rod;
@@ -31,16 +31,16 @@ make_rod (Item *l, Item *r)
rod.distance_f_ = li[RIGHT] - ri[LEFT];
rod.columnize ();
- return rod;
+ rod.add_to_cols ();
}
-
-Array<Rod>
-Separating_group_spanner::get_rods () const
+MAKE_SCHEME_CALLBACK(Separating_group_spanner,set_spacing_rods);
+SCM
+Separating_group_spanner::set_spacing_rods (SCM smob)
{
- Array<Rod> a;
+ Score_element*me = unsmob_element (smob);
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
+ for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
{
/*
Order of elements is reversed!
@@ -60,29 +60,28 @@ Separating_group_spanner::get_rods () const
Item *rb
= dynamic_cast<Item*>(r->find_prebroken_piece (LEFT));
- a.push (make_rod(l, r));
+ do_rod(l, r);
if (lb)
{
- Rod rod(make_rod (lb, r));
- a.push (rod);
+ do_rod (lb, r);
}
if (rb)
{
- a.push (make_rod (l, rb));
+ do_rod (l, rb);
}
if (lb && rb)
{
- Rod rod(make_rod (lb, rb));
- a.push (rod);
+ do_rod (lb, rb);
+
}
}
/*
We've done our job, so we get lost.
*/
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
{
Item * it =dynamic_cast<Item*>(unsmob_element (gh_car (s)));
if (it && it->broken_b ())
@@ -92,10 +91,8 @@ Separating_group_spanner::get_rods () const
}
it->suicide ();
}
-
- ((Separating_group_spanner *)this)->suicide ();
-
- return a;
+ me->suicide ();
+ return SCM_UNDEFINED ;
}
void
@@ -106,8 +103,8 @@ Separating_group_spanner::add_spacing_unit (Score_element* me ,Item*i)
}
-Separating_group_spanner::Separating_group_spanner (SCM s)
- : Spanner (s)
+void
+Separating_group_spanner::set_interface (Score_element*me)
{
- set_elt_property ("elements", SCM_EOL);
+ me->set_elt_property ("elements", SCM_EOL);
}
diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc
index 96749f0410..7cc7ad681a 100644
--- a/lily/separating-line-group-engraver.cc
+++ b/lily/separating-line-group-engraver.cc
@@ -18,7 +18,7 @@ class Separating_line_group_engraver : public Engraver
protected:
Item * break_malt_p_;
Item * nobreak_malt_p_;
- Separating_group_spanner * sep_span_p_;
+ Spanner * sep_span_p_;
virtual void acknowledge_element (Score_element_info);
virtual void do_creation_processing ();
@@ -39,7 +39,8 @@ Separating_line_group_engraver::Separating_line_group_engraver ()
void
Separating_line_group_engraver::do_creation_processing ()
{
- sep_span_p_ = new Separating_group_spanner (get_property ("basicSeparatingGroupSpannerProperties"));
+ sep_span_p_ = new Spanner (get_property ("basicSeparatingGroupSpannerProperties"));
+ Separating_group_spanner::set_interface (sep_span_p_);
announce_element (Score_element_info (sep_span_p_, 0));
sep_span_p_->set_bound (LEFT, unsmob_element (get_property ("currentCommandColumn")));
}
@@ -58,7 +59,7 @@ Separating_line_group_engraver::acknowledge_element (Score_element_info i)
Item * it = dynamic_cast <Item *> (i.elem_l_);
if (it && !it->parent_l (X_AXIS))
{
- bool ib =it->breakable_b ();
+ bool ib =Item::breakable_b (it);
Item *&p_ref_ (ib ? break_malt_p_
: nobreak_malt_p_);
diff --git a/lily/simple-spacer.cc b/lily/simple-spacer.cc
index e11b6c1dd6..36971396df 100644
--- a/lily/simple-spacer.cc
+++ b/lily/simple-spacer.cc
@@ -19,6 +19,7 @@
#include "rod.hh"
#include "warn.hh"
#include "column-x-positions.hh"
+#include "spaceable-element.hh"
#include "dimensions.hh"
Simple_spacer::Simple_spacer ()
@@ -164,26 +165,27 @@ Simple_spacer::my_solve_natural_len ()
}
void
-Simple_spacer::add_columns (Link_array<Paper_column> cols)
+Simple_spacer::add_columns (Link_array<Score_element> cols)
{
for (int i=0; i < cols.size () - 1; i++)
{
- Paper_column * c = cols [i];
- Column_spring *to_next = 0;
- for (int j =0; !to_next && j < c->springs_.size( ); j++)
+ SCM spring_params = SCM_UNDEFINED;
+ for (SCM s = Spaceable_element::get_ideal_distances (cols[i]);
+ spring_params == SCM_UNDEFINED && gh_pair_p (s);
+ s = gh_cdr (s))
{
- Column_spring &sp = c->springs_ [j];
- if (sp.other_l_ != cols[i+1])
+ Score_element *other = unsmob_element (gh_caar (s));
+ if (other != cols[i+1])
continue;
- to_next = &sp;
+ spring_params = gh_cdar (s);
}
Spring_description desc;
- if (to_next)
+ if (spring_params != SCM_UNDEFINED)
{
- desc.hooke_f_ = to_next->strength_f_;
- desc.ideal_f_ = to_next->distance_f_;
+ desc.ideal_f_ = gh_scm2double (gh_car (spring_params));
+ desc.hooke_f_ = gh_scm2double (gh_cdr (spring_params));
}
else
{
@@ -204,13 +206,14 @@ Simple_spacer::add_columns (Link_array<Paper_column> cols)
for (int i=0; i < cols.size () - 1; i++)
{
- Array<Column_rod> * rods = &cols [i]->minimal_dists_;
- for (int j =0; j < rods->size( ); j++)
+ for (SCM s = Spaceable_element::get_minimum_distances (cols[i]);
+ gh_pair_p (s); s = gh_cdr (s))
{
- int oi = cols.find_i (rods->elem (j).other_l_ );
+ Score_element * other = unsmob_element (gh_caar (s));
+ int oi = cols.find_i (other);
if (oi >= 0)
{
- add_rod (i, oi, rods->elem (j).distance_f_);
+ add_rod (i, oi, gh_scm2double (gh_cdar (s)));
}
}
}
diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc
index 7987187335..8cd767edcd 100644
--- a/lily/slur-engraver.cc
+++ b/lily/slur-engraver.cc
@@ -12,12 +12,13 @@
#include "note-column.hh"
#include "translator-group.hh"
#include "engraver.hh"
+#include "spanner.hh"
class Slur_engraver :public Engraver {
Link_array<Span_req> requests_arr_;
Link_array<Span_req> new_slur_req_l_arr_;
- Link_array<Slur> slur_l_stack_;
- Link_array<Slur> end_slur_l_arr_;
+ Link_array<Score_element> slur_l_stack_;
+ Link_array<Score_element> end_slur_l_arr_;
void set_melisma (bool);
protected:
@@ -56,13 +57,13 @@ Slur_engraver::set_melisma (bool m)
void
Slur_engraver::acknowledge_element (Score_element_info info)
{
- if (dynamic_cast<Note_column *> (info.elem_l_))
+ if (Note_column::has_interface (info.elem_l_))
{
- Note_column *col_l =dynamic_cast<Note_column *> (info.elem_l_) ;// ugh
+ Score_element *e =info.elem_l_;
for (int i = 0; i < slur_l_stack_.size (); i++)
- slur_l_stack_[i]->add_column (col_l);
+ Slur::add_column (slur_l_stack_[i], e);
for (int i = 0; i < end_slur_l_arr_.size (); i++)
- end_slur_l_arr_[i]->add_column (col_l);
+ Slur::add_column (end_slur_l_arr_[i], e);
}
}
@@ -86,7 +87,7 @@ Slur_engraver::do_removal_processing ()
void
Slur_engraver::do_process_music ()
{
- Array<Slur*> start_slur_l_arr_;
+ Link_array<Score_element> start_slur_l_arr_;
for (int i=0; i< new_slur_req_l_arr_.size (); i++)
{
Span_req* slur_req_l = new_slur_req_l_arr_[i];
@@ -98,7 +99,7 @@ Slur_engraver::do_process_music ()
slur_req_l->warning (_f ("can't find both ends of %s", _ ("slur")));
else
{
- Slur* slur = slur_l_stack_.pop ();
+ Score_element* slur = slur_l_stack_.pop ();
SCM s = get_property ("slurEndAttachment");
if (gh_symbol_p (s))
{
@@ -112,7 +113,8 @@ Slur_engraver::do_process_music ()
{
// push a new slur onto stack.
// (use temp. array to wait for all slur STOPs)
- Slur* slur = new Slur (get_property ("basicSlurProperties"));
+ Score_element* slur = new Spanner (get_property ("basicSlurProperties"));
+ Slur::set_interface (slur);
SCM s = get_property ("slurBeginAttachment");
if (gh_symbol_p (s))
{
diff --git a/lily/slur.cc b/lily/slur.cc
index 5b702323bd..9b751ab6e8 100644
--- a/lily/slur.cc
+++ b/lily/slur.cc
@@ -31,31 +31,34 @@
#include "main.hh"
#include "group-interface.hh"
#include "staff-symbol-referencer.hh"
+#include "spanner.hh"
-Slur::Slur (SCM s)
- : Spanner (s)
+
+void
+Slur::set_interface (Score_element*me)
{
- set_elt_property ("attachment", gh_cons (SCM_BOOL_F, SCM_BOOL_F));
- set_elt_property ("note-columns", SCM_EOL);
- set_elt_property ("control-points", SCM_EOL);
+ me-> set_elt_property ("attachment", gh_cons (SCM_BOOL_F, SCM_BOOL_F));
+ me->set_elt_property ("note-columns", SCM_EOL);
+ me->set_elt_property ("control-points", SCM_EOL);
+ me->set_interface (ly_symbol2scm ("slur-interface"));
}
void
-Slur::add_column (Note_column*n)
+Slur::add_column (Score_element*me, Score_element*n)
{
if (!gh_pair_p (n->get_elt_property ("note-heads")))
warning (_ ("Putting slur over rest. Ignoring."));
else
{
- Pointer_group_interface (this, "note-columns").add_element (n);
- add_dependency (n);
+ Pointer_group_interface (me, "note-columns").add_element (n);
+ me->add_dependency (n);
}
- add_bound_item (this, n);
+ add_bound_item (dynamic_cast<Spanner*> (me), dynamic_cast<Item*>(n));
}
void
-Slur::de_uglyfy (Slur_bezier_bow* bb, Real default_height)
+Slur::de_uglyfy (Score_element*me, Slur_bezier_bow* bb, Real default_height)
{
Real length = bb->curve_.control_[3][X_AXIS] ;
Real ff = bb->fit_factor ();
@@ -66,9 +69,9 @@ Slur::de_uglyfy (Slur_bezier_bow* bb, Real default_height)
Real h = bb->curve_.control_[i][Y_AXIS] * ff / length;
Real f = default_height / length;
- Real c1 = paper_l ()->get_var ("bezier_control1");
- Real c2 = paper_l ()->get_var ("bezier_control2");
- Real c3 = paper_l ()->get_var ("bezier_control3");
+ Real c1 = me->paper_l ()->get_var ("bezier_control1");
+ Real c2 = me->paper_l ()->get_var ("bezier_control2");
+ Real c3 = me->paper_l ()->get_var ("bezier_control3");
if (h > c1 * f)
{
h = c1 * f;
@@ -85,15 +88,15 @@ Slur::de_uglyfy (Slur_bezier_bow* bb, Real default_height)
}
Direction
-Slur::get_default_dir () const
+Slur::get_default_dir (Score_element*me)
{
- Link_array<Note_column> encompass_arr =
- Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Link_array<Score_element> encompass_arr =
+ Pointer_group_interface__extract_elements (me, (Score_element*)0, "note-columns");
Direction d = DOWN;
for (int i=0; i < encompass_arr.size (); i ++)
{
- if (encompass_arr[i]->dir () < 0)
+ if (Note_column::dir (encompass_arr[i]) < 0)
{
d = UP;
break;
@@ -107,13 +110,14 @@ Slur::get_default_dir () const
Offset
-Slur::encompass_offset (Score_element* col,
- Score_element **common) const
+Slur::encompass_offset (Score_element*me,
+ Score_element* col,
+ Score_element **common)
{
Offset o;
Score_element* stem_l = unsmob_element (col->get_elt_property ("stem"));
- Direction dir = Directional_element_interface (this).get ();
+ Direction dir = Directional_element_interface (me).get ();
if (!stem_l)
{
@@ -144,7 +148,7 @@ Slur::encompass_offset (Score_element* col,
/*
leave a gap: slur mustn't touch head/stem
*/
- o[Y_AXIS] += dir * paper_l ()->get_var ("slur_y_free");
+ o[Y_AXIS] += dir * me->paper_l ()->get_var ("slur_y_free");
return o;
}
@@ -154,33 +158,32 @@ SCM
Slur::after_line_breaking (SCM smob)
{
Score_element *me = unsmob_element (smob);
- Slur * sl = dynamic_cast<Slur*>(me);
- sl->set_extremities ();
- sl->set_control_points ();
+ set_extremities (me);
+ set_control_points (me);
return SCM_UNDEFINED;
}
void
-Slur::set_extremities ()
+Slur::set_extremities (Score_element*me)
{
- if (!Directional_element_interface (this).get ())
- Directional_element_interface (this).set (get_default_dir ());
+ if (!Directional_element_interface (me).get ())
+ Directional_element_interface (me).set (get_default_dir (me));
Direction dir = LEFT;
do
{
- if (!gh_symbol_p (index_cell (get_elt_property ("attachment"), dir)))
+ if (!gh_symbol_p (index_cell (me->get_elt_property ("attachment"), dir)))
{
// for (SCM s = get_elt_property ("slur-extremity-rules"); s != SCM_EOL; s = gh_cdr (s))
for (SCM s = scm_eval (ly_symbol2scm ("slur-extremity-rules"));
s != SCM_EOL; s = gh_cdr (s))
{
- SCM r = gh_call2 (gh_caar (s), this->self_scm_,
+ SCM r = gh_call2 (gh_caar (s), me->self_scm_,
gh_int2scm ((int)dir));
if (r != SCM_BOOL_F)
{
- index_set_cell (get_elt_property ("attachment"), dir,
+ index_set_cell (me->get_elt_property ("attachment"), dir,
gh_cdar (s));
break;
}
@@ -191,22 +194,24 @@ Slur::set_extremities ()
}
Offset
-Slur::get_attachment (Direction dir,
- Score_element **common) const
+Slur::get_attachment (Score_element*me,Direction dir,
+ Score_element **common)
{
- SCM s = get_elt_property ("attachment");
+ Spanner*sp = dynamic_cast<Spanner*>(me);
+ SCM s = me->get_elt_property ("attachment");
SCM a = dir == LEFT ? gh_car (s) : gh_cdr (s);
String str = ly_symbol2string (a);
- Real ss = Staff_symbol_referencer::staff_space ((Score_element*)this);
+ Real ss = Staff_symbol_referencer::staff_space ((Score_element*)me);
Real hs = ss / 2.0;
Offset o;
-
- if (Note_column* n = dynamic_cast<Note_column*> (get_bound (dir)))
+
+ if (Note_column::has_interface (sp->get_bound (dir)))
{
- if (n->stem_l ())
+ Score_element * n =sp->get_bound (dir);
+ if (Score_element*st = Note_column::stem_l (n))
{
- Score_element*st = n->stem_l();
+
if (str == "head")
{
o = Offset (0, Stem::chord_start_f (st ));
@@ -214,7 +219,7 @@ Slur::get_attachment (Direction dir,
Default position is centered in X, on outer side of head Y
*/
o += Offset (0.5 * n->extent (X_AXIS).length (),
- 0.5 * ss * Directional_element_interface (this).get ());
+ 0.5 * ss * Directional_element_interface (me).get ());
}
else if (str == "alongside-stem")
{
@@ -224,7 +229,7 @@ Slur::get_attachment (Direction dir,
*/
o += Offset (n->extent (X_AXIS).length ()
* (1 + Stem::get_direction (st )),
- 0.5 * ss * Directional_element_interface (this).get ());
+ 0.5 * ss * Directional_element_interface (me).get ());
}
else if (str == "stem")
{
@@ -243,7 +248,7 @@ Slur::get_attachment (Direction dir,
SCM other_a = dir == LEFT ? gh_cdr (s) : gh_car (s);
if (ly_symbol2string (other_a) != "loose-end")
{
- o = Offset (0, get_attachment (-dir, common)[Y_AXIS]);
+ o = Offset (0, get_attachment (me, -dir, common)[Y_AXIS]);
}
}
@@ -251,7 +256,7 @@ Slur::get_attachment (Direction dir,
SCM l = scm_assoc
(scm_listify (a,
gh_int2scm (Stem::get_direction (st ) * dir),
- gh_int2scm (Directional_element_interface (this).get () * dir),
+ gh_int2scm (Directional_element_interface (me).get () * dir),
SCM_UNDEFINED),
scm_eval (ly_symbol2scm ("slur-extremity-offset-alist")));
@@ -267,24 +272,25 @@ Slur::get_attachment (Direction dir,
What if get_bound () is not a note-column?
*/
if (str != "loose-end"
- && get_bound (dir)->common_refpoint (common[Y_AXIS], Y_AXIS) == common[Y_AXIS])
+ && sp->get_bound (dir)->common_refpoint (common[Y_AXIS], Y_AXIS) == common[Y_AXIS])
{
- o[Y_AXIS] += get_bound (dir)->relative_coordinate (common[Y_AXIS], Y_AXIS)
- - relative_coordinate (common[Y_AXIS], Y_AXIS);
+ o[Y_AXIS] += sp->get_bound (dir)->relative_coordinate (common[Y_AXIS], Y_AXIS)
+ - me->relative_coordinate (common[Y_AXIS], Y_AXIS);
}
return o;
}
Array<Offset>
-Slur::get_encompass_offset_arr () const
+Slur::get_encompass_offset_arr (Score_element*me)
{
- SCM eltlist = get_elt_property ("note-columns");
- Score_element *common[] = {common_refpoint (eltlist,X_AXIS),
- common_refpoint (eltlist,Y_AXIS)};
+ Spanner*sp = dynamic_cast<Spanner*>(me);
+ SCM eltlist = me->get_elt_property ("note-columns");
+ Score_element *common[] = {me->common_refpoint (eltlist,X_AXIS),
+ me->common_refpoint (eltlist,Y_AXIS)};
- common[X_AXIS] = common[X_AXIS]->common_refpoint (get_bound (RIGHT), X_AXIS);
- common[X_AXIS] = common[X_AXIS]->common_refpoint (get_bound (LEFT), X_AXIS);
+ common[X_AXIS] = common[X_AXIS]->common_refpoint (sp->get_bound (RIGHT), X_AXIS);
+ common[X_AXIS] = common[X_AXIS]->common_refpoint (sp->get_bound (LEFT), X_AXIS);
Link_array<Score_element> encompass_arr;
while (gh_pair_p (eltlist))
@@ -297,66 +303,68 @@ Slur::get_encompass_offset_arr () const
Array<Offset> offset_arr;
- Offset origin (relative_coordinate (common[X_AXIS], X_AXIS),
- relative_coordinate (common[Y_AXIS], Y_AXIS));
+ Offset origin (me->relative_coordinate (common[X_AXIS], X_AXIS),
+ me->relative_coordinate (common[Y_AXIS], Y_AXIS));
int first = 1;
int last = encompass_arr.size () - 2;
- offset_arr.push (get_attachment (LEFT, common));
+ offset_arr.push (get_attachment (me, LEFT, common));
/*
left is broken edge
*/
- if (encompass_arr[0] != get_bound (LEFT))
+ if (encompass_arr[0] != sp->get_bound (LEFT))
{
first--;
// ?
offset_arr[0][Y_AXIS] -=
encompass_arr[0]->relative_coordinate (common[Y_AXIS], Y_AXIS)
- - relative_coordinate (common[Y_AXIS], Y_AXIS);
+ - me->relative_coordinate (common[Y_AXIS], Y_AXIS);
}
/*
right is broken edge
*/
- if (encompass_arr.top () != get_bound (RIGHT))
+ if (encompass_arr.top () != sp->get_bound (RIGHT))
{
last++;
}
for (int i = first; i <= last; i++)
{
- Offset o (encompass_offset (encompass_arr[i], common));
+ Offset o (encompass_offset (me, encompass_arr[i], common));
offset_arr.push (o - origin);
}
- offset_arr.push (Offset (spanner_length (), 0) + get_attachment (RIGHT,common));
+ offset_arr.push (Offset (sp->spanner_length (), 0) + get_attachment (me, RIGHT,common));
- if (encompass_arr[0] != get_bound (LEFT))
+ if (encompass_arr[0] != sp->get_bound (LEFT))
{
offset_arr.top ()[Y_AXIS] -= encompass_arr.top ()->relative_coordinate (common[Y_AXIS], Y_AXIS)
- - relative_coordinate (common[Y_AXIS], Y_AXIS);
+ - me->relative_coordinate (common[Y_AXIS], Y_AXIS);
}
return offset_arr;
}
-Array<Rod>
-Slur::get_rods () const
+MAKE_SCHEME_CALLBACK(Slur,set_spacing_rods);
+SCM
+Slur::set_spacing_rods (SCM smob)
{
- Array<Rod> a;
+ Score_element*me = unsmob_element (smob);
+
Rod r;
-
- r.item_l_drul_[LEFT] = get_bound (LEFT);
- r.item_l_drul_[RIGHT] = get_bound (RIGHT);
- r.distance_f_ = paper_l ()->get_var ("slur_x_minimum");
+ Spanner*sp = dynamic_cast<Spanner*>(me);
+ r.item_l_drul_[LEFT] = sp->get_bound (LEFT);
+ r.item_l_drul_[RIGHT] = sp->get_bound (RIGHT);
+ r.distance_f_ = me->paper_l ()->get_var ("slur_x_minimum");
- a.push (r);
- return a;
+ r.add_to_cols ();
+ return SCM_UNDEFINED;
}
@@ -367,11 +375,9 @@ MAKE_SCHEME_CALLBACK(Slur,brew_molecule);
SCM
Slur::brew_molecule (SCM smob)
{
- Slur * me = dynamic_cast<Slur*> (unsmob_element (smob));
-
-
+ Score_element * me = unsmob_element (smob);
Real thick = me->paper_l ()->get_var ("slur_thickness");
- Bezier one = me->get_curve ();
+ Bezier one = get_curve (me);
Molecule a;
SCM d = me->get_elt_property ("dashed");
@@ -384,14 +390,14 @@ Slur::brew_molecule (SCM smob)
}
void
-Slur::set_control_points ()
+Slur::set_control_points (Score_element*me)
{
- Slur_bezier_bow bb (get_encompass_offset_arr (),
- Directional_element_interface (this).get ());
+ Slur_bezier_bow bb (get_encompass_offset_arr (me),
+ Directional_element_interface (me).get ());
- Real staff_space = Staff_symbol_referencer::staff_space (this);
- Real h_inf = paper_l ()->get_var ("slur_height_limit_factor") * staff_space;
- Real r_0 = paper_l ()->get_var ("slur_ratio");
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real h_inf = me->paper_l ()->get_var ("slur_height_limit_factor") * staff_space;
+ Real r_0 = me->paper_l ()->get_var ("slur_ratio");
bb.set_default_bezier (h_inf, r_0);
@@ -399,14 +405,14 @@ Slur::set_control_points ()
{
Real length = bb.curve_.control_[3][X_AXIS];
Real default_height = bb.get_default_height (h_inf, r_0, length);
- bb.minimise_enclosed_area (paper_l(), default_height);
+ bb.minimise_enclosed_area (me->paper_l(), default_height);
- Real bff = paper_l ()->get_var ("slur_force_blowfit");
+ Real bff = me->paper_l ()->get_var ("slur_force_blowfit");
bb.curve_.control_[1][Y_AXIS] *= bff;
bb.curve_.control_[2][Y_AXIS] *= bff;
bb.blow_fit ();
- Real sb = paper_l ()->get_var ("slur_beautiful");
+ Real sb = me->paper_l ()->get_var ("slur_beautiful");
Real beautiful = length * default_height * sb;
Real area = bb.enclosed_area_f ();
@@ -414,7 +420,7 @@ Slur::set_control_points ()
Slurs that fit beautifully are not ugly
*/
if (area > beautiful)
- de_uglyfy (&bb, default_height);
+ de_uglyfy (me, &bb, default_height);
}
Bezier b = bb.get_bezier ();
@@ -424,32 +430,32 @@ Slur::set_control_points ()
for (int i= 4; i--;)
controls = gh_cons ( ly_offset2scm (b.control_[i]), controls);
- set_elt_property ("control-points", controls);
+ me->set_elt_property ("control-points", controls);
}
Bezier
-Slur::get_curve () const
+Slur::get_curve (Score_element*me)
{
Bezier b;
int i = 0;
- if (!Directional_element_interface (this).get ()
- || ! gh_symbol_p (index_cell (get_elt_property ("attachment"), LEFT)))
- ((Slur*)this)->set_extremities ();
+ if (!Directional_element_interface (me).get ()
+ || ! gh_symbol_p (index_cell (me->get_elt_property ("attachment"), LEFT)))
+ set_extremities (me);
- if (!gh_pair_p (get_elt_property ("control-points")))
- ((Slur*)this)->set_control_points ();
+ if (!gh_pair_p (me->get_elt_property ("control-points")))
+ set_control_points (me);
- for (SCM s= get_elt_property ("control-points"); s != SCM_EOL; s = gh_cdr (s))
+ for (SCM s= me->get_elt_property ("control-points"); s != SCM_EOL; s = gh_cdr (s))
{
b.control_[i] = ly_scm2offset (gh_car (s));
i++;
}
- Array<Offset> enc (get_encompass_offset_arr ());
- Direction dir = Directional_element_interface (this).get ();
+ Array<Offset> enc (get_encompass_offset_arr (me));
+ Direction dir = Directional_element_interface (me).get ();
Real x1 = enc[0][X_AXIS];
Real x2 = enc.top ()[X_AXIS];
@@ -468,3 +474,11 @@ Slur::get_curve () const
return b;
}
+
+bool
+Slur::has_interface (Score_element*me)
+{
+ return me->has_interface ("slur-interface");
+}
+
+
diff --git a/lily/spaceable-element.cc b/lily/spaceable-element.cc
new file mode 100644
index 0000000000..7f746ee4d6
--- /dev/null
+++ b/lily/spaceable-element.cc
@@ -0,0 +1,84 @@
+/*
+ spaceable-element.cc -- implement Spaceable_element
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "spaceable-element.hh"
+#include "score-element.hh"
+#include "warn.hh"
+
+SCM
+Spaceable_element::get_minimum_distances ( Score_element*me)
+{
+ return me->get_elt_property ("minimum-distances");
+}
+
+void
+Spaceable_element::add_rod (Score_element *me , Score_element * p, Real d)
+{
+ SCM mins = get_minimum_distances (me);
+ SCM newdist= gh_double2scm (d);
+ for (; gh_pair_p (mins); mins = gh_cdr (mins))
+ {
+ SCM dist = gh_car (mins);
+ if (gh_car (dist) == p->self_scm_)
+ {
+ gh_set_cdr_x (dist, scm_max (gh_cdr (dist),
+ newdist));
+ return ;
+ }
+ }
+
+ mins = gh_cons (gh_cons (p->self_scm_, newdist), mins);
+ me->set_elt_property ("minimum-distances", mins);
+}
+
+SCM
+Spaceable_element::get_ideal_distances (Score_element*me)
+{
+ return me->get_elt_property ("ideal-distances");
+}
+
+void
+Spaceable_element::add_spring (Score_element*me, Score_element * p, Real d, Real s)
+{
+ SCM mins = get_ideal_distances (me);
+ SCM newdist= gh_double2scm (d);
+ for (; gh_pair_p (mins); mins = gh_cdr (mins))
+ {
+ SCM dist = gh_car (mins);
+ if (gh_car (dist) == p->self_scm_)
+ {
+ programming_error("already have that spring");
+ /* gh_set_car_x (gh_cdr (dist), scm_max (gh_cadr (dist),
+ newdist));*/
+ return ;
+ }
+ }
+ SCM newstrength= gh_double2scm (s);
+
+ mins = gh_cons (gh_cons (p->self_scm_, gh_cons (newdist, newstrength)), mins);
+ me->set_elt_property ("ideal-distances", mins);
+}
+
+
+void
+Spaceable_element::remove_interface (Score_element*me)
+{
+ me->remove_elt_property ("minimum-distances");
+ me->remove_elt_property ("ideal-distances");
+ me->remove_elt_property ("dir-list");
+}
+
+
+void
+Spaceable_element::set_interface (Score_element*me)
+{
+ me->set_elt_property ("minimum-distances", SCM_EOL);
+ me->set_elt_property ("ideal-distances", SCM_EOL);
+ me->set_elt_property ("dir-list",SCM_EOL) ;
+}
diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc
index a61b79a223..df45ee44f6 100644
--- a/lily/spacing-engraver.cc
+++ b/lily/spacing-engraver.cc
@@ -11,6 +11,48 @@
#include "paper-column.hh"
#include "spacing-engraver.hh"
#include "spacing-spanner.hh"
+#include "engraver.hh"
+#include "pqueue.hh"
+
+struct Rhythmic_tuple
+{
+ Score_element_info info_;
+ Moment end_;
+
+ Rhythmic_tuple ()
+ {
+ }
+ Rhythmic_tuple (Score_element_info i, Moment m )
+ {
+ info_ = i;
+ end_ = m;
+ }
+ static int time_compare (Rhythmic_tuple const &, Rhythmic_tuple const &);
+};
+
+/**
+ Acknowledge rhythmic elements, for initializing spacing fields in
+ the columns.
+
+ should be the last one of the toplevel context
+*/
+class Spacing_engraver : public Engraver
+{
+ PQueue<Rhythmic_tuple> playing_durations_;
+ Array<Rhythmic_tuple> now_durations_;
+ Array<Rhythmic_tuple> stopped_durations_;
+
+ Spanner * spacing_p_;
+protected:
+ VIRTUAL_COPY_CONS(Translator);
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_post_move_processing ();
+ virtual void do_pre_move_processing ();
+ virtual void do_creation_processing ();
+ virtual void do_removal_processing ();
+public:
+ Spacing_engraver ();
+};
inline int
compare (Rhythmic_tuple const &a, Rhythmic_tuple const &b)
@@ -33,7 +75,8 @@ Spacing_engraver::Spacing_engraver()
void
Spacing_engraver::do_creation_processing ()
{
- spacing_p_ =new Spacing_spanner (SCM_EOL);
+ spacing_p_ =new Spanner (get_property ("basicSpacingSpannerProperties"));
+ Spacing_spanner::set_interface (spacing_p_);
spacing_p_->set_bound (LEFT, unsmob_element (get_property ("currentCommandColumn")));
announce_element (Score_element_info (spacing_p_, 0));
}
diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc
index 827213d9fd..9ba7119034 100644
--- a/lily/spacing-spanner.cc
+++ b/lily/spacing-spanner.cc
@@ -16,11 +16,11 @@
#include "line-of-score.hh"
#include "misc.hh"
-Spacing_spanner::Spacing_spanner (SCM s)
- : Spanner (s)
+void
+Spacing_spanner::set_interface (Score_element*me)
{
- set_extent_callback (0, X_AXIS);
- set_extent_callback (0, Y_AXIS);
+ me->set_extent_callback (0, X_AXIS);
+ me->set_extent_callback (0, Y_AXIS);
}
/*
@@ -36,8 +36,8 @@ Spacing_spanner::Spacing_spanner (SCM s)
TODO: write comments
*/
-Array<Spring>
-Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
+void
+Spacing_spanner::do_measure (Score_element*me, Link_array<Score_element> cols)
{
Moment shortest;
Moment mean_shortest;
@@ -46,7 +46,7 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
int n = 0;
for (int i =0 ; i < cols.size (); i++)
{
- if (cols[i]->musical_b ())
+ if (dynamic_cast<Paper_column*> (cols[i])->musical_b ())
{
SCM st = cols[i]->get_elt_property ("shortest-starter-duration");
Moment this_shortest = (*SMOB_TO_TYPE(Moment, st));
@@ -60,15 +60,13 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
}
mean_shortest /= n;
- Array<Spring> meas_springs;
-
- Real non_musical_space_strength = paper_l ()->get_var ("breakable_column_space_strength");
+ Real non_musical_space_strength = me->paper_l ()->get_var ("breakable_column_space_strength");
for (int i= 0; i < cols.size () - 1; i++)
{
- Item * l = cols[i];
- Item * r = cols[i+1];
- Item * lb = l->find_prebroken_piece (RIGHT);
- Item * rb = r->find_prebroken_piece (LEFT);
+ Item * l = dynamic_cast<Item*> (cols[i]);
+ Item * r = dynamic_cast<Item*> (cols[i+1]);
+ Item * lb = dynamic_cast<Item*> ( l->find_prebroken_piece (RIGHT));
+ Item * rb = dynamic_cast<Item*> ( r->find_prebroken_piece (LEFT));
Item* combinations[4][2]={{l,r}, {lb,r}, {l,rb},{lb,rb}};
@@ -96,11 +94,11 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
// 2nd condition should be (i+1 < col_count()), ie. not the last column in score. FIXME
else if (!lc->musical_b() && i+1 < cols.size ())
{
- left_distance= default_bar_spacing (lc,rc,shortest);
+ left_distance= default_bar_spacing (me,lc,rc,shortest);
}
else if (lc->musical_b())
{
- left_distance = note_spacing (lc, rc, shortest);
+ left_distance = note_spacing (me,lc, rc, shortest);
}
s.distance_f_ = left_distance;
@@ -112,10 +110,10 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
We want the space before barline to be like the note
spacing in the measure.
*/
- if (lc->breakable_b () || lc->original_l_)
+ if (Item::breakable_b (lc) || lc->original_l_)
s.strength_f_ = non_musical_space_strength;
else if (!lc->musical_b ())
- left_distance *= paper_l ()->get_var ("decrease_nonmus_spacing_factor");
+ left_distance *= me->paper_l ()->get_var ("decrease_nonmus_spacing_factor");
Real right_dist = 0.0;
@@ -135,11 +133,11 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
if (lc->musical_b () && rc->musical_b ())
{
if (!to_boolean (rc->get_elt_property ("contains-grace")))
- right_dist *= paper_l ()->get_var ("musical_to_musical_left_spacing_factor");
+ right_dist *= me->paper_l ()->get_var ("musical_to_musical_left_spacing_factor");
}
if (rc->musical_b () && to_boolean (rc->get_elt_property ("contains-grace")))
- right_dist *= paper_l ()->get_var ("before_grace_spacing_factor");
+ right_dist *= me->paper_l ()->get_var ("before_grace_spacing_factor");
s.distance_f_ = left_distance + right_dist;
@@ -170,30 +168,29 @@ Spacing_spanner::do_measure (Link_array<Paper_column> cols) const
else
s.strength_f_ /= stretch_dist;
- meas_springs.push (s);
+ s.add_to_cols ();
}
}
-
- return meas_springs;
+
}
/**
Do something if breakable column has no spacing hints set.
*/
Real
-Spacing_spanner::default_bar_spacing (Paper_column *lc, Paper_column *rc,
- Moment shortest) const
+Spacing_spanner::default_bar_spacing (Score_element*me, Score_element *lc, Score_element *rc,
+ Moment shortest)
{
Real symbol_distance = lc->extent (X_AXIS)[RIGHT] ;
Real durational_distance = 0;
- Moment delta_t = rc->when_mom () - lc->when_mom () ;
+ Moment delta_t = Paper_column::when_mom (rc) - Paper_column::when_mom (lc);
/*
ugh should use shortest_playing distance
*/
if (delta_t)
{
- durational_distance = get_duration_space (delta_t, shortest);
+ durational_distance = get_duration_space (me, delta_t, shortest);
}
return symbol_distance >? durational_distance;
@@ -201,7 +198,7 @@ Spacing_spanner::default_bar_spacing (Paper_column *lc, Paper_column *rc,
/**
- Get the measure wide constant for arithmetic spacing.
+ Get the measure wide ant for arithmetic spacing.
@see
John S. Gourlay. ``Spacing a Line of Music,'' Technical Report
@@ -210,42 +207,47 @@ Spacing_spanner::default_bar_spacing (Paper_column *lc, Paper_column *rc,
*/
Real
-Spacing_spanner::get_duration_space (Moment d, Moment shortest) const
+Spacing_spanner::get_duration_space (Score_element*me, Moment d, Moment shortest)
{
Real log = log_2 (Moment (1,8) <? shortest);
- Real k= paper_l ()->get_var ("arithmetic_basicspace")
+ Real k= me->paper_l ()->get_var ("arithmetic_basicspace")
- log;
- return (log_2 (d) + k) * paper_l ()->get_var ("arithmetic_multiplier");
+ return (log_2 (d) + k) * me->paper_l ()->get_var ("arithmetic_multiplier");
}
Real
-Spacing_spanner::note_spacing (Paper_column *lc, Paper_column *rc, Moment shortest) const
+Spacing_spanner::note_spacing (Score_element*me, Score_element *lc, Score_element *rc, Moment shortest)
{
Moment shortest_playing_len = 0;
SCM s = lc->get_elt_property ("shortest-playing-duration");
- // SCM s = lc->get_elt_property ("mean-playing-duration");
- if (SMOB_IS_TYPE_B(Moment, s))
- shortest_playing_len = *SMOB_TO_TYPE (Moment, s);
+ // SCM s = lc->get_elt_property ("mean-playing-duration");
+ if (unsmob_moment (s))
+ shortest_playing_len = *unsmob_moment(s);
if (! shortest_playing_len)
{
- programming_error ("can't find a ruling note at " + lc->when_mom ().str ());
+ programming_error ("can't find a ruling note at " + Paper_column::when_mom (lc).str ());
shortest_playing_len = 1;
}
if (! shortest)
{
- programming_error ("no minimum in measure at " + lc->when_mom ().str ());
+ programming_error ("no minimum in measure at " + Paper_column::when_mom (lc).str ());
shortest = 1;
}
- Moment delta_t = rc->when_mom () - lc->when_mom ();
- Real dist = get_duration_space (shortest_playing_len, shortest);
+ Moment delta_t = Paper_column::when_mom (rc) - Paper_column::when_mom (lc);
+ Real dist = get_duration_space (me, shortest_playing_len, shortest);
dist *= (double)(delta_t / shortest_playing_len);
- dist += stem_dir_correction (lc,rc);
+ /*
+ UGH: KLUDGE!
+ */
+
+ if (delta_t > Moment (1,32))
+ dist += stem_dir_correction (me, lc,rc);
return dist;
}
@@ -264,17 +266,16 @@ Spacing_spanner::note_spacing (Paper_column *lc, Paper_column *rc, Moment shorte
TODO: lookup correction distances? More advanced correction?
Possibly turn this off?
+ TODO: have to check wether the stems are in the same staff.
+
This routine reads the DIR-LIST property of both its L and R arguments. */
Real
-Spacing_spanner::stem_dir_correction (Paper_column*l, Paper_column*r) const
+Spacing_spanner::stem_dir_correction (Score_element*me, Score_element*l, Score_element*r)
{
SCM dl = l->get_elt_property ("dir-list");
SCM dr = r->get_elt_property ("dir-list");
- if (dl == SCM_UNDEFINED || dr == SCM_UNDEFINED)
- return 0.0;
-
-
- if (scm_ilength (dl) != 1 && scm_ilength (dr) != 1)
+
+ if (scm_ilength (dl) != 1 || scm_ilength (dr) != 1)
return 0.;
dl = gh_car (dl);
@@ -289,44 +290,35 @@ Spacing_spanner::stem_dir_correction (Paper_column*l, Paper_column*r) const
bool err = false;
Real correction = 0.0;
- Real ssc = paper_l ()->get_var("stemSpacingCorrection");
+ Real ssc = me->paper_l ()->get_var("stemSpacingCorrection");
- if (d1 && d2)
+ if (d1 && d2 && d1 * d2 == -1)
{
- if (d1 == 1 && d2 == -1)
- correction = ssc;
- else if (d1 == -1 && d2 == 1)
- correction = -ssc;
- else
- err = true;
+ correction = d1 * ssc;
}
-
else
- err = true;
-
- if (err)
programming_error ("Stem directions not set correctly for optical correction");
return correction;
}
-Array<Spring>
-Spacing_spanner::get_springs () const
+MAKE_SCHEME_CALLBACK(Spacing_spanner, set_springs);
+SCM
+Spacing_spanner::set_springs (SCM smob)
{
- Array<Spring> springs;
-
- Link_array<Paper_column> all (pscore_l_->line_l_->column_l_arr ()) ;
+ Score_element *me = unsmob_element (smob);
+ Link_array<Score_element> all (me->pscore_l_->line_l_->column_l_arr ()) ;
int j = 0;
for (int i = 1; i < all.size (); i++)
{
- Paper_column* sc = dynamic_cast<Paper_column*> (all[i]);
- if (sc->breakable_b ())
+ Score_element *sc = all[i];
+ if (Item::breakable_b (sc))
{
- Link_array<Paper_column> measure (all.slice (j, i+1));
- springs.concat (do_measure (measure));
+ Link_array<Score_element> measure (all.slice (j, i+1));
+ do_measure (me, measure);
j = i;
}
}
@@ -334,9 +326,8 @@ Spacing_spanner::get_springs () const
/*
farewell, cruel world
*/
- ((Spacing_spanner*)this)->suicide ();
-
- return springs;
+ me->suicide ();
+ return SCM_UNDEFINED;
}
diff --git a/lily/spanner.cc b/lily/spanner.cc
index b272827ba4..f9cb12f4c1 100644
--- a/lily/spanner.cc
+++ b/lily/spanner.cc
@@ -232,38 +232,6 @@ Spanner::broken_b() const
return broken_into_l_arr_.size();
}
-Array<Rod>
-Spanner::get_rods () const
-{
- Array<Rod> r;
- return r;
-}
-
-Array<Spring>
-Spanner::get_springs () const
-{
- Array<Spring> s;
- return s;
-}
-
-void
-Spanner::do_space_processing ()
-{
- Array<Rod> rs (get_rods ());
- for (int i=0; i < rs.size (); i++)
- {
- rs[i].add_to_cols ();
- }
-
- Array<Spring> ss (get_springs ());
- for (int i=0; i < ss.size (); i++)
- {
- if (isinf (ss[i].distance_f_))
- programming_error ("weird spring");
- else
- ss[i].add_to_cols ();
- }
-}
/*
If this is a broken spanner, return the amount the left end is to be
diff --git a/lily/spring.cc b/lily/spring.cc
index 41a7e1772d..e5136a82ff 100644
--- a/lily/spring.cc
+++ b/lily/spring.cc
@@ -10,6 +10,7 @@
#include "spring.hh"
#include "debug.hh"
#include "item.hh"
+#include "spaceable-element.hh"
#include "paper-column.hh"
Spring::Spring ()
@@ -22,7 +23,9 @@ Spring::Spring ()
void
Spring::add_to_cols ()
{
- item_l_drul_[LEFT]->column_l ()->add_spring (item_l_drul_[RIGHT]->column_l (), distance_f_, strength_f_);
+ Spaceable_element::add_spring (item_l_drul_[LEFT]->column_l (),
+ item_l_drul_[RIGHT]->column_l (),
+ distance_f_, strength_f_);
}
diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc
index 259d69feeb..2b5367aab2 100644
--- a/lily/stem-engraver.cc
+++ b/lily/stem-engraver.cc
@@ -12,7 +12,7 @@
#include "musical-request.hh"
#include "misc.hh"
#include "stem-tremolo.hh"
-
+#include "item.hh"
#include "translator-group.hh"
#include "engraver.hh"
@@ -34,7 +34,7 @@ protected:
private:
int default_tremolo_type_i_;
- Stem *stem_p_;
+ Score_element *stem_p_;
Score_element *tremolo_p_;
Rhythmic_req *rhythmic_req_l_;
Tremolo_req* tremolo_req_l_;
@@ -77,7 +77,8 @@ Stem_engraver::acknowledge_element(Score_element_info i)
int duration_log = r->duration_.durlog_i_;
if (!stem_p_)
{
- stem_p_ = new Stem (get_property ("basicStemProperties"));
+ stem_p_ = new Item (get_property ("basicStemProperties"));
+ Stem::set_interface (stem_p_);
Staff_symbol_referencer::set_interface(stem_p_);
diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc
index a0797cff86..fff6f5c056 100644
--- a/lily/stem-tremolo.cc
+++ b/lily/stem-tremolo.cc
@@ -13,8 +13,7 @@
#include "paper-def.hh"
#include "lookup.hh"
#include "stem.hh"
-#include "offset.hh"
-
+#include "item.hh"
#include "staff-symbol-referencer.hh"
#include "directional-element-interface.hh"
@@ -45,7 +44,7 @@ Stem_tremolo::brew_molecule (SCM smob)
{
Score_element *me= unsmob_element (smob);
Score_element * stem = unsmob_element (me->get_elt_property ("stem"));
- Beam * beam = Stem::beam_l (stem);
+ Score_element * beam = Stem::beam_l (stem);
Real dydx;
if (beam)
@@ -54,8 +53,8 @@ Stem_tremolo::brew_molecule (SCM smob)
SCM s = beam->get_elt_property ("height");
if (gh_number_p (s))
dy = gh_scm2double (s);
- Real dx = beam->last_visible_stem ()->relative_coordinate (0, X_AXIS)
- - beam->first_visible_stem ()->relative_coordinate (0, X_AXIS);
+ Real dx = Beam::last_visible_stem (beam)->relative_coordinate (0, X_AXIS)
+ - Beam::first_visible_stem (beam)->relative_coordinate (0, X_AXIS);
dydx = dx ? dy/dx : 0;
}
else
@@ -79,7 +78,7 @@ Stem_tremolo::brew_molecule (SCM smob)
// huh?
tremolo_flags = 1;
- int mult = beam ? beam->get_multiplicity () : 0;
+ int mult = beam ? Beam::get_multiplicity (beam) : 0;
Real interbeam_f = me->paper_l ()->interbeam_f (mult);
Molecule mol;
for (int i = 0; i < tremolo_flags; i++)
diff --git a/lily/stem.cc b/lily/stem.cc
index 1b7d72042a..a8583c450a 100644
--- a/lily/stem.cc
+++ b/lily/stem.cc
@@ -25,7 +25,7 @@
#include "group-interface.hh"
#include "cross-staff.hh"
#include "staff-symbol-referencer.hh"
-
+#include "spanner.hh"
void
@@ -213,16 +213,6 @@ Stem::add_head (Score_element*me, Score_element *n)
}
}
-Stem::Stem (SCM s)
- : Item (s)
-{
- Score_element * me = this;
-
- me->set_elt_property ("heads", SCM_EOL);
- Stem::set_interface (me);
- me->add_offset_callback ( &Stem::off_callback, X_AXIS);
-}
-
bool
Stem::invisible_b (Score_element*me)
{
@@ -516,11 +506,11 @@ Stem::off_callback (Score_element * me, Axis)
-Beam*
+Score_element*
Stem::beam_l (Score_element*me)
{
SCM b= me->get_elt_property ("beam");
- return dynamic_cast<Beam*> (unsmob_element (b));
+ return unsmob_element (b);
}
@@ -528,7 +518,7 @@ Stem::beam_l (Score_element*me)
Stem_info
Stem::calc_stem_info (Score_element*me)
{
- Beam * beam = beam_l (me);
+ Score_element * beam = beam_l (me);
Direction beam_dir = Directional_element_interface (beam).get ();
if (!beam_dir)
@@ -540,9 +530,9 @@ Stem::calc_stem_info (Score_element*me)
Real staff_space = Staff_symbol_referencer::staff_space (me);
Real half_space = staff_space / 2;
- Real interbeam_f = me->paper_l ()->interbeam_f (beam->get_multiplicity ());
+ Real interbeam_f = me->paper_l ()->interbeam_f (Beam::get_multiplicity (beam));
Real thick = gh_scm2double (beam->get_elt_property ("beam-thickness"));
- int multiplicity = beam->get_multiplicity ();
+ int multiplicity = Beam::get_multiplicity (beam);
Stem_info info;
info.idealy_f_ = chord_start_f (me);
@@ -626,7 +616,7 @@ Stem::calc_stem_info (Score_element*me)
if (gh_number_p (s))
info.idealy_f_ -= gh_scm2double (s);
- Real interstaff_f = -beam_dir* calc_interstaff_dist (dynamic_cast<Item*> (me), beam);
+ Real interstaff_f = -beam_dir* calc_interstaff_dist (dynamic_cast<Item*> (me), dynamic_cast<Spanner*> (beam));
info.idealy_f_ += interstaff_f;
info.miny_f_ += interstaff_f;
@@ -642,7 +632,9 @@ Stem::has_interface (Score_element*m)
}
void
-Stem::set_interface (Score_element*m)
-{
- return m->set_interface (ly_symbol2scm ("stem-interface"));
+Stem::set_interface (Score_element*me)
+{
+ me->set_elt_property ("heads", SCM_EOL);
+ me->add_offset_callback ( &Stem::off_callback, X_AXIS);
+ me->set_interface (ly_symbol2scm ("stem-interface"));
}
diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc
index 323b502845..2f9c366195 100644
--- a/lily/system-start-delimiter-engraver.cc
+++ b/lily/system-start-delimiter-engraver.cc
@@ -14,6 +14,7 @@
#include "group-interface.hh"
#include "paper-column.hh"
#include "paper-def.hh"
+#include "spanner.hh"
class System_start_delimiter_engraver : public Engraver
{
@@ -41,9 +42,9 @@ System_start_delimiter_engraver::acknowledge_element (Score_element_info inf)
Pointer_group_interface (delim_).add_element (inf.elem_l_);
}
- else if (System_start_delimiter * b = dynamic_cast<System_start_delimiter *> (inf.elem_l_))
+ else if (System_start_delimiter::has_interface (inf.elem_l_))
{
- SCM gl = b->get_elt_property ("glyph");
+ SCM gl = inf.elem_l_->get_elt_property ("glyph");
SCM my_gl = delim_->get_elt_property ("glyph");
/*
@@ -51,7 +52,7 @@ System_start_delimiter_engraver::acknowledge_element (Score_element_info inf)
*/
if (gh_symbol_p (gl) && gl == ly_symbol2scm ("brace")
&& gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
- b->translate_axis ( -paper_l ()->get_var ("interline"), X_AXIS); // ugh
+ inf.elem_l_->translate_axis ( -paper_l ()->get_var ("interline"), X_AXIS); // ugh
}
}
@@ -64,7 +65,8 @@ System_start_delimiter_engraver::System_start_delimiter_engraver()
void
System_start_delimiter_engraver::do_creation_processing()
{
- delim_ = new System_start_delimiter (get_property ("basicSystemStartDelimiterProperties"));
+ delim_ = new Spanner (get_property ("basicSystemStartDelimiterProperties"));
+ System_start_delimiter::set_interface (delim_);
delim_->set_bound (LEFT, unsmob_element (get_property ("currentCommandColumn")));
/*
diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc
index 20bb3fc306..23bf7e7fac 100644
--- a/lily/system-start-delimiter.cc
+++ b/lily/system-start-delimiter.cc
@@ -8,29 +8,30 @@
*/
#include <math.h>
+#include "axis-group-interface.hh"
#include "system-start-delimiter.hh"
#include "paper-def.hh"
#include "molecule.hh"
-#include "axis-group-interface.hh"
#include "lookup.hh"
#include "all-font-metrics.hh"
+#include "spanner.hh"
Molecule
-System_start_delimiter::staff_bracket (Real height) const
+System_start_delimiter::staff_bracket (Score_element*me,Real height)
{
- Paper_def* p= paper_l ();
+ Paper_def* p= me->paper_l ();
SCM scmss = p->get_scmvar ("staffspace");
Real ss = gh_scm2double (scmss);
- Real arc_height = gh_scm2double (get_elt_property("arch-height")) * ss ;
+ Real arc_height = gh_scm2double (me->get_elt_property("arch-height")) * ss ;
SCM at = gh_list (ly_symbol2scm ("bracket"),
- scm_product (get_elt_property ("arch-angle"), scmss),
- scm_product (get_elt_property ("arch-width"), scmss),
+ scm_product (me->get_elt_property ("arch-angle"), scmss),
+ scm_product (me->get_elt_property ("arch-width"), scmss),
gh_double2scm (arc_height),
- scm_product (get_elt_property ("bracket-width"),scmss),
+ scm_product (me->get_elt_property ("bracket-width"),scmss),
gh_double2scm (height),
- scm_product (get_elt_property ("arch-thick"),scmss),
- scm_product (get_elt_property ("bracket-thick"),scmss),
+ scm_product (me->get_elt_property ("arch-thick"),scmss),
+ scm_product (me->get_elt_property ("bracket-thick"),scmss),
SCM_UNDEFINED);
Real h = height + 2 * arc_height;
@@ -40,19 +41,26 @@ System_start_delimiter::staff_bracket (Real height) const
return mol;
}
-System_start_delimiter::System_start_delimiter (SCM s)
- : Spanner (s)
+void
+System_start_delimiter::set_interface (Score_element*me)
+{
+ me->set_extent_callback (0, Y_AXIS);
+ Pointer_group_interface (me).set_interface();
+ me->set_interface (ly_symbol2scm ("system-start-delimiter-interface"));
+}
+
+bool
+System_start_delimiter::has_interface (Score_element*me)
{
- set_extent_callback (0, Y_AXIS);
- Pointer_group_interface (this).set_interface();
+ return me->has_interface (ly_symbol2scm ("system-start-delimiter-interface"));
}
Molecule
-System_start_delimiter::simple_bar (Real h) const
+System_start_delimiter::simple_bar (Score_element*me,Real h)
{
- Real w = paper_l ()->get_var ("stafflinethickness") *
- gh_scm2double (get_elt_property ("thickness"));
- return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
+ Real w = me->paper_l ()->get_var ("stafflinethickness") *
+ gh_scm2double (me->get_elt_property ("thickness"));
+ return me->lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
}
MAKE_SCHEME_CALLBACK(System_start_delimiter,after_line_breaking);
@@ -82,31 +90,28 @@ MAKE_SCHEME_CALLBACK(System_start_delimiter,brew_molecule);
SCM
System_start_delimiter::brew_molecule (SCM smob)
{
- Score_element * sc = unsmob_element (smob);
-
- System_start_delimiter * ssd= dynamic_cast<System_start_delimiter*> (sc);
-
- Interval ext = Axis_group_interface::group_extent_callback (sc, Y_AXIS);
+ Score_element * me = unsmob_element (smob);
+ Interval ext = Axis_group_interface::group_extent_callback (me, Y_AXIS);
Real l = ext.length ();
Molecule m;
- SCM s = sc->get_elt_property ("collapse-height");
+ SCM s = me->get_elt_property ("collapse-height");
if (gh_number_p (s) && l < gh_scm2double (s))
{
- sc->suicide();
+ me->suicide();
return SCM_EOL;
}
- s = sc->get_elt_property ("glyph");
+ s = me->get_elt_property ("glyph");
if (!gh_symbol_p(s))
return SCM_EOL;
if (s == ly_symbol2scm ("bracket"))
- m = ssd->staff_bracket (l);
+ m = staff_bracket (me,l);
else if (s == ly_symbol2scm ("brace"))
- m = ssd-> staff_brace (l);
+ m = staff_brace (me,l);
else if (s == ly_symbol2scm ("bar-line"))
- m = ssd->simple_bar (l);
+ m = simple_bar (me,l);
m.translate_axis (ext.center (), Y_AXIS);
@@ -117,9 +122,9 @@ System_start_delimiter::brew_molecule (SCM smob)
Ugh. Suck me plenty.
*/
Molecule
-System_start_delimiter::staff_brace (Real y) const
+System_start_delimiter::staff_brace (Score_element*me,Real y)
{
- Real staffht = paper_l ()->get_var ("staffheight");
+ Real staffht = me->paper_l ()->get_var ("staffheight");
int staff_size = int (rint (staffht ));
// URG
diff --git a/lily/tie-column.cc b/lily/tie-column.cc
index 10008dc2fa..cd3badc526 100644
--- a/lily/tie-column.cc
+++ b/lily/tie-column.cc
@@ -13,19 +13,23 @@
#include "directional-element-interface.hh"
#include "rhythmic-head.hh"
-Tie_column::Tie_column (SCM s)
- : Spanner (s)
-{
-}
+
void
Tie_column::set_interface (Score_element*me)
{
- me-> set_elt_property ("ties", SCM_EOL);
+ me-> set_elt_property ("ties", SCM_EOL);
+ me->set_interface (ly_symbol2scm ("tie-column"));
me->set_extent_callback (0, X_AXIS);
me->set_extent_callback (0, Y_AXIS);
}
+bool
+Tie_column::has_interface (Score_element*me)
+{
+ return me->has_interface (ly_symbol2scm ("tie-column"));
+}
+
void
Tie_column::add_tie (Score_element*me,Tie *s)
{
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc
index 4f619e27ae..09c4d47c60 100644
--- a/lily/tie-engraver.cc
+++ b/lily/tie-engraver.cc
@@ -49,7 +49,7 @@ class Tie_engraver : public Engraver
Array<CHead_melodic_tuple> stopped_heads_;
Link_array<Tie> tie_p_arr_;
- Tie_column * tie_column_p_;
+ Spanner * tie_column_p_;
void set_melisma (bool);
@@ -199,7 +199,7 @@ Tie_engraver::process_acknowledged ()
}
else if (tie_p_arr_.size () > 1 && !tie_column_p_)
{
- tie_column_p_ = new Tie_column (get_property ("basicTieColumnProperties"));
+ tie_column_p_ = new Spanner (get_property ("basicTieColumnProperties"));
Tie_column::set_interface (tie_column_p_);
for (int i = tie_p_arr_.size (); i--; )
Tie_column::add_tie (tie_column_p_,tie_p_arr_ [i]);
diff --git a/lily/tie.cc b/lily/tie.cc
index 9b655230a0..13acee6ea7 100644
--- a/lily/tie.cc
+++ b/lily/tie.cc
@@ -168,23 +168,28 @@ Tie::after_line_breaking (SCM smob)
}
-
-Array<Rod>
-Tie::get_rods () const
+MAKE_SCHEME_CALLBACK(Tie,set_spacing_rods);
+SCM
+Tie::set_spacing_rods (SCM smob)
{
- Array<Rod> a;
+ Score_element*me = unsmob_element (smob);
+ Spanner*sp = dynamic_cast<Spanner*> (me);
Rod r;
- r.item_l_drul_ [LEFT]=get_bound (LEFT);
- r.item_l_drul_ [RIGHT]=get_bound (RIGHT);
+ r.item_l_drul_ [LEFT]=sp->get_bound (LEFT);
+ r.item_l_drul_ [RIGHT]=sp->get_bound (RIGHT);
- r.distance_f_ = paper_l ()->get_var ("tie_x_minimum");
- a.push (r);
- return a;
+ r.distance_f_ = me->paper_l ()->get_var ("tie_x_minimum");
+ r.add_to_cols ();
+ return SCM_UNDEFINED;
}
-MAKE_SCHEME_CALLBACK(Tie,brew_molecule);
+
+
+
+
+MAKE_SCHEME_CALLBACK(Tie,brew_molecule);
SCM
Tie::brew_molecule (SCM smob)
{
diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc
index 071e55e03b..6fcdba950e 100644
--- a/lily/tuplet-engraver.cc
+++ b/lily/tuplet-engraver.cc
@@ -15,6 +15,7 @@
#include "beam.hh"
#include "music-list.hh"
#include "engraver.hh"
+#include "spanner.hh"
class Tuplet_engraver : public Engraver
{
@@ -96,17 +97,17 @@ Tuplet_engraver::acknowledge_element (Score_element_info i)
if (grace != wgb)
return;
- if (Note_column *nc = dynamic_cast<Note_column *> (i.elem_l_))
+ if (Note_column::has_interface(i.elem_l_))
{
for (int j =0; j <started_span_p_arr_.size (); j++)
if (started_span_p_arr_[j])
- Tuplet_spanner::add_column (started_span_p_arr_[j],nc);
+ Tuplet_spanner::add_column (started_span_p_arr_[j], dynamic_cast<Item*>(i.elem_l_));
}
- else if (Beam *b = dynamic_cast<Beam *> (i.elem_l_))
+ else if (Beam::has_interface (i.elem_l_))
{
for (int j = 0; j < started_span_p_arr_.size (); j++)
if (started_span_p_arr_[j])
- Tuplet_spanner::add_beam (started_span_p_arr_[j],b);
+ Tuplet_spanner::add_beam (started_span_p_arr_[j],i.elem_l_);
}
}
diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc
index 87a528f12b..10ddf98876 100644
--- a/lily/tuplet-spanner.cc
+++ b/lily/tuplet-spanner.cc
@@ -20,6 +20,7 @@
#include "dimensions.hh"
#include "group-interface.hh"
#include "directional-element-interface.hh"
+#include "spanner.hh"
@@ -65,8 +66,8 @@ Tuplet_spanner::brew_molecule (SCM smob)
if (gh_pair_p (me->get_elt_property ("columns")))
{
- Link_array<Note_column> column_arr=
- Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
+ Link_array<Score_element> column_arr=
+ Pointer_group_interface__extract_elements (me, (Score_element*)0, "columns");
Real ncw = column_arr.top ()->extent(X_AXIS).length ();
Real w = dynamic_cast<Spanner*>(me)->spanner_length () + ncw;
@@ -123,8 +124,8 @@ Tuplet_spanner::brew_molecule (SCM smob)
void
Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real * dy)
{
- Link_array<Note_column> column_arr=
- Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
+ Link_array<Score_element> column_arr=
+ Pointer_group_interface__extract_elements (me, (Score_element*)0, "columns");
Score_element * common = me->common_refpoint (me->get_elt_property ("columns"), Y_AXIS);
@@ -135,11 +136,11 @@ Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real *
Use outer non-rest columns to determine slope
*/
int l = 0;
- while (l <column_arr.size() && column_arr[l]->rest_b())
+ while (l <column_arr.size() && Note_column::rest_b(column_arr[l]))
l ++;
int r = column_arr.size ()- 1;
- while (r >= l && column_arr[r]->rest_b())
+ while (r >= l && Note_column::rest_b(column_arr[r]))
r--;
if (l < r)
@@ -180,9 +181,8 @@ Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real *
void
Tuplet_spanner::calc_dy (Score_element*me,Real * dy)
{
- Link_array<Note_column> column_arr=
- Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
-
+ Link_array<Score_element> column_arr=
+ Pointer_group_interface__extract_elements (me, (Score_element*)0, "columns");
Direction d = Directional_element_interface (me).get ();
*dy = column_arr.top ()->extent (Y_AXIS) [d]
@@ -224,7 +224,7 @@ Tuplet_spanner::after_line_breaking (SCM smob)
{
SCM bs = me->get_elt_property ("beams");
Score_element *b = unsmob_element (gh_car (bs));
- Beam * beam_l = dynamic_cast<Beam*> (b);
+ Spanner * beam_l = dynamic_cast<Spanner *> (b);
if (!sp->broken_b ()
&& sp->get_bound (LEFT)->column_l () == beam_l->get_bound (LEFT)->column_l ()
&& sp->get_bound (RIGHT)->column_l () == beam_l->get_bound (RIGHT)->column_l ())
@@ -249,9 +249,8 @@ Tuplet_spanner::get_default_dir (Score_element*me)
d = UP ;
for (SCM s = me->get_elt_property ("columns"); gh_pair_p (s); s = gh_cdr (s))
{
- Score_element * sc = unsmob_element (gh_car (s));
- Note_column * nc = dynamic_cast<Note_column*> (sc);
- if (nc->dir () < 0)
+ Score_element * nc = unsmob_element (gh_car (s));
+ if (Note_column::dir (nc) < 0)
{
d = DOWN;
break;
@@ -264,7 +263,7 @@ Tuplet_spanner::get_default_dir (Score_element*me)
void
Tuplet_spanner::add_beam (Score_element*me, Score_element *b)
{
-me->add_dependency (b);
+ me->add_dependency (b);
Pointer_group_interface gi (me, "beams");
gi.add_element (b);
}