From: Han-Wen Nienhuys Date: Tue, 4 Jul 2000 16:15:56 +0000 (+0200) Subject: release: 1.3.69 X-Git-Tag: release/1.3.69 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0af2486a28f1c60b9de929a9101964d880927e54;p=lilypond.git release: 1.3.69 =========== * 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 --- diff --git a/CHANGES b/CHANGES index 31c3968012..36ed28852a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,39 @@ +1.3.68.hwn1 +=========== + +* 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.68 ====== @@ -1592,7 +1628,7 @@ pl 15.jcn4 - removed old notename2scm conversion - beam-dir-algorithm through scm - bfs paper-scm - - bf: knee-stemlengths +gv - bf: knee-stemlengths pl 15.jcn3 - moved poor man's stem arrays to scm diff --git a/Documentation/faq.texi b/Documentation/faq.texi index fb738a93df..aa35683a34 100644 --- a/Documentation/faq.texi +++ b/Documentation/faq.texi @@ -75,35 +75,6 @@ yourself: @end example -@subsubsection Some of your neat scripts fail, what directories do you use: - -[This only applies if you don't do @code{make install}, and run out -of the source directory] - -I have a directory which contains all our development projects -@example - - ~/usr/ - -@end example - -which looks like @file{/usr/} -@example - - bin/ - share - lib/ - share/ - src/ - - etc.... - -@end example - -@file{~/usr/bin/} is in the variable PATH, and contains symbolic links -to the compiled executables. Unpacked sources, releases and patches are -in subdirectories under @file{~/usr/src/}. - @subsubsection Is there an emacs mode? Yes. It is included with the source archive as @file{lilypond-mode.el}. diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely index e25c9789df..57217c95a4 100644 --- a/Documentation/regression-test.tely +++ b/Documentation/regression-test.tely @@ -407,5 +407,9 @@ setting the @code{extra-offset} of an output object. @mudelafile{generic-output-property.ly} +The same mechanism can be used to force pagebreaks. + +@mudelafile{between-systems.ly} + @bye diff --git a/VERSION b/VERSION index 37215af175..9c8701a77f 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=68 +PATCH_LEVEL=69 MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a diff --git a/input/bugs/lyric-warning.ly b/input/bugs/lyric-warning.ly new file mode 100644 index 0000000000..15e127b9a5 --- /dev/null +++ b/input/bugs/lyric-warning.ly @@ -0,0 +1,6 @@ +% f.ly:4:20: warning: Must stop before this music ends: + + +\score { \notes { + \addlyrics { c4 } { f4} +}} diff --git a/input/trip.ly b/input/trip.ly index 5ca69f53eb..c661e62277 100644 --- a/input/trip.ly +++ b/input/trip.ly @@ -158,7 +158,10 @@ fugaIIPedal = \notes \relative c { \clef bass; %15 - dis4.-\ltoe e8-\rtoe cis4 | + % + % TODO: the volta typesetting should spread over the complete score. + % + \repeat "volta" 2 { dis4.-\ltoe } \alternative { e8-\rtoe cis4 } | b4.-\lheel [cis8-\ltoe dis8-\rtoe e8-\rheel] | fis4.-\rtoe [e8-\rheel dis8-\rtoe cis8-\ltoe] | dis4-\rtoe e4-\rheel e,4-\ltoe | diff --git a/lily/align-interface.cc b/lily/align-interface.cc index fdeefe5d29..200bd8d6c4 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -8,7 +8,7 @@ */ #include "align-interface.hh" -#include "dimension-cache.hh" + #include "score-element.hh" #include "group-interface.hh" #include "axis-group-interface.hh" @@ -23,7 +23,7 @@ Align_interface::alignment_callback (Score_element *sc, Axis ax) Score_element * par = sc->parent_l (ax); if (par && par->get_elt_property ("alignment-done") == SCM_UNDEFINED) { - Align_interface (par).do_side_processing (ax); + Align_interface::do_side_processing (par, ax); } return 0.0; } @@ -32,7 +32,7 @@ Align_interface::alignment_callback (Score_element *sc, Axis ax) Real Align_interface::center_on_element (Score_element *me, Axis a) { - Score_element *cent = unsmob_element (me->get_elt_pointer ("group-center-element")); + Score_element *cent = unsmob_element (me->get_elt_property ("group-center-element")); if (cent) { @@ -47,11 +47,11 @@ Align_interface::center_on_element (Score_element *me, Axis a) from the outside by setting minimum-space and extra-space in its children */ void -Align_interface::do_side_processing (Axis a) +Align_interface::do_side_processing (Score_element * me, Axis a) { - elt_l_->set_elt_property ("alignment-done", SCM_BOOL_T); + me->set_elt_property ("alignment-done", SCM_BOOL_T); - SCM d = elt_l_->get_elt_property ("stacking-dir"); + SCM d = me->get_elt_property ("stacking-dir"); Direction stacking_dir = gh_number_p(d) ? to_dir (d) : CENTER; if (!stacking_dir) stacking_dir = DOWN; @@ -61,10 +61,10 @@ Align_interface::do_side_processing (Axis a) Link_array elems; Link_array all_elts - = Pointer_group_interface__extract_elements ( elt_l_, (Score_element*) 0, "elements"); + = Pointer_group_interface__extract_elements ( me, (Score_element*) 0, "elements"); for (int i=0; i < all_elts.size(); i++) { - Interval y = all_elts[i]->extent(a) + all_elts[i]->relative_coordinate (elt_l_, a); + Interval y = all_elts[i]->extent(a) + all_elts[i]->relative_coordinate (me, a); if (!y.empty_b()) { Score_element *e =dynamic_cast(all_elts[i]); @@ -95,7 +95,7 @@ Align_interface::do_side_processing (Axis a) Interval threshold = Interval (0, Interval::infinity ()); - SCM thr = elt_l_->get_elt_property ("threshold"); + SCM thr = me->get_elt_property ("threshold"); if (gh_pair_p (thr)) { threshold[SMALLER] = gh_scm2double (gh_car (thr)); @@ -122,9 +122,9 @@ Align_interface::do_side_processing (Axis a) Axis -Align_interface::axis ()const +Align_interface::axis (Score_element*me) { - return Axis (gh_scm2int (gh_car (elt_l_->get_elt_property ("axes")))); + return Axis (gh_scm2int (gh_car (me->get_elt_property ("axes")))); } @@ -132,9 +132,9 @@ Align_interface::axis ()const should use generic Scm funcs. */ int -Align_interface::get_count (Score_element*s)const +Align_interface::get_count (Score_element*me,Score_element*s) { - SCM e = elt_l_->get_elt_pointer ("elements"); + SCM e = me->get_elt_property ("elements"); int c =0; while (gh_pair_p (e)) { @@ -147,38 +147,30 @@ Align_interface::get_count (Score_element*s)const } void -Align_interface::add_element (Score_element* s) +Align_interface::add_element (Score_element*me,Score_element* s) { - s->add_offset_callback (alignment_callback, axis ()); - Axis_group_interface (elt_l_).add_element (s); + s->add_offset_callback (alignment_callback, Align_interface::axis (me)); + Axis_group_interface::add_element (me, s); } -Align_interface::Align_interface (Score_element const*s) -{ - elt_l_ = (Score_element*)s; -} void -Align_interface::set_interface () +Align_interface::set_interface (Score_element*me) { - Axis_group_interface (elt_l_).set_interface (); + me->set_interface (ly_symbol2scm ("align-interface")); - Group_interface (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Alignment")); + Axis_group_interface::set_interface (me); } void -Align_interface::set_axis (Axis a) +Align_interface::set_axis (Score_element*me,Axis a) { - Axis_group_interface (elt_l_).set_axes (a,a ); + Axis_group_interface::set_axes (me, a,a ); } bool -Align_interface::has_interface_b () +Align_interface::has_interface (Score_element*me) { - SCM ifs = elt_l_->get_elt_property ("interfaces"); - if (!gh_pair_p (ifs)) - return false; - - return scm_memq (ly_symbol2scm ("Alignment"), ifs) != SCM_BOOL_F; + return me && me->has_interface (ly_symbol2scm ("align-interface")); } diff --git a/lily/align-note-column-engraver.cc b/lily/align-note-column-engraver.cc index 2ffb4d178a..cbe7a931f0 100644 --- a/lily/align-note-column-engraver.cc +++ b/lily/align-note-column-engraver.cc @@ -14,13 +14,14 @@ #include "warn.hh" #include "directional-element-interface.hh" #include "side-position-interface.hh" +#include "local-key-item.hh" /** Catch notes, and put them in a row. Used for aligning grace notes. */ class Align_note_column_engraver: public Engraver { - Grace_align_item * align_item_p_; + Item * align_item_p_; Note_column * now_column_l_; Score_element * accidental_l_; @@ -44,9 +45,10 @@ Align_note_column_engraver::Align_note_column_engraver() void Align_note_column_engraver::do_creation_processing () { - align_item_p_ = new Grace_align_item (get_property ("basicGraceAlignItemProperties")); - Side_position_interface (align_item_p_).set_axis (X_AXIS); - Side_position_interface (align_item_p_).set_direction (LEFT); + align_item_p_ = new Item (get_property ("basicGraceAlignItemProperties")); + Grace_align_item::set_interface (align_item_p_); + Side_position::set_axis (align_item_p_, X_AXIS); + Side_position::set_direction (align_item_p_, LEFT); // needed for setting font size. announce_element (Score_element_info (align_item_p_, 0)); @@ -73,7 +75,7 @@ Align_note_column_engraver::acknowledge_element (Score_element_info inf) { now_column_l_ =n; } - else if (to_boolean (inf.elem_l_->get_elt_property ("accidentals-interface"))) + else if (Local_key_item::has_interface (inf.elem_l_)) { accidental_l_ = inf.elem_l_; } @@ -105,7 +107,7 @@ Align_note_column_engraver::process_acknowledged () if (now_column_l_) { - Align_interface (align_item_p_).add_element (now_column_l_); + Align_interface::add_element (align_item_p_,now_column_l_); now_column_l_ =0; } } diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 433f469f67..d912bb9585 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -1,3 +1,4 @@ + /* auto-beam-engraver.cc -- implement Auto_beam_engraver @@ -7,13 +8,54 @@ */ #include "beaming.hh" -#include "auto-beam-engraver.hh" #include "musical-request.hh" #include "beam.hh" #include "stem.hh" #include "debug.hh" -#include "timing-engraver.hh" #include "engraver-group-engraver.hh" +#include "bar.hh" +#include "rest.hh" +#include "engraver.hh" + +class Auto_beam_engraver : public Engraver +{ +public: + Auto_beam_engraver (); + VIRTUAL_COPY_CONS (Translator); + +protected: + virtual bool do_try_music (Music*); + virtual void do_pre_move_processing (); + virtual void do_post_move_processing (); + virtual void do_removal_processing (); + virtual void acknowledge_element (Score_element_info); + virtual void do_process_music (); + virtual void process_acknowledged (); +private: + void begin_beam (); + void consider_end_and_begin (Moment test_mom); + Beam* 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_; + Link_array* stem_l_arr_p_; + + Moment last_add_mom_; + Moment extend_mom_; + Moment beam_start_moment_; + Moment beam_start_location_; + + // We act as if beam were created, and start a grouping anyway. + Beaming_info_list*grouping_p_; + Beaming_info_list*finished_grouping_p_; +}; + + + ADD_THIS_TRANSLATOR (Auto_beam_engraver); @@ -29,15 +71,8 @@ Auto_beam_engraver::Auto_beam_engraver () finished_beam_p_ = 0; finished_grouping_p_ = 0; grouping_p_ = 0; - timer_l_ =0; } -void -Auto_beam_engraver::do_creation_processing () -{ - Translator * t = daddy_grav_l ()->get_simple_translator ("Timing_engraver"); - timer_l_ = dynamic_cast (t); -} bool Auto_beam_engraver::do_try_music (Music*) @@ -54,12 +89,11 @@ Auto_beam_engraver::do_process_music () void Auto_beam_engraver::consider_end_and_begin (Moment test_mom) { - if (!timer_l_) - return; - - int num; - int den; - timer_l_->get_time_signature (&num, &den); + Moment one_beat = *unsmob_moment( get_property ("beatLength")); + + int num = *unsmob_moment (get_property("measureLength")) / one_beat; + int den = one_beat.den_i (); + String time_str = String ("time") + to_str (num) + "_" + to_str (den); @@ -168,7 +202,7 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) Rational r; if (end_mom) - r = timer_l_->measure_position ().mod_rat (end_mom); + r = unsmob_moment (get_property ("measurePosition"))->mod_rat (end_mom); else r = Moment (1); @@ -183,7 +217,7 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) return; if (begin_mom) - r = timer_l_->measure_position ().mod_rat (begin_mom); + r = unsmob_moment (get_property ("measurePosition"))->mod_rat (begin_mom); if (!stem_l_arr_p_ && (!begin_mom || !r)) begin_beam (); } @@ -193,11 +227,11 @@ void Auto_beam_engraver::begin_beam () { assert (!stem_l_arr_p_); - stem_l_arr_p_ = new Array; + stem_l_arr_p_ = new Link_array; assert (!grouping_p_); grouping_p_ = new Beaming_info_list; beam_start_moment_ = now_mom (); - beam_start_location_ = timer_l_->measure_position (); + beam_start_location_ = *unsmob_moment (get_property ("measurePosition")); } Beam* @@ -210,7 +244,7 @@ Auto_beam_engraver::create_beam_p () /* watch out for stem tremolos and abbreviation beams */ - if ((*stem_l_arr_p_)[i]->beam_l ()) + if (Stem::beam_l ((*stem_l_arr_p_)[i])) { return 0; } @@ -299,7 +333,7 @@ Auto_beam_engraver::same_grace_state_b (Score_element* e) void Auto_beam_engraver::acknowledge_element (Score_element_info info) { - if (!same_grace_state_b (info.elem_l_) || !timer_l_) + if (!same_grace_state_b (info.elem_l_)) return; if (stem_l_arr_p_) @@ -308,18 +342,20 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info) { end_beam (); } - else if (to_boolean (info.elem_l_->get_elt_property ("bar-interface"))) + else if (Bar::has_interface (info.elem_l_)) { end_beam (); } - else if (to_boolean (info.elem_l_->get_elt_property ("rest-interface"))) + else if (Rest::has_interface (info.elem_l_)) { end_beam (); } } - if (Stem* stem_l = dynamic_cast (info.elem_l_)) + if (Stem::has_interface (info.elem_l_)) { + Item* stem_l = dynamic_cast (info.elem_l_); + Rhythmic_req *rhythmic_req = dynamic_cast (info.req_l_); if (!rhythmic_req) { @@ -330,14 +366,14 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info) /* Don't (start) auto-beam over empty stems; skips or rests */ - if (!stem_l->heads_i ()) + if (!Stem::heads_i (stem_l)) { if (stem_l_arr_p_) end_beam (); return; } - if (stem_l->beam_l ()) + if (!Stem::beam_l (stem_l)) { if (stem_l_arr_p_) junk_beam (); diff --git a/lily/axis-group-engraver.cc b/lily/axis-group-engraver.cc index f5266ecdd4..25ed6142d9 100644 --- a/lily/axis-group-engraver.cc +++ b/lily/axis-group-engraver.cc @@ -10,7 +10,7 @@ #include "spanner.hh" #include "paper-column.hh" #include "axis-group-interface.hh" -#include "dimension-cache.hh" + #include "engraver-group-engraver.hh" Axis_group_engraver::Axis_group_engraver () @@ -22,8 +22,8 @@ void Axis_group_engraver::do_creation_processing () { staffline_p_ = get_spanner_p (); - Axis_group_interface (staffline_p_).set_interface (); - Axis_group_interface (staffline_p_).set_axes (Y_AXIS, Y_AXIS); + Axis_group_interface::set_interface (staffline_p_); + Axis_group_interface::set_axes (staffline_p_, Y_AXIS, Y_AXIS); Score_element * it = unsmob_element (get_property ("currentCommandColumn")); Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_); @@ -84,9 +84,9 @@ Axis_group_engraver::process_acknowledged () { Score_element *par = elts_[i]->parent_l (Y_AXIS); - if ((!par || !Axis_group_interface (par).has_interface_b ()) + if ((!par || !Axis_group_interface::has_interface (par)) && ! elts_[i]->empty_b (Y_AXIS)) - Axis_group_interface (staffline_p_).add_element (elts_[i]); + Axis_group_interface::add_element (staffline_p_, elts_[i]); } elts_.clear (); } diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index f426b856c9..12eac16329 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -9,39 +9,26 @@ #include "axis-group-interface.hh" #include "score-element.hh" -#include "dimension-cache.hh" - -Axis_group_interface::Axis_group_interface (Score_element*s) -{ - elt_l_ = s; -} - -Axis_group_interface -Axis_group_interface (Score_element*s) -{ - return Axis_group_interface (s); -} void -Axis_group_interface::add_element (Score_element *e) +Axis_group_interface::add_element (Score_element*me,Score_element *e) { - for (SCM ax = elt_l_->get_elt_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax)) + for (SCM ax = me->get_elt_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax)) { Axis a = (Axis) gh_scm2int (gh_car (ax)); if (!e->parent_l (a)) - e->set_parent (elt_l_, a); + e->set_parent (me, a); } - Pointer_group_interface (elt_l_).add_element (e); - elt_l_->add_dependency (e); + Pointer_group_interface (me).add_element (e); + me->add_dependency (e); } - bool -Axis_group_interface::axis_b (Axis a )const +Axis_group_interface::axis_b (Score_element*me,Axis a ) { - return elt_l_->has_extent_callback_b (group_extent_callback, a); + return me->has_extent_callback_b (group_extent_callback, a); } Interval @@ -63,38 +50,28 @@ Axis_group_interface::group_extent_callback (Score_element *me, Axis a) { Score_element * common =(Score_element*) me; - for (SCM s = me->get_elt_pointer ("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)) { Score_element * se = unsmob_element (gh_car (s)); common = se->common_refpoint (common, a); } Real my_coord = me->relative_coordinate (common, a); - Interval r (relative_group_extent (a, common, me->get_elt_pointer ("elements"))); + Interval r (relative_group_extent (a, common, me->get_elt_property ("elements"))); return r - my_coord; } -void -Axis_group_interface::set_interface () -{ - if (!has_interface_b ()) - { - elt_l_->set_elt_pointer ("elements", SCM_EOL); - - Group_interface (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group")); - } -} void -Axis_group_interface::set_axes (Axis a1, Axis a2) +Axis_group_interface::set_axes (Score_element*me,Axis a1, Axis a2) { // set_interface () ? SCM sa1= gh_int2scm (a1); SCM sa2 = gh_int2scm (a2); - SCM prop = elt_l_->get_elt_property ("axes"); + SCM prop = me->get_elt_property ("axes"); if (prop == SCM_UNDEFINED || scm_memq (sa1, prop) == SCM_BOOL_F @@ -103,45 +80,51 @@ Axis_group_interface::set_axes (Axis a1, Axis a2) SCM ax = gh_cons (sa1, SCM_EOL); if (a1 != a2) ax= gh_cons (sa2, ax); - elt_l_->set_elt_property ("axes", ax); + me->set_elt_property ("axes", ax); } if (a1 != X_AXIS && a2 != X_AXIS) - elt_l_->set_extent_callback (0, X_AXIS); + me->set_extent_callback (0, X_AXIS); if (a1 != Y_AXIS && a2 != Y_AXIS) - elt_l_->set_extent_callback (0, Y_AXIS); + me->set_extent_callback (0, Y_AXIS); - elt_l_->set_extent_callback (Axis_group_interface::group_extent_callback,a1); - elt_l_->set_extent_callback (Axis_group_interface::group_extent_callback,a2); + me->set_extent_callback (Axis_group_interface::group_extent_callback,a1); + me->set_extent_callback (Axis_group_interface::group_extent_callback,a2); } Link_array -Axis_group_interface::get_children () +Axis_group_interface::get_children (Score_element*me) { Link_array childs; - childs.push (elt_l_) ; + childs.push (me) ; - if (!has_interface_b ()) + if (!has_interface (me)) return childs; - for (SCM ep = elt_l_->get_elt_pointer ("elements"); gh_pair_p (ep); ep = gh_cdr (ep)) + for (SCM ep = me->get_elt_property ("elements"); gh_pair_p (ep); ep = gh_cdr (ep)) { Score_element* e = unsmob_element (gh_car (ep)); if (e) - childs.concat (Axis_group_interface (e).get_children ()); + childs.concat (Axis_group_interface::get_children (e)); } return childs; } bool -Axis_group_interface::has_interface_b () +Axis_group_interface::has_interface (Score_element*me) { - SCM ifs = elt_l_->get_elt_property ("interfaces"); - - if (!gh_pair_p (ifs )) - return false; - return scm_memq (ly_symbol2scm ("Axis_group"),ifs) != SCM_BOOL_F; + return me && me->has_interface (ly_symbol2scm ("axis-group-interface")); } + +void +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); + } +} diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc index b7a240b604..3451841d66 100644 --- a/lily/bar-engraver.cc +++ b/lily/bar-engraver.cc @@ -7,15 +7,16 @@ Jan Nieuwenhuizen */ +#include "bar.hh" #include "score-engraver.hh" #include "bar-engraver.hh" -#include "staff-bar.hh" #include "musical-request.hh" #include "multi-measure-rest.hh" #include "command-request.hh" #include "timing-engraver.hh" #include "engraver-group-engraver.hh" #include "warn.hh" +#include "item.hh" Bar_engraver::Bar_engraver() { @@ -28,13 +29,8 @@ Bar_engraver::create_bar () { if (!bar_p_) { - bar_p_ = new Staff_bar (get_property ("basicBarProperties")); - + bar_p_ = new Item (get_property ("basicBarProperties")); - // urg: "" != empty... - /* - TODO: use symbol. - */ SCM default_type = get_property ("defaultBarType"); if (gh_string_p (default_type)) { @@ -48,7 +44,6 @@ Bar_engraver::create_bar () /** Make a barline. If there are both |: and :| requested, merge them to :|:. - */ void Bar_engraver::request_bar (String requested_type) diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index 13b50e0a6e..5b29f4a19f 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -73,7 +73,7 @@ void Bar_number_engraver::acknowledge_element (Score_element_info inf) { Score_element * s = inf.elem_l_; - if (dynamic_cast (s)) + if (Staff_symbol::has_interface (s)) { staffs_ = gh_cons (inf.elem_l_->self_scm_, staffs_); } @@ -93,7 +93,7 @@ Bar_number_engraver::do_pre_move_processing () { if (text_p_) { - text_p_->set_elt_pointer ("side-support-elements", staffs_); + text_p_->set_elt_property ("side-support-elements", staffs_); typeset_element (text_p_); text_p_ =0; } @@ -108,8 +108,7 @@ Bar_number_engraver::create_items () SCM b = get_property ("basicBarNumberProperties"); text_p_ = new Item (b); - Side_position_interface staffside(text_p_); - staffside.set_axis (Y_AXIS); + Side_position::set_axis(text_p_,Y_AXIS); SCM prop = get_property ("barNumberDirection"); if (!isdir_b (prop)) diff --git a/lily/bar.cc b/lily/bar.cc index 8b9ecadc60..19716114dd 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -9,7 +9,7 @@ #include "main.hh" #include "dimensions.hh" -#include "dimension-cache.hh" +#include "score-element.hh" #include "bar.hh" #include "string.hh" #include "molecule.hh" @@ -17,65 +17,56 @@ #include "lookup.hh" #include "debug.hh" #include "all-font-metrics.hh" +#include "item.hh" +#include "staff-symbol-referencer.hh" -Bar::Bar (SCM s) - : Item (s) -{ -} - - -Real -Bar::get_bar_size () const -{ - // Never called! - return 0; -} - +MAKE_SCHEME_CALLBACK(Bar,brew_molecule); SCM Bar::brew_molecule (SCM smob) { - Score_element * self = unsmob_element (smob); - Bar * fly = dynamic_cast (self); - SCM s = self->get_elt_property ("glyph"); - if (gh_string_p (s)) + Score_element * me = unsmob_element (smob); + + SCM s = me->get_elt_property ("glyph"); + SCM barsiz_proc = me->get_elt_property ("barsize-procedure"); + if (gh_string_p (s) && gh_procedure_p (barsiz_proc)) { String str =ly_scm2string (s); - return fly->compound_barline (str, fly->get_bar_size ()).create_scheme (); + SCM siz = gh_call1 (barsiz_proc, me->self_scm_); + return compound_barline (me, str, gh_scm2double (siz)).create_scheme (); } return SCM_EOL; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Bar,brew_molecule); Molecule -Bar::compound_barline (String str, Real h) const +Bar::compound_barline (Score_element*me, String str, Real h) { - Real kern = gh_scm2double (get_elt_property ("kern")); - Real thinkern = gh_scm2double (get_elt_property ("thin-kern")); - Real hair = gh_scm2double (get_elt_property ("hair-thickness")); - Real fatline = gh_scm2double (get_elt_property ("thick-thickness")); + Real kern = gh_scm2double (me->get_elt_property ("kern")); + Real thinkern = gh_scm2double (me->get_elt_property ("thin-kern")); + Real hair = gh_scm2double (me->get_elt_property ("hair-thickness")); + Real fatline = gh_scm2double (me->get_elt_property ("thick-thickness")); - Real staffline = paper_l ()->get_var ("stafflinethickness"); + Real staffline = me->paper_l ()->get_var ("stafflinethickness"); kern *= staffline; thinkern *= staffline; hair *= staffline; fatline *= staffline; - Molecule thin = simple_barline (hair, h); - Molecule thick = simple_barline (fatline, h); - Molecule colon = lookup_l ()->afm_find ("dots-repeatcolon"); + Molecule thin = simple_barline (me, hair, h); + Molecule thick = simple_barline (me, fatline, h); + Molecule colon = me->lookup_l ()->afm_find ("dots-repeatcolon"); Molecule m; if (str == "") { - return lookup_l ()->blank (Box (Interval(0, 0), Interval (-h/2, h/2))); + return me->lookup_l ()->blank (Box (Interval(0, 0), Interval (-h/2, h/2))); } if (str == "scorepostbreak") { - return simple_barline (paper_l ()->get_var ("barthick_score"), h); + return simple_barline (me, me->paper_l ()->get_var ("barthick_score"), h); } else if (str == "|") { @@ -126,19 +117,22 @@ Bar::compound_barline (String str, Real h) const Molecule -Bar::simple_barline (Real w, Real h) const +Bar::simple_barline (Score_element*me,Real w, Real h) { - return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); + return me->lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); } +MAKE_SCHEME_CALLBACK(Bar,before_line_breaking ); -GLUE_SCORE_ELEMENT(Bar,before_line_breaking ); SCM -Bar::member_before_line_breaking () +Bar::before_line_breaking (SCM smob) { - SCM g = get_elt_property ("glyph"); + Score_element*me=unsmob_element (smob); + Item * item = dynamic_cast (me); + + SCM g = me->get_elt_property ("glyph"); SCM orig = g; - Direction bsd = break_status_dir (); + Direction bsd = item->break_status_dir (); if (gh_string_p (g)) { if (bsd) @@ -157,15 +151,42 @@ Bar::member_before_line_breaking () if (!gh_string_p (g)) { - set_elt_property ("molecule-callback", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); + me->set_elt_property ("molecule-callback", SCM_BOOL_T); + me->set_extent_callback (0, X_AXIS); // leave y_extent for spanbar? } else if (! gh_equal_p (g, orig)) - set_elt_property ("glyph", g); + me->set_elt_property ("glyph", g); return SCM_UNDEFINED; } +void +Bar::set_interface (Score_element*me) +{ + me->set_elt_property ("interfaces", + gh_cons (ly_symbol2scm ("bar-interface"), me->get_elt_property ("interfaces"))); +} +bool +Bar::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("bar-interface")); +} + + +MAKE_SCHEME_CALLBACK(Bar,get_staff_bar_size); +SCM +Bar::get_staff_bar_size (SCM smob) +{ + Score_element*me = unsmob_element (smob); + Real ss = Staff_symbol_referencer::staff_space (me); + SCM size = me->get_elt_property ("bar-size"); + if (gh_number_p (size)) + return gh_double2scm (gh_scm2double(size)*ss); + else + { + return gh_double2scm ((Staff_symbol_referencer::line_count (me) -1) * ss); + } +} diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index 61fbd4997e..dedbad0dd0 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -183,14 +183,14 @@ Beam_engraver::acknowledge_element (Score_element_info info) { if (beam_p_) { - if (to_boolean (info.elem_l_->get_elt_property("rest-interface"))) + if (Rest::has_interface (info.elem_l_)) { info.elem_l_->add_offset_callback (Beam::rest_collision_callback, Y_AXIS); } - else if (to_boolean (info.elem_l_->get_elt_property ("stem-interface"))) + else if (Stem::has_interface (info.elem_l_)) { - Stem *stem_l = dynamic_cast (info.elem_l_); - if (stem_l->beam_l ()) + Item *stem_l = dynamic_cast (info.elem_l_); + if (Stem::beam_l (stem_l)) return; bool stem_grace = stem_l->get_elt_property ("grace") == SCM_BOOL_T; diff --git a/lily/beam.cc b/lily/beam.cc index c007e311bf..604c4d356b 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -35,7 +35,9 @@ Beam::Beam (SCM s) : Spanner (s) { - Pointer_group_interface g (this, "stems"); + Score_element*me =this; + + Pointer_group_interface g (me, "stems"); g.set_interface (); set_elt_property ("height", gh_int2scm (0)); // ugh. @@ -43,29 +45,31 @@ Beam::Beam (SCM s) } void -Beam::add_stem (Stem*s) +Beam::add_stem (Score_element*s) { - Pointer_group_interface gi (this, "stems"); + Score_element*me =this; + Pointer_group_interface gi (me, "stems"); gi.add_element (s); - s->add_dependency (this); + s->add_dependency (me); - assert (!s->beam_l ()); - s->set_elt_pointer ("beam", self_scm_); + assert (!Stem::beam_l (s)); + s->set_elt_property ("beam", self_scm_); - add_bound_item (this, s); + add_bound_item (dynamic_cast (me), dynamic_cast (s)); } int Beam::get_multiplicity () const { + Score_element*me =(Score_element*)this; int m = 0; - for (SCM s = get_elt_pointer ("stems"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = me->get_elt_property ("stems"); gh_pair_p (s); s = gh_cdr (s)) { Score_element * sc = unsmob_element (gh_car (s)); - if (Stem * st = dynamic_cast (sc)) - m = m >? st->beam_count (LEFT) >? st->beam_count (RIGHT); + if (Stem::has_interface (sc)) + m = m >? Stem::beam_count (sc,LEFT) >? Stem::beam_count (sc,RIGHT); } return m; } @@ -78,23 +82,27 @@ Beam::get_multiplicity () const [Alternatively, stems could set its own directions, according to their beam, during 'final-pre-processing'.] */ -GLUE_SCORE_ELEMENT(Beam,before_line_breaking); +MAKE_SCHEME_CALLBACK(Beam,before_line_breaking); SCM -Beam::member_before_line_breaking () +Beam::before_line_breaking (SCM smob) { + + Score_element * beam = unsmob_element (smob); + Beam * me =dynamic_cast (beam); + // Why? - if (visible_stem_count () < 2) + if (me->visible_stem_count () < 2) { warning (_ ("beam has less than two stems")); } - 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 (me->get_default_dir ()); - auto_knees (); - set_stem_directions (); - set_stem_shorten (); + me->auto_knees (); + me->set_stem_directions (); + me->set_stem_shorten (); return SCM_EOL; } @@ -110,13 +118,16 @@ Beam::get_default_dir () const Drul_array count; count[UP] = count[DOWN] = 0; Direction d = DOWN; + Spanner*me = (Spanner*)this; + Link_array stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); - for (int i=0; i get_center_distance ((Direction)-d); + : Stem::get_center_distance (s, (Direction)-d); if (current) { @@ -137,10 +148,9 @@ Beam::get_default_dir () const return to_dir (s); /* - If dir is not determined: get from paper + If dir is not determined: get default */ - return (Direction)(int) - paper_l ()->get_var ("stem_default_neutral_direction"); + return to_dir (get_elt_property ("default-neutral-direction")); } @@ -152,10 +162,13 @@ Beam::get_default_dir () const void Beam::set_stem_directions () { + Link_array stems + =Pointer_group_interface__extract_elements (this, (Item*) 0, "stems"); Direction d = Directional_element_interface (this).get (); - for (int i=0; i remove_elt_property ("dir-forced"); if (!gh_boolean_p (force) || !gh_scm2bool (force)) Directional_element_interface (s).set (d); @@ -181,20 +194,24 @@ Beam::auto_knee (String gap_str, bool interstaff_b) { bool knee_b = false; int knee_y = 0; - SCM gap = get_elt_property (gap_str); - Direction d = Directional_element_interface (this).get (); + SCM gap = get_elt_property (gap_str.ch_C()); + Spanner* me = this; + + Direction d = Directional_element_interface (me).get (); + Link_array stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); if (gh_number_p (gap)) { int auto_gap_i = gh_scm2int (gap); - for (int i=1; i < stem_count (); i++) + for (int i=1; i < stems.size (); i++) { - bool is_b = (bool)(calc_interstaff_dist (stem (i), this) - - calc_interstaff_dist (stem (i-1), this)); - int l_y = (int)(stem (i-1)->head_positions()[d]) - + (int)calc_interstaff_dist (stem (i-1), this); - int r_y = (int)(stem (i)->head_positions()[d]) - + (int)calc_interstaff_dist (stem (i), this); + bool is_b = (bool)(calc_interstaff_dist (stems[i], me) + - calc_interstaff_dist (stems[i-1], me)); + int l_y = (int)(Stem::head_positions(stems[i-1])[d]) + + (int)calc_interstaff_dist (stems[i-1], me); + int r_y = (int)(Stem::head_positions(stems[i])[d]) + + (int)calc_interstaff_dist (stems[i], me); int gap_i = r_y - l_y; if ((abs (gap_i) >= auto_gap_i) && (!interstaff_b || is_b)) @@ -207,12 +224,11 @@ Beam::auto_knee (String gap_str, bool interstaff_b) } if (knee_b) { - for (int i=0; i < stem_count (); i++) + for (int i=0; i < stems.size (); i++) { - Item *s = stem(i); - int y = (int)(stem (i)->head_positions()[d]) - + (int)calc_interstaff_dist (s, this); - + Item *s = stems[i]; + int y = (int)(Stem::head_positions(s)[d]) + + (int)calc_interstaff_dist (s, me); Directional_element_interface (s).set (y < knee_y ? UP : DOWN); s->set_elt_property ("dir-forced", SCM_BOOL_T); @@ -230,6 +246,7 @@ Beam::auto_knee (String gap_str, bool interstaff_b) void Beam::set_stem_shorten () { + Spanner*me = this; if (!visible_stem_count ()) return; @@ -247,8 +264,7 @@ Beam::set_stem_shorten () int sz = scm_ilength (shorten); - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + Real staff_space = Staff_symbol_referencer::staff_space (me); SCM shorten_elt = scm_list_ref (shorten, gh_int2scm (multiplicity stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); + + for (int i=0; i < stems.size (); i++) { - Stem* s = stem (i); - if (s->invisible_b ()) + Item* s = stems[i]; + if (Stem::invisible_b (s)) continue; if (gh_number_p (s->get_elt_property ("shorten"))) s->set_elt_property ("shorten", gh_double2scm (shorten_f)); @@ -270,20 +289,23 @@ Beam::set_stem_shorten () Set elt properties height and y-position if not set. Adjust stem lengths to reach beam. */ -GLUE_SCORE_ELEMENT(Beam,after_line_breaking); +MAKE_SCHEME_CALLBACK(Beam,after_line_breaking); SCM -Beam::member_after_line_breaking () +Beam::after_line_breaking (SCM smob) { + Score_element * beam = unsmob_element (smob); + Beam * me =dynamic_cast (beam); + /* first, calculate y, dy */ Real y, dy; - calc_default_position_and_height (&y, &dy); - if (visible_stem_count ()) + me->calc_default_position_and_height (&y, &dy); + if (me->visible_stem_count ()) { - if (suspect_slope_b (y, dy)) + if (me->suspect_slope_b (y, dy)) dy = 0; - Real damped_dy = calc_slope_damping_f (dy); - Real quantised_dy = quantise_dy_f (damped_dy); + Real damped_dy = me->calc_slope_damping_f (dy); + Real quantised_dy = me->quantise_dy_f (damped_dy); y += (dy - quantised_dy) / 2; dy = quantised_dy; @@ -291,22 +313,22 @@ Beam::member_after_line_breaking () /* until here, we used only stem_info, which acts as if dir=up */ - y *= Directional_element_interface (this).get (); - dy *= Directional_element_interface (this).get (); + y *= Directional_element_interface (me).get (); + dy *= Directional_element_interface (me).get (); + - Staff_symbol_referencer_interface st (this); - Real half_space = st.staff_space () / 2; + Real half_space = Staff_symbol_referencer::staff_space (me) / 2; /* check for user-override of dy */ - SCM s = remove_elt_property ("height-hs"); + SCM s = me->remove_elt_property ("height-hs"); if (gh_number_p (s)) { dy = gh_scm2double (s) * half_space; } - set_elt_property ("height", gh_double2scm (dy)); + me->set_elt_property ("height", gh_double2scm (dy)); /* check for user-override of y */ - s = remove_elt_property ("y-position-hs"); + s = me->remove_elt_property ("y-position-hs"); if (gh_number_p (s)) { y = gh_scm2double (s) * half_space; @@ -314,11 +336,11 @@ Beam::member_after_line_breaking () else { /* we can modify y, so we should quantise y */ - Real y_shift = check_stem_length_f (y, dy); + Real y_shift = me->check_stem_length_f (y, dy); y += y_shift; - y = quantise_y_f (y, dy, 0); - set_stem_length (y, dy); - y_shift = check_stem_length_f (y, dy); + y = me->quantise_y_f (y, dy, 0); + me->set_stem_length (y, dy); + y_shift = me->check_stem_length_f (y, dy); if (y_shift > half_space / 4) { @@ -330,15 +352,14 @@ Beam::member_after_line_breaking () */ int quant_dir = 0; if (abs (y_shift) > half_space / 2) - quant_dir = sign (y_shift) * Directional_element_interface (this).get (); - y = quantise_y_f (y, dy, quant_dir); + quant_dir = sign (y_shift) * Directional_element_interface (me).get (); + y = me->quantise_y_f (y, dy, quant_dir); } } // UGH. Y is not in staff position unit? // Ik dacht datwe daar juist van weg wilden? - set_stem_length (y, dy); - set_elt_property ("y-position", gh_double2scm (y)); - + me->set_stem_length (y, dy); + me->set_elt_property ("y-position", gh_double2scm (y)); return SCM_UNDEFINED; } @@ -349,13 +370,14 @@ Beam::member_after_line_breaking () void Beam::calc_default_position_and_height (Real* y, Real* dy) const { + Spanner*me = (Spanner*)this; *y = 0; *dy = 0; if (visible_stem_count () <= 1) return; - Real first_ideal = first_visible_stem ()->calc_stem_info ().idealy_f_; - if (first_ideal == last_visible_stem ()->calc_stem_info ().idealy_f_) + Real first_ideal = Stem::calc_stem_info (first_visible_stem ()).idealy_f_; + if (first_ideal == Stem::calc_stem_info (last_visible_stem ()).idealy_f_) { *dy = 0; *y = first_ideal; @@ -364,13 +386,16 @@ Beam::calc_default_position_and_height (Real* y, Real* dy) const Array ideals; Real x0 = first_visible_stem ()->relative_coordinate (0, X_AXIS); - for (int i=0; i < stem_count (); i++) + Link_array stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); + + for (int i=0; i < stems.size (); i++) { - Stem* s = stem (i); - if (s->invisible_b ()) + Item* s = stems[i]; + if (Stem::invisible_b (s)) continue; ideals.push (Offset (s->relative_coordinate (0, X_AXIS) - x0, - s->calc_stem_info ().idealy_f_)); + Stem::calc_stem_info (s).idealy_f_)); } Real dydx; minimise_least_squares (&dydx, y, ideals); // duh, takes references @@ -386,8 +411,8 @@ Beam::suspect_slope_b (Real y, Real dy) const /* steep slope running against lengthened stem is suspect */ - Real first_ideal = first_visible_stem ()->calc_stem_info ().idealy_f_; - Real last_ideal = last_visible_stem ()->calc_stem_info ().idealy_f_; + 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"); @@ -410,10 +435,8 @@ Beam::suspect_slope_b (Real y, Real dy) const Real Beam::calc_slope_damping_f (Real dy) const { - SCM damp = get_elt_property ("damping"); // remove? - int damping = 1; // ugh. - if (gh_number_p (damp)) - damping = gh_scm2int (damp); + SCM damp = get_elt_property ("damping"); + int damping = gh_scm2int (damp); if (damping) { @@ -427,13 +450,14 @@ Beam::calc_slope_damping_f (Real dy) const } Real -Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const +Beam::calc_stem_y_f (Item* s, Real y, Real dy) const { + Score_element*me = (Score_element*)this; Real thick = gh_scm2double (get_elt_property ("beam-thickness")); thick *= paper_l ()->get_var ("staffspace"); int beam_multiplicity = get_multiplicity (); - int stem_multiplicity = (s->flag_i () - 2) >? 0; + 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); @@ -441,7 +465,7 @@ Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const Real stem_y = (dy && dx ? (s->relative_coordinate (0, X_AXIS) - x0) / dx * dy : 0) + y; /* knee */ - Direction dir = Directional_element_interface(this).get (); + Direction dir = Directional_element_interface(me).get (); Direction sdir = Directional_element_interface (s).get (); /* knee */ @@ -450,35 +474,39 @@ Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const stem_y -= dir * (thick / 2 + (beam_multiplicity - 1) * interbeam_f); - Staff_symbol_referencer_interface me (s); - Staff_symbol_referencer_interface last (last_visible_stem ()); + // huh, why not for first visible? - if (//(s != first_visible_stem ()) && - me.staff_symbol_l () != last.staff_symbol_l ()) - stem_y += Directional_element_interface (this).get () - * (beam_multiplicity - stem_multiplicity) * interbeam_f; - } + if (Staff_symbol_referencer::staff_symbol_l (s) + != Staff_symbol_referencer::staff_symbol_l (last_visible_stem ())) + stem_y += Directional_element_interface (me).get () + * (beam_multiplicity - stem_multiplicity) * interbeam_f; + } + return stem_y; } Real Beam::check_stem_length_f (Real y, Real dy) const { + Score_element * me = (Score_element*)this; Real shorten = 0; Real lengthen = 0; - Direction dir = Directional_element_interface (this).get (); - - for (int i=0; i < stem_count (); i++) + Direction dir = Directional_element_interface (me).get (); + + Link_array stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); + + for (int i=0; i < stems.size(); i++) { - Stem* s = stem (i); - if (s->invisible_b ()) + Item* s = stems[i]; + if (Stem::invisible_b (s)) continue; Real stem_y = calc_stem_y_f (s, y, dy); stem_y *= dir; - Stem_info info = s->calc_stem_info (); + Stem_info info = Stem::calc_stem_info (s); // if (0 > info.maxy_f_ - stem_y) shorten = shorten stems= + Pointer_group_interface__extract_elements (me, (Item*)0, "stems"); + + + for (int i=0; i < stems.size (); i++) { - Stem* s = stem (i); - if (s->invisible_b ()) + Item* s = stems[i]; + if (Stem::invisible_b (s)) continue; Real stem_y = calc_stem_y_f (s, y, dy); /* caution: stem measures in staff-positions */ - s->set_stemend ((stem_y + calc_interstaff_dist (s, this)) / half_space); + Stem::set_stemend (s,(stem_y + calc_interstaff_dist (s, me)) / half_space); } } @@ -526,6 +559,7 @@ Beam::set_stem_length (Real y, Real dy) Real Beam::quantise_dy_f (Real dy) const { + Score_element*me = (Score_element*)this; Array 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))); @@ -533,8 +567,7 @@ Beam::quantise_dy_f (Real dy) const if (a.size () <= 1) return dy; - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + Real staff_space = Staff_symbol_referencer::staff_space (me); Interval iv = quantise_iv (a, abs (dy)/staff_space) * staff_space; Real q = (abs (dy) - iv[SMALLER] <= iv[BIGGER] - abs (dy)) @@ -556,8 +589,9 @@ Real Beam::quantise_y_f (Real y, Real dy, int quant_dir) { int multiplicity = get_multiplicity (); - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + Score_element*me = (Score_element*)this; + + Real staff_space = Staff_symbol_referencer::staff_space (me); SCM quants = scm_eval (gh_list (ly_symbol2scm ("beam-vertical-position-quants"), gh_int2scm (multiplicity), gh_double2scm (dy/staff_space), @@ -571,7 +605,7 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir) if (a.size () <= 1) return y; - Real up_y = Directional_element_interface (this).get () * y; + Real up_y = Directional_element_interface (me).get () * y; Interval iv = quantise_iv (a, up_y/staff_space) * staff_space; Real q = up_y - iv[SMALLER] <= iv[BIGGER] - up_y @@ -579,19 +613,23 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir) if (quant_dir) q = iv[(Direction)quant_dir]; - return q * Directional_element_interface (this).get (); + return q * Directional_element_interface (me).get (); } void Beam::set_beaming (Beaming_info_list *beaming) { + Score_element*me = this; + Link_array stems= + Pointer_group_interface__extract_elements (me, (Score_element*)0, "stems"); + Direction d = LEFT; - for (int i=0; i < stem_count (); i++) + for (int i=0; i < stems.size(); i++) { do { - if (stem (i)->beam_count (d) == 0) - stem (i)->set_beaming ( beaming->infos_.elem (i).beams_i_drul_[d],d); + if (Stem::beam_count (stems[i], d) == 0) + Stem::set_beaming ( stems[i], beaming->infos_.elem (i).beams_i_drul_[d],d); } while (flip (&d) != LEFT); } @@ -606,8 +644,9 @@ Beam::set_beaming (Beaming_info_list *beaming) clean me up. */ Molecule -Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const +Beam::stem_beams (Item *here, Item *next, Item *prev) const { + 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"); @@ -634,23 +673,23 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const // UGH Real nw_f; - if (!here->first_head ()) + if (!Stem::first_head (here)) nw_f = 0; - else if (here->type_i ()== 1) + else if (Stem::type_i (here)== 1) nw_f = paper_l ()->get_var ("wholewidth"); - else if (here->type_i () == 2) + else if (Stem::type_i (here) == 2) nw_f = paper_l ()->get_var ("notewidth") * 0.8; else nw_f = paper_l ()->get_var ("quartwidth"); - Direction dir = Directional_element_interface (this).get (); + Direction dir = Directional_element_interface (me).get (); /* half beams extending to the left. */ if (prev) { - int lhalfs= lhalfs = here->beam_count (LEFT) - prev->beam_count (RIGHT); - int lwholebeams= here->beam_count (LEFT) beam_count (RIGHT) ; + int lhalfs= lhalfs = Stem::beam_count (here,LEFT) - Stem::beam_count (prev,RIGHT); + int lwholebeams= Stem::beam_count (here,LEFT) beam_count (RIGHT) - next->beam_count (LEFT); - int rwholebeams= here->beam_count (RIGHT) beam_count (LEFT) ; + int rhalfs = Stem::beam_count (here,RIGHT) - Stem::beam_count (next,LEFT); + int rwholebeams= Stem::beam_count (here,RIGHT) relative_coordinate (0, X_AXIS) - here->relative_coordinate (0, X_AXIS); Molecule a = lookup_l ()->beam (dydx, w + stemdx, thick); @@ -701,7 +740,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const for (; j < rwholebeams; j++) { Molecule b (a); - b.translate (Offset (here->invisible_b () ? 0 : gap_f, -dir * bdy * j)); + b.translate (Offset (Stem::invisible_b (here) ? 0 : gap_f, -dir * bdy * j)); rightbeams.add_molecule (b); } @@ -726,42 +765,49 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const return leftbeams; } -GLUE_SCORE_ELEMENT(Beam,brew_molecule); +MAKE_SCHEME_CALLBACK(Beam,brew_molecule); SCM -Beam::member_brew_molecule () const +Beam::brew_molecule (SCM smob) { + Score_element * beam = unsmob_element (smob); + Beam * me =dynamic_cast (beam); + Molecule mol; - if (!stem_count ()) + if (!gh_pair_p (me->get_elt_property ("stems"))) return SCM_EOL; Real x0,dx; - if (visible_stem_count ()) + Link_arraystems = + Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems"); + if (me->visible_stem_count ()) { - x0 = first_visible_stem ()->relative_coordinate (0, X_AXIS); - dx = last_visible_stem ()->relative_coordinate (0, X_AXIS) - x0; + x0 = me->first_visible_stem ()->relative_coordinate (0, X_AXIS); + dx = me->last_visible_stem ()->relative_coordinate (0, X_AXIS) - x0; } else { - x0 = stem (0)->relative_coordinate (0, X_AXIS); - dx = stem_top ()->relative_coordinate (0, X_AXIS) - x0; + x0 = stems[0]->relative_coordinate (0, X_AXIS); + dx = stems.top()->relative_coordinate (0, X_AXIS) - x0; } - Real dy = gh_scm2double (get_elt_property ("height")); + Real dy = gh_scm2double (me->get_elt_property ("height")); Real dydx = dy && dx ? dy/dx : 0; - Real y = gh_scm2double (get_elt_property ("y-position")); - for (int j=0; j get_elt_property ("y-position")); + + + for (int j=0; j 0)? stem (j-1) : 0; - Stem * next = (j < stem_count ()-1) ? stem (j+1) :0; + Item *i = stems[j]; + Item * prev = (j > 0)? stems[j-1] : 0; + Item * next = (j < stems.size()-1) ? stems[j+1] :0; - Molecule sb = stem_beams (i, next, prev); + Molecule sb = me->stem_beams (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 - - get_bound (LEFT)->relative_coordinate (0, X_AXIS), X_AXIS); + - me->get_bound (LEFT)->relative_coordinate (0, X_AXIS), X_AXIS); return mol.create_scheme (); } @@ -769,79 +815,70 @@ Beam::member_brew_molecule () const int Beam::forced_stem_count () const { + Score_element* me = (Score_element*)this; + Link_arraystems = + Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems"); int f = 0; - for (int i=0; i < stem_count (); i++) + for (int i=0; i < stems.size (); i++) { - Stem *s = stem (i); + Item *s = stems[i]; - if (s->invisible_b ()) + if (Stem::invisible_b (s)) continue; - if (((int)s->chord_start_f ()) - && (s->get_direction () != s->get_default_dir ())) + if (((int)Stem::chord_start_f (s)) + && (Stem::get_direction (s ) != Stem::get_default_dir (s ))) f++; } return f; } -/* - TODO: Fix this class. This is wildly inefficient. - And it sux. Yet another array/list 'interface'. - */ -Stem * -Beam::stem (int i) const -{ - return Pointer_group_interface__extract_elements ((Beam*) this, (Stem*) 0, "stems")[i]; -} -int -Beam::stem_count () const -{ - Pointer_group_interface gi (this, "stems"); - return gi.count (); -} -Stem* -Beam::stem_top () const -{ - SCM s = get_elt_pointer ("stems"); - - return gh_pair_p (s) ? dynamic_cast (unsmob_element (gh_car (s))) : 0; -} -/* burp */ +/* TODO: + use filter and standard list functions. + */ int Beam::visible_stem_count () const { + Score_element * me = (Score_element*)this; + Link_arraystems = + Pointer_group_interface__extract_elements (me, (Item*) 0, "stems"); int c = 0; - for (int i = 0; i < stem_count (); i++) + for (int i = stems.size (); i--;) { - if (!stem (i)->invisible_b ()) + if (!Stem::invisible_b (stems[i])) c++; } return c; } -Stem* -Beam::first_visible_stem () const +Item* +Beam::first_visible_stem() const { - for (int i = 0; i < stem_count (); i++) + Score_element * me = (Score_element*)this; + Link_arraystems = + Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems"); + + for (int i = 0; i < stems.size (); i++) { - Stem* s = stem (i); - if (!s->invisible_b ()) - return s; + if (!Stem::invisible_b (stems[i])) + return stems[i]; } return 0; } -Stem* -Beam::last_visible_stem () const +Item* +Beam::last_visible_stem() const { - for (int i = stem_count (); i > 0; i--) + Score_element * me = (Score_element*)this; + Link_arraystems = + Pointer_group_interface__extract_elements ((Beam*) me, (Item*) 0, "stems"); + for (int i = stems.size (); i--;) { - Stem* s = stem (i - 1); - if (!s->invisible_b ()) - return s; + if (!Stem::invisible_b (stems[i])) + return stems[i]; } return 0; } @@ -861,11 +898,11 @@ Beam::rest_collision_callback (Score_element *rest, Axis a ) { assert (a == Y_AXIS); - Score_element * st = unsmob_element (rest->get_elt_pointer ("stem")); - Stem * stem = dynamic_cast (st); + Score_element * st = unsmob_element (rest->get_elt_property ("stem")); + Score_element * stem = st; if (!stem) return 0.0; - Beam * beam = dynamic_cast (unsmob_element (stem->get_elt_pointer ("beam"))); + Beam * beam = dynamic_cast (unsmob_element (stem->get_elt_property ("beam"))); if (!beam || !beam->visible_stem_count ()) return 0.0; @@ -883,16 +920,14 @@ 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 = beam->first_visible_stem()->relative_coordinate (0, X_AXIS); + Real dx = beam->last_visible_stem()->relative_coordinate (0, X_AXIS) - x0; Real dydx = beam_dy && dx ? beam_dy/dx : 0; - Direction d = stem->get_direction (); + Direction d = Stem::get_direction (stem); Real beamy = (stem->relative_coordinate (0, X_AXIS) - x0) * dydx + beam_y; - Staff_symbol_referencer_interface si (rest); - - Real staff_space = si.staff_space (); + Real staff_space = Staff_symbol_referencer::staff_space (rest); Real rest_dim = rest->extent (Y_AXIS)[d]*2.0 / staff_space ; Real minimum_dist @@ -900,7 +935,7 @@ Beam::rest_collision_callback (Score_element *rest, Axis a ) Real dist = minimum_dist + -d * (beamy - rest_dim) >? 0; - int stafflines = si.line_count (); + int stafflines = Staff_symbol_referencer::line_count (rest); // move discretely by half spaces. int discrete_dist = int (ceil (dist)); diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc index f2b59eb272..cd8c9a1b81 100644 --- a/lily/break-align-engraver.cc +++ b/lily/break-align-engraver.cc @@ -9,13 +9,14 @@ #include "engraver.hh" #include "protected-scm.hh" #include "break-align-item.hh" +#include "item.hh" #include "align-interface.hh" #include "axis-group-interface.hh" -#include "dimension-cache.hh" + class Break_align_engraver : public Engraver { - Break_align_item *align_l_; + Item *align_l_; Protected_scm column_alist_; protected: virtual void acknowledge_element(Score_element_info i); @@ -35,7 +36,7 @@ void Break_align_engraver::add_column (SCM smob) { Score_element * e = unsmob_element (smob); - Align_interface (align_l_).add_element (e); + Break_align_item::add_element (align_l_,e); typeset_element (e); } @@ -95,7 +96,8 @@ Break_align_engraver::acknowledge_element (Score_element_info inf) if (!align_l_) { - align_l_ = new Break_align_item (get_property ("basicBreakAlignProperties")); + align_l_ = new Item (get_property ("basicBreakAlignProperties")); + Break_align_item::set_interface (align_l_); announce_element (Score_element_info (align_l_,0)); SCM edge_sym = ly_symbol2scm ("Left_edge_item"); @@ -109,7 +111,7 @@ Break_align_engraver::acknowledge_element (Score_element_info inf) */ edge->set_extent_callback (Score_element::point_dimension_callback,X_AXIS); - align_l_->set_elt_pointer ("group-center-element", edge->self_scm_); + align_l_->set_elt_property ("group-center-element", edge->self_scm_); announce_element (Score_element_info(edge, 0)); column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm_); @@ -126,16 +128,16 @@ Break_align_engraver::acknowledge_element (Score_element_info inf) } else { - group = new Item (SCM_EOL); + group = new Item (get_property ("basicBreakAlignGroupProperties")); - Axis_group_interface (group).set_interface (); - Axis_group_interface (group).set_axes (X_AXIS,X_AXIS); + Axis_group_interface::set_interface (group); + Axis_group_interface::set_axes (group, X_AXIS,X_AXIS); group->set_elt_property ("break-align-symbol", align_name); group->set_parent (align_l_, Y_AXIS); announce_element (Score_element_info (group, 0)); column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm_); } - Axis_group_interface (group).add_element (item_l); + Axis_group_interface::add_element (group, item_l); } } diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc index 2977cde738..53b6eaa232 100644 --- a/lily/break-align-item.cc +++ b/lily/break-align-item.cc @@ -5,40 +5,72 @@ (c) 1997--2000 Han-Wen Nienhuys */ + + #include #include #include "side-position-interface.hh" +#include "axis-group-interface.hh" #include "warn.hh" #include "lily-guile.hh" #include "break-align-item.hh" #include "dimensions.hh" #include "paper-def.hh" #include "paper-column.hh" - #include "group-interface.hh" #include "align-interface.hh" -GLUE_SCORE_ELEMENT(Break_align_item,before_line_breaking); +MAKE_SCHEME_CALLBACK(Break_align_item,before_line_breaking); + SCM -Break_align_item::member_before_line_breaking () +Break_align_item::before_line_breaking (SCM smob) +{ + Score_element* me = unsmob_element (smob); + do_alignment (me); + return SCM_UNDEFINED; +} + +Real +Break_align_item::alignment_callback (Score_element*c, Axis a) { - if (break_status_dir() == LEFT) + assert (a == X_AXIS); + Score_element *par = c->parent_l (a); + if (par && !to_boolean (par->get_elt_property ("break-alignment-done")))\ { - set_elt_property ("self-alignment-X", gh_int2scm (RIGHT)); + par->set_elt_property ("break-alignment-done", SCM_BOOL_T); + Break_align_item::do_alignment (par); + } + + return 0.0; +} + +void +Break_align_item::add_element (Score_element*me, Score_element *toadd) +{ + toadd->add_offset_callback (alignment_callback, X_AXIS); + Axis_group_interface::add_element (me, toadd); +} + +void +Break_align_item::do_alignment (Score_element *me) +{ + Item * item = dynamic_cast (me); + Item *column = item->column_l (); + if (item->break_status_dir() == LEFT) + { + me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT)); } else { - add_offset_callback (Align_interface::center_on_element, X_AXIS); + me->add_offset_callback (Align_interface::center_on_element, X_AXIS); } - - - Real interline= paper_l ()->get_var ("interline"); + Real interline= me->paper_l ()->get_var ("interline"); Link_array elems; Link_array all_elems - = Pointer_group_interface__extract_elements (this, (Score_element*)0, - "elements"); + = Pointer_group_interface__extract_elements (me, (Score_element*)0, + "elements"); for (int i=0; i < all_elems.size(); i++) { @@ -48,7 +80,7 @@ Break_align_item::member_before_line_breaking () } if (!elems.size ()) - return SCM_UNDEFINED; + return; SCM symbol_list = SCM_EOL; Array dists; @@ -104,8 +136,7 @@ Break_align_item::member_before_line_breaking () symbol_list = gh_cdr (scm_reverse (symbol_list)); for (int i=0; i set_elt_property (sym_str, + elems[i]->set_elt_property (gh_car (symbol_list), scm_cons (gh_double2scm (0), gh_double2scm (dists[i+1]))); @@ -126,9 +157,10 @@ Break_align_item::member_before_line_breaking () /* Force callbacks for alignment to be called - */ - Real unused = elems[0]->relative_coordinate (this, X_AXIS); - Real pre_space = elems[0]->relative_coordinate (column_l (), X_AXIS); + */ + Align_interface::do_side_processing (me, X_AXIS); + + Real pre_space = elems[0]->relative_coordinate (column, X_AXIS); Real xl = elems[0]->extent (X_AXIS)[LEFT]; if (!isinf (xl)) @@ -137,7 +169,7 @@ Break_align_item::member_before_line_breaking () programming_error ("Infinity reached. "); Real xr = elems.top ()->extent (X_AXIS)[RIGHT]; - Real spring_len = elems.top ()->relative_coordinate (column_l (), X_AXIS); + Real spring_len = elems.top ()->relative_coordinate (column, X_AXIS); if (!isinf (xr)) spring_len += xr; else @@ -161,25 +193,23 @@ Break_align_item::member_before_line_breaking () The pairs are in the format of an interval (ie. CAR < CDR). */ - column_l ()->set_elt_property ("extra-space", - scm_cons (gh_double2scm (pre_space), - gh_double2scm (spring_len))); + column->set_elt_property ("extra-space", + scm_cons (gh_double2scm (pre_space), + gh_double2scm (spring_len))); - column_l ()->set_elt_property ("stretch-distance", - gh_cons (gh_double2scm (-dists[0]), - gh_double2scm (stretch_distance))); + column->set_elt_property ("stretch-distance", + gh_cons (gh_double2scm (-dists[0]), + gh_double2scm (stretch_distance))); - return SCM_UNDEFINED; } -Break_align_item::Break_align_item (SCM s) - : Item (s) -{ - set_elt_property ("stacking-dir" , gh_int2scm (RIGHT)); - Align_interface (this).set_interface (); - Align_interface (this).set_axis (X_AXIS); +void +Break_align_item::set_interface (Score_element*me) +{ + Align_interface::set_interface (me); + Align_interface::set_axis (me,X_AXIS); - add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); + me->add_offset_callback (Side_position::aligned_on_self, X_AXIS); } diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index 73580c0f2c..8dd2d4298d 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -22,21 +22,19 @@ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Breathing_sign,brew_molecule); +MAKE_SCHEME_CALLBACK(Breathing_sign,brew_molecule); SCM Breathing_sign::brew_molecule (SCM smob) { - Score_element * sc = unsmob_element (smob); - Staff_symbol_referencer_interface si (sc); - - Real space = si.staff_space(); + Score_element * me = unsmob_element (smob); + Real space = Staff_symbol_referencer::staff_space (me); // todo: cfg'able. Interval i1(0, space / 6), i2(-space / 2, space / 2); Box b(i1, i2); - return sc->lookup_l()->filledbox(b).create_scheme (); + return me->lookup_l()->filledbox(b).create_scheme (); } Real @@ -44,7 +42,7 @@ Breathing_sign::offset_callback (Score_element * b, Axis a) { Score_element * me = (Score_element*)b; - Real space = Staff_symbol_referencer_interface (b).staff_space(); + Real space = Staff_symbol_referencer::staff_space (b); Direction d = Directional_element_interface (b). get (); if (!d) { @@ -58,6 +56,6 @@ Breathing_sign::offset_callback (Score_element * b, Axis a) void Breathing_sign::set_interface (Score_element *b) { - Staff_symbol_referencer_interface::set_interface (b); + Staff_symbol_referencer::set_interface (b); b->add_offset_callback (Breathing_sign::offset_callback,Y_AXIS); } diff --git a/lily/chord-name.cc b/lily/chord-name.cc index bcc0abea3d..4becdee60f 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -124,7 +124,7 @@ Chord_name::ly_text2molecule (Score_element * me, SCM text) return mol; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Chord_name,brew_molecule); +MAKE_SCHEME_CALLBACK(Chord_name,brew_molecule); SCM Chord_name::brew_molecule (SCM smob) diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index 3445d1277e..d670feb130 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -16,6 +16,7 @@ #include "musical-request.hh" #include "warn.hh" #include "misc.hh" +#include "note-head.hh" /** This acknowledges repeated music with "tremolo" style. It typesets @@ -130,12 +131,13 @@ Chord_tremolo_engraver::acknowledge_element (Score_element_info info) { if (beam_p_) { - if (Stem* s = dynamic_cast (info.elem_l_)) + if (Stem::has_interface (info.elem_l_)) { - int f = s->flag_i (); + Score_element * s = info.elem_l_; + int f = Stem::flag_i (s); f = (f > 2) ? f - 2 : 1; - s->set_beaming (f, LEFT); - s->set_beaming (f, RIGHT); + Stem::set_beaming (s, f, LEFT); + Stem::set_beaming (s, f, RIGHT); /* URG: this sets the direction of the Stem s. @@ -149,9 +151,9 @@ Chord_tremolo_engraver::acknowledge_element (Score_element_info info) --hwn. */ SCM d = s->get_elt_property ("direction"); - if (s->type_i () != 1) + if (Stem::type_i (s ) != 1) { - int gap_i =s->flag_i () - ((s->type_i () >? 2) - 2); + int gap_i =Stem::flag_i (s ) - ((Stem::type_i (s ) >? 2) - 2); beam_p_->set_elt_property ("beam-gap", gh_int2scm(gap_i)); } s->set_elt_property ("direction", d); @@ -171,7 +173,7 @@ Chord_tremolo_engraver::acknowledge_element (Score_element_info info) ::warning (s); } } - if (to_boolean (info.elem_l_->get_elt_property ("note-head-interface"))) + if (Note_head::has_interface (info.elem_l_)) { info.elem_l_->set_elt_property ("duration-log", gh_int2scm (intlog2 (note_head_i_))); } diff --git a/lily/chord.cc b/lily/chord.cc index 2eb762b778..5bcdf9c7be 100644 --- a/lily/chord.cc +++ b/lily/chord.cc @@ -16,9 +16,10 @@ /* FIXME: should use SCM iso. arrays and have-to-delete pointers. + + FIXME: this contains memleaks. */ - /* construct from parser output */ diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index 4267a35779..dd7385a988 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -10,6 +10,10 @@ #include +#include "key-item.hh" +#include "local-key-item.hh" +#include "bar.hh" +#include "note-head.hh" #include "staff-symbol-referencer.hh" #include "debug.hh" #include "command-request.hh" @@ -123,18 +127,19 @@ Clef_engraver::acknowledge_element (Score_element_info info) Item * item =dynamic_cast (info.elem_l_); if (item) { - if (to_boolean (info.elem_l_->get_elt_property ("bar-interface")) + if (Bar::has_interface (info.elem_l_) && gh_string_p (clef_glyph_)) create_clef(); - if (to_boolean (item->get_elt_property("note-head-interface")) - || to_boolean (item->get_elt_property ("accidentals-interface"))) + if (Note_head::has_interface (item) + || Local_key_item::has_interface (item)) { - Staff_symbol_referencer_interface si (item); - si.set_position (int (si.position_f ()) + c0_position_i_); + int p = int (Staff_symbol_referencer::position_f (item)) + c0_position_i_; + Staff_symbol_referencer::set_position (item,p); + } - else if (to_boolean (item->get_elt_property ("key-item-interface"))) + else if (Key_item::has_interface (item)) { item->set_elt_property ("c0-position", gh_int2scm (c0_position_i_)); } @@ -175,23 +180,21 @@ Clef_engraver::create_clef() Item *c= new Item ( current_settings_); announce_element (Score_element_info (c, clef_req_l_)); - Staff_symbol_referencer_interface::set_interface (c); + Staff_symbol_referencer::set_interface (c); clef_p_ = c; } - Staff_symbol_referencer_interface si(clef_p_); - - si.set_position (clef_position_i_); + Staff_symbol_referencer::set_position(clef_p_, clef_position_i_); if (octave_dir_) { Item * g = new Item (get_property ("basicOctavateEightProperties")); - Side_position_interface spi (g); - spi.set_axis (Y_AXIS); - spi.add_support (clef_p_); + Side_position::set_axis (g,Y_AXIS); + Side_position::add_support (g,clef_p_); + g->set_parent (clef_p_, Y_AXIS); g->set_parent (clef_p_, X_AXIS); - g->add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); - g->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS); + g->add_offset_callback (Side_position::aligned_on_self, X_AXIS); + g->add_offset_callback (Side_position::centered_on_parent, X_AXIS); g->set_elt_property ("direction", gh_int2scm (octave_dir_)); octavate_p_ = g; announce_element (Score_element_info (octavate_p_, clef_req_l_)); diff --git a/lily/clef-item.cc b/lily/clef-item.cc index 26bf3e2856..9c1179333d 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -7,35 +7,16 @@ */ -#include "clef-item.hh" +#include "clef.hh" #include "string.hh" #include "molecule.hh" #include "item.hh" - -/** - Set a clef in a staff. - - properties: - - non-default -- not set because of existence of a bar? - - change -- is this a change clef (smaller size)? - - glyph -- a string determining what glyph is typeset - - */ -struct Clef -{ - static SCM before_line_breaking (SCM); -}; - - /* FIXME: should use symbol. */ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Clef,before_line_breaking); +MAKE_SCHEME_CALLBACK(Clef,before_line_breaking); SCM Clef::before_line_breaking (SCM smob) { @@ -71,5 +52,17 @@ Clef::before_line_breaking (SCM smob) return SCM_UNDEFINED; } +bool +Clef::has_interface (Score_element* me) +{ + return me->has_interface (ly_symbol2scm ("clef-interface")); +} + + +void +Clef::set_interface (Score_element* me) +{ + me->set_interface (ly_symbol2scm ("clef-interface")); +} diff --git a/lily/collision-engraver.cc b/lily/collision-engraver.cc index f698089413..8816100638 100644 --- a/lily/collision-engraver.cc +++ b/lily/collision-engraver.cc @@ -8,7 +8,7 @@ #include "note-column.hh" #include "collision.hh" -#include "dimension-cache.hh" + #include "engraver.hh" #include "axis-group-interface.hh" @@ -37,14 +37,14 @@ Collision_engraver::process_acknowledged () if (!col_p_) { col_p_ = new Item (get_property ("basicCollisionProperties")); - Axis_group_interface (col_p_).set_interface (); - Axis_group_interface (col_p_).set_axes (X_AXIS, Y_AXIS); + Axis_group_interface::set_interface (col_p_); + Axis_group_interface::set_axes (col_p_, X_AXIS, Y_AXIS); announce_element (Score_element_info (col_p_,0)); } for (int i=0; i< note_column_l_arr_.size (); i++) - Collision (col_p_).add_column (note_column_l_arr_[i]); + Collision::add_column (col_p_,note_column_l_arr_[i]); } void diff --git a/lily/collision.cc b/lily/collision.cc index 9316fcd2f3..a52c130048 100644 --- a/lily/collision.cc +++ b/lily/collision.cc @@ -14,11 +14,11 @@ #include "item.hh" void -Collision::add_column (Note_column* ncol_l) +Collision::add_column (Score_element*me,Note_column* ncol_l) { ncol_l->add_offset_callback (force_shift_callback, X_AXIS); - Axis_group_interface (elt_l_).add_element (ncol_l); - elt_l_->add_dependency (ncol_l); + Axis_group_interface::add_element (me, ncol_l); + me->add_dependency (ncol_l); } Real @@ -30,9 +30,9 @@ Collision::force_shift_callback (Score_element * c, Axis a) /* ugh. the way DONE is done is not clean */ - if (!unsmob_element (me->get_elt_pointer ("done"))) + if (!unsmob_element (me->get_elt_property ("done"))) { - me->set_elt_pointer ("done", me->self_scm_); + me->set_elt_property ("done", me->self_scm_); do_shifts (me); } @@ -81,7 +81,7 @@ Collision::automatic_shift (Score_element *me) Drul_array > shifts; SCM tups = SCM_EOL; - SCM s = me->get_elt_pointer ("elements"); + SCM s = me->get_elt_property ("elements"); for (; gh_pair_p (s); s = gh_cdr (s)) { SCM car = gh_car (s); @@ -164,19 +164,19 @@ Collision::automatic_shift (Score_element *me) /* TODO. */ - Rhythmic_head * nu_l= cu_l->first_head(); - Rhythmic_head * nd_l = cd_l->first_head(); + Score_element * nu_l= cu_l->first_head(); + Score_element * nd_l = cd_l->first_head(); int downpos = Note_column::head_positions_interval (cd_l)[BIGGER]; int uppos = Note_column::head_positions_interval (cu_l)[SMALLER]; bool merge = downpos == uppos - && nu_l->balltype_i () == nd_l->balltype_i (); + && Rhythmic_head::balltype_i (nu_l) == Rhythmic_head::balltype_i (nd_l); if (!to_boolean (me->get_elt_property ("merge-differently-dotted"))) - merge = merge && nu_l->dot_count () == nd_l->dot_count (); + merge = merge && Rhythmic_head::dot_count (nu_l) == Rhythmic_head::dot_count (nd_l); /* notes are close, but can not be merged. Shift @@ -208,7 +208,7 @@ Collision::forced_shift (Score_element *me) { SCM tups = SCM_EOL; - SCM s = me->get_elt_pointer ("elements"); + SCM s = me->get_elt_property ("elements"); for (; gh_pair_p (s); s = gh_cdr (s)) { Score_element * se = unsmob_element (gh_car (s)); @@ -225,7 +225,3 @@ Collision::forced_shift (Score_element *me) -Collision::Collision (Score_element* c) -{ - elt_l_ = c; -} diff --git a/lily/crescendo.cc b/lily/crescendo.cc index 8ba2b7ef9e..0c9fb96c69 100644 --- a/lily/crescendo.cc +++ b/lily/crescendo.cc @@ -18,12 +18,12 @@ void Crescendo::set_interface (Score_element*s) { - s->set_elt_pointer ("dynamic-drul", gh_cons (SCM_UNDEFINED, SCM_UNDEFINED)); + s->set_elt_property ("dynamic-drul", gh_cons (SCM_UNDEFINED, SCM_UNDEFINED)); } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Crescendo,brew_molecule); +MAKE_SCHEME_CALLBACK(Crescendo,brew_molecule); SCM Crescendo::brew_molecule (SCM smob) { diff --git a/lily/cross-staff.cc b/lily/cross-staff.cc index 8e5e8e6f4a..ad0ba06109 100644 --- a/lily/cross-staff.cc +++ b/lily/cross-staff.cc @@ -12,9 +12,9 @@ calc_interstaff_dist (Item const *item, Spanner const *span) { Real interstaff = 0.0; Score_element *common = item->common_refpoint (span, Y_AXIS); - Align_interface align(common); - if (align.has_interface_b () && align.axis() == Y_AXIS) + + if (Align_interface::has_interface (common) && Align_interface::axis(common) == Y_AXIS) { SCM threshold = common->get_elt_property ("threshold"); if (!gh_pair_p (threshold) @@ -34,9 +34,9 @@ calc_interstaff_dist (Item const *item, Spanner const *span) note_refpoint = note_refpoint->parent_l (Y_AXIS); int span_prio = - align.get_count ((Score_element*) dynamic_cast (span_refpoint)); + Align_interface::get_count (common,(Score_element*) dynamic_cast (span_refpoint)); int item_prio = - align.get_count ((Score_element*) dynamic_cast (note_refpoint)); + Align_interface::get_count (common,(Score_element*) dynamic_cast (note_refpoint)); /* our staff is lower -> interstaff *= -1 diff --git a/lily/directional-element-interface.cc b/lily/directional-element-interface.cc index e34eea308a..4a6a9e4d11 100644 --- a/lily/directional-element-interface.cc +++ b/lily/directional-element-interface.cc @@ -16,7 +16,7 @@ Directional_element_interface::Directional_element_interface (Score_element cons } bool -Directional_element_interface::has_interface_b () const +Directional_element_interface::has_interface () const { return isdir_b (elt_l_->get_elt_property ("direction")); } diff --git a/lily/dot-column-engraver.cc b/lily/dot-column-engraver.cc index 908851d168..35ca2c3cc4 100644 --- a/lily/dot-column-engraver.cc +++ b/lily/dot-column-engraver.cc @@ -16,7 +16,7 @@ class Dot_column_engraver : public Engraver { Score_element *dotcol_p_ ; - Link_array head_l_arr_; + Link_array head_l_arr_; public: VIRTUAL_COPY_CONS(Translator); Dot_column_engraver(); @@ -46,7 +46,7 @@ Dot_column_engraver::do_pre_move_processing () void Dot_column_engraver::acknowledge_element (Score_element_info info) { - Score_element *d = unsmob_element (info.elem_l_->get_elt_pointer ("dot")); + Score_element *d = unsmob_element (info.elem_l_->get_elt_property ("dot")); if (d) { if (!dotcol_p_) @@ -54,8 +54,8 @@ Dot_column_engraver::acknowledge_element (Score_element_info info) dotcol_p_ = new Item(get_property ("basicDotColumnProperties")); Dot_column::set_interface (dotcol_p_); - Side_position_interface (dotcol_p_).set_axis (X_AXIS); - Side_position_interface (dotcol_p_).set_direction (RIGHT); + Side_position::set_axis (dotcol_p_, X_AXIS); + Side_position::set_direction (dotcol_p_, RIGHT); announce_element (Score_element_info (dotcol_p_, 0)); } diff --git a/lily/dot-column.cc b/lily/dot-column.cc index f3ce19ad83..556928f7da 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -18,40 +18,32 @@ void -Dot_column::add_head (Score_element * dc, Score_element *rh) +Dot_column::add_head (Score_element * me, Score_element *rh) { - Score_element * d = unsmob_element (rh->get_elt_pointer ("dot")); + Score_element * d = unsmob_element (rh->get_elt_property ("dot")); if (d) { - Side_position_interface (dc).add_support (rh); + Side_position::add_support (me,rh); - Pointer_group_interface gi (dc, "dots"); + Pointer_group_interface gi (me, "dots"); gi.add_element (d); d->add_offset_callback (force_shift_callback , Y_AXIS); - Axis_group_interface (dc).add_element (d); + Axis_group_interface::add_element (me, d); } } -int -Dot_column::compare (Score_element * const &d1, Score_element * const &d2) -{ - Staff_symbol_referencer_interface s1(d1); - Staff_symbol_referencer_interface s2(d2); - - return int (s1.position_f () - s2.position_f ()); -} void -Dot_column::set_interface (Score_element* dc) +Dot_column::set_interface (Score_element* me) { - dc->set_elt_pointer ("dots", SCM_EOL); - Directional_element_interface (dc).set (RIGHT); + me->set_elt_property ("dots", SCM_EOL); + Directional_element_interface (me).set (RIGHT); - Axis_group_interface (dc).set_interface (); - Axis_group_interface (dc).set_axes(X_AXIS,X_AXIS); + Axis_group_interface::set_interface (me); + Axis_group_interface::set_axes (me, X_AXIS,X_AXIS); } /* @@ -76,7 +68,7 @@ Dot_column::force_shift_callback (Score_element * dot, Axis a) { assert (a == Y_AXIS); Score_element * me = dot->parent_l (X_AXIS); - SCM dots = me->get_elt_pointer ("dots"); + SCM dots = me->get_elt_property ("dots"); do_shifts (dots); return 0.0; } @@ -91,7 +83,7 @@ Dot_column::do_shifts (SCM l) l = gh_cdr (l); } - dots.sort (Dot_column::compare); + dots.sort (compare_position); if (dots.size () < 2) return SCM_UNDEFINED; @@ -102,7 +94,7 @@ Dot_column::do_shifts (SCM l) int conflicts = 0; for (int i=0; i < dots.size (); i++) { - Real p = Staff_symbol_referencer_interface (dots[i]).position_f (); + Real p = Staff_symbol_referencer::position_f (dots[i]); for (int j=0; j < taken_posns.size (); j++) { if (taken_posns[j] == (int) p) @@ -127,8 +119,14 @@ Dot_column::do_shifts (SCM l) for (int i=0; i < dots.size (); pos += 2, i++) { Score_element * d = dots[i]; - Staff_symbol_referencer_interface (d).set_position(pos); + Staff_symbol_referencer::set_position (d,pos); } return SCM_UNDEFINED; } + +bool +Dot_column::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("dot-column-interface")); +} diff --git a/lily/dots.cc b/lily/dots.cc index 929aabf96f..1b702e2932 100644 --- a/lily/dots.cc +++ b/lily/dots.cc @@ -26,17 +26,17 @@ Dots::quantised_position_callback (Score_element * me, Axis a) if (!Directional_element_interface (me).get ()) Directional_element_interface (me).set (UP); - Staff_symbol_referencer_interface si (me); - int pos = int (si.position_f ()); + + int pos = int (Staff_symbol_referencer::position_f (me)); if (!(pos % 2)) - return si.staff_space () / 2.0 * Directional_element_interface (me).get (); + return Staff_symbol_referencer::staff_space (me) / 2.0 * Directional_element_interface (me).get (); } return 0.0; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Dots,brew_molecule); +MAKE_SCHEME_CALLBACK(Dots,brew_molecule); SCM Dots::brew_molecule (SCM d) { diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 1e329f4f73..967dcc1886 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -120,9 +120,9 @@ Dynamic_engraver::do_process_music () { line_spanner_ = new Spanner (get_property ("basicDynamicLineSpannerProperties")); - Side_position_interface (line_spanner_).set_axis (Y_AXIS); - Axis_group_interface (line_spanner_).set_interface (); - Axis_group_interface (line_spanner_).set_axes (Y_AXIS, Y_AXIS); + Side_position::set_axis (line_spanner_, Y_AXIS); + Axis_group_interface::set_interface (line_spanner_); + Axis_group_interface::set_axes (line_spanner_, Y_AXIS, Y_AXIS); announce_element (Score_element_info (line_spanner_, text_req_l_ ? text_req_l_ : accepted_spanreqs_drul_[START])); @@ -170,9 +170,9 @@ Dynamic_engraver::do_process_music () if (Direction d=text_req_l_->get_direction ()) Directional_element_interface (line_spanner_).set (d); - Axis_group_interface (line_spanner_).add_element (text_p_); + Axis_group_interface::add_element (line_spanner_, text_p_); - text_p_->add_offset_callback (Side_position_interface::aligned_on_self, + text_p_->add_offset_callback (Side_position::aligned_on_self, Y_AXIS); announce_element (Score_element_info (text_p_, text_req_l_)); } @@ -256,17 +256,17 @@ Dynamic_engraver::do_process_music () if (text_p_) { - index_set_cell (cresc_p_->get_elt_pointer ("dynamic-drul"), + index_set_cell (cresc_p_->get_elt_property ("dynamic-drul"), LEFT, text_p_->self_scm_); if (finished_cresc_p_) - index_set_cell (finished_cresc_p_->get_elt_pointer ("dynamic-drul"), + index_set_cell (finished_cresc_p_->get_elt_property ("dynamic-drul"), RIGHT, text_p_->self_scm_); } - Axis_group_interface (line_spanner_).add_element (cresc_p_); + Axis_group_interface::add_element (line_spanner_, cresc_p_); cresc_p_->set_elt_property ("self-alignment-Y", gh_int2scm (0)); cresc_p_->add_offset_callback - (Side_position_interface::aligned_on_self, Y_AXIS); + (Side_position::aligned_on_self, Y_AXIS); announce_element (Score_element_info (cresc_p_, accepted_spanreqs_drul_[START])); } } @@ -312,7 +312,7 @@ Dynamic_engraver::typeset_all () } if (finished_line_spanner_) { - Side_position_interface (finished_line_spanner_).add_staff_support (); + Side_position::add_staff_support (finished_line_spanner_); if (!finished_line_spanner_->get_bound (LEFT)) { @@ -337,7 +337,7 @@ Dynamic_engraver::acknowledge_element (Score_element_info i) { if (line_spanner_) { - Side_position_interface (line_spanner_).add_support (n); + Side_position::add_support (line_spanner_,n); add_bound_item (line_spanner_,n); } } diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 6e9f20a872..4be468180c 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -62,8 +62,8 @@ void Extender_engraver::acknowledge_element (Score_element_info i) { // -> text_item - if (dynamic_cast (i.elem_l_) - && to_boolean (i.elem_l_->get_elt_property ("text-item-interface"))) + if (i.elem_l_->has_interface (ly_symbol2scm("text-item-interface"))) + { current_lyric_l_ = i.elem_l_; if (extender_p_ diff --git a/lily/grace-align-item.cc b/lily/grace-align-item.cc index 6a6f432ccf..2b7aec2beb 100644 --- a/lily/grace-align-item.cc +++ b/lily/grace-align-item.cc @@ -13,32 +13,36 @@ #include "paper-column.hh" #include "paper-def.hh" -Grace_align_item::Grace_align_item (SCM s) - : Item (s) +void +Grace_align_item::set_interface (Score_element*me) { - set_elt_property ("stacking-dir", gh_int2scm (RIGHT)); - Align_interface (this).set_interface(); - Align_interface (this).set_axis (X_AXIS); + 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 */ -GLUE_SCORE_ELEMENT(Grace_align_item,before_line_breaking); +MAKE_SCHEME_CALLBACK(Grace_align_item,before_line_breaking); SCM -Grace_align_item::member_before_line_breaking () +Grace_align_item::before_line_breaking (SCM smob) { + Score_element*me = unsmob_element (smob); Real nhw = // lookup_l ()->notehead (2, "")..extent (X_AXIS).length(); - paper_l ()->get_var ("quartwidth"); + me->paper_l ()->get_var ("quartwidth"); - set_elt_property ("threshold", + me->set_elt_property ("threshold", gh_cons (gh_double2scm (nhw* 1.5), gh_double2scm (infinity_f))); - column_l ()->set_elt_property ("contains-grace", SCM_BOOL_T); + dynamic_cast(me)->column_l ()->set_elt_property ("contains-grace", SCM_BOOL_T); return SCM_UNDEFINED; - } - - +bool +Grace_align_item::has_interface (Score_element*m) +{ + return m&& m->has_interface (ly_symbol2scm ("grace-align-interface")); +} diff --git a/lily/grace-position-engraver.cc b/lily/grace-position-engraver.cc index bdf58af7e8..6de4b273ec 100644 --- a/lily/grace-position-engraver.cc +++ b/lily/grace-position-engraver.cc @@ -12,7 +12,7 @@ #include "rhythmic-head.hh" #include "local-key-item.hh" #include "paper-column.hh" -#include "dimension-cache.hh" +#include "note-head.hh" #include "side-position-interface.hh" #include "axis-group-interface.hh" @@ -26,7 +26,7 @@ protected: virtual void process_acknowledged (); virtual void do_post_move_processing (); virtual void do_pre_move_processing (); - Grace_align_item*align_l_; + Item*align_l_; Link_array support_; public: Grace_position_engraver(); @@ -42,21 +42,22 @@ Grace_position_engraver::Grace_position_engraver () void Grace_position_engraver::acknowledge_element (Score_element_info i) { - if (Grace_align_item*g =dynamic_cast(i.elem_l_)) + Item *item = dynamic_cast (i.elem_l_); + if (item && Grace_align_item::has_interface (i.elem_l_)) { - align_l_ = g; + align_l_ = item; } - else if (to_boolean (i.elem_l_->get_elt_property ("note-head-interface"))) + else if (item && Note_head::has_interface (i.elem_l_)) { - if (!to_boolean (i.elem_l_->get_elt_property ("grace"))) - support_.push (dynamic_cast (i.elem_l_)); + if (!to_boolean (item->get_elt_property ("grace"))) + support_.push (item); } - else if (Local_key_item*it = dynamic_cast(i.elem_l_)) + else if (item && Local_key_item::has_interface (i.elem_l_)) { - if (!to_boolean (it->get_elt_property ("grace"))) - support_.push (it); + if (!to_boolean (item->get_elt_property ("grace"))) + support_.push (item); else if (align_l_) - it->add_dependency (align_l_); + item->add_dependency (align_l_); } } @@ -66,7 +67,7 @@ Grace_position_engraver::process_acknowledged () if (align_l_) { for (int i=0; i < support_.size (); i++) - Side_position_interface (align_l_).add_support (support_[i]); + Side_position::add_support (align_l_,support_[i]); support_.clear (); } } @@ -74,7 +75,7 @@ Grace_position_engraver::process_acknowledged () void Grace_position_engraver::do_pre_move_processing () { - if (align_l_ && !Side_position_interface (align_l_).supported_b ()) + if (align_l_ && !Side_position::supported_b (align_l_)) { /* We don't have support. Either some moron tried attaching us to a rest, @@ -93,7 +94,7 @@ Grace_position_engraver::do_pre_move_processing () warning (_("Unattached grace notes. Attaching to last musical column.")); align_l_->set_parent (0, X_AXIS); - Axis_group_interface (last_musical_col_l_).add_element (align_l_); + Axis_group_interface::add_element (last_musical_col_l_, align_l_); } last_musical_col_l_ = dynamic_cast( unsmob_element (get_property ("currentMusicalColumn"))); diff --git a/lily/group-interface.cc b/lily/group-interface.cc index b78783c192..7337f84c3b 100644 --- a/lily/group-interface.cc +++ b/lily/group-interface.cc @@ -22,9 +22,9 @@ Group_interface::Group_interface (Score_element const *e, String s) name_ = s; } bool -Group_interface::has_interface_b () +Group_interface::has_interface () { - SCM el = elt_l_->get_elt_property (name_); + SCM el = elt_l_->get_elt_property (name_.ch_C()); return el == SCM_EOL || gh_pair_p (el); } @@ -34,24 +34,23 @@ Group_interface::has_interface_b () void Group_interface::add_thing (SCM s) { - elt_l_->set_elt_property (name_, - gh_cons (s, elt_l_->get_elt_property (name_))); - + elt_l_->set_elt_property (name_.ch_C (), + gh_cons (s, elt_l_->get_elt_property (name_.ch_C()))); } int Group_interface::count () { - return scm_ilength (elt_l_->get_elt_property (name_)); + return scm_ilength (elt_l_->get_elt_property (name_.ch_C())); } void Group_interface::set_interface () { - if (!has_interface_b ()) + if (!has_interface ()) { - elt_l_->set_elt_property (name_, SCM_EOL); + elt_l_->set_elt_property (name_.ch_C (), SCM_EOL); } } diff --git a/lily/hara-kiri-engraver.cc b/lily/hara-kiri-engraver.cc index 1ef2d1ac3c..c251871682 100644 --- a/lily/hara-kiri-engraver.cc +++ b/lily/hara-kiri-engraver.cc @@ -23,12 +23,9 @@ void Hara_kiri_engraver::acknowledge_element (Score_element_info i) { Axis_group_engraver::acknowledge_element (i); - - i.elem_l_->add_offset_callback (Hara_kiri_group_spanner::force_hara_kiri_callback, Y_AXIS); - - if (Rhythmic_head *h = dynamic_cast (i.elem_l_)) + if (Rhythmic_head::has_interface (i.elem_l_)) { - Hara_kiri_group_spanner::add_interesting_item (staffline_p_, h); + Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_); } } ADD_THIS_TRANSLATOR(Hara_kiri_engraver); diff --git a/lily/hara-kiri-group-spanner.cc b/lily/hara-kiri-group-spanner.cc index 125b686f37..cd16fab04f 100644 --- a/lily/hara-kiri-group-spanner.cc +++ b/lily/hara-kiri-group-spanner.cc @@ -16,25 +16,32 @@ void Hara_kiri_group_spanner::set_interface (Score_element*me) { - me->set_elt_pointer ("items-worth-living", SCM_EOL); + me->set_elt_property ("items-worth-living", SCM_EOL); + me->add_offset_callback (force_hara_kiri_callback, Y_AXIS); + me->set_interface (ly_symbol2scm ("hara-kiri-spanner-interface")); +} + +bool +Hara_kiri_group_spanner::has_interface (Score_element*me) +{ + return me->has_interface (ly_symbol2scm ("hara-kiri-spanner-interface")); } void -Hara_kiri_group_spanner::add_interesting_item (Score_element* me,Item* n) +Hara_kiri_group_spanner::add_interesting_item (Score_element* me,Score_element* n) { me->add_dependency (n); Pointer_group_interface (me, "items-worth-living").add_element (n); - } void Hara_kiri_group_spanner::consider_suicide(Score_element*me) { - SCM worth = me->get_elt_pointer ("items-worth-living"); + SCM worth = me->get_elt_property ("items-worth-living"); if (gh_pair_p (worth)) return ; - Link_array childs = Axis_group_interface (me).get_children (); + Link_array childs = Axis_group_interface::get_children (me); for (int i = 0; i < childs.size (); i++) childs[i]->suicide (); @@ -54,14 +61,8 @@ Hara_kiri_group_spanner::consider_suicide(Score_element*me) Real Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element *elt, Axis a) { - while (elt - && to_boolean (elt->get_elt_property ("hara-kiri-interface"))) - elt = elt->parent_l(a); - - if (elt) - { - Hara_kiri_group_spanner::consider_suicide (elt); - } - + assert (a == Y_AXIS); + consider_suicide (elt); return 0.0; } + diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc index 204995b4b0..cb276bcf4e 100644 --- a/lily/hyphen-engraver.cc +++ b/lily/hyphen-engraver.cc @@ -55,8 +55,7 @@ void Hyphen_engraver::acknowledge_element (Score_element_info i) { // -> text-item - if (dynamic_cast (i.elem_l_) - && to_boolean (i.elem_l_->get_elt_property ("text-item-interface"))) + if (i.elem_l_->has_interface (ly_symbol2scm ("text-item-interface"))) { current_lyric_l_ = i.elem_l_; if (hyphen_p_ diff --git a/lily/hyphen-spanner.cc b/lily/hyphen-spanner.cc index af618e87ca..f21eda6045 100644 --- a/lily/hyphen-spanner.cc +++ b/lily/hyphen-spanner.cc @@ -18,7 +18,7 @@ #include "spanner.hh" #include "item.hh" -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Hyphen_spanner,brew_molecule) +MAKE_SCHEME_CALLBACK(Hyphen_spanner,brew_molecule) SCM Hyphen_spanner::brew_molecule (SCM smob) diff --git a/lily/include/align-interface.hh b/lily/include/align-interface.hh index 04b2cca234..d17392f3b3 100644 --- a/lily/include/align-interface.hh +++ b/lily/include/align-interface.hh @@ -30,22 +30,19 @@ element properties stacking-dir - - Which side to align? -1: left side, 0: centered (around - center_l_ if not nil, or around center of width), 1: right side - */ -struct Align_interface { - Score_element * elt_l_; - - Align_interface (Score_element const*); + + Which side to align? -1: left side, 0: centered (around + center_l_ if not nil, or around center of width), 1: right side +*/ +struct Align_interface { static Real alignment_callback (Score_element *,Axis); - void do_side_processing (Axis a); - void set_axis (Axis); - Axis axis () const; - void add_element (Score_element*); - int get_count (Score_element*)const; - void set_interface (); - bool has_interface_b (); + static void do_side_processing (Score_element*,Axis a); + static void set_axis (Score_element*,Axis); + static Axis axis (Score_element*) ; + static void add_element (Score_element*,Score_element*); + static int get_count (Score_element*,Score_element*); + static void set_interface (Score_element*); + static bool has_interface (Score_element*); static Real center_on_element (Score_element *c, Axis); }; diff --git a/lily/include/auto-beam-engraver.hh b/lily/include/auto-beam-engraver.hh deleted file mode 100644 index b5aec56fb1..0000000000 --- a/lily/include/auto-beam-engraver.hh +++ /dev/null @@ -1,57 +0,0 @@ -/* - auto-beam-engraver.hh -- declare Auto_beam_engraver - - source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Jan Nieuwenhuizen - - */ - -#ifndef AUTO_BEAM_ENGRAVER_HH -#define AUTO_BEAM_ENGRAVER_HH - -#include "engraver.hh" - -class Auto_beam_engraver : public Engraver -{ -public: - Auto_beam_engraver (); - VIRTUAL_COPY_CONS (Translator); - -protected: - virtual bool do_try_music (Music*); - virtual void do_pre_move_processing (); - virtual void do_post_move_processing (); - virtual void do_removal_processing (); - virtual void acknowledge_element (Score_element_info); - virtual void do_process_music (); - virtual void process_acknowledged (); - virtual void do_creation_processing (); -private: - void begin_beam (); - void consider_end_and_begin (Moment test_mom); - Beam* 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_; - Array* stem_l_arr_p_; - - Moment last_add_mom_; - Moment extend_mom_; - - - Moment beam_start_moment_; - Moment beam_start_location_; - - Timing_translator * timer_l_; - // We act as if beam were created, and start a grouping anyway. - Beaming_info_list*grouping_p_; - Beaming_info_list*finished_grouping_p_; -}; - -#endif /* AUTO_BEAM_ENGRAVER_HH */ - diff --git a/lily/include/axis-group-interface.hh b/lily/include/axis-group-interface.hh index f99d232133..659905c2d4 100644 --- a/lily/include/axis-group-interface.hh +++ b/lily/include/axis-group-interface.hh @@ -28,18 +28,15 @@ */ struct Axis_group_interface { - Score_element *elt_l_; - Axis_group_interface (Score_element*); - static Interval group_extent_callback (Score_element *,Axis); static Interval relative_group_extent (Axis, Score_element * common, SCM list); - void add_element (Score_element*); - void set_axes (Axis,Axis); - bool axis_b (Axis)const; - Link_array get_children (); - bool has_interface_b (); - void set_interface (); + static void add_element (Score_element* me, Score_element*); + static void set_axes (Score_element*,Axis,Axis); + static bool axis_b (Score_element*,Axis); + static Link_array get_children (Score_element*); + static bool has_interface (Score_element*); + static void set_interface (Score_element*); }; diff --git a/lily/include/bar-engraver.hh b/lily/include/bar-engraver.hh index 7f446bcd13..89ad0898f7 100644 --- a/lily/include/bar-engraver.hh +++ b/lily/include/bar-engraver.hh @@ -33,7 +33,7 @@ protected: private: void create_bar (); - Bar * bar_p_; + Item * bar_p_; }; #endif // BAR_ENGRAVER_HH diff --git a/lily/include/bar.hh b/lily/include/bar.hh index 1e6bf095f8..c9ab5d36ef 100644 --- a/lily/include/bar.hh +++ b/lily/include/bar.hh @@ -6,27 +6,23 @@ #ifndef BAR_HH #define BAR_HH -#include "item.hh" + +#include "lily-guile.hh" +#include "lily-proto.hh" /** A vertical bar. */ -class Bar:public Item +class Bar { public: - VIRTUAL_COPY_CONS(Score_element); - Bar(SCM); - - Molecule compound_barline (String, Real height) const; - Molecule simple_barline (Real wid, Real height) const; + static bool has_interface (Score_element*); + static void set_interface (Score_element*); + static Molecule compound_barline (Score_element*, String, Real height) ; + static Molecule simple_barline (Score_element*, Real wid, Real height) ; + static SCM get_staff_bar_size (SCM); static SCM brew_molecule (SCM); - - -public: - SCM member_before_line_breaking (); static SCM before_line_breaking (SCM); - - virtual Real get_bar_size () const; }; #endif // BAR_HH diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 3efb7c2827..dba75f2045 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -17,27 +17,25 @@ beam and that point in the correct direction (urg?) elt_properties: - y-position: real (position of left edge) - height: real (dy) + + y-position -- real (position of left edge) - damping: amount of beam slope damping. (int) + height -- real (dy) + + damping -- amount of beam slope damping. (int) should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams */ class Beam : public Spanner { public: - static SCM brew_molecule (SCM); - - int stem_count () const; - Stem* stem (int) const; - Stem* stem_top () const; + int visible_stem_count () const; - Stem* first_visible_stem () const; - Stem* last_visible_stem () const; + Item* first_visible_stem () const; + Item* last_visible_stem () const; static Real rest_collision_callback (Score_element *,Axis); Beam (SCM); - void add_stem (Stem*); + void add_stem (Score_element*); void set_grouping (Rhythmic_grouping def, Rhythmic_grouping current); void set_beaming (Beaming_info_list *); void set_stemlens (); @@ -45,15 +43,11 @@ public: int get_multiplicity () const; -public: - - SCM member_before_line_breaking (); + static SCM brew_molecule (SCM); static SCM before_line_breaking (SCM); - SCM member_after_line_breaking (); static SCM after_line_breaking (SCM); - SCM member_brew_molecule () const; - Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const; + Molecule stem_beams (Item *here, Item *next, Item *prev) const; private: Direction get_default_dir () const; void set_stem_directions (); @@ -63,7 +57,7 @@ private: 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 (Stem* s, Real y, 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; diff --git a/lily/include/break-algorithm.hh b/lily/include/break-algorithm.hh index b01487e171..7e0c341544 100644 --- a/lily/include/break-algorithm.hh +++ b/lily/include/break-algorithm.hh @@ -18,6 +18,8 @@ /** Class representation of an algorithm which decides where to put the column, and where to break lines. + + JUNKME. */ class Break_algorithm { diff --git a/lily/include/break-align-item.hh b/lily/include/break-align-item.hh index 0a4a42b597..028b4f282e 100644 --- a/lily/include/break-align-item.hh +++ b/lily/include/break-align-item.hh @@ -24,13 +24,14 @@ TODO: remove this as a class, and make interface. */ -class Break_align_item : public Item +class Break_align_item { public: - SCM member_before_line_breaking (); static SCM before_line_breaking (SCM); - - Break_align_item (SCM s); - VIRTUAL_COPY_CONS(Score_element); + static void do_alignment (Score_element*); + static void set_interface (Score_element*); + static bool has_interface (Score_element*); + static void add_element (Score_element*me, Score_element*add); + static Real alignment_callback (Score_element*, Axis); }; #endif // BREAK_ALIGN_ITEM_HH diff --git a/lily/include/breathing-sign.hh b/lily/include/breathing-sign.hh index a3c3bb9be0..17e06d03a4 100644 --- a/lily/include/breathing-sign.hh +++ b/lily/include/breathing-sign.hh @@ -22,6 +22,7 @@ public: static SCM brew_molecule (SCM); static Real offset_callback (Score_element *, Axis); static void set_interface (Score_element*); + static bool has_interface (Score_element*); }; #endif // BREATHING_SIGN_HH diff --git a/lily/include/clef-item.hh b/lily/include/clef-item.hh deleted file mode 100644 index a3f7c5ed44..0000000000 --- a/lily/include/clef-item.hh +++ /dev/null @@ -1,17 +0,0 @@ -/* - clef-item.hh -- declare Clef_item - - (c) 1996--2000 Han-Wen Nienhuys -*/ - -#ifndef CLEFITEM_HH -#define CLEFITEM_HH -#include "item.hh" - -#include "direction.hh" - - - -#endif // CLEFITEM_HH - - diff --git a/lily/include/clef.hh b/lily/include/clef.hh new file mode 100644 index 0000000000..f8c4b52c61 --- /dev/null +++ b/lily/include/clef.hh @@ -0,0 +1,36 @@ +/* + clef.hh -- declare + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#ifndef CLEF_HH +#define CLEF_HH +#include "lily-guile.hh" +#include "lily-proto.hh" + +/** + Set a clef in a staff. + + properties: + + non-default -- not set because of existence of a bar? + + change -- is this a change clef (smaller size)? + + glyph -- a string determining what glyph is typeset + + */ +struct Clef +{ + static SCM before_line_breaking (SCM); + static bool has_interface (Score_element*); + static void set_interface (Score_element*); +}; + + +#endif /* CLEF_HH */ + diff --git a/lily/include/collision.hh b/lily/include/collision.hh index 3e88c982b2..469dfeacbd 100644 --- a/lily/include/collision.hh +++ b/lily/include/collision.hh @@ -39,13 +39,10 @@ class Collision // interface { public: - Score_element* elt_l_; static SCM automatic_shift (Score_element*); static SCM forced_shift (Score_element*); static Real force_shift_callback (Score_element *, Axis); static void do_shifts (Score_element*); - - void add_column (Note_column*ncol_l); - Collision(Score_element*); + static void add_column (Score_element*me,Note_column*ncol_l); }; #endif // COLLISION_HH diff --git a/lily/include/crescendo.hh b/lily/include/crescendo.hh index 36639f8586..09c46265ac 100644 --- a/lily/include/crescendo.hh +++ b/lily/include/crescendo.hh @@ -21,6 +21,7 @@ struct Crescendo public: static SCM brew_molecule (SCM); static void set_interface(Score_element*); + static bool has_interface (Score_element*); }; #endif // CRESCENDO_HH diff --git a/lily/include/directional-element-interface.hh b/lily/include/directional-element-interface.hh index d3e6434529..57e1e228df 100644 --- a/lily/include/directional-element-interface.hh +++ b/lily/include/directional-element-interface.hh @@ -21,7 +21,7 @@ public: Directional_element_interface (Score_element const *); void set (Direction d); Direction get () const; - bool has_interface_b () const; + bool has_interface () const; // bool set_interface (); }; diff --git a/lily/include/dot-column.hh b/lily/include/dot-column.hh index db18bf572d..27a1eb3225 100644 --- a/lily/include/dot-column.hh +++ b/lily/include/dot-column.hh @@ -21,6 +21,7 @@ public: static int compare (Score_element * const&,Score_element * const&); static void add_head (Score_element * dotcol, Score_element* rh ); static void set_interface (Score_element*); + static bool has_interface (Score_element*); static Real force_shift_callback (Score_element * , Axis); static SCM do_shifts (SCM dotlist); }; diff --git a/lily/include/grace-align-item.hh b/lily/include/grace-align-item.hh index 25764b2256..74cc870a29 100644 --- a/lily/include/grace-align-item.hh +++ b/lily/include/grace-align-item.hh @@ -11,16 +11,14 @@ #define GRACE_ALIGN_ITEM_HH -#include "item.hh" +#include "lily-guile.hh" +#include "lily-proto.hh" -class Grace_align_item : public Item +class Grace_align_item { public: - VIRTUAL_COPY_CONS (Score_element); - Grace_align_item (SCM); - - - SCM member_before_line_breaking (); + static void set_interface (Score_element*); + static bool has_interface (Score_element*); static SCM before_line_breaking (SCM); }; #endif /* GRACE_ALIGN_ITEM_HH */ diff --git a/lily/include/group-interface.hh b/lily/include/group-interface.hh index 43b2ba66db..9ae9cac612 100644 --- a/lily/include/group-interface.hh +++ b/lily/include/group-interface.hh @@ -32,7 +32,7 @@ public: Group_interface (Score_element const*, String); int count (); void add_thing (SCM); - bool has_interface_b (); + bool has_interface (); void set_interface (); }; @@ -44,7 +44,8 @@ public: Pointer_group_interface (Score_element const*, String); int count (); void set_interface (); - bool has_interface_b (); + static bool has_interface (Score_element*); + bool has_interface (); void add_element (Score_element*); }; /** @@ -56,7 +57,7 @@ Pointer_group_interface__extract_elements (Score_element const *elt, T *, const { Link_array arr; - for (SCM s = elt->get_elt_pointer (name); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = elt->get_elt_property (name); gh_pair_p (s); s = gh_cdr (s)) { SCM e = gh_car (s); arr.push (dynamic_cast (unsmob_element (e))); diff --git a/lily/include/hara-kiri-group-spanner.hh b/lily/include/hara-kiri-group-spanner.hh index 912a6f4ffc..b2ddc79a08 100644 --- a/lily/include/hara-kiri-group-spanner.hh +++ b/lily/include/hara-kiri-group-spanner.hh @@ -30,8 +30,9 @@ class Hara_kiri_group_spanner public: static Real force_hara_kiri_callback (Score_element * , Axis); static void set_interface (Score_element*me); + static bool has_interface (Score_element*); static void consider_suicide (Score_element*me); - static void add_interesting_item (Score_element * me , Item* n); + static void add_interesting_item (Score_element * me , Score_element* n); }; diff --git a/lily/include/key-item.hh b/lily/include/key-item.hh index e77703b9a3..de16e2a130 100644 --- a/lily/include/key-item.hh +++ b/lily/include/key-item.hh @@ -24,7 +24,8 @@ struct Key_item { static int calculate_position(Score_element*,SCM pair) ; - void set_interface (Score_element*); + static void set_interface (Score_element*); + static bool has_interface (Score_element*); static SCM brew_molecule (SCM); }; diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 7c91bbd276..89ff1a2c29 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -77,6 +77,20 @@ SCM index_set_cell (SCM cellp, Direction d, SCM val); */ void add_scm_init_func (void (*)()); + + +#define MAKE_SCHEME_CALLBACK(TYPE, FUNC) \ +static SCM TYPE ## _ ## FUNC ## _scm;\ +void \ +TYPE ## _ ## FUNC ## _init_functions () \ +{ \ + TYPE ## _ ## FUNC ## _scm = gh_new_procedure1_0 (#TYPE "::" #FUNC, \ + (SCM(*)(...))TYPE :: FUNC); \ +} \ + \ +ADD_SCM_INIT_FUNC(TYPE ## _ ## FUNC ## _callback, TYPE ## _ ## FUNC ## _init_functions); \ + + #define ADD_SCM_INIT_FUNC(name, func)\ class name ## _scm_initter { \ public:\ diff --git a/lily/include/line-of-score.hh b/lily/include/line-of-score.hh index 2856aa04c5..9d510c692c 100644 --- a/lily/include/line-of-score.hh +++ b/lily/include/line-of-score.hh @@ -30,15 +30,11 @@ class Line_of_score : public Spanner { public: - - - void post_processing(); - - /// -> SCM int rank_i_; + void post_processing(); Protected_scm output_; - Line_of_score(); + Line_of_score(SCM); /// is #c# contained in #*this#? bool contains_b (Paper_column const *c) const; diff --git a/lily/include/local-key-item.hh b/lily/include/local-key-item.hh index 01eba65007..fb2c190ece 100644 --- a/lily/include/local-key-item.hh +++ b/lily/include/local-key-item.hh @@ -40,17 +40,17 @@ class Local_key_item : public Item { Array accidental_arr_; - Molecule accidental (int,bool,bool) const; + static Molecule accidental (Score_element*me, int,bool,bool) ; public: Local_key_item (SCM ); static SCM brew_molecule (SCM); void add_pitch (Musical_pitch, bool cautionary, bool natural); - SCM member_before_line_breaking (); static SCM before_line_breaking (SCM); - SCM member_brew_molecule() const; + static bool has_interface (Score_element*); }; + #endif // LOCALKEYITEM_HH diff --git a/lily/include/multi-measure-rest-engraver.hh b/lily/include/multi-measure-rest-engraver.hh deleted file mode 100644 index 951112c3ef..0000000000 --- a/lily/include/multi-measure-rest-engraver.hh +++ /dev/null @@ -1,8 +0,0 @@ -/* - multi_measure_rest-engraver.hh -- declare Multi_measure_rest_engraver - - source file of the GNU LilyPond music typesetter - - (c) 1998--2000 Jan Nieuwenhuizen -*/ - diff --git a/lily/include/multi-measure-rest.hh b/lily/include/multi-measure-rest.hh index f163bf4816..71353da3b1 100644 --- a/lily/include/multi-measure-rest.hh +++ b/lily/include/multi-measure-rest.hh @@ -19,6 +19,7 @@ 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); diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh index ddd691232d..7bf51956d5 100644 --- a/lily/include/note-column.hh +++ b/lily/include/note-column.hh @@ -34,7 +34,7 @@ public: static Slice head_positions_interval(Score_element* me) ; static Direction static_dir (Score_element*); void translate_rests(int dy); - Rhythmic_head * first_head ()const; + Score_element * first_head ()const; Interval rest_dim ()const ; Note_column (SCM); void set_stem (Score_element*); @@ -42,7 +42,9 @@ public: void add_head (Score_element*); bool rest_b () const; - Stem *stem_l()const; + static bool has_interface (Score_element*); + + Item *stem_l()const; }; #endif // NOTE_COLUMN_HH diff --git a/lily/include/note-head.hh b/lily/include/note-head.hh index b945d3a28a..09c75e186e 100644 --- a/lily/include/note-head.hh +++ b/lily/include/note-head.hh @@ -25,6 +25,7 @@ class Note_head public: static SCM brew_molecule (SCM); static Molecule ledger_line (Interval, Score_element*) ; + static bool has_interface (Score_element*); }; #endif // NOTEHEAD_HH diff --git a/lily/include/paper-column.hh b/lily/include/paper-column.hh index fe5dc7c68b..3b1756e8f1 100644 --- a/lily/include/paper-column.hh +++ b/lily/include/paper-column.hh @@ -41,10 +41,16 @@ public: * Put these in Scheme. */ - + + Array minimal_dists_; Array 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); @@ -56,7 +62,7 @@ public: Line_of_score *line_l_; /// which one (left =0) - int rank_i() const; + static int rank_i(Score_element*); Paper_column (SCM); Moment when_mom ()const; @@ -64,14 +70,6 @@ public: bool musical_b () const; bool used_b () const; void set_rank (int); -private: - - /** - The ranking: left is smaller than right - -1 is uninitialised. - */ - int rank_i_; - }; #endif // P_COL_HH diff --git a/lily/include/paper-score.hh b/lily/include/paper-score.hh index bca0642c61..41823001cb 100644 --- a/lily/include/paper-score.hh +++ b/lily/include/paper-score.hh @@ -21,10 +21,9 @@ #Paper_score# contains the items, the columns. */ - class Paper_score : public Music_output { - SCM element_smob_list_; + SCM main_smob_; public: Paper_def *paper_l_; diff --git a/lily/include/rest-collision.hh b/lily/include/rest-collision.hh index baf03668b4..39a9fcd120 100644 --- a/lily/include/rest-collision.hh +++ b/lily/include/rest-collision.hh @@ -16,12 +16,9 @@ class Rest_collision // interface { public: - Score_element *elt_l_; - - void add_column (Note_column*); - Rest_collision(Score_element*); - void set_interface (); - + static void add_column (Score_element*me,Note_column*); + static void set_interface (Score_element*me); + static bool has_interface (Score_element*); static Real force_shift_callback (Score_element *, Axis); static SCM do_shift (Score_element*,SCM); }; diff --git a/lily/include/rest.hh b/lily/include/rest.hh index dc3706005b..f403690dc7 100644 --- a/lily/include/rest.hh +++ b/lily/include/rest.hh @@ -23,6 +23,7 @@ class Rest { public: static SCM after_line_breaking (SCM); + static bool has_interface (Score_element*); static SCM brew_molecule (SCM); }; #endif // REST_HH diff --git a/lily/include/rhythmic-head.hh b/lily/include/rhythmic-head.hh index cb00554714..b64844d41d 100644 --- a/lily/include/rhythmic-head.hh +++ b/lily/include/rhythmic-head.hh @@ -10,7 +10,8 @@ #ifndef RHYTHMIC_HEAD_HH #define RHYTHMIC_HEAD_HH -#include "item.hh" +#include "lily-guile.hh" +#include "lily-proto.hh" /* Properties @@ -20,24 +21,17 @@ dot -- reference to Dots object. */ -class Rhythmic_head : public Item +class Rhythmic_head { public: - - /* - Typically not used, since Rhythmic_head is not breakable. - */ - VIRTUAL_COPY_CONS(Rhythmic_head); - int balltype_i () const; - - void set_dots (Item *); - Stem * stem_l () const; - Item * dots_l () const; - int dot_count () const; - - SCM member_after_line_breaking (); + static int balltype_i (Score_element*) ; + static void set_dots (Score_element*,Item *); + static Item * stem_l (Score_element*) ; + static Item * dots_l (Score_element*) ; + static int dot_count (Score_element*) ; static SCM after_line_breaking (SCM); - Rhythmic_head (SCM s); + static bool has_interface (Score_element*); + static void set_interface (Score_element*); }; #endif // RHYTHMIC_HEAD_HH diff --git a/lily/include/rod.hh b/lily/include/rod.hh index 4edf21b1cd..f76a4e5b0c 100644 --- a/lily/include/rod.hh +++ b/lily/include/rod.hh @@ -19,7 +19,6 @@ struct Column_rod Real distance_f_; Column_rod (); - static int compare (const Column_rod &r1, const Column_rod &r2); }; diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh index 9ae036d0d5..0fd7fd077f 100644 --- a/lily/include/score-element.hh +++ b/lily/include/score-element.hh @@ -17,7 +17,6 @@ typedef Interval (*Extent_callback)(Score_element *,Axis); typedef Real (*Offset_callback)(Score_element *,Axis); -#define READONLY_PROPS // FIXME. /** @@ -69,11 +68,9 @@ class Score_element { */ public: // ugh. - SCM property_alist_; - SCM pointer_alist_; -#ifndef READONLY_PROPS - SCM basic_property_list_; -#endif + SCM immutable_property_alist_; + SCM mutable_property_alist_; + public: Score_element *original_l_; @@ -99,31 +96,14 @@ public: /* properties */ - SCM get_elt_property (String nm) const; - void set_elt_property (String, SCM val); - - /** - Pointers are like properties, but they are subject to a substitution - after line breaking. - */ - SCM get_elt_pointer (const char*) const; + SCM get_elt_property (const char*) const; + SCM get_elt_property (SCM) const; + void set_elt_property (const char * , SCM val); + void set_immutable_elt_property (const char * , SCM val); + void set_immutable_elt_property (SCM key, SCM val); + void set_elt_property (SCM , SCM val); void set_elt_pointer (const char*, SCM val); friend class Property_engraver; // UGHUGHUGH. - /** - UGH! JUNKME ? - - This gets messy because it changes state - - calling - - Bar::proc () - { - s->remove_elt_property ("foo") - } - - twice may do weird things if Bar::foo has a default set. - - */ SCM remove_elt_property (const char* nm); /* @@ -182,10 +162,13 @@ protected: static Interval dim_cache_callback (Dimension_cache const*); public: - SCM member_brew_molecule ()const; - static SCM ly_set_elt_property (SCM, SCM,SCM); static SCM ly_get_elt_property (SCM, SCM); + + bool has_interface (SCM intf); + void set_interface (SCM intf); + + static SCM brew_molecule (SCM); virtual void handle_broken_dependencies (); virtual void handle_prebroken_dependencies (); @@ -235,30 +218,10 @@ public: void set_parent (Score_element* e, Axis); Score_element *parent_l (Axis a) const; - void fixup_refpoint (); + static SCM fixup_refpoint (SCM); }; Score_element * unsmob_element (SCM); -#define MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(TYPE, FUNC) \ -void \ -TYPE ## _ ## FUNC ## _init_functions () \ -{ \ - scm_make_gsubr (#TYPE "::" #FUNC, 1, 0, 0, \ - (SCM(*)(...))TYPE :: FUNC); \ -} \ - \ -ADD_SCM_INIT_FUNC(TYPE ## _ ## FUNC ## _scelt, TYPE ## _ ## FUNC ## _init_functions); \ - -#define GLUE_SCORE_ELEMENT(TYPE, FUNC) \ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(TYPE,FUNC);\ -SCM \ -TYPE::FUNC (SCM smob) \ -{ \ - TYPE * b = dynamic_cast (unsmob_element (smob)); \ - return b ? b->member_ ## FUNC () : SCM_UNDEFINED; \ -} \ - - #endif // STAFFELEM_HH diff --git a/lily/include/script.hh b/lily/include/script.hh index df31d40d15..b983b54716 100644 --- a/lily/include/script.hh +++ b/lily/include/script.hh @@ -24,7 +24,6 @@ public: static Molecule get_molecule (Score_element*,Direction d); Script (SCM); static SCM brew_molecule (SCM); - SCM member_after_line_breaking (); static SCM after_line_breaking (SCM); }; diff --git a/lily/include/separating-group-spanner.hh b/lily/include/separating-group-spanner.hh index f947eb57ba..5c46dc3f8d 100644 --- a/lily/include/separating-group-spanner.hh +++ b/lily/include/separating-group-spanner.hh @@ -15,7 +15,7 @@ class Separating_group_spanner : public Spanner { public: - void add_spacing_unit (Item*); + static void add_spacing_unit (Score_element*me, Item*); Separating_group_spanner(SCM); protected: VIRTUAL_COPY_CONS(Score_element); diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index a7bfa6e21d..74c0b0b4d3 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -28,6 +28,7 @@ struct Separation_item { static void set_interface (Score_element*); + static bool has_interface (Score_element*); static Interval my_width (Score_element*) ; static void add_item (Score_element*,Item*); }; diff --git a/lily/include/side-position-interface.hh b/lily/include/side-position-interface.hh index 117fd8caed..7bcb13aa39 100644 --- a/lily/include/side-position-interface.hh +++ b/lily/include/side-position-interface.hh @@ -31,32 +31,29 @@ padding -- add this much extra space between victim and support + TODO: move out unrelated callbacks. - + + TODO: reduce number of methods. */ -struct Side_position_interface +struct Side_position { - Score_element * elt_l_; public: - Side_position_interface (Score_element const*); static Real side_position (Score_element *, Axis); static Real aligned_on_self (Score_element *, Axis); static Real aligned_side (Score_element *, Axis); static Real quantised_position (Score_element *, Axis); static Real centered_on_parent (Score_element *, Axis); - void set_axis (Axis); - void set_minimum_space (Real); - void set_padding (Real); - void set_quantised (Axis); - Axis get_axis () const; - - bool supported_b () const; - bool has_interface_b () const; - void add_support (Score_element*); - - void add_staff_support (); - Direction get_direction () const; - void set_direction (Direction); + static void set_axis (Score_element*,Axis); + static void set_minimum_space (Score_element*,Real); + static void set_padding (Score_element*,Real); + static Axis get_axis (Score_element*) ; + static bool supported_b (Score_element*) ; + static bool has_interface (Score_element*) ; + static void add_support (Score_element*,Score_element*); + static void add_staff_support (Score_element*); + static Direction get_direction (Score_element*); + static void set_direction (Score_element*,Direction); }; diff --git a/lily/include/slur.hh b/lily/include/slur.hh index e37761e8a5..c9f6052d5a 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -22,12 +22,10 @@ public: void add_column (Note_column*); static SCM brew_molecule (SCM); - SCM member_brew_molecule () const; Array get_encompass_offset_arr () const; Bezier get_curve () const; Direction get_default_dir () const; - SCM member_after_line_breaking (); static SCM after_line_breaking (SCM); Array get_rods () const; Offset get_attachment (Direction dir, Score_element**common) const; diff --git a/lily/include/span-bar.hh b/lily/include/span-bar.hh index 52079f0a5a..da2de18188 100644 --- a/lily/include/span-bar.hh +++ b/lily/include/span-bar.hh @@ -10,7 +10,8 @@ #ifndef SPAN_BAR_HH #define SPAN_BAR_HH -#include "bar.hh" +#include "lily-guile.hh" +#include "lily-proto.hh" /** This is a barline that is spanned across other bar lines. This is @@ -21,23 +22,18 @@ to span a Score_element. Perhaps this can be used for large time sigs? */ -class Span_bar : public Bar +class Span_bar { - Interval get_spanned_interval () const; public: - Span_bar (SCM); - - VIRTUAL_COPY_CONS(Score_element); - void add_bar (Score_element*); - void evaluate_empty (); - + static void set_interface (Score_element*); + static bool has_interface (Score_element*); + static Interval get_spanned_interval (Score_element*); + static void add_bar (Score_element*,Score_element*); + static void evaluate_empty (Score_element*); static Interval width_callback(Score_element *, Axis) ; - - virtual Real get_bar_size () const; - SCM member_before_line_breaking (); + static SCM get_bar_size (SCM); static SCM before_line_breaking (SCM); - SCM member_after_line_breaking (); - static SCM after_line_breaking (SCM); + static Real center_on_spanned_callback (Score_element*,Axis); }; #endif // SPAN_BAR_HH diff --git a/lily/include/spring.hh b/lily/include/spring.hh index 3e88aadf38..4a49085e80 100644 --- a/lily/include/spring.hh +++ b/lily/include/spring.hh @@ -19,7 +19,6 @@ struct Column_spring { Real strength_f_; Column_spring (); - static int compare (const Column_spring &r1, const Column_spring &r2); }; struct Spring{ diff --git a/lily/include/staff-bar.hh b/lily/include/staff-bar.hh deleted file mode 100644 index 0932ef78a1..0000000000 --- a/lily/include/staff-bar.hh +++ /dev/null @@ -1,29 +0,0 @@ -/* - staff-bar.hh -- declare Staff_bar - - source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Han-Wen Nienhuys - - */ - -#ifndef STAFF_BAR_HH -#define STAFF_BAR_HH - -#include "bar.hh" - - -/** - A bar that is on a staff. - Ugh. Entita non multiplicandum ... - */ -class Staff_bar : public Bar -{ -public: - VIRTUAL_COPY_CONS(Score_element); - virtual Real get_bar_size () const; - Staff_bar (SCM); -}; - -#endif /* STAFF_BAR_HH */ - diff --git a/lily/include/staff-symbol-referencer.hh b/lily/include/staff-symbol-referencer.hh index 202f27f0de..ea46d2d474 100644 --- a/lily/include/staff-symbol-referencer.hh +++ b/lily/include/staff-symbol-referencer.hh @@ -1,10 +1,10 @@ -/* - staff-sym-referencer.hh -- declare staff_symbol_referencer - - source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Han-Wen Nienhuys - +/* + staff-sym-referencer.hh -- declare staff_symbol_referencer + + source file of the GNU LilyPond music typesetter + + (c) 1999--2000 Han-Wen Nienhuys + */ #ifndef STAFF_SYMBOL_REFERENCER_HH @@ -14,29 +14,27 @@ /** - A notation object that needs access to variables of the staff (no - lines, leading). - + A notation object that needs access to variables of the staff (no + lines, leading). + */ -class Staff_symbol_referencer_interface +class Staff_symbol_referencer { public: - Score_element * elt_l_; // junkme. - Staff_symbol_referencer_interface (Score_element const*); static void set_interface (Score_element*); - static bool has_interface_b (Score_element*); - void set_position (Real); + static bool has_interface (Score_element*); + static void set_position (Score_element*,Real); static Real callback (Score_element *, Axis a); /** Leading are the lead strips between the sticks (lines) of typeface. ie. leading is vertical space. - */ - - Real staff_space () const; - Staff_symbol * staff_symbol_l () const; - int line_count () const; - Real position_f () const; + */ + + static Real staff_space (Score_element*); + static Score_element * staff_symbol_l (Score_element*); + static int line_count (Score_element*); + static Real position_f (Score_element*); }; int compare_position (Score_element *const&,Score_element *const&); diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh index 79af611f13..f78c4542bc 100644 --- a/lily/include/staff-symbol.hh +++ b/lily/include/staff-symbol.hh @@ -9,22 +9,21 @@ #ifndef STAFFSYM_HH #define STAFFSYM_HH -#include "spanner.hh" + +#include "lily-guile.hh" /** This spanner draws the lines of a pstaff. The bottom line is position 0. */ -class Staff_symbol : public Spanner +class Staff_symbol { public: - Real staff_space () const; - int steps_i() const; - int line_count () const; - Staff_symbol (SCM s); - static SCM brew_molecule (SCM); - VIRTUAL_COPY_CONS(Score_element); - SCM member_brew_molecule() const; - + static Real staff_space (Score_element*) ; + static int steps_i(Score_element*) ; + static int line_count (Score_element*); + static SCM brew_molecule (SCM); + static bool has_interface (Score_element*); + static void set_interface (Score_element*); }; #endif // STAFFSYM_HH diff --git a/lily/include/stem-tremolo.hh b/lily/include/stem-tremolo.hh index 344d1f5568..71ad915593 100644 --- a/lily/include/stem-tremolo.hh +++ b/lily/include/stem-tremolo.hh @@ -17,6 +17,7 @@ class Stem_tremolo { public: static void set_interface (Score_element*); + static bool has_interface (Score_element*); static Interval dim_callback (Score_element*, Axis); static SCM brew_molecule (SCM); static void set_stem (Score_element*me, Score_element *st); diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 2897b07d53..d3b9eb8a1e 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -43,59 +43,53 @@ class Stem : public Item { public: - static SCM brew_molecule (SCM); - - + static SCM brew_molecule (SCM); /// log of the duration. Eg. 4 -> 16th note -> 2 flags - int flag_i () const; + static int flag_i (Score_element*) ; - int beam_count (Direction) const; - void set_beaming (int, Direction d); + 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 - */ - Beam* beam_l () const; - Rhythmic_head * first_head () const; - Drul_array extremal_heads () const; - - Score_element * support_head () const; + don't print flag when in beam. + our beam, for aligning abbrev flags + */ + static Beam * beam_l (Score_element*); + static Score_element * first_head (Score_element*) ; + static Drul_array extremal_heads (Score_element*); + + static Score_element * support_head (Score_element*) ; Stem (SCM); /// ensure that this Stem also encompasses the Notehead #n# - void add_head (Rhythmic_head*n); + static void add_head (Score_element*me, Score_element*n); - Stem_info calc_stem_info () const; + static Stem_info calc_stem_info (Score_element *) ; - Real chord_start_f () const; - Direction get_direction () const; - int type_i () const; - void set_stemend (Real); - Direction get_default_dir() const; + static Real chord_start_f (Score_element *) ; + static Direction get_direction (Score_element*) ; + static int type_i (Score_element *) ; + static void set_stemend (Score_element *,Real); + static Direction get_default_dir(Score_element *) ; + static int get_center_distance(Score_element *,Direction) ; + static int heads_i (Score_element *) ; - int get_center_distance(Direction) const; - int heads_i () const; - - bool invisible_b() const; - + static bool invisible_b(Score_element *) ; + /// heads that the stem encompasses (positions) - Interval head_positions() const; + static Interval head_positions(Score_element *) ; -public: - friend class Stem_tremolo; // ugh. - Real get_default_stem_end_position () const; - void position_noteheads(); - Real stem_end_position () const; + static Real get_default_stem_end_position (Score_element*me) ; + static void position_noteheads(Score_element*); + static Real stem_end_position (Score_element*) ; static Real off_callback (Score_element *, Axis); - Molecule flag () const; - - SCM member_before_line_breaking (); + static Molecule flag (Score_element*); static SCM before_line_breaking (SCM); static Interval dim_callback (Score_element *,Axis); - SCM member_brew_molecule() const; + static bool has_interface (Score_element*); + static void set_interface (Score_element*); - void set_spacing_hints () ; + static void set_spacing_hints (Score_element*me) ; }; #endif diff --git a/lily/include/tie-column.hh b/lily/include/tie-column.hh index c8a7b8bca3..bbee8fede5 100644 --- a/lily/include/tie-column.hh +++ b/lily/include/tie-column.hh @@ -19,6 +19,7 @@ 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); diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 347c0be237..ea1f5f97f3 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -22,8 +22,9 @@ public: Tie (SCM); static void set_head (Score_element*,Direction, Item*head_l); static void set_interface (Score_element*); + static bool has_interface (Score_element*); VIRTUAL_COPY_CONS(Score_element); - static Rhythmic_head* head (Score_element*,Direction) ; + static Score_element * head (Score_element*,Direction) ; static Real position_f (Score_element*) ; static SCM brew_molecule (SCM); static Direction get_default_dir(Score_element*) ; diff --git a/lily/include/timing-translator.hh b/lily/include/timing-translator.hh index c60d4de3b5..7735562b3d 100644 --- a/lily/include/timing-translator.hh +++ b/lily/include/timing-translator.hh @@ -35,7 +35,6 @@ public: Moment measure_position () const; Moment measure_length () const; void set_time_signature (int, int); - void get_time_signature (int *, int*) const; }; #endif // TIMING_TRANSLATOR_HH diff --git a/lily/include/tuplet-spanner.hh b/lily/include/tuplet-spanner.hh index 73370baea3..0bebbf3805 100644 --- a/lily/include/tuplet-spanner.hh +++ b/lily/include/tuplet-spanner.hh @@ -21,6 +21,7 @@ class Tuplet_spanner public: static SCM brew_molecule (SCM); static void set_interface (Score_element*); + static bool has_interface (Score_element*); static void add_column (Score_element*me,Item*); static void add_beam (Score_element*me,Score_element*); diff --git a/lily/include/volta-spanner.hh b/lily/include/volta-spanner.hh index c95961909b..733c43b1e0 100644 --- a/lily/include/volta-spanner.hh +++ b/lily/include/volta-spanner.hh @@ -16,10 +16,10 @@ class Volta_spanner { public: static void set_interface (Score_element*); + static bool has_interface (Score_element*); static SCM brew_molecule (SCM); static void add_column (Score_element*, Score_element*col); static void add_bar (Score_element*me, Item*bar); - }; #endif // VOLTA_SPANNER_HH diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index 010db52474..910a8f8ef5 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -42,7 +42,7 @@ Instrument_name_engraver::do_pre_move_processing () { if (text_) { - text_->add_offset_callback (Side_position_interface::centered_on_parent, + text_->add_offset_callback (Side_position::centered_on_parent, Y_AXIS); typeset_element (text_); @@ -78,7 +78,7 @@ Instrument_name_engraver::acknowledge_element (Score_element_info i) if (gh_string_p (s)) { - if (Bar* b= dynamic_cast (i.elem_l_)) + if (Bar::has_interface (i.elem_l_)) { create_text (s); } diff --git a/lily/item.cc b/lily/item.cc index f601a947dd..319c402842 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -6,7 +6,7 @@ (c) 1997--2000 Han-Wen Nienhuys */ -#include "dimension-cache.hh" + #include "paper-score.hh" #include "debug.hh" #include "item.hh" @@ -138,8 +138,8 @@ Item::handle_prebroken_dependencies () { if (original_l_) { - pointer_alist_ - = handle_broken_smobs (original_l_->pointer_alist_, + mutable_property_alist_ + = handle_broken_smobs (original_l_->mutable_property_alist_, gh_int2scm (break_status_dir ())); } diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index 3d5f48e83a..9208f26ab3 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -17,7 +17,7 @@ #include "engraver.hh" #include "musical-pitch.hh" #include "protected-scm.hh" - +#include "clef.hh" /** Make the key signature. @@ -64,7 +64,7 @@ Key_engraver::create_key (bool def) item_p_->set_elt_property ("old-accidentals", old_accs_); item_p_->set_elt_property ("new-accidentals", get_property ("keySignature")); - Staff_symbol_referencer_interface::set_interface (item_p_); + Staff_symbol_referencer::set_interface (item_p_); SCM prop = get_property ("keyOctaviation"); bool multi = to_boolean (prop); @@ -99,7 +99,7 @@ Key_engraver::do_try_music (Music * req_l) void Key_engraver::acknowledge_element (Score_element_info info) { - if (to_boolean (info.elem_l_->get_elt_property ("clef-interface"))) + if (Clef::has_interface (info.elem_l_)) { SCM c = get_property ("createKeyOnClefChange"); if (to_boolean (c)) @@ -107,7 +107,7 @@ Key_engraver::acknowledge_element (Score_element_info info) create_key (false); } } - else if (dynamic_cast (info.elem_l_) + else if (Bar::has_interface (info.elem_l_) && gh_pair_p (get_property ("keySignature"))) { create_key (true); diff --git a/lily/key-item.cc b/lily/key-item.cc index 871abd31ce..bb3ad4a377 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -71,15 +71,14 @@ Key_item::calculate_position(Score_element *ki, SCM pair) TODO - space the `natural' signs wider */ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Key_item,brew_molecule); +MAKE_SCHEME_CALLBACK(Key_item,brew_molecule); SCM Key_item::brew_molecule (SCM smob) { Score_element*me =unsmob_element (smob); - Staff_symbol_referencer_interface si (me); - Real inter = si.staff_space ()/2.0; + Real inter = Staff_symbol_referencer::staff_space (me)/2.0; SCM newas = me->get_elt_property ("new-accidentals"); Molecule mol; @@ -136,3 +135,15 @@ Key_item::brew_molecule (SCM smob) + +bool +Key_item::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("key-signature-interface")); +} + +void +Key_item::set_interface (Score_element*m) +{ + m->set_interface (ly_symbol2scm ("key-signature-interface")); +} diff --git a/lily/line-group-group-engraver.cc b/lily/line-group-group-engraver.cc index c6e6f7c58d..908396dbe8 100644 --- a/lily/line-group-group-engraver.cc +++ b/lily/line-group-group-engraver.cc @@ -1,18 +1,18 @@ /* - staff-gravs.cc -- implement Line_group_engraver + line-group-engraver-group.cc -- implement Line_group_engraver source file of the GNU LilyPond music typesetter (c) 1997--2000 Han-Wen Nienhuys */ -#include "staff-symbol.hh" #include "command-request.hh" #include "bar.hh" #include "debug.hh" #include "line-group-group-engraver.hh" #include "paper-column.hh" #include "axis-group-interface.hh" +#include "spanner.hh" Line_group_engraver_group::Line_group_engraver_group() @@ -25,7 +25,7 @@ void Line_group_engraver_group::typeset_element (Score_element *elem) { if (!elem->parent_l (Y_AXIS)) - Axis_group_interface (staffline_p_).add_element (elem); + Axis_group_interface::add_element (staffline_p_, elem); Engraver_group_engraver::typeset_element (elem); } @@ -59,8 +59,8 @@ void Line_group_engraver_group::create_line_spanner () { staffline_p_ = new Spanner (SCM_EOL); - Axis_group_interface (staffline_p_).set_interface (); - Axis_group_interface (staffline_p_).set_axes (Y_AXIS,Y_AXIS); + Axis_group_interface::set_interface (staffline_p_); + Axis_group_interface::set_axes (staffline_p_, Y_AXIS,Y_AXIS); } diff --git a/lily/line-number-engraver.cc b/lily/line-number-engraver.cc index dc08a787a9..2811792adb 100644 --- a/lily/line-number-engraver.cc +++ b/lily/line-number-engraver.cc @@ -12,6 +12,7 @@ #include "side-position-interface.hh" #include "rhythmic-head.hh" #include "stem.hh" +#include "note-head.hh" /** Annotate output with line numbers. Creates text-items when it @@ -37,11 +38,11 @@ Line_number_engraver::process_acknowledged () if (!text_item_p_ && interesting_.size ()) { text_item_p_ = new Item (get_property ("basicTextProperties") ); - Side_position_interface si (text_item_p_); - si.set_axis (Y_AXIS); + Side_position::set_axis (text_item_p_,Y_AXIS); + Side_position::set_direction (text_item_p_, UP); text_item_p_->set_parent (interesting_[0].elem_l_, Y_AXIS); - si.set_direction (UP); + announce_element (Score_element_info (text_item_p_, 0)); } } @@ -49,12 +50,12 @@ Line_number_engraver::process_acknowledged () void Line_number_engraver::acknowledge_element (Score_element_info inf) { - if (to_boolean (inf.elem_l_->get_elt_property ("note-head-interface"))) + if (Note_head::has_interface (inf.elem_l_)) { interesting_.push (inf); support_.push (inf.elem_l_); } - else if (to_boolean (inf.elem_l_->get_elt_property ("stem-interface"))) + else if (Stem::has_interface (inf.elem_l_)) { support_.push (inf.elem_l_); } @@ -66,7 +67,7 @@ Line_number_engraver::do_pre_move_processing () if (text_item_p_) { String s; - Side_position_interface si (text_item_p_); + for (int i=0; i < interesting_.size (); i++) { if (i) @@ -78,7 +79,7 @@ Line_number_engraver::do_pre_move_processing () for (int j= support_.size (); j--; ) { - si.add_support (support_[j]); + Side_position::add_support (text_item_p_,support_[j]); } if (s != last_text_) { diff --git a/lily/line-of-score.cc b/lily/line-of-score.cc index 274a558a07..464212d3cb 100644 --- a/lily/line-of-score.cc +++ b/lily/line-of-score.cc @@ -20,20 +20,32 @@ #include "molecule.hh" #include "all-font-metrics.hh" -Line_of_score::Line_of_score() - : Spanner (SCM_EOL) +// todo: use map. +void +fixup_refpoints (SCM s) +{ + for (; gh_pair_p (s); s = gh_cdr (s)) + { + Score_element::fixup_refpoint (gh_car (s)); + } +} + + +Line_of_score::Line_of_score(SCM s) + : Spanner (s) { - set_elt_pointer ("columns", SCM_EOL); - set_elt_pointer ("all-elements", SCM_EOL); + rank_i_ = 0; + set_elt_property ("columns", SCM_EOL); + set_elt_property ("all-elements", SCM_EOL); - Axis_group_interface (this).set_interface (); - Axis_group_interface (this).set_axes (Y_AXIS,X_AXIS); + Axis_group_interface::set_interface (this); + Axis_group_interface::set_axes (this, Y_AXIS,X_AXIS); } int Line_of_score::element_count () const { - return scm_ilength ( get_elt_pointer ("all-elements")); + return scm_ilength ( get_elt_property ("all-elements")); } void @@ -47,7 +59,7 @@ Line_of_score::typeset_element (Score_element * elem_p) void Line_of_score::output_lines () { - for (SCM s = get_elt_pointer ("all-elements"); + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) { unsmob_element (gh_car (s))->do_break_processing (); @@ -59,10 +71,10 @@ Line_of_score::output_lines () for (int i=0; i < broken_into_l_arr_.size (); i++) { Score_element *se = broken_into_l_arr_[i]; - SCM all = se->get_elt_pointer ("all-elements"); + SCM all = se->get_elt_property ("all-elements"); for (SCM s = all; gh_pair_p (s); s = gh_cdr (s)) { - unsmob_element (gh_car (s))->fixup_refpoint (); + fixup_refpoint (gh_car (s)); } count += scm_ilength (all); } @@ -71,13 +83,10 @@ Line_of_score::output_lines () /* needed for doing items. */ - for (SCM s = get_elt_pointer ("all-elements"); - gh_pair_p (s); s = gh_cdr (s)) - { - unsmob_element (gh_car (s))->fixup_refpoint (); - } + fixup_refpoints (get_elt_property ("all-elements")); + - for (SCM s = get_elt_pointer ("all-elements"); + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) { unsmob_element (gh_car (s))->handle_broken_dependencies (); @@ -104,7 +113,7 @@ Line_of_score::output_lines () if (i < broken_into_l_arr_.size () - 1) { - SCM lastcol = gh_car (line_l->get_elt_pointer ("columns")); + SCM lastcol = gh_car (line_l->get_elt_property ("columns")); Score_element* e = unsmob_element (lastcol); SCM inter = e->get_elt_property ("between-system-string"); if (gh_string_p (inter)) @@ -123,6 +132,7 @@ Line_of_score::break_into_pieces (Array const &breaking) { Line_of_score *line_l = dynamic_cast (clone()); line_l->rank_i_ = i; + // line_l->set_immutable_elt_property ("rank", gh_int2scm( i)); Link_array c (breaking[i].cols_); pscore_l_->typeset_line (line_l); @@ -182,65 +192,54 @@ Line_of_score::output_scheme (SCM s) void Line_of_score::add_column (Paper_column*p) { - SCM cs = get_elt_pointer ("columns"); + Score_element *me = this; + SCM cs = me->get_elt_property ("columns"); Score_element * prev = gh_pair_p (cs) ? unsmob_element (gh_car (cs)) : 0; - int rank = prev ? dynamic_cast (prev)->rank_i () + 1 : 0; - p->set_rank (rank); - set_elt_pointer ("columns", gh_cons (p->self_scm_, cs)); + p->rank_i_ = prev ? Paper_column::rank_i (prev) + 1 : 0; - Axis_group_interface (this).add_element (p); -} -void -fixup_refpoints (SCM s) -{ - for (; gh_pair_p (s); s = gh_cdr (s)) - { - Score_element * se = unsmob_element (gh_car (s)); - if (se) - { - se->fixup_refpoint (); - if (!dynamic_cast (se) && !se->parent_l (Y_AXIS)) - { - programming_error ("No parent!"); - } - } - } + me->set_elt_property ("columns", gh_cons (p->self_scm_, cs)); + + Axis_group_interface::add_element (me, p); } + +/* + TODO: use scm_map iso. for loops. + */ void Line_of_score::pre_processing () { - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) unsmob_element (gh_car (s))->discretionary_processing (); if(verbose_global_b) progress_indication ( _f("Element count %d ", element_count ())); - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) unsmob_element (gh_car (s))->handle_prebroken_dependencies (); - fixup_refpoints (get_elt_pointer ("all-elements")); + fixup_refpoints (get_elt_property ("all-elements")); - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) { Score_element* sc = unsmob_element (gh_car (s)); sc->calculate_dependencies (PRECALCED, PRECALCING, ly_symbol2scm ("before-line-breaking-callback")); } progress_indication ("\n" + _ ("Calculating column positions...") + " " ); - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) unsmob_element (gh_car (s))->do_space_processing (); } void Line_of_score::post_processing () { - for (SCM s = get_elt_pointer ("all-elements"); + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) { Score_element* sc = unsmob_element (gh_car (s)); @@ -265,7 +264,7 @@ Line_of_score::post_processing () generate all molecules to trigger all font loads. (ugh. This is not very memory efficient.) */ - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) unsmob_element (gh_car (s))->get_molecule (); /* @@ -288,7 +287,7 @@ Line_of_score::post_processing () /* all elements. */ - for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s)) { Score_element * sc = unsmob_element (gh_car (s)); Molecule m = sc->get_molecule (); @@ -316,7 +315,7 @@ Line_of_score::broken_col_range (Item const*l, Item const*r) const l = l->column_l (); r = r->column_l (); - SCM s = get_elt_pointer ("columns"); + SCM s = get_elt_property ("columns"); while (gh_pair_p (s) && gh_car (s) != r->self_scm_) s = gh_cdr (s); diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index 96e4cec5df..2067092594 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -40,12 +40,12 @@ public: SCM last_keysig_; Link_array mel_l_arr_; - Link_array support_l_arr_; + Link_array support_l_arr_; Link_array forced_l_arr_; - Link_array tied_l_arr_; + Link_array tied_l_arr_; Local_key_engraver(); - Grace_align_item * grace_align_l_; + Item * grace_align_l_; }; Local_key_engraver::Local_key_engraver() @@ -73,7 +73,7 @@ Local_key_engraver::process_acknowledged () bool forget = to_boolean (f); for (int i=0; i < mel_l_arr_.size(); i++) { - Item * support_l = support_l_arr_[i]; + Score_element * support_l = support_l_arr_[i]; Note_req * note_l = mel_l_arr_[i]; int n = note_l->pitch_.notename_i_; @@ -98,9 +98,9 @@ Local_key_engraver::process_acknowledged () if (!key_item_p_) { key_item_p_ = new Local_key_item (get_property ("basicLocalKeyProperties")); - Side_position_interface (key_item_p_).set_axis (X_AXIS); - Side_position_interface (key_item_p_).set_direction (LEFT); - Staff_symbol_referencer_interface::set_interface (key_item_p_); + Side_position::set_axis (key_item_p_, X_AXIS); + Side_position::set_direction (key_item_p_, LEFT); + Staff_symbol_referencer::set_interface (key_item_p_); announce_element (Score_element_info (key_item_p_, 0)); } @@ -113,7 +113,7 @@ Local_key_engraver::process_acknowledged () key_item_p_->add_pitch (note_l->pitch_, note_l->cautionary_b_, extra_natural); - Side_position_interface (key_item_p_).add_support (support_l); + Side_position::add_support (key_item_p_,support_l); } if (!forget) @@ -148,7 +148,7 @@ Local_key_engraver::process_acknowledged () if (key_item_p_ && grace_align_l_) { - Side_position_interface (grace_align_l_).add_support (key_item_p_); + Side_position::add_support (grace_align_l_,key_item_p_); grace_align_l_ =0; } @@ -166,7 +166,7 @@ Local_key_engraver::do_pre_move_processing() if (key_item_p_) { for (int i=0; i < support_l_arr_.size(); i++) - Side_position_interface (key_item_p_).add_support (support_l_arr_[i]); + Side_position::add_support (key_item_p_,support_l_arr_[i]); typeset_element (key_item_p_); key_item_p_ =0; @@ -187,25 +187,24 @@ Local_key_engraver::acknowledge_element (Score_element_info info) bool selfgr = gh_boolean_p (wg) &&gh_scm2bool (wg); bool he_gr = to_boolean (info.elem_l_->get_elt_property ("grace")); - Grace_align_item * gai = dynamic_cast (info.elem_l_); - if (he_gr && !selfgr && gai) + Item * item = dynamic_cast (info.elem_l_); + if (he_gr && !selfgr && item && Grace_align_item::has_interface (item)) { - grace_align_l_ = gai; + grace_align_l_ = item; } if (he_gr != selfgr) return; Note_req * note_l = dynamic_cast (info.req_l_); - Rhythmic_head * note_head = dynamic_cast (info.elem_l_); - if (note_l && note_head) + if (note_l && Rhythmic_head::has_interface (info.elem_l_)) { mel_l_arr_.push (note_l); - support_l_arr_.push (note_head); + support_l_arr_.push (info.elem_l_); } - else if (Tie * tie_l = dynamic_cast (info.elem_l_)) + else if (Tie::has_interface (info.elem_l_)) { - tied_l_arr_.push (Tie::head (tie_l, RIGHT)); + tied_l_arr_.push (Tie::head (info.elem_l_, RIGHT)); } } diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index 2dd0071095..04445201ed 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -29,28 +29,31 @@ Local_key_item::add_pitch (Musical_pitch p, bool cautionary, bool natural) accidental_arr_.push (t); } -GLUE_SCORE_ELEMENT(Local_key_item,before_line_breaking); +MAKE_SCHEME_CALLBACK(Local_key_item,before_line_breaking); SCM -Local_key_item::member_before_line_breaking () +Local_key_item::before_line_breaking (SCM smob) { - accidental_arr_.sort (Local_key_cautionary_tuple::compare); + Local_key_item* me = dynamic_cast(unsmob_element (smob)); + + + me->accidental_arr_.sort (Local_key_cautionary_tuple::compare); return SCM_UNDEFINED; } Molecule -Local_key_item::accidental (int j, bool cautionary, bool natural) const +Local_key_item::accidental (Score_element*me, int j, bool cautionary, bool natural) { - Molecule m (lookup_l ()->afm_find (String ("accidentals-") + to_str (j))); + Molecule m (me->lookup_l ()->afm_find (String ("accidentals-") + to_str (j))); if (natural) { - Molecule prefix = lookup_l ()->afm_find (String ("accidentals-0")); + Molecule prefix = me->lookup_l ()->afm_find (String ("accidentals-0")); m.add_at_edge(X_AXIS, LEFT, Molecule(prefix), 0); } if (cautionary) { - Molecule open = lookup_l ()->afm_find (String ("accidentals-(")); - Molecule close = lookup_l ()->afm_find (String ("accidentals-)")); + Molecule open = me->lookup_l ()->afm_find (String ("accidentals-(")); + Molecule close = me->lookup_l ()->afm_find (String ("accidentals-)")); m.add_at_edge(X_AXIS, LEFT, Molecule(open), 0); m.add_at_edge(X_AXIS, RIGHT, Molecule(close), 0); } @@ -62,20 +65,23 @@ Local_key_item::accidental (int j, bool cautionary, bool natural) const UGH. clean me up */ -GLUE_SCORE_ELEMENT(Local_key_item,brew_molecule); +MAKE_SCHEME_CALLBACK(Local_key_item,brew_molecule); SCM -Local_key_item::member_brew_molecule () const +Local_key_item::brew_molecule (SCM smob) { + Local_key_item* lki = dynamic_cast(unsmob_element (smob)); + Score_element* me = lki; + Molecule mol; - Staff_symbol_referencer_interface si (this); - Real note_distance = si.staff_space ()/2; + + Real note_distance = Staff_symbol_referencer::staff_space (me)/2; Molecule octave_mol; bool oct_b = false; int lastoct = -100; - for (int i = 0; i < accidental_arr_.size(); i++) + for (int i = 0; i < lki->accidental_arr_.size(); i++) { - Musical_pitch p (accidental_arr_[i].pitch_); + Musical_pitch p (lki->accidental_arr_[i].pitch_); // do one octave if (p.octave_i_ != lastoct) { @@ -91,13 +97,13 @@ Local_key_item::member_brew_molecule () const lastoct = p.octave_i_; - SCM c0 = get_elt_property ("c0-position"); + SCM c0 = me->get_elt_property ("c0-position"); Real dy = (gh_number_p (c0) ? gh_scm2int (c0) : 0 + p.notename_i_) * note_distance; - Molecule m (accidental (p.accidental_i_, - accidental_arr_[i].cautionary_b_, - accidental_arr_[i].natural_b_)); + Molecule m (accidental (me,p.accidental_i_, + lki->accidental_arr_[i].cautionary_b_, + lki->accidental_arr_[i].natural_b_)); m.translate_axis (dy, Y_AXIS); octave_mol.add_at_edge (X_AXIS, RIGHT, m, 0); @@ -111,15 +117,15 @@ Local_key_item::member_brew_molecule () const octave_mol = Molecule (); } - if (accidental_arr_.size()) + if (lki->accidental_arr_.size()) { Drul_array pads; /* Use a cons? */ - pads[RIGHT] = get_elt_property ("right-padding"); - pads[LEFT] = get_elt_property ("left-padding"); + pads[RIGHT] = me->get_elt_property ("right-padding"); + pads[LEFT] = me->get_elt_property ("left-padding"); // unused ? @@ -130,7 +136,7 @@ Local_key_item::member_brew_molecule () const Box b(Interval (0, gh_scm2double (pads[d]) * note_distance), Interval (0,0)); - Molecule m (lookup_l ()->blank (b)); + Molecule m (me->lookup_l ()->blank (b)); mol.add_at_edge (X_AXIS, d, m, 0); } while ( flip (&d)!= LEFT); } @@ -143,3 +149,8 @@ Local_key_item::Local_key_item (SCM s) { } +bool +Local_key_item::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("accidentals-interface")); +} diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index 5856b92318..9f142dc891 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -46,7 +46,7 @@ Lyric_engraver::do_process_music() text_p_->set_elt_property ("text", ly_str02scm ((req_l_->text_str_ + " ").ch_C ())); - text_p_->add_offset_callback (&Side_position_interface::aligned_on_self,X_AXIS); + text_p_->add_offset_callback (&Side_position::aligned_on_self,X_AXIS); /* We can't reach the notehead where we're centered from here. So we kludge. diff --git a/lily/lyric-extender.cc b/lily/lyric-extender.cc index 9ae0629bd6..f5209e36aa 100644 --- a/lily/lyric-extender.cc +++ b/lily/lyric-extender.cc @@ -6,7 +6,7 @@ Han-Wen Nienhuys */ -#include "dimension-cache.hh" + #include "box.hh" #include "debug.hh" #include "lookup.hh" @@ -16,7 +16,7 @@ #include "lyric-extender.hh" -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Lyric_extender,brew_molecule) +MAKE_SCHEME_CALLBACK(Lyric_extender,brew_molecule) SCM Lyric_extender::brew_molecule (SCM smob) { diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 019e367361..9a9b96e245 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -9,7 +9,7 @@ #include #include "bar.hh" #include "command-request.hh" -#include "dimension-cache.hh" +#include "staff-symbol.hh" #include "engraver-group-engraver.hh" #include "engraver.hh" #include "lily-guile.hh" @@ -18,7 +18,6 @@ #include "protected-scm.hh" #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" -#include "staff-symbol.hh" #include "item.hh" #include "group-interface.hh" @@ -36,7 +35,6 @@ protected: Protected_scm staffs_; protected: - virtual void do_creation_processing (); virtual void do_pre_move_processing (); virtual void acknowledge_element (Score_element_info); void create_items(Request*); @@ -58,21 +56,17 @@ Mark_engraver::Mark_engraver () staffs_ = SCM_EOL; } -void -Mark_engraver::do_creation_processing () -{ -} void Mark_engraver::acknowledge_element (Score_element_info inf) { Score_element * s = inf.elem_l_; - if (dynamic_cast (s)) + if (Staff_symbol::has_interface (s)) { staffs_ = gh_cons (inf.elem_l_->self_scm_, staffs_); } - else if (text_p_ && dynamic_cast (s)) + else if (text_p_ && Bar::has_interface (s)) { /* Ugh. Figure out how to do this right at beginning of line, (without @@ -87,7 +81,7 @@ Mark_engraver::do_pre_move_processing () { if (text_p_) { - text_p_->set_elt_pointer("side-support-elements" , staffs_); + text_p_->set_elt_property("side-support-elements" , staffs_); typeset_element (text_p_); text_p_ =0; } @@ -103,9 +97,8 @@ Mark_engraver::create_items (Request *rq) SCM s = get_property ("basicMarkProperties"); text_p_ = new Item (s); - Group_interface (text_p_, "interfaces").add_thing (ly_symbol2scm ("Mark")); - Side_position_interface staffside(text_p_); - staffside.set_axis (Y_AXIS); + + Side_position::set_axis (text_p_, Y_AXIS); /* -> Generic props. diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 762deb8825..84d5061e7f 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -14,6 +14,7 @@ #include "staff-symbol-referencer.hh" #include "engraver.hh" #include "moment.hh" +#include "spanner.hh" /** The name says it all: make multi measure rests @@ -38,8 +39,8 @@ private: int start_measure_i_; Moment start_moment_; - Multi_measure_rest *mmrest_p_; - Multi_measure_rest *lastrest_p_; + Spanner *mmrest_p_; + Spanner *lastrest_p_; }; ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver); @@ -54,12 +55,13 @@ Multi_measure_rest_engraver::Multi_measure_rest_engraver () void Multi_measure_rest_engraver::acknowledge_element (Score_element_info i) { - if (Bar *c = dynamic_cast (i.elem_l_)) + Item * item = dynamic_cast (i.elem_l_); + if (item && Bar::has_interface (item)) { if (mmrest_p_) - Multi_measure_rest::add_column (mmrest_p_,c); + Multi_measure_rest::add_column (mmrest_p_,item); if (lastrest_p_) - Multi_measure_rest::add_column (mmrest_p_,c); + Multi_measure_rest::add_column (lastrest_p_,item); } } @@ -111,7 +113,7 @@ Multi_measure_rest_engraver::do_process_music () { mmrest_p_ = new Multi_measure_rest (get_property ("basicMultiMeasureRestProperties")); Multi_measure_rest::set_interface (mmrest_p_); - Staff_symbol_referencer_interface::set_interface (mmrest_p_); + Staff_symbol_referencer::set_interface (mmrest_p_); announce_element (Score_element_info (mmrest_p_, busy_span_req_l_)); start_measure_i_ @@ -127,7 +129,7 @@ Multi_measure_rest_engraver::do_pre_move_processing () if (mmrest_p_ && (now_mom () >= start_moment_) && !mp - && (scm_ilength (mmrest_p_->get_elt_pointer ("columns")) >= 2)) + && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2)) { typeset_element (mmrest_p_); /* diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 72b5468993..6d95336d3a 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -22,7 +22,7 @@ void Multi_measure_rest::set_interface (Score_element*me) { - me->set_elt_pointer ("columns", SCM_EOL); + me->set_elt_property ("columns", SCM_EOL); } Multi_measure_rest::Multi_measure_rest (SCM s) @@ -33,14 +33,14 @@ Multi_measure_rest::Multi_measure_rest (SCM s) [TODO] 17 * variable-sized multi-measure rest symbol: |====| ?? */ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Multi_measure_rest,brew_molecule); +MAKE_SCHEME_CALLBACK(Multi_measure_rest,brew_molecule); SCM Multi_measure_rest::brew_molecule (SCM smob) { Score_element *me = unsmob_element (smob); Spanner * sp = dynamic_cast (me); Real staff_space - = Staff_symbol_referencer_interface (me).staff_space (); + = Staff_symbol_referencer::staff_space (me); Interval sp_iv; Direction d = LEFT; diff --git a/lily/note-column.cc b/lily/note-column.cc index 2d20c48a19..7616a119b5 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -14,11 +14,13 @@ #include "paper-def.hh" #include "group-interface.hh" #include "staff-symbol-referencer.hh" +#include "rest.hh" +#include "note-head.hh" bool Note_column::rest_b () const { - return unsmob_element (get_elt_pointer ("rest")); + return unsmob_element (get_elt_property ("rest")); } int @@ -35,17 +37,19 @@ Note_column::shift_compare (Note_column *const &p1, Note_column*const&p2) Note_column::Note_column( SCM s) : Item (s) { - set_elt_pointer ("note-heads", SCM_EOL); - Axis_group_interface (this).set_interface (); - Axis_group_interface (this).set_axes (X_AXIS, Y_AXIS); - Group_interface (this, "interfaces").add_thing (ly_symbol2scm ("Note_column")); + Score_element* me = this; + me->set_elt_property ("note-heads", SCM_EOL); + me->set_interface (ly_symbol2scm ("note-column-interface")); + + Axis_group_interface::set_interface (me); + Axis_group_interface::set_axes (me, X_AXIS, Y_AXIS); } -Stem * +Item * Note_column::stem_l () const { - SCM s = get_elt_pointer ("stem"); - return dynamic_cast (unsmob_element (s)); + SCM s = get_elt_property ("stem"); + return dynamic_cast(unsmob_element (s)); } @@ -56,13 +60,12 @@ Note_column::head_positions_interval(Score_element *me) iv.set_empty (); - SCM h = me->get_elt_pointer ("note-heads"); + SCM h = me->get_elt_property ("note-heads"); for (; gh_pair_p (h); h = gh_cdr (h)) { Score_element *se = unsmob_element (gh_car (h)); - Staff_symbol_referencer_interface si (se); - int j = int (si.position_f ()); + int j = int (Staff_symbol_referencer::position_f (se)); iv.unite (Slice (j,j)); } return iv; @@ -71,10 +74,10 @@ Note_column::head_positions_interval(Score_element *me) Direction Note_column::static_dir (Score_element* me) { - Score_element *stem = unsmob_element (me->get_elt_pointer ("stem")); - if (dynamic_cast (stem)) - return dynamic_cast (stem)->get_direction (); - else if (gh_pair_p (me->get_elt_pointer ("note-heads"))) + Score_element *stem = unsmob_element (me->get_elt_property ("stem")); + if (stem && Stem::has_interface (stem)) + return Stem::get_direction (stem); + else if (gh_pair_p (me->get_elt_property ("note-heads"))) return (Direction)sign (head_positions_interval (me).center ()); programming_error ("Note column without heads and stem!"); @@ -91,25 +94,25 @@ Note_column::dir () const void Note_column::set_stem (Score_element * stem_l) { - set_elt_pointer ("stem", stem_l->self_scm_); + set_elt_property ("stem", stem_l->self_scm_); add_dependency (stem_l); - Axis_group_interface (this).add_element (stem_l); + Axis_group_interface::add_element (this, stem_l); } void Note_column::add_head (Score_element *h) { - if (to_boolean (h->get_elt_property ("rest-interface"))) + if (Rest::has_interface (h)) { - this->set_elt_pointer ("rest", h->self_scm_); + this->set_elt_property ("rest", h->self_scm_); } - else if (to_boolean (h->get_elt_property ("note-head-interface"))) + else if (Note_head::has_interface (h)) { Pointer_group_interface gi (this, "note-heads"); gi.add_element (h); } - Axis_group_interface (this).add_element (h); + Axis_group_interface::add_element (this, h); } /** @@ -118,11 +121,10 @@ Note_column::add_head (Score_element *h) void Note_column::translate_rests (int dy_i) { - Score_element * r = unsmob_element (get_elt_pointer ("rest")); + Score_element * r = unsmob_element (get_elt_property ("rest")); if (r) { - Staff_symbol_referencer_interface si (r); - r->translate_axis (dy_i * si.staff_space ()/2.0, Y_AXIS); + r->translate_axis (dy_i * Staff_symbol_referencer::staff_space (r)/2.0, Y_AXIS); } } @@ -130,7 +132,7 @@ Note_column::translate_rests (int dy_i) void Note_column::set_dotcol (Score_element *d) { - Axis_group_interface (this).add_element (d); + Axis_group_interface::add_element (this, d); } @@ -138,13 +140,19 @@ Note_column::set_dotcol (Score_element *d) Interval Note_column::rest_dim () const { - Score_element * r = unsmob_element (get_elt_pointer ("rest")); + Score_element * r = unsmob_element (get_elt_property ("rest")); return r->extent (Y_AXIS); } -Rhythmic_head* +Score_element* Note_column::first_head () const { - Stem * st = stem_l (); - return st? st->first_head (): 0; + Score_element * st = stem_l (); + return st? Stem::first_head (st): 0; +} + +bool +Note_column::has_interface (Score_element*me) +{ + return me && me->has_interface (ly_symbol2scm ("note-column-interface")); } diff --git a/lily/note-head.cc b/lily/note-head.cc index 035b18a378..eb23429a89 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -13,7 +13,7 @@ #include "lookup.hh" #include "molecule.hh" #include "musical-request.hh" -#include "dimension-cache.hh" + #include "staff-symbol-referencer.hh" /* @@ -50,19 +50,17 @@ Note_head::ledger_line (Interval xwid, Score_element *me) } - - -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Note_head,brew_molecule); +MAKE_SCHEME_CALLBACK(Note_head,brew_molecule); SCM Note_head::brew_molecule (SCM smob) { Score_element *me = unsmob_element (smob); - Staff_symbol_referencer_interface si (me); + - Real inter_f = si.staff_space ()/2; - int sz = si.line_count ()-1; - Real p = si.position_f (); + Real inter_f = Staff_symbol_referencer::staff_space (me)/2; + int sz = Staff_symbol_referencer::line_count (me)-1; + Real p = Staff_symbol_referencer::position_f (me); int streepjes_i = abs (p) < sz ? 0 : (abs((int)p) - sz) /2; @@ -101,3 +99,9 @@ Note_head::brew_molecule (SCM smob) } return out.create_scheme(); } + +bool +Note_head::has_interface (Score_element*m) +{ + return m&& m->has_interface (ly_symbol2scm ("note-head-interface")); +} diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 49524aea21..39b1cf6b13 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -13,13 +13,14 @@ #include "staff-symbol-referencer.hh" #include "engraver.hh" #include "pqueue.hh" +#include "item.hh" /** make balls and rests */ class Note_heads_engraver : public Engraver { - Link_array note_p_arr_; + Link_array note_p_arr_; Link_array dot_p_arr_; Link_array note_req_l_arr_; Moment note_end_mom_; @@ -85,9 +86,9 @@ Note_heads_engraver::do_process_music() for (int i=0; i < note_req_l_arr_.size (); i++) { - Rhythmic_head *note_p = new Rhythmic_head (get_property ("basicNoteHeadProperties")); + Item *note_p = new Item (get_property ("basicNoteHeadProperties")); - Staff_symbol_referencer_interface::set_interface (note_p); + Staff_symbol_referencer::set_interface (note_p); @@ -100,9 +101,9 @@ Note_heads_engraver::do_process_music() { Item * d = new Item (get_property ("basicDotsProperties")); - Staff_symbol_referencer_interface::set_interface (d); + Staff_symbol_referencer::set_interface (d); - note_p->set_dots (d); + Rhythmic_head::set_dots (note_p, d); if (note_req_l->duration_.dots_i_ != gh_scm2int (d->get_elt_property ("dot-count"))) diff --git a/lily/output-property-engraver.cc b/lily/output-property-engraver.cc index 78227b5f60..ebbb40b6b6 100644 --- a/lily/output-property-engraver.cc +++ b/lily/output-property-engraver.cc @@ -51,9 +51,8 @@ Output_property_engraver::acknowledge_element (Score_element_info inf) gh_list (inf.elem_l_->self_scm_, SCM_UNDEFINED)); if (to_boolean (result)) { - Score_element::ly_set_elt_property (inf.elem_l_->self_scm_, - gh_cadr (o->pred_sym_val_list_), - gh_caddr (o->pred_sym_val_list_)); + inf.elem_l_->set_elt_property (gh_cadr (o->pred_sym_val_list_), + gh_caddr (o->pred_sym_val_list_)); } } } diff --git a/lily/paper-column.cc b/lily/paper-column.cc index b7e18f9aa4..579d028256 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -14,7 +14,7 @@ void Paper_column::add_rod (Paper_column * p, Real d) { - Direction dir = Direction (sign (p->rank_i () - rank_i ())); + Direction dir = Direction (sign (rank_i(p) -rank_i (this))); if (dir != RIGHT) { @@ -42,7 +42,7 @@ Paper_column::add_rod (Paper_column * p, Real d) void Paper_column::add_spring (Paper_column * p, Real d, Real s) { - Direction dir = Direction (sign (p->rank_i () - rank_i ())); + Direction dir = Direction (sign (rank_i(p) -rank_i (this))); if (dir != RIGHT) { @@ -69,19 +69,11 @@ Paper_column::add_spring (Paper_column * p, Real d, Real s) } int -Paper_column::rank_i() const +Paper_column::rank_i(Score_element*me) { - return rank_i_; + return dynamic_cast (me)->rank_i_; } -void -Paper_column::set_rank (int i) -{ - rank_i_ = i; -} - - - Line_of_score* Paper_column::line_l() const { @@ -97,9 +89,9 @@ Paper_column::column_l () const Paper_column::Paper_column (SCM l) : Item (l) // guh.? { - Axis_group_interface (this).set_interface (); - Axis_group_interface (this).set_axes (X_AXIS, X_AXIS); - set_elt_pointer ("bounded-by-me", SCM_EOL); + Axis_group_interface::set_interface (this); + Axis_group_interface::set_axes (this, X_AXIS, X_AXIS); + set_elt_property ("bounded-by-me", SCM_EOL); line_l_=0; rank_i_ = -1; } @@ -131,7 +123,7 @@ Paper_column::musical_b () const bool Paper_column::used_b ()const { - return gh_pair_p (get_elt_pointer ("elements")) || breakable_b () - || gh_pair_p (get_elt_pointer ("bounded-by-me")) + return gh_pair_p (get_elt_property ("elements")) || breakable_b () + || gh_pair_p (get_elt_property ("bounded-by-me")) ; } diff --git a/lily/paper-score.cc b/lily/paper-score.cc index c90f8ca0ff..601ce748cb 100644 --- a/lily/paper-score.cc +++ b/lily/paper-score.cc @@ -27,16 +27,19 @@ Paper_score::Paper_score () { paper_l_ =0; outputter_l_ =0; - line_l_ = new Line_of_score; - element_smob_list_ = SCM_EOL; - typeset_line (line_l_); + line_l_ = 0; + main_smob_ = SCM_EOL; } void Paper_score::typeset_line (Line_of_score *l) { - line_l_->pscore_l_ = this; - element_smob_list_ = gh_cons (l->self_scm_, element_smob_list_); + if (!line_l_) + { + line_l_ = l; // ugh. + } + main_smob_ = gh_cons (l->self_scm_, main_smob_); + l->pscore_l_ = this; } Paper_score::Paper_score (Paper_score const &s) diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc index 2058358a9e..7f4d1777cc 100644 --- a/lily/piano-pedal-engraver.cc +++ b/lily/piano-pedal-engraver.cc @@ -111,18 +111,17 @@ Piano_pedal_engraver::acknowledge_element (Score_element_info info) { if (p->item_p_) { - if (Rhythmic_head* n = dynamic_cast (info.elem_l_)) + if (Rhythmic_head::has_interface (info.elem_l_)) { - Side_position_interface st (p->item_p_); - st.add_support (n); - if (st.get_axis( ) == X_AXIS + Side_position::add_support (p->item_p_, info.elem_l_); + + if (Side_position::get_axis(p->item_p_) == X_AXIS && !p->item_p_->parent_l (Y_AXIS)) - p->item_p_->set_parent (n, Y_AXIS); + p->item_p_->set_parent (info.elem_l_, Y_AXIS); } - if (Stem* s = dynamic_cast (info.elem_l_)) + if (Stem::has_interface (info.elem_l_)) { - Side_position_interface st (p->item_p_); - st.add_support (s); + Side_position::add_support (p->item_p_,info.elem_l_); } } } @@ -195,12 +194,11 @@ Piano_pedal_engraver::do_process_music () p->item_p_->set_elt_property ("text", s); // guh - Side_position_interface si (p->item_p_); - si.set_axis (Y_AXIS); + Side_position::set_axis (p->item_p_,Y_AXIS); // todo: init with basic props. - p->item_p_->add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); - p->item_p_->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS); + p->item_p_->add_offset_callback (Side_position::aligned_on_self, X_AXIS); + p->item_p_->add_offset_callback (Side_position::centered_on_parent, X_AXIS); announce_element (Score_element_info (p->item_p_, p->req_l_drul_[START] ? p->req_l_drul_[START] @@ -223,7 +221,7 @@ Piano_pedal_engraver::do_pre_move_processing () { if (p->item_p_) { - Side_position_interface (p->item_p_).add_staff_support (); + Side_position::add_staff_support (p->item_p_); /* Hmm. */ @@ -231,8 +229,7 @@ Piano_pedal_engraver::do_pre_move_processing () { if (sustain) { - Side_position_interface st (p->item_p_); - st.add_support (sustain); + Side_position::add_support (p->item_p_,sustain); } } typeset_element (p->item_p_); diff --git a/lily/pitch-squash-engraver.cc b/lily/pitch-squash-engraver.cc index fbe88a3300..027e73f37e 100644 --- a/lily/pitch-squash-engraver.cc +++ b/lily/pitch-squash-engraver.cc @@ -7,16 +7,16 @@ */ #include "staff-symbol-referencer.hh" - +#include "note-head.hh" #include "pitch-squash-engraver.hh" #include "rhythmic-head.hh" void Pitch_squash_engraver::acknowledge_element (Score_element_info i) { - if (to_boolean (i.elem_l_->get_elt_property ("note-head-interface"))) + if (Note_head::has_interface (i.elem_l_)) { - Staff_symbol_referencer_interface (i.elem_l_).set_position(0); + Staff_symbol_referencer::set_position (i.elem_l_,0); } } diff --git a/lily/pointer-group-interface.cc b/lily/pointer-group-interface.cc index f20aea2b05..cb9c413a9d 100644 --- a/lily/pointer-group-interface.cc +++ b/lily/pointer-group-interface.cc @@ -22,9 +22,9 @@ Pointer_group_interface::Pointer_group_interface (Score_element const *e, String name_ = s; } bool -Pointer_group_interface::has_interface_b () +Pointer_group_interface::has_interface () { - SCM el = elt_l_->get_elt_pointer (name_.ch_C()); + SCM el = elt_l_->get_elt_property (name_.ch_C()); return el == SCM_EOL || gh_pair_p (el); } @@ -33,23 +33,23 @@ Pointer_group_interface::has_interface_b () void Pointer_group_interface::add_element (Score_element*p) { - elt_l_->set_elt_pointer (name_.ch_C(), + elt_l_->set_elt_property (name_.ch_C(), gh_cons (p->self_scm_, - elt_l_->get_elt_pointer (name_.ch_C()))); + elt_l_->get_elt_property (name_.ch_C()))); } int Pointer_group_interface::count () { - return scm_ilength (elt_l_->get_elt_pointer (name_.ch_C())); + return scm_ilength (elt_l_->get_elt_property (name_.ch_C())); } void Pointer_group_interface::set_interface () { - if (!has_interface_b ()) + if (!has_interface ()) { - elt_l_->set_elt_pointer (name_.ch_C(), SCM_EOL); + elt_l_->set_elt_property (name_.ch_C(), SCM_EOL); } } diff --git a/lily/property-engraver.cc b/lily/property-engraver.cc index a509bd1adb..3a6f547c91 100644 --- a/lily/property-engraver.cc +++ b/lily/property-engraver.cc @@ -76,18 +76,17 @@ Property_engraver::apply_properties (SCM p, Score_element *e) SCM type_p = gh_cadr (entry); SCM elt_prop_sym = gh_caddr (entry); - SCM preset = scm_assq(elt_prop_sym, e->property_alist_); - if (preset != SCM_BOOL_F) + SCM preset = e->get_elt_property (elt_prop_sym); // scm_assq(elt_prop_sym, e->property_alist_); + if (preset != SCM_UNDEFINED) continue; SCM val = get_property (prop_sym); - if (val == SCM_UNDEFINED) ; // Not defined in context. else if (gh_apply (type_p, scm_listify (val, SCM_UNDEFINED)) == SCM_BOOL_T) // defined and right type: do it - e->set_elt_property (ly_symbol2string (elt_prop_sym), val); + e->set_elt_property (elt_prop_sym, val); else /* diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc index 6ed4bf9bb7..dc66a1497a 100644 --- a/lily/repeat-engraver.cc +++ b/lily/repeat-engraver.cc @@ -22,6 +22,8 @@ #include "paper-def.hh" #include "music-list.hh" #include "side-position-interface.hh" +#include "spanner.hh" +#include "note-column.hh" struct Bar_create_event { @@ -261,23 +263,25 @@ Repeat_engraver::do_process_music () void Repeat_engraver::acknowledge_element (Score_element_info i) { - if (Note_column *c = dynamic_cast (i.elem_l_)) - { - if (volta_span_p_) - Volta_spanner::add_column (volta_span_p_,c); - if (end_volta_span_p_) - Volta_spanner::add_column (end_volta_span_p_,c); - } - if (Bar *c = dynamic_cast (i.elem_l_)) + if (Item* item = dynamic_cast (i.elem_l_)) { - if (volta_span_p_) - Volta_spanner::add_bar (volta_span_p_,c); - if (end_volta_span_p_) - Volta_spanner::add_bar(end_volta_span_p_ , c); + if (Note_column::has_interface (item)) + { + if (volta_span_p_) + Volta_spanner::add_column (volta_span_p_,item); + if (end_volta_span_p_) + Volta_spanner::add_column (end_volta_span_p_,item); + } + if (Bar::has_interface (item)) + { + if (volta_span_p_) + Volta_spanner::add_bar (volta_span_p_, item); + if (end_volta_span_p_) + Volta_spanner::add_bar(end_volta_span_p_ , item); + } } } - void Repeat_engraver::do_removal_processing () { @@ -309,7 +313,7 @@ Repeat_engraver::do_pre_move_processing () { if (end_volta_span_p_) { - Side_position_interface (end_volta_span_p_).add_staff_support (); + Side_position::add_staff_support (end_volta_span_p_); typeset_element (end_volta_span_p_ ); end_volta_span_p_ =0; diff --git a/lily/rest-collision-engraver.cc b/lily/rest-collision-engraver.cc index bea1a8cc1c..fc310aef05 100644 --- a/lily/rest-collision-engraver.cc +++ b/lily/rest-collision-engraver.cc @@ -12,7 +12,6 @@ #include "collision.hh" #include "note-column.hh" - class Rest_collision_engraver : public Engraver { Item* rest_collision_p_; @@ -42,10 +41,10 @@ Rest_collision_engraver::process_acknowledged () return; rest_collision_p_ = new Item (get_property ("basicRestCollisionProperties")); - Rest_collision (rest_collision_p_).set_interface(); + Rest_collision::set_interface (rest_collision_p_); announce_element (Score_element_info (rest_collision_p_, 0)); for (int i=0; i< note_column_l_arr_.size (); i++) - Rest_collision (rest_collision_p_).add_column (note_column_l_arr_[i]); + Rest_collision::add_column ( rest_collision_p_,note_column_l_arr_[i]); } void diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 969741809b..7a26dee1a9 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -24,15 +24,15 @@ Rest_collision::force_shift_callback (Score_element *them, Axis a) { assert (a == Y_AXIS); - Score_element * rc = unsmob_element (them->get_elt_pointer ("rest-collision")); + Score_element * rc = unsmob_element (them->get_elt_property ("rest-collision")); if (rc) { /* Done: destruct pointers, so we do the shift only once. */ - SCM elts = rc->get_elt_pointer ("elements"); - rc->set_elt_pointer ("elements", SCM_EOL); + SCM elts = rc->get_elt_property ("elements"); + rc->set_elt_property ("elements", SCM_EOL); do_shift (rc, elts); } @@ -41,49 +41,28 @@ Rest_collision::force_shift_callback (Score_element *them, Axis a) } void -Rest_collision::add_column (Note_column *p) +Rest_collision::add_column (Score_element*me,Note_column *p) { - elt_l_->add_dependency (p); - Pointer_group_interface gi (elt_l_); + me->add_dependency (p); + Pointer_group_interface gi (me); gi.add_element (p); p->add_offset_callback (&Rest_collision::force_shift_callback, Y_AXIS); - p->set_elt_pointer ("rest-collision", elt_l_->self_scm_); + p->set_elt_property ("rest-collision", me->self_scm_); } -/* - these 3 have to go, because they're unnecessary complications. - */ -static Duration -to_duration (int type, int dots) +static SCM +head_characteristic (Score_element * col) { - Duration d; - d.durlog_i_ = type; - d.dots_i_ = dots; - return d; -} - -/* - UGH - - elt_l_ should be "duration" independent - */ -static Moment -rhythmic_head2mom (Rhythmic_head* r) -{ - return to_duration (r->balltype_i (), r->dot_count ()).length_mom (); -} + Score_element * s = unsmob_element (col->get_elt_property ("rest")); -/* - ugh - */ -static Rhythmic_head* -col2rhythmic_head (Score_element* c) -{ - return dynamic_cast (unsmob_element (c->get_elt_pointer ("rest"))); + if (!s) + return SCM_BOOL_F; + else + return gh_cons (s->get_elt_property ("duration-log"), + gh_int2scm (Rhythmic_head::dot_count (s))); } - /* TODO: fixme, fucks up if called twice on the same set of rests. */ @@ -99,7 +78,7 @@ Rest_collision::do_shift (Score_element *me, SCM elts) 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_pointer ("rest"))) + if (e && unsmob_element (e->get_elt_property ("rest"))) rests.push (dynamic_cast (e)); else notes.push (dynamic_cast (e)); @@ -126,12 +105,16 @@ Rest_collision::do_shift (Score_element *me, SCM elts) // meisjes met meisjes if (!notes.size()) { - Moment m = rhythmic_head2mom (col2rhythmic_head (rests[0])); + + /* + FIXME: col2rhythmic_head and rhythmic_head2mom sucks bigtime. + + */ + SCM characteristic = head_characteristic (rests[0]); int i = 1; for (; i < rests.size (); i++) { - Moment me = rhythmic_head2mom (col2rhythmic_head (rests[i])); - if (me != m) + if (!gh_equal_p (head_characteristic (rests[i]), characteristic)) break; } @@ -148,8 +131,12 @@ Rest_collision::do_shift (Score_element *me, SCM elts) { display_count = gh_scm2int (s); for (; i > display_count; i--) - col2rhythmic_head (rests[i-1]) - ->set_elt_property ("molecule-callback", SCM_BOOL_T); + { + Score_element* r = unsmob_element (rests[i-1]->get_elt_property ("rest")); + if (r) + r->suicide (); + rests[i-1]->suicide (); + } } else display_count = rests.size (); @@ -210,7 +197,7 @@ Rest_collision::do_shift (Score_element *me, SCM elts) // FIXME //int stafflines = 5; // rcol->rests[0]->line_count; - int stafflines = Staff_symbol_referencer_interface (me).line_count (); + int stafflines = Staff_symbol_referencer::line_count (me); // hurg? stafflines = stafflines != 0 ? stafflines : 5; @@ -227,14 +214,10 @@ Rest_collision::do_shift (Score_element *me, SCM elts) } void -Rest_collision::set_interface () +Rest_collision::set_interface (Score_element*me) { - elt_l_->set_extent_callback (0, X_AXIS); - elt_l_->set_extent_callback (0, Y_AXIS); - elt_l_->set_elt_pointer ("elements", SCM_EOL); + me->set_extent_callback (0, X_AXIS); + me->set_extent_callback (0, Y_AXIS); + me->set_elt_property ("elements", SCM_EOL); } -Rest_collision::Rest_collision (Score_element* c) -{ - elt_l_ = c; -} diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index 35df3f18ec..1d615fccb3 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -5,17 +5,19 @@ (c) 1997--2000 Han-Wen Nienhuys */ +#include "item.hh" #include "staff-symbol-referencer.hh" #include "musical-request.hh" #include "dots.hh" #include "rhythmic-head.hh" #include "engraver.hh" + class Rest_engraver : public Engraver { Rest_req *rest_req_l_; Item * dot_p_; - Rhythmic_head * rest_p_; + Score_element* rest_p_; protected: virtual bool do_try_music (Music *); virtual void do_pre_move_processing (); @@ -64,8 +66,9 @@ Rest_engraver::do_process_music () { if (rest_req_l_ && !rest_p_) { - rest_p_ = new Rhythmic_head (get_property ("basicRestProperties")); - Staff_symbol_referencer_interface::set_interface (rest_p_); + rest_p_ = new Item (get_property ("basicRestProperties")); + Rhythmic_head::set_interface (rest_p_); + Staff_symbol_referencer::set_interface (rest_p_); rest_p_->set_elt_property ("duration-log", @@ -75,10 +78,8 @@ Rest_engraver::do_process_music () { dot_p_ = new Item (get_property ("basicDotsProperties")); - Staff_symbol_referencer_interface::set_interface (dot_p_); - - - rest_p_->set_dots (dot_p_); + Staff_symbol_referencer::set_interface (dot_p_); + Rhythmic_head::set_dots (rest_p_, dot_p_); dot_p_->set_parent (rest_p_, Y_AXIS); dot_p_->add_offset_callback (Dots::quantised_position_callback, Y_AXIS); dot_p_->set_elt_property ("dot-count", diff --git a/lily/rest.cc b/lily/rest.cc index a8264b0ef6..7f4e6cf4f7 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -15,7 +15,7 @@ #include "staff-symbol-referencer.hh" // -> offset callback -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Rest,after_line_breaking); +MAKE_SCHEME_CALLBACK(Rest,after_line_breaking); SCM Rest::after_line_breaking (SCM smob) { @@ -23,11 +23,11 @@ Rest::after_line_breaking (SCM smob) int bt = gh_scm2int (me->get_elt_property ("duration-log")); if (bt == 0) { - Staff_symbol_referencer_interface si (me); - me->translate_axis (si.staff_space() , Y_AXIS); + + me->translate_axis (Staff_symbol_referencer::staff_space (me) , Y_AXIS); } - Score_element * d = unsmob_element (me->get_elt_pointer ("dot")); + Score_element * d = unsmob_element (me->get_elt_property ("dot")); if (d && bt > 4) // UGH. { d->set_elt_property ("staff-position", @@ -38,25 +38,25 @@ Rest::after_line_breaking (SCM smob) } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Rest,brew_molecule) +MAKE_SCHEME_CALLBACK(Rest,brew_molecule) SCM Rest::brew_molecule (SCM smob) { - Score_element* sc = unsmob_element (smob); + Score_element* me = unsmob_element (smob); bool ledger_b =false; - SCM balltype = sc->get_elt_property ("duration-log"); + SCM balltype = me->get_elt_property ("duration-log"); if (balltype == gh_int2scm (0) || balltype == gh_int2scm (1)) { - Staff_symbol_referencer_interface si(sc); - ledger_b = abs(si.position_f () - (2* gh_scm2int (balltype) - 1)) - > si.line_count (); + int sz = Staff_symbol_referencer::line_count (me); + Real dif = abs(Staff_symbol_referencer::position_f (me) - (2* gh_scm2int (balltype) - 1)); + ledger_b = dif > sz; } String style; - SCM style_sym =sc->get_elt_property ("style"); + SCM style_sym =me->get_elt_property ("style"); if (gh_scm2int (balltype) >= 2 && gh_string_p (style_sym)) { style = ly_scm2string (style_sym); @@ -65,6 +65,12 @@ Rest::brew_molecule (SCM smob) String idx = ("rests-") + to_str (gh_scm2int (balltype)) + (ledger_b ? "o" : "") + style; - return sc-> lookup_l ()->afm_find (idx).create_scheme(); + return me-> lookup_l ()->afm_find (idx).create_scheme(); } + +bool +Rest::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("rest-interface")); +} diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index 632beeb3af..b83520535c 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -6,7 +6,7 @@ (c) 1997--2000 Han-Wen Nienhuys */ -#include "dimension-cache.hh" + #include "slur.hh" #include "engraver.hh" #include "rhythmic-head.hh" @@ -14,12 +14,13 @@ #include "note-column.hh" #include "dot-column.hh" #include "musical-request.hh" +#include "item.hh" class Rhythmic_column_engraver :public Engraver { - Link_array rhead_l_arr_; + Link_array rhead_l_arr_; Link_array grace_slur_endings_; - Stem * stem_l_; + Score_element * stem_l_; Note_column *ncol_p_; Score_element *dotcol_l_; @@ -51,7 +52,7 @@ Rhythmic_column_engraver::process_acknowledged () { if (!ncol_p_) { - ncol_p_ = new Note_column (SCM_EOL); + ncol_p_ = new Note_column (get_property("basicNoteColumnProperties")); announce_element (Score_element_info (ncol_p_, 0)); } @@ -94,22 +95,20 @@ Rhythmic_column_engraver::acknowledge_element (Score_element_info i) { SCM wg = get_property ("weAreGraceContext"); bool wegrace = to_boolean (wg); - if ((wegrace != - (i.elem_l_->get_elt_property ("grace") != SCM_UNDEFINED)) + if (wegrace != to_boolean (i.elem_l_->get_elt_property ("grace")) && !dynamic_cast (i.elem_l_)) return ; Item * item = dynamic_cast (i.elem_l_); - if (Stem*s=dynamic_cast (item)) + if (item && Stem::has_interface (item)) { - stem_l_ = s; + stem_l_ = item; } - else if (Rhythmic_head*r=dynamic_cast (item)) + else if (item && Rhythmic_head::has_interface (item)) { - rhead_l_arr_.push (r); + rhead_l_arr_.push (item); } - else if (item - && to_boolean (item->get_elt_property ("dot-column-interface"))) + else if (item && Dot_column::has_interface (item)) { dotcol_l_ = item; } diff --git a/lily/rhythmic-head.cc b/lily/rhythmic-head.cc index b443e3d612..9c8cb00b50 100644 --- a/lily/rhythmic-head.cc +++ b/lily/rhythmic-head.cc @@ -19,42 +19,49 @@ Item* -Rhythmic_head::dots_l () const +Rhythmic_head::dots_l (Score_element*me) { - SCM s = get_elt_pointer ("dot"); + SCM s = me->get_elt_property ("dot"); return dynamic_cast (unsmob_element (s)); } int -Rhythmic_head::balltype_i () const +Rhythmic_head::balltype_i (Score_element*me) { - SCM s = get_elt_property ("duration-log"); + SCM s = me->get_elt_property ("duration-log"); return gh_number_p (s) ? gh_scm2int (s) : 0; } -Stem* -Rhythmic_head::stem_l () const +Item* +Rhythmic_head::stem_l (Score_element*me) { - SCM s = get_elt_pointer ("stem"); - return dynamic_cast (unsmob_element (s)); + SCM s = me->get_elt_property ("stem"); + return dynamic_cast (unsmob_element (s)); } int -Rhythmic_head::dot_count () const +Rhythmic_head::dot_count (Score_element*me) { - return dots_l () - ? gh_scm2int (dots_l ()->get_elt_property ("dot-count")) : 0; + return dots_l (me) + ? gh_scm2int (dots_l (me)->get_elt_property ("dot-count")) : 0; } void -Rhythmic_head::set_dots (Item *dot_l) +Rhythmic_head::set_dots (Score_element*me,Item *dot_l) { - set_elt_pointer ("dot", dot_l->self_scm_); + me->set_elt_property ("dot", dot_l->self_scm_); } -Rhythmic_head::Rhythmic_head (SCM s) - : Item (s) +void +Rhythmic_head::set_interface (Score_element*me) +{ + me->set_interface (ly_symbol2scm ("rhythmic-head-interface")); +} + +bool +Rhythmic_head::has_interface (Score_element*me) { + return me && me->has_interface (ly_symbol2scm ("rhythmic-head-interface")); } diff --git a/lily/rod.cc b/lily/rod.cc index 7d287f84ba..15b4c7a808 100644 --- a/lily/rod.cc +++ b/lily/rod.cc @@ -25,13 +25,6 @@ Column_rod::Column_rod () distance_f_ = 0; other_l_ = 0; } - -int -Column_rod::compare (const Column_rod &r1, const Column_rod &r2) -{ - return r1.other_l_->rank_i() - r2.other_l_->rank_i(); -} - void Rod::columnize () diff --git a/lily/score-element-callback.cc b/lily/score-element-callback.cc index 7b701b15bd..00cd9f7a38 100644 --- a/lily/score-element-callback.cc +++ b/lily/score-element-callback.cc @@ -1,3 +1,4 @@ +#if 0 /* score-element-callback.cc -- implement Callback smob. @@ -52,3 +53,4 @@ smobify_callback (Score_element_callback cb ) } ADD_SCM_INIT_FUNC(callback, start_callback_smobs); +#endif diff --git a/lily/score-element.cc b/lily/score-element.cc index c79813468c..5b17ffbbd3 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -50,12 +50,14 @@ Score_element::Score_element(SCM basicprops) status_i_ = 0; self_scm_ = SCM_EOL; original_l_ = 0; - property_alist_ = basicprops; - pointer_alist_ = SCM_EOL; - + immutable_property_alist_ = basicprops; + mutable_property_alist_ = SCM_EOL; + smobify_self (); - set_elt_pointer ("dependencies", SCM_EOL); - set_elt_property ("interfaces", SCM_EOL); + set_elt_property ("dependencies", SCM_EOL); + + if (get_elt_property ("interfaces") == SCM_UNDEFINED) + set_elt_property ("interfaces", SCM_EOL); } @@ -64,9 +66,8 @@ Score_element::Score_element (Score_element const&s) { self_scm_ = SCM_EOL; original_l_ =(Score_element*) &s; - property_alist_ = s.property_alist_; - - pointer_alist_ = SCM_EOL; + immutable_property_alist_ = s.immutable_property_alist_; + mutable_property_alist_ = SCM_EOL; status_i_ = s.status_i_; lookup_l_ = s.lookup_l_; @@ -87,25 +88,21 @@ Score_element::~Score_element() SCM -Score_element::get_elt_pointer (const char *nm) const +Score_element::get_elt_property (const char *nm) const { - SCM sym = ly_symbol2scm (nm); - SCM s = scm_assq(sym, pointer_alist_); - - return (s == SCM_BOOL_F) ? SCM_UNDEFINED : gh_cdr (s); + SCM sym = ly_symbol2scm (nm); + return get_elt_property (sym); } -// should also have one that takes SCM arg. SCM -Score_element::get_elt_property (String nm) const +Score_element::get_elt_property (SCM sym) const { - SCM sym = ly_symbol2scm (nm.ch_C()); - SCM s = scm_assq(sym, property_alist_); - + SCM s = scm_assq(sym, mutable_property_alist_); if (s != SCM_BOOL_F) - return gh_cdr (s); + return gh_cdr (s); - return SCM_UNDEFINED; + s = scm_assq (sym, immutable_property_alist_); + return (s == SCM_BOOL_F) ? SCM_UNDEFINED : gh_cdr (s); } /* @@ -123,17 +120,34 @@ Score_element::remove_elt_property (const char* key) } void -Score_element::set_elt_property (String k, SCM val) +Score_element::set_elt_property (const char* k, SCM v) { - SCM sym = ly_symbol2scm (k.ch_C ()); - property_alist_ = gh_cons (gh_cons (sym, val), property_alist_); + SCM s = ly_symbol2scm (k); + set_elt_property (s, v); } +/* + Puts the k, v in the immutable_property_alist_, which is convenient for + storing variables that are needed during the breaking process. (eg. + Line_of_score::rank : int ) + */ void -Score_element::set_elt_pointer (const char* k, SCM v) +Score_element::set_immutable_elt_property (const char*k, SCM v) { SCM s = ly_symbol2scm (k); - pointer_alist_ = scm_assq_set_x (pointer_alist_, s, v); + set_immutable_elt_property (s, v); +} + +void +Score_element::set_immutable_elt_property (SCM s, SCM v) +{ + immutable_property_alist_ = gh_cons (gh_cons (s,v), mutable_property_alist_); + mutable_property_alist_ = scm_assq_remove_x (mutable_property_alist_, s); +} +void +Score_element::set_elt_property (SCM s, SCM v) +{ + mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, s, v); } @@ -214,7 +228,7 @@ Score_element::calculate_dependencies (int final, int busy, SCM funcname) status_i_= busy; - for (SCM d= get_elt_pointer ("dependencies"); gh_pair_p (d); d = gh_cdr (d)) + for (SCM d= get_elt_property ("dependencies"); gh_pair_p (d); d = gh_cdr (d)) { unsmob_element (gh_car (d)) ->calculate_dependencies (final, busy, funcname); @@ -262,7 +276,7 @@ Score_element::do_add_processing() } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Score_element,brew_molecule) +MAKE_SCHEME_CALLBACK(Score_element,brew_molecule) /* ugh. @@ -395,8 +409,8 @@ Score_element::handle_broken_dependencies() { Score_element * sc = s->broken_into_l_arr_[i]; Line_of_score * l = sc->line_l (); - sc->pointer_alist_ = - handle_broken_smobs (pointer_alist_, + sc->mutable_property_alist_ = + handle_broken_smobs (mutable_property_alist_, l ? l->self_scm_ : SCM_UNDEFINED); } } @@ -406,13 +420,13 @@ Score_element::handle_broken_dependencies() if (line && common_refpoint (line, X_AXIS) && common_refpoint (line, Y_AXIS)) { - pointer_alist_ - = handle_broken_smobs (pointer_alist_, + mutable_property_alist_ + = handle_broken_smobs (mutable_property_alist_, line ? line->self_scm_ : SCM_UNDEFINED); } else if (dynamic_cast (this)) { - pointer_alist_ = handle_broken_smobs (pointer_alist_, + mutable_property_alist_ = handle_broken_smobs (mutable_property_alist_, SCM_UNDEFINED); } else @@ -437,8 +451,8 @@ Score_element::handle_broken_dependencies() void Score_element::suicide () { - property_alist_ = SCM_EOL; - pointer_alist_ = SCM_EOL; + mutable_property_alist_ = SCM_EOL; + immutable_property_alist_ = SCM_EOL; set_extent_callback (0, Y_AXIS); set_extent_callback (0, X_AXIS); @@ -643,24 +657,26 @@ Score_element::set_parent (Score_element *g, Axis a) dim_cache_[a].parent_l_ = g; } -void -Score_element::fixup_refpoint () +MAKE_SCHEME_CALLBACK(Score_element,fixup_refpoint); +SCM +Score_element::fixup_refpoint (SCM smob) { + Score_element *me = unsmob_element (smob); for (int a = X_AXIS; a < NO_AXES; a ++) { Axis ax = (Axis)a; - Score_element * parent = parent_l (ax); + Score_element * parent = me->parent_l (ax); if (!parent) continue; - if (parent->line_l () != line_l () && line_l ()) + if (parent->line_l () != me->line_l () && me->line_l ()) { - Score_element * newparent = parent->find_broken_piece (line_l ()); - set_parent (newparent, ax); + Score_element * newparent = parent->find_broken_piece (me->line_l ()); + me->set_parent (newparent, ax); } - if (Item * i = dynamic_cast (this)) + if (Item * i = dynamic_cast (me)) { Item *parenti = dynamic_cast (parent); @@ -670,11 +686,12 @@ Score_element::fixup_refpoint () if (my_dir!= parenti->break_status_dir()) { Item *newparent = parenti->find_prebroken_piece (my_dir); - set_parent (newparent, ax); + me->set_parent (newparent, ax); } } } } + return smob; } @@ -697,7 +714,7 @@ Score_element::mark_smob (SCM ses) programming_error ("SMOB marking gone awry"); return SCM_EOL; } - scm_gc_mark (s->pointer_alist_); + scm_gc_mark ( s->immutable_property_alist_); s->do_derived_mark (); if (s->parent_l (Y_AXIS)) @@ -705,7 +722,7 @@ Score_element::mark_smob (SCM ses) if (s->parent_l (X_AXIS)) scm_gc_mark (s->parent_l (X_AXIS)->self_scm_); - return s->property_alist_; + return s->mutable_property_alist_; } int @@ -741,7 +758,7 @@ Score_element::equal_p (SCM a, SCM b) SCM -Score_element::ly_set_elt_property (SCM elt, SCM sym, SCM val) +ly_set_elt_property (SCM elt, SCM sym, SCM val) { Score_element * sc = unsmob_element (elt); @@ -754,7 +771,7 @@ Score_element::ly_set_elt_property (SCM elt, SCM sym, SCM val) if (sc) { - sc->property_alist_ = scm_assq_set_x (sc->property_alist_, sym, val); + sc->set_elt_property (sym, val); } else { @@ -767,18 +784,13 @@ Score_element::ly_set_elt_property (SCM elt, SCM sym, SCM val) SCM -Score_element::ly_get_elt_property (SCM elt, SCM sym) +ly_get_elt_property (SCM elt, SCM sym) { Score_element * sc = unsmob_element (elt); if (sc) { - SCM s = scm_assq(sym, sc->property_alist_); - - if (s != SCM_BOOL_F) - return gh_cdr (s); - else - return SCM_UNDEFINED; + return sc->get_elt_property (sym); } else { @@ -795,36 +807,50 @@ Score_element::discretionary_processing() } + SCM spanner_get_bound (SCM slur, SCM dir) { return dynamic_cast (unsmob_element (slur))->get_bound (to_dir (dir))->self_scm_; } -SCM -score_element_get_pointer (SCM se, SCM name) + + +static SCM interfaces_sym; + +static void +init_functions () { - SCM s = scm_assq (name, unsmob_element (se)->pointer_alist_); - return (s == SCM_BOOL_F) ? SCM_UNDEFINED : gh_cdr (s); + interfaces_sym = scm_permanent_object (ly_symbol2scm ("interfaces")); + + scm_make_gsubr ("ly-get-elt-property", 2, 0, 0, (SCM(*)(...))ly_get_elt_property); + scm_make_gsubr ("ly-set-elt-property", 3, 0, 0, (SCM(*)(...))ly_set_elt_property); + scm_make_gsubr ("ly-get-spanner-bound", 2 , 0, 0, (SCM(*)(...)) spanner_get_bound); } -SCM -score_element_get_property (SCM se, SCM name) +bool +Score_element::has_interface (SCM k) { - SCM s = scm_assq (name, unsmob_element (se)->property_alist_); - return (s == SCM_BOOL_F) ? SCM_UNDEFINED : gh_cdr (s); -} + if (mutable_property_alist_ == SCM_EOL) + return false; + + SCM ifs = get_elt_property (interfaces_sym); + return scm_memq (k, ifs) != SCM_BOOL_F; +} -static void -init_functions () +void +Score_element::set_interface (SCM k) { - scm_make_gsubr ("ly-get-elt-property", 2, 0, 0, (SCM(*)(...))Score_element::ly_get_elt_property); - scm_make_gsubr ("ly-set-elt-property", 3, 0, 0, (SCM(*)(...))Score_element::ly_set_elt_property); - scm_make_gsubr ("ly-get-elt-pointer", 2 , 0, 0, - (SCM(*)(...)) score_element_get_pointer); - scm_make_gsubr ("ly-get-spanner-bound", 2 , 0, 0, - (SCM(*)(...)) spanner_get_bound); + if (has_interface (k)) + return ; + else + { + set_elt_property (interfaces_sym, + gh_cons (k, get_elt_property (interfaces_sym))); + } } + + ADD_SCM_INIT_FUNC(scoreelt, init_functions); diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 8c878da7bf..842a896fb7 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -7,7 +7,7 @@ */ #include "debug.hh" -#include "dimension-cache.hh" + #include "line-of-score.hh" #include "item.hh" #include "score-engraver.hh" @@ -158,12 +158,12 @@ Score_engraver::typeset_all() if (!elem_p->parent_l (X_AXIS)) { bool br = to_boolean (elem_p->get_elt_property ("breakable")); - Axis_group_interface gi ((br) ? command_column_l_ : musical_column_l_) ; - gi.add_element(elem_p); + Axis_group_interface::add_element (br ? command_column_l_ : musical_column_l_, elem_p); + } } if (!elem_p->parent_l(Y_AXIS)) - Axis_group_interface (scoreline_l_).add_element (elem_p); + Axis_group_interface::add_element (scoreline_l_, elem_p); } elem_p_arr_.clear(); } @@ -266,5 +266,7 @@ Score_engraver::do_add_processing () assert (!daddy_trans_l_); pscore_p_ = new Paper_score; pscore_p_->paper_l_ = dynamic_cast(output_def_l_); + + pscore_p_->typeset_line (new Line_of_score (get_property(ly_symbol2scm ("basicLineOfScoreProperties")))); } diff --git a/lily/script-column-engraver.cc b/lily/script-column-engraver.cc index e76d3c41a7..47c37cfcaa 100644 --- a/lily/script-column-engraver.cc +++ b/lily/script-column-engraver.cc @@ -56,12 +56,12 @@ Script_column_engraver::do_post_move_processing () void Script_column_engraver::acknowledge_element( Score_element_info inf) { - if (Side_position_interface (inf.elem_l_).has_interface_b ()) + if (Side_position::has_interface (inf.elem_l_)) { Item *thing = dynamic_cast (inf.elem_l_); if (thing && !thing->breakable_b () - && Side_position_interface (inf.elem_l_).get_axis () == Y_AXIS) + && Side_position::get_axis (inf.elem_l_) == Y_AXIS) { script_l_arr_.push (thing); } @@ -74,7 +74,7 @@ Script_column_engraver::process_acknowledged () if (!scol_p_ && script_l_arr_.size () > 1) { scol_p_ = new Item (get_property ("basicScriptColumnProperties")); - scol_p_->set_elt_pointer ("scripts", SCM_EOL); + scol_p_->set_elt_property ("scripts", SCM_EOL); announce_element (Score_element_info (scol_p_, 0)); } diff --git a/lily/script-column.cc b/lily/script-column.cc index 7d047b97f5..0da72b3d4b 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -8,7 +8,7 @@ */ #include "script-column.hh" #include "side-position-interface.hh" -#include "dimension-cache.hh" + #include "group-interface.hh" void @@ -34,7 +34,7 @@ staff_side_compare (Score_element * const &i1, return gh_scm2int (p1) - gh_scm2int (p2); } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Script_column,before_line_breaking); +MAKE_SCHEME_CALLBACK(Script_column,before_line_breaking); SCM Script_column::before_line_breaking (SCM smob) @@ -47,8 +47,8 @@ Script_column::before_line_breaking (SCM smob) for (int i=0; i < staff_sided.size (); i++) { - Side_position_interface st (staff_sided[i]); - arrs[st.get_direction ()].push (staff_sided[i]); + arrs[Side_position::get_direction (staff_sided[i])] + .push (staff_sided[i]); } Direction d = DOWN; @@ -60,11 +60,9 @@ Script_column::before_line_breaking (SCM smob) Score_element * last = 0; for (int i=0; i < arr.size (); i++) { - Side_position_interface s (arr[i]); + if (last) - { - s.add_support (last); - } + Side_position::add_support( arr[i],last); arr[i]->remove_elt_property ("script-priority"); last = arr[i]; diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index a12f671bbd..2f433d9d37 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -9,9 +9,8 @@ #include "side-position-interface.hh" #include "musical-request.hh" #include "stem.hh" -#include "staff-symbol.hh" #include "rhythmic-head.hh" -#include "dimension-cache.hh" + #include "engraver.hh" @@ -72,9 +71,7 @@ Script_engraver::do_process_music() // todo -> use result of articulation-to-scriptdef directly as basic prop list. Script *p =new Script (get_property ("basicScriptProperties")); - p->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS); - Side_position_interface stafy (p); - + p->add_offset_callback (Side_position::centered_on_parent, X_AXIS); list = gh_cdr (list); p->set_elt_property ("molecule", @@ -93,23 +90,21 @@ Script_engraver::do_process_music() if (relative_stem_dir) p->set_elt_property ("side-relative-direction", gh_int2scm (relative_stem_dir)); else - stafy.set_direction ((Direction)force_dir); + Side_position::set_direction (p,(Direction)force_dir); if (l->get_direction ()) - stafy.set_direction (l->get_direction ()); + Side_position::set_direction (p, l->get_direction ()); SCM axisprop = get_property ("scriptHorizontal"); bool xaxis = to_boolean (axisprop); - if (xaxis) - stafy.set_axis (X_AXIS); - else - stafy.set_axis (Y_AXIS); + Side_position::set_axis (p, xaxis ? X_AXIS : Y_AXIS); if (!follow_staff && ! xaxis) p->set_elt_property ("staff-support", SCM_BOOL_T); if (!xaxis && follow_staff) - stafy.set_quantised (Y_AXIS); + p->add_offset_callback (Side_position::quantised_position, Y_AXIS); + p->set_elt_property ("script-priority", priority); @@ -128,30 +123,31 @@ Script_engraver::acknowledge_element (Score_element_info inf) if (us_grace != them_grace) return; - if (Stem *s = dynamic_cast(inf.elem_l_)) + if (Stem::has_interface (inf.elem_l_)) { for (int i=0; i < script_p_arr_.size(); i++) { - Side_position_interface stafy (script_p_arr_[i]); - stafy.elt_l_->set_elt_property ("direction-source", s->self_scm_); - stafy.add_support (s); + Score_element*e = script_p_arr_[i]; + + e->set_elt_property ("direction-source", inf.elem_l_->self_scm_); + Side_position::add_support (e, inf.elem_l_); } } - else if (Rhythmic_head * rh = dynamic_cast(inf.elem_l_)) + else if (Rhythmic_head::has_interface (inf.elem_l_)) { for (int i=0; i < script_p_arr_.size(); i++) { - Side_position_interface stafy(script_p_arr_[i]); + Score_element *e = script_p_arr_[i]; - if (!stafy.elt_l_->parent_l (X_AXIS)) + if (!e->parent_l (X_AXIS)) { - stafy.elt_l_->set_parent (inf.elem_l_, X_AXIS); + e->set_parent (inf.elem_l_, X_AXIS); } - if (stafy.get_axis () == X_AXIS - && !stafy.elt_l_->parent_l (Y_AXIS)) - stafy.elt_l_->set_parent (rh, Y_AXIS); + if (Side_position::get_axis (e) == X_AXIS + && !e->parent_l (Y_AXIS)) + e->set_parent (inf.elem_l_, Y_AXIS); - stafy.add_support (rh); + Side_position::add_support (e,inf.elem_l_); } } } @@ -164,7 +160,7 @@ Script_engraver::do_pre_move_processing() Script * sc = script_p_arr_[i]; if (to_boolean (sc->remove_elt_property ("staff-support"))) { - Side_position_interface (sc).add_staff_support (); + Side_position::add_staff_support (sc); } typeset_element (sc); } diff --git a/lily/script.cc b/lily/script.cc index 5ad45f28ca..c4dcc30cd4 100644 --- a/lily/script.cc +++ b/lily/script.cc @@ -12,7 +12,7 @@ #include "lookup.hh" #include "side-position-interface.hh" #include "paper-def.hh" -#include "dimension-cache.hh" + Script ::Script (SCM s) : Item (s) @@ -43,20 +43,20 @@ Script::get_molecule(Score_element * me, Direction d) - -GLUE_SCORE_ELEMENT(Script,after_line_breaking); +MAKE_SCHEME_CALLBACK(Script,after_line_breaking); SCM -Script::member_after_line_breaking () +Script::after_line_breaking (SCM smob) { - Side_position_interface i (this); - Direction d = i.get_direction (); - i.set_direction (d); + Score_element * me = unsmob_element (smob); + + Direction d = Side_position::get_direction (me); + Side_position::set_direction (me,d); return SCM_UNDEFINED; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Script,brew_molecule); +MAKE_SCHEME_CALLBACK(Script,brew_molecule); SCM Script::brew_molecule (SCM smob) diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index d627cb6da1..6b5c2302a8 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -40,7 +40,7 @@ Separating_group_spanner::get_rods () const { Array a; - for (SCM s = get_elt_pointer ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s)) + for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s)) { /* Order of elements is reversed! @@ -82,7 +82,7 @@ Separating_group_spanner::get_rods () const /* We've done our job, so we get lost. */ - for (SCM s = get_elt_pointer ("elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s)) { Item * it =dynamic_cast(unsmob_element (gh_car (s))); if (it && it->broken_b ()) @@ -99,15 +99,15 @@ Separating_group_spanner::get_rods () const } void -Separating_group_spanner::add_spacing_unit (Item*i) +Separating_group_spanner::add_spacing_unit (Score_element* me ,Item*i) { - Pointer_group_interface (this, "elements").add_element (i); - add_dependency (i); + Pointer_group_interface (me, "elements").add_element (i); + me->add_dependency (i); } Separating_group_spanner::Separating_group_spanner (SCM s) : Spanner (s) { - set_elt_pointer ("elements", SCM_EOL); + set_elt_property ("elements", SCM_EOL); } diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 8b5c2f2327..96749f0410 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -1,5 +1,5 @@ /* - separating-line-group-grav.cc -- implement Separating_line_group_engraver + separating-line-group-engraver.cc -- implement Separating_line_group_engraver source file of the GNU LilyPond music typesetter @@ -39,7 +39,7 @@ Separating_line_group_engraver::Separating_line_group_engraver () void Separating_line_group_engraver::do_creation_processing () { - sep_span_p_ = new Separating_group_spanner (SCM_EOL); + sep_span_p_ = new Separating_group_spanner (get_property ("basicSeparatingGroupSpannerProperties")); announce_element (Score_element_info (sep_span_p_, 0)); sep_span_p_->set_bound (LEFT, unsmob_element (get_property ("currentCommandColumn"))); } @@ -64,9 +64,8 @@ Separating_line_group_engraver::acknowledge_element (Score_element_info i) if (!p_ref_) { - p_ref_ - = new Item - (get_property ("basicSingleMaltGroupingItemProperties")); + p_ref_ = new Item + (get_property ("basicSeparationItemProperties")); if (ib) p_ref_->set_elt_property ("breakable", SCM_BOOL_T); @@ -81,14 +80,14 @@ Separating_line_group_engraver::do_pre_move_processing () { if (break_malt_p_) { - sep_span_p_->add_spacing_unit (break_malt_p_); + Separating_group_spanner::add_spacing_unit (sep_span_p_, break_malt_p_); typeset_element (break_malt_p_); break_malt_p_ =0; } if (nobreak_malt_p_) { - sep_span_p_->add_spacing_unit (nobreak_malt_p_); + Separating_group_spanner::add_spacing_unit (sep_span_p_, nobreak_malt_p_); typeset_element (nobreak_malt_p_); nobreak_malt_p_ =0; } @@ -96,5 +95,5 @@ Separating_line_group_engraver::do_pre_move_processing () -ADD_THIS_TRANSLATOR( Separating_line_group_engraver); +ADD_THIS_TRANSLATOR(Separating_line_group_engraver); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index f51345bdc2..7613471c7f 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -15,7 +15,7 @@ void Separation_item::set_interface (Score_element*s) { - s->set_elt_pointer ("elements", SCM_EOL); + s->set_elt_property ("elements", SCM_EOL); s->set_extent_callback (0, X_AXIS); s->set_extent_callback (0, Y_AXIS); } @@ -35,7 +35,7 @@ Separation_item::my_width (Score_element *me) Paper_column * pc = item->column_l (); Interval w; - for (SCM s = me->get_elt_pointer ("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)) { SCM elt = gh_car (s); if (!SMOB_IS_TYPE_B(Score_element, elt)) diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index c52646506a..c6598c608d 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -9,46 +9,40 @@ #include // ceil. #include "side-position-interface.hh" -#include "staff-symbol.hh" #include "debug.hh" #include "warn.hh" #include "dimensions.hh" -#include "dimension-cache.hh" + #include "staff-symbol-referencer.hh" #include "group-interface.hh" -Side_position_interface::Side_position_interface (Score_element const *e) -{ - elt_l_ = (Score_element*)e; -} - void -Side_position_interface::add_support (Score_element*e) +Side_position::add_support (Score_element*me, Score_element*e) { - Pointer_group_interface (elt_l_, "side-support-elements").add_element (e); + Pointer_group_interface (me, "side-support-elements").add_element (e); } Direction -Side_position_interface::get_direction () const +Side_position::get_direction (Score_element*me) { - SCM d = elt_l_->get_elt_property ("direction"); + SCM d = me->get_elt_property ("direction"); if (isdir_b (d)) return to_dir (d) ? to_dir (d) : DOWN; Direction relative_dir = UP; - SCM reldir = elt_l_->get_elt_property ("side-relative-direction"); // should use a lambda. + SCM reldir = me->get_elt_property ("side-relative-direction"); // should use a lambda. if (isdir_b (reldir)) { relative_dir = to_dir (reldir); } - SCM other_elt = elt_l_->get_elt_pointer ("direction-source"); + SCM other_elt = me->get_elt_property ("direction-source"); Score_element * e = unsmob_element(other_elt); if (e) { - return (Direction)(relative_dir * Side_position_interface (e).get_direction ()); + return (Direction)(relative_dir * Side_position::get_direction (e)); } return DOWN; @@ -59,11 +53,11 @@ Side_position_interface::get_direction () const */ Real -Side_position_interface::side_position (Score_element *cme, Axis axis) +Side_position::side_position (Score_element *cme, Axis axis) { Score_element* me = (Score_element*)cme; Score_element *common = me->parent_l (axis); - SCM support = me->get_elt_pointer ("side-support-elements"); + SCM support = me->get_elt_property ("side-support-elements"); for (SCM s = support; s != SCM_EOL; s = gh_cdr (s)) { Score_element * e = unsmob_element (gh_car (s)); @@ -89,7 +83,7 @@ Side_position_interface::side_position (Score_element *cme, Axis axis) dim = Interval(0,0); } - Direction dir = Side_position_interface (me).get_direction (); + Direction dir = Side_position::get_direction (me); Real off = me->parent_l (axis)->relative_coordinate (common, axis); SCM minimum = me->remove_elt_property ("minimum-space"); @@ -114,13 +108,13 @@ Side_position_interface::side_position (Score_element *cme, Axis axis) callback that centers the element on itself */ Real -Side_position_interface::aligned_on_self (Score_element *elm, Axis ax) +Side_position::aligned_on_self (Score_element *elm, Axis ax) { String s ("self-alignment-"); s += (ax == X_AXIS) ? "X" : "Y"; - SCM align (elm->get_elt_property (s)); + SCM align (elm->get_elt_property (s.ch_C())); if (isdir_b (align)) { Direction d = to_dir (align); @@ -156,15 +150,13 @@ directed_round (Real f, Direction d) Callback that quantises in staff-spaces, rounding in the direction of the elements "direction" elt property. */ Real -Side_position_interface::quantised_position (Score_element *me, Axis a) +Side_position::quantised_position (Score_element *me, Axis ) { - Side_position_interface s(me); - Direction d = s.get_direction (); + Direction d = Side_position::get_direction (me); - if (Staff_symbol_referencer_interface::has_interface_b (me)) + if (Staff_symbol_referencer::has_interface (me)) { - Staff_symbol_referencer_interface si (me); - Real p = si.position_f (); + Real p = Staff_symbol_referencer::position_f (me); Real rp = directed_round (p, d); int ip = int (rp); @@ -174,7 +166,7 @@ Side_position_interface::quantised_position (Score_element *me, Axis a) rp += d; } - return (rp - p) * si.staff_space () / 2.0; + return (rp - p) * Staff_symbol_referencer::staff_space (me) / 2.0; } return 0.0; } @@ -183,10 +175,10 @@ Side_position_interface::quantised_position (Score_element *me, Axis a) Position next to support, taking into account my own dimensions and padding. */ Real -Side_position_interface::aligned_side (Score_element *me, Axis ax) +Side_position::aligned_side (Score_element *me, Axis ax) { - Side_position_interface s(me); - Direction d = s.get_direction (); + + Direction d = Side_position ::get_direction (me); Real o = side_position (me,ax); Interval iv = me->extent (ax); @@ -206,7 +198,7 @@ Side_position_interface::aligned_side (Score_element *me, Axis ax) Position centered on parent. */ Real -Side_position_interface::centered_on_parent (Score_element * me, Axis a) +Side_position::centered_on_parent (Score_element * me, Axis a) { Score_element *him = me->parent_l (a); @@ -215,38 +207,34 @@ Side_position_interface::centered_on_parent (Score_element * me, Axis a) void -Side_position_interface::add_staff_support () +Side_position::add_staff_support (Score_element*me) { - Staff_symbol_referencer_interface si (elt_l_); - if (si.staff_symbol_l ()) + Score_element* st = Staff_symbol_referencer::staff_symbol_l (me); + if (st) { - add_support (si.staff_symbol_l ()); + add_support (me,st); } } void -Side_position_interface::set_axis (Axis a) +Side_position::set_axis (Score_element*me, Axis a) { // prop transparent ? - if (elt_l_->get_elt_pointer ("side-support-elements") == SCM_UNDEFINED) - elt_l_->set_elt_pointer ("side-support-elements" ,SCM_EOL); + if (me->get_elt_property ("side-support-elements") == SCM_UNDEFINED) + me->set_elt_property ("side-support-elements" ,SCM_EOL); - if (!elt_l_->has_offset_callback_b (aligned_side, a)) - elt_l_->add_offset_callback (aligned_side, a); + if (!me->has_offset_callback_b (aligned_side, a)) + me->add_offset_callback (aligned_side, a); } -void -Side_position_interface::set_quantised (Axis a) -{ - elt_l_->add_offset_callback (quantised_position, a); -} + Axis -Side_position_interface::get_axis () const +Side_position::get_axis (Score_element*me) { - if (elt_l_->has_offset_callback_b (&side_position, X_AXIS) - || elt_l_->has_offset_callback_b (&aligned_side , X_AXIS)) + if (me->has_offset_callback_b (&side_position, X_AXIS) + || me->has_offset_callback_b (&aligned_side , X_AXIS)) return X_AXIS; @@ -254,33 +242,33 @@ Side_position_interface::get_axis () const } void -Side_position_interface::set_direction (Direction d) +Side_position::set_direction (Score_element*me, Direction d) { - elt_l_->set_elt_property ("direction", gh_int2scm (d)); + me->set_elt_property ("direction", gh_int2scm (d)); } void -Side_position_interface::set_minimum_space (Real m) +Side_position::set_minimum_space (Score_element*me, Real m) { - elt_l_->set_elt_property ("minimum-space", gh_double2scm (m)); + me->set_elt_property ("minimum-space", gh_double2scm (m)); } void -Side_position_interface::set_padding (Real p) +Side_position::set_padding (Score_element*me, Real p) { - elt_l_->set_elt_property ("padding", gh_double2scm (p)); + me->set_elt_property ("padding", gh_double2scm (p)); } bool -Side_position_interface::has_interface_b () const +Side_position::has_interface (Score_element*me) { - return elt_l_->get_elt_pointer ("side-support-elements") != SCM_UNDEFINED; + return me->get_elt_property ("side-support-elements") != SCM_UNDEFINED; } bool -Side_position_interface::supported_b () const +Side_position::supported_b (Score_element*me) { - SCM s =elt_l_->get_elt_pointer ("side-support-elements"); + SCM s =me->get_elt_property ("side-support-elements"); return s != SCM_UNDEFINED && s != SCM_EOL; } diff --git a/lily/slur.cc b/lily/slur.cc index 04d44e7ad9..5b702323bd 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -36,14 +36,14 @@ Slur::Slur (SCM s) : Spanner (s) { set_elt_property ("attachment", gh_cons (SCM_BOOL_F, SCM_BOOL_F)); - set_elt_pointer ("note-columns", SCM_EOL); + set_elt_property ("note-columns", SCM_EOL); set_elt_property ("control-points", SCM_EOL); } void Slur::add_column (Note_column*n) { - if (!gh_pair_p (n->get_elt_pointer ("note-heads"))) + if (!gh_pair_p (n->get_elt_property ("note-heads"))) warning (_ ("Putting slur over rest. Ignoring.")); else { @@ -111,7 +111,7 @@ Slur::encompass_offset (Score_element* col, Score_element **common) const { Offset o; - Score_element* stem_l = unsmob_element (col->get_elt_pointer ("stem")); + Score_element* stem_l = unsmob_element (col->get_elt_property ("stem")); Direction dir = Directional_element_interface (this).get (); @@ -148,13 +148,15 @@ Slur::encompass_offset (Score_element* col, return o; } -GLUE_SCORE_ELEMENT(Slur,after_line_breaking); +MAKE_SCHEME_CALLBACK(Slur,after_line_breaking); SCM -Slur::member_after_line_breaking () +Slur::after_line_breaking (SCM smob) { - set_extremities (); - set_control_points (); + Score_element *me = unsmob_element (smob); + Slur * sl = dynamic_cast(me); + sl->set_extremities (); + sl->set_control_points (); return SCM_UNDEFINED; } @@ -195,18 +197,19 @@ Slur::get_attachment (Direction dir, SCM s = get_elt_property ("attachment"); SCM a = dir == LEFT ? gh_car (s) : gh_cdr (s); String str = ly_symbol2string (a); - Real ss = Staff_symbol_referencer_interface (this).staff_space (); + Real ss = Staff_symbol_referencer::staff_space ((Score_element*)this); Real hs = ss / 2.0; Offset o; if (Note_column* n = dynamic_cast (get_bound (dir))) { - if (Stem* st = dynamic_cast (n->stem_l ())) + if (n->stem_l ()) { + Score_element*st = n->stem_l(); if (str == "head") { - o = Offset (0, st->chord_start_f ()); + o = Offset (0, Stem::chord_start_f (st )); /* Default position is centered in X, on outer side of head Y */ @@ -215,24 +218,24 @@ Slur::get_attachment (Direction dir, } else if (str == "alongside-stem") { - o = Offset (0, st->chord_start_f ()); + o = Offset (0, Stem::chord_start_f (st )); /* Default position is on stem X, on outer side of head Y */ o += Offset (n->extent (X_AXIS).length () - * (1 + st->get_direction ()), + * (1 + Stem::get_direction (st )), 0.5 * ss * Directional_element_interface (this).get ()); } else if (str == "stem") { - o = Offset (0, st->stem_end_position () * hs); + o = Offset (0, Stem::stem_end_position (st ) * hs); /* Default position is on stem X, at stem end Y */ o += Offset (0.5 * (n->extent (X_AXIS).length () - st->extent (X_AXIS).length ()) - * (1 + st->get_direction ()), + * (1 + Stem::get_direction (st )), 0); } else if (str == "loose-end") @@ -247,7 +250,7 @@ Slur::get_attachment (Direction dir, SCM l = scm_assoc (scm_listify (a, - gh_int2scm (st->get_direction () * dir), + gh_int2scm (Stem::get_direction (st ) * dir), gh_int2scm (Directional_element_interface (this).get () * dir), SCM_UNDEFINED), scm_eval (ly_symbol2scm ("slur-extremity-offset-alist"))); @@ -275,7 +278,7 @@ Slur::get_attachment (Direction dir, Array Slur::get_encompass_offset_arr () const { - SCM eltlist = get_elt_pointer ("note-columns"); + SCM eltlist = get_elt_property ("note-columns"); Score_element *common[] = {common_refpoint (eltlist,X_AXIS), common_refpoint (eltlist,Y_AXIS)}; @@ -360,19 +363,22 @@ Slur::get_rods () const /* Ugh should have dash-length + dash-period */ -GLUE_SCORE_ELEMENT(Slur,brew_molecule); +MAKE_SCHEME_CALLBACK(Slur,brew_molecule); SCM -Slur::member_brew_molecule () const +Slur::brew_molecule (SCM smob) { - Real thick = paper_l ()->get_var ("slur_thickness"); - Bezier one = get_curve (); + Slur * me = dynamic_cast (unsmob_element (smob)); + + + Real thick = me->paper_l ()->get_var ("slur_thickness"); + Bezier one = me->get_curve (); Molecule a; - SCM d = get_elt_property ("dashed"); + SCM d = me->get_elt_property ("dashed"); if (gh_number_p (d)) - a = lookup_l ()->dashed_slur (one, thick, thick * gh_scm2double (d)); + a = me->lookup_l ()->dashed_slur (one, thick, thick * gh_scm2double (d)); else - a = lookup_l ()->slur (one, Directional_element_interface (this).get () * thick, thick); + a = me->lookup_l ()->slur (one, Directional_element_interface (me).get () * thick, thick); return a.create_scheme(); } @@ -383,7 +389,7 @@ Slur::set_control_points () Slur_bezier_bow bb (get_encompass_offset_arr (), Directional_element_interface (this).get ()); - Real staff_space = Staff_symbol_referencer_interface (this).staff_space (); + 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"); diff --git a/lily/span-bar-engraver.cc b/lily/span-bar-engraver.cc index 17c713b453..dd40fd96e2 100644 --- a/lily/span-bar-engraver.cc +++ b/lily/span-bar-engraver.cc @@ -6,11 +6,14 @@ (c) 1997--2000 Han-Wen Nienhuys */ -#include "dimension-cache.hh" + #include "lily-guile.hh" +#include "bar.hh" +#include "item.hh" #include "span-bar.hh" #include "engraver.hh" + /** Make bars that span multiple "staffs". Catch bars, and span a @@ -22,8 +25,8 @@ */ class Span_bar_engraver : public Engraver { - Span_bar * spanbar_p_; - Link_array bar_l_arr_; + Item * spanbar_p_; + Link_array bar_l_arr_; public: VIRTUAL_COPY_CONS(Translator); @@ -31,7 +34,7 @@ public: protected: virtual void acknowledge_element (Score_element_info); virtual void do_pre_move_processing(); - virtual Span_bar* get_span_bar_p(SCM) const; + }; @@ -40,12 +43,6 @@ Span_bar_engraver::Span_bar_engraver() spanbar_p_ =0; } -Span_bar* -Span_bar_engraver::get_span_bar_p(SCM s) const -{ - Span_bar * sp= new Span_bar (s); - return sp; -} void @@ -53,13 +50,15 @@ Span_bar_engraver::acknowledge_element (Score_element_info i) { int depth = i.origin_trans_l_arr (this).size(); if (depth > 1 - && dynamic_cast (i.elem_l_)) + && Bar::has_interface (i.elem_l_)) { - bar_l_arr_.push (dynamic_cast (i.elem_l_)); + Item * it = dynamic_cast(i.elem_l_); + bar_l_arr_.push (it); if (bar_l_arr_.size() >= 2 && !spanbar_p_) { - spanbar_p_ = get_span_bar_p (get_property ("basicSpanBarProperties")); + spanbar_p_ = new Item (get_property ("basicSpanBarProperties")); + Span_bar::set_interface (spanbar_p_); spanbar_p_->set_elt_property ("glyph", bar_l_arr_[0]->get_elt_property ("glyph")); spanbar_p_->set_elt_property ("visibility-lambda", bar_l_arr_[0]->get_elt_property ("visibility-lambda")); @@ -77,7 +76,7 @@ Span_bar_engraver::do_pre_move_processing() if (spanbar_p_) { for (int i=0; i < bar_l_arr_.size() ; i++) - spanbar_p_->add_bar (bar_l_arr_[i]); + Span_bar::add_bar( spanbar_p_,bar_l_arr_[i]); typeset_element (spanbar_p_); spanbar_p_ =0; } diff --git a/lily/span-bar.cc b/lily/span-bar.cc index 0012dab45f..eab329b9ea 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -5,7 +5,7 @@ (c) 1997--2000 Han-Wen Nienhuys */ -#include "dimension-cache.hh" + #include "span-bar.hh" #include "lookup.hh" #include "dimensions.hh" @@ -14,68 +14,68 @@ #include "warn.hh" #include "axis-group-interface.hh" #include "group-interface.hh" +#include "score-element.hh" +#include "bar.hh" void -Span_bar::add_bar (Score_element*b) +Span_bar::add_bar (Score_element*me, Score_element*b) { - Pointer_group_interface gi (this); + Pointer_group_interface gi (me); gi.add_element (b); - add_dependency (b); + me->add_dependency (b); } - Interval Span_bar::width_callback (Score_element *se, Axis ) { - Span_bar* s= dynamic_cast ((Score_element*)se); - String gl = ly_scm2string (s->get_elt_property ("glyph")); + String gl = ly_scm2string (se->get_elt_property ("glyph")); /* urg. */ - Molecule m = s->compound_barline (gl, 40 PT); + Molecule m = Bar::compound_barline (se, gl, 40 PT); return m.extent (X_AXIS); } -GLUE_SCORE_ELEMENT(Span_bar,before_line_breaking); +MAKE_SCHEME_CALLBACK(Span_bar,before_line_breaking); SCM -Span_bar::member_before_line_breaking () +Span_bar::before_line_breaking (SCM smob) { - Bar::member_before_line_breaking (); + Bar::before_line_breaking (smob); - evaluate_empty (); + evaluate_empty (unsmob_element (smob)); return SCM_UNDEFINED; } -GLUE_SCORE_ELEMENT(Span_bar,after_line_breaking); -SCM -Span_bar::member_after_line_breaking () +Real +Span_bar::center_on_spanned_callback (Score_element * me, Axis a) { - Interval i (get_spanned_interval ()); + assert (a == Y_AXIS); + Interval i (get_spanned_interval (me)); /* Bar::brew_molecule delivers a barline of y-extent (-h/2,h/2), so we have to translate ourselves to be in the center of the interval that we span. */ - translate_axis (i.center (), Y_AXIS); - return SCM_UNDEFINED; + + return i.center (); } void -Span_bar::evaluate_empty () +Span_bar::evaluate_empty (Score_element*me) { - if (!gh_pair_p (get_elt_pointer ("elements"))) + if (!gh_pair_p (me->get_elt_property ("elements"))) { - suicide (); + me->suicide (); } - SCM gl = get_elt_property ("glyph"); + SCM gl = me->get_elt_property ("glyph"); if (!gh_string_p (gl)) { - suicide (); + me->suicide (); return ; } else { @@ -94,37 +94,44 @@ Span_bar::evaluate_empty () type_str= ".|."; } if (orig != type_str) - set_elt_property ("glyph", ly_str02scm (type_str.ch_C())); + me->set_elt_property ("glyph", ly_str02scm (type_str.ch_C())); } } Interval -Span_bar::get_spanned_interval () const +Span_bar::get_spanned_interval (Score_element*me) { - return Axis_group_interface::group_extent_callback ((Span_bar*)this, Y_AXIS); + return Axis_group_interface::group_extent_callback (me, Y_AXIS); } -Real -Span_bar::get_bar_size () const +MAKE_SCHEME_CALLBACK(Span_bar,get_bar_size); +SCM +Span_bar::get_bar_size (SCM smob) { - Interval iv (get_spanned_interval ()); + Score_element* me = unsmob_element (smob); + Interval iv (get_spanned_interval (me)); if (iv.empty_b ()) { programming_error("Huh? My children deflated (FIXME)"); iv = Interval (0,0); } - return iv.length (); + return gh_double2scm (iv.length ()); } - -Span_bar::Span_bar (SCM s) - : Bar (s) +void +Span_bar::set_interface (Score_element *me) { - Pointer_group_interface(this).set_interface (); - set_extent_callback (width_callback, X_AXIS); + Bar::set_interface (me); - // dim_cache_[Y_AXIS]->set_extent_callback (Axis_group_interface::group_extent_callback); - - set_extent_callback (0, Y_AXIS); + Pointer_group_interface(me).set_interface (); + me->set_extent_callback (width_callback, X_AXIS); + me->add_offset_callback (center_on_spanned_callback, Y_AXIS); + me->set_interface (ly_symbol2scm ("span-bar-interface")); + me->set_extent_callback (0, Y_AXIS); } +bool +Span_bar::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("span-bar-interface")); +} diff --git a/lily/spanner.cc b/lily/spanner.cc index db4b05d118..b272827ba4 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -8,7 +8,7 @@ #include #include -#include "dimension-cache.hh" + #include "debug.hh" #include "spanner.hh" #include "paper-column.hh" @@ -134,11 +134,11 @@ Spanner::spanned_rank_iv () if (spanned_drul_[LEFT]) { - iv[LEFT] = spanned_drul_[LEFT]->column_l ()->rank_i (); + iv[LEFT] = Paper_column::rank_i (spanned_drul_[LEFT]->column_l ()); } if (spanned_drul_[RIGHT]) { - iv[RIGHT] = spanned_drul_[RIGHT]->column_l ()->rank_i (); + iv[RIGHT] = Paper_column::rank_i (spanned_drul_[RIGHT]->column_l ()); } return iv; } @@ -223,7 +223,7 @@ Spanner::find_broken_piece (Line_of_score*l) const int Spanner::compare (Spanner * const &p1, Spanner * const &p2) { - return p1->line_l ()->rank_i_ - p2->line_l ()->rank_i_; + return p1->line_l ()->rank_i_ - p2->line_l ()->rank_i_; } bool @@ -300,6 +300,9 @@ Spanner::do_derived_mark () if (spanned_drul_[d]) scm_gc_mark (spanned_drul_[d]->self_scm_); while (flip (&d) != LEFT); + + for (int i= broken_into_l_arr_.size () ; i--;) + scm_gc_mark (broken_into_l_arr_[i]->self_scm_); } void diff --git a/lily/spring.cc b/lily/spring.cc index ae5f33da74..41a7e1772d 100644 --- a/lily/spring.cc +++ b/lily/spring.cc @@ -34,9 +34,4 @@ Column_spring::Column_spring () } -int -Column_spring::compare (Column_spring const & r1, Column_spring const &r2) -{ - return r1.other_l_->rank_i() - r2.other_l_->rank_i(); -} diff --git a/lily/staff-bar.cc b/lily/staff-bar.cc index c74c0bcfb7..8b13789179 100644 --- a/lily/staff-bar.cc +++ b/lily/staff-bar.cc @@ -1,31 +1 @@ -/* - staff-bar.cc -- implement Staff_bar - - source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Han-Wen Nienhuys - - */ -#include "staff-bar.hh" -#include "staff-symbol-referencer.hh" - -Real -Staff_bar::get_bar_size () const -{ - SCM size = get_elt_property ("bar-size"); - if (gh_number_p (size)) - return gh_scm2double (size); - else - { - Staff_symbol_referencer_interface si (this); - return (si.line_count () -1) * si.staff_space (); - } -} - - -Staff_bar::Staff_bar (SCM s) - : Bar (s) -{ - -} diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc index 6440a59414..1078870c62 100644 --- a/lily/staff-symbol-engraver.cc +++ b/lily/staff-symbol-engraver.cc @@ -6,7 +6,7 @@ (c) 1997--2000 Han-Wen Nienhuys */ -#include "staff-symbol.hh" + #include "score.hh" #include "paper-column.hh" #include "paper-def.hh" @@ -18,18 +18,16 @@ Manage the staff symbol. */ class Staff_symbol_engraver : public Engraver { - Staff_symbol *span_p_; + Spanner *span_p_; public: VIRTUAL_COPY_CONS(Translator); Staff_symbol_engraver(); protected: virtual ~Staff_symbol_engraver(); - virtual void acknowledge_element (Score_element_info); virtual void do_removal_processing(); virtual void do_creation_processing(); - }; @@ -46,8 +44,9 @@ Staff_symbol_engraver::Staff_symbol_engraver() void Staff_symbol_engraver::do_creation_processing() { - span_p_ = new Staff_symbol (get_property ("staffSymbolBasicProperties")); - span_p_->set_bound(LEFT,unsmob_element (get_property ("currentCommandColumn"))); + span_p_ = new Spanner (get_property ("staffSymbolBasicProperties")); + + span_p_->set_bound(LEFT, unsmob_element (get_property ("currentCommandColumn"))); announce_element (Score_element_info (span_p_, 0)); } @@ -71,7 +70,7 @@ Staff_symbol_engraver::do_removal_processing() void Staff_symbol_engraver::acknowledge_element (Score_element_info s) { - s.elem_l_->set_elt_pointer ("staff-symbol", span_p_->self_scm_); + s.elem_l_->set_elt_property ("staff-symbol", span_p_->self_scm_); s.elem_l_->add_dependency (span_p_); // UGH. UGH. UGH } diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc index b2ed112f90..b67c577954 100644 --- a/lily/staff-symbol-referencer.cc +++ b/lily/staff-symbol-referencer.cc @@ -11,15 +11,12 @@ #include "staff-symbol-referencer.hh" #include "staff-symbol.hh" #include "paper-def.hh" -#include "dimension-cache.hh" -Staff_symbol_referencer_interface::Staff_symbol_referencer_interface (Score_element const *sc) -{ - elt_l_ = (Score_element*)sc; -} + + void -Staff_symbol_referencer_interface::set_interface (Score_element * e) +Staff_symbol_referencer::set_interface (Score_element * e) { if (!gh_number_p (e->get_elt_property ("staff-position"))) e->set_elt_property ("staff-position", gh_double2scm (0.0)); @@ -28,56 +25,56 @@ Staff_symbol_referencer_interface::set_interface (Score_element * e) } bool -Staff_symbol_referencer_interface::has_interface_b (Score_element*e) +Staff_symbol_referencer::has_interface (Score_element*e) { - return unsmob_element (e->get_elt_pointer ("staff-symbol")) + return unsmob_element (e->get_elt_property ("staff-symbol")) || gh_number_p (e->get_elt_property ("staff-position")); } int -Staff_symbol_referencer_interface::line_count () const +Staff_symbol_referencer::line_count (Score_element*me) { - Staff_symbol *st = staff_symbol_l (); - return st ? st->line_count () : 0; + Score_element *st = staff_symbol_l (me); + return st ? Staff_symbol::line_count (st) : 0; } -Staff_symbol* -Staff_symbol_referencer_interface::staff_symbol_l () const +Score_element* +Staff_symbol_referencer::staff_symbol_l (Score_element*me) { - SCM st = elt_l_->get_elt_pointer ("staff-symbol"); - return dynamic_cast (unsmob_element(st)); + SCM st = me->get_elt_property ("staff-symbol"); + return unsmob_element(st); } Real -Staff_symbol_referencer_interface::staff_space () const +Staff_symbol_referencer::staff_space (Score_element*me) { - Staff_symbol * st = staff_symbol_l (); + Score_element * st = staff_symbol_l (me); if (st) - return st->staff_space (); - else if (elt_l_->pscore_l_ && elt_l_->paper_l ()) - return elt_l_->paper_l ()->get_var ("interline"); + return Staff_symbol::staff_space (st); + else if (me->pscore_l_ && me->paper_l ()) + return me->paper_l ()->get_var ("interline"); return 0.0; } Real -Staff_symbol_referencer_interface::position_f () const +Staff_symbol_referencer::position_f (Score_element*me) { Real p =0.0; - Staff_symbol * st = staff_symbol_l (); - Score_element * c = st ? elt_l_->common_refpoint (st, Y_AXIS) : 0; + Score_element * st = staff_symbol_l (me); + Score_element * c = st ? me->common_refpoint (st, Y_AXIS) : 0; if (st && c) { - Real y = elt_l_->relative_coordinate (c, Y_AXIS) + Real y = me->relative_coordinate (c, Y_AXIS) - st->relative_coordinate (c, Y_AXIS); - p += 2.0 * y / st->staff_space (); + p += 2.0 * y / Staff_symbol::staff_space (st); } else { - SCM pos = elt_l_->get_elt_property ("staff-position"); + SCM pos = me->get_elt_property ("staff-position"); if (gh_number_p (pos)) return gh_scm2double (pos); } @@ -91,7 +88,7 @@ Staff_symbol_referencer_interface::position_f () const should use offset callback! */ Real -Staff_symbol_referencer_interface::callback (Score_element * sc,Axis ) +Staff_symbol_referencer::callback (Score_element * sc,Axis ) { Score_element* me = (Score_element*)sc; // UGH. @@ -99,7 +96,7 @@ Staff_symbol_referencer_interface::callback (Score_element * sc,Axis ) Real off =0.0; if (gh_number_p (pos)) { - Real space = Staff_symbol_referencer_interface (sc).staff_space (); + Real space = Staff_symbol_referencer::staff_space (sc); off = gh_scm2double (pos) * space/2.0; } @@ -124,33 +121,31 @@ Staff_symbol_referencer_interface::callback (Score_element * sc,Axis ) */ void -Staff_symbol_referencer_interface::set_position (Real p) +Staff_symbol_referencer::set_position (Score_element*me,Real p) { - Staff_symbol * st = staff_symbol_l (); - if (st && elt_l_->common_refpoint(st, Y_AXIS)) + Score_element * st = staff_symbol_l (me); + if (st && me->common_refpoint(st, Y_AXIS)) { - Real oldpos = position_f (); - elt_l_->set_elt_property ("staff-position", gh_double2scm (p - oldpos)); + Real oldpos = position_f (me); + me->set_elt_property ("staff-position", gh_double2scm (p - oldpos)); } else { - elt_l_->set_elt_property ("staff-position", + me->set_elt_property ("staff-position", gh_double2scm (p)); } - if (elt_l_->has_offset_callback_b (callback, Y_AXIS)) + if (me->has_offset_callback_b (callback, Y_AXIS)) return ; - elt_l_->add_offset_callback (callback, Y_AXIS); + me->add_offset_callback (callback, Y_AXIS); } int compare_position (Score_element *const &a, Score_element * const &b) { - Staff_symbol_referencer_interface s1(a); - Staff_symbol_referencer_interface s2(b); - - return sign(s1.position_f () - s2.position_f ()); + return sign (Staff_symbol_referencer::position_f((Score_element*)a) - + Staff_symbol_referencer::position_f((Score_element*)b)); } diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index ae2167d988..ffdd54e56d 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -1,47 +1,49 @@ /* - staffsym.cc -- implement Staff_symbol + staff-symbol.cc -- implement Staff_symbol source file of the GNU LilyPond music typesetter (c) 1997--2000 Han-Wen Nienhuys */ -#include "staff-symbol.hh" + #include "lookup.hh" #include "dimensions.hh" #include "paper-def.hh" #include "molecule.hh" #include "debug.hh" #include "item.hh" +#include "staff-symbol.hh" +#include "spanner.hh" - - -GLUE_SCORE_ELEMENT(Staff_symbol,brew_molecule); +MAKE_SCHEME_CALLBACK(Staff_symbol,brew_molecule); SCM -Staff_symbol::member_brew_molecule () const +Staff_symbol::brew_molecule (SCM smob) { + Score_element *me = unsmob_element (smob); + Spanner* sp = dynamic_cast (me); Score_element * common - = get_bound (LEFT)->common_refpoint (get_bound (RIGHT), X_AXIS); + = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); Real width = // right_shift - left_shift - + get_bound (RIGHT)->relative_coordinate (common , X_AXIS) - - get_bound (LEFT)->relative_coordinate (common, X_AXIS) + + sp->get_bound (RIGHT)->relative_coordinate (common , X_AXIS) + - sp->get_bound (LEFT)->relative_coordinate (common, X_AXIS) ; - Real t = paper_l ()->get_var ("stafflinethickness"); - int l = line_count (); + Real t = me->paper_l ()->get_var ("stafflinethickness"); + int l = Staff_symbol::line_count (me); - Real height = (l-1) * staff_space () /2; - Molecule m; + Real height = (l-1) * staff_space (me) /2; + Molecule m; for (int i=0; i < l; i++) { Molecule a = - lookup_l ()->filledbox (Box (Interval (0,width), - Interval (-t/2, t/2))); + me->lookup_l ()->filledbox (Box (Interval (0,width), + Interval (-t/2, t/2))); - a.translate_axis (height - i * staff_space (), Y_AXIS); + a.translate_axis (height - i * staff_space (me), Y_AXIS); m.add_molecule (a); } @@ -49,25 +51,34 @@ Staff_symbol::member_brew_molecule () const } int -Staff_symbol::steps_i() const +Staff_symbol::steps_i(Score_element*me) { - return line_count () * 2; + return line_count (me) * 2; } int -Staff_symbol::line_count () const +Staff_symbol::line_count (Score_element*me) { - return gh_scm2int (get_elt_property ("line-count")); + SCM c = me->get_elt_property ("line-count"); + if (gh_number_p (c)) + return gh_scm2int (c); + else + return 0; } Real -Staff_symbol::staff_space ()const +Staff_symbol::staff_space (Score_element*me ) { - return gh_scm2double (get_elt_property ("staff-space")) * - paper_l ()->get_var ("staffspace"); + Real ss = me->paper_l ()->get_var ("staffspace"); + + SCM s = me->get_elt_property ("staff-space"); + if (gh_number_p (s)) + ss *= gh_scm2double (s); + return ss; } -Staff_symbol::Staff_symbol( SCM s) - : Spanner (s) +bool +Staff_symbol::has_interface (Score_element*m) { + return m && m->has_interface (ly_symbol2scm ("staff-symbol-interface")); } diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index 08b598f1e2..259d69feeb 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -67,9 +67,10 @@ Stem_engraver::do_creation_processing () void Stem_engraver::acknowledge_element(Score_element_info i) { - if (Rhythmic_head * h = dynamic_cast (i.elem_l_)) + Score_element* h = i.elem_l_; + if (Rhythmic_head::has_interface (h)) { - if (h->stem_l ()) + if (Rhythmic_head::stem_l (h)) return; Rhythmic_req * r = dynamic_cast (i.req_l_); @@ -77,7 +78,7 @@ Stem_engraver::acknowledge_element(Score_element_info i) if (!stem_p_) { stem_p_ = new Stem (get_property ("basicStemProperties")); - Staff_symbol_referencer_interface::set_interface(stem_p_); + Staff_symbol_referencer::set_interface(stem_p_); stem_p_->set_elt_property ("duration-log", gh_int2scm (duration_log)); @@ -121,12 +122,12 @@ Stem_engraver::acknowledge_element(Score_element_info i) announce_element (Score_element_info (stem_p_, r)); } - if (stem_p_->flag_i () != duration_log) + if (Stem::flag_i (stem_p_) != duration_log) { - r->warning (_f ("Adding note head to incompatible stem (type = %d)", 1 << stem_p_->flag_i ())); + r->warning (_f ("Adding note head to incompatible stem (type = %d)", 1 << Stem::flag_i (stem_p_))); } - stem_p_->add_head (h); + Stem::add_head (stem_p_,h); } } @@ -145,13 +146,13 @@ Stem_engraver::do_pre_move_processing() SCM prop = get_property ("stemLeftBeamCount"); if (gh_number_p(prop)) { - stem_p_->set_beaming (gh_scm2int (prop),LEFT); + Stem::set_beaming (stem_p_,gh_scm2int (prop),LEFT); daddy_trans_l_->set_property ("stemLeftBeamCount", SCM_UNDEFINED); } prop = get_property ("stemRightBeamCount"); if (gh_number_p(prop)) { - stem_p_->set_beaming (gh_scm2int (prop), RIGHT); + Stem::set_beaming (stem_p_,gh_scm2int (prop), RIGHT); daddy_trans_l_->set_property ("stemRightBeamCount", SCM_UNDEFINED); } diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index a2e174f69b..a0797cff86 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -14,7 +14,7 @@ #include "lookup.hh" #include "stem.hh" #include "offset.hh" -#include "dimension-cache.hh" + #include "staff-symbol-referencer.hh" #include "directional-element-interface.hh" @@ -26,26 +26,26 @@ void Stem_tremolo::set_interface (Score_element *me) { -me->set_elt_pointer ("stem", SCM_EOL); +me->set_elt_property ("stem", SCM_EOL); } Interval Stem_tremolo::dim_callback (Score_element * se, Axis ) { - Real space = Staff_symbol_referencer_interface (se).staff_space (); + Real space = Staff_symbol_referencer::staff_space (se); return Interval (-space, space); } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Stem_tremolo,brew_molecule); +MAKE_SCHEME_CALLBACK(Stem_tremolo,brew_molecule); SCM Stem_tremolo::brew_molecule (SCM smob) { Score_element *me= unsmob_element (smob); - Stem * stem = dynamic_cast (unsmob_element (me->get_elt_pointer ("stem"))); - Beam * beam = stem->beam_l (); + Score_element * stem = unsmob_element (me->get_elt_property ("stem")); + Beam * beam = Stem::beam_l (stem); Real dydx; if (beam) @@ -62,7 +62,7 @@ Stem_tremolo::brew_molecule (SCM smob) // urg dydx = 0.25; - Real ss = Staff_symbol_referencer_interface (stem).staff_space (); + Real ss = Staff_symbol_referencer::staff_space (stem); Real thick = gh_scm2double (me->get_elt_property ("beam-thickness")); Real width = gh_scm2double (me->get_elt_property ("beam-width")); width *= ss; @@ -93,9 +93,9 @@ Stem_tremolo::brew_molecule (SCM smob) if (beam) { // ugh, rather calc from Stem_tremolo_req - int beams_i = stem->beam_count(RIGHT) >? stem->beam_count (LEFT); + int beams_i = Stem::beam_count(stem, RIGHT) >? Stem::beam_count (stem, LEFT); mol.translate (Offset(stem->relative_coordinate (0, X_AXIS) - me->relative_coordinate (0, X_AXIS), - stem->stem_end_position () * ss / 2 - + Stem::stem_end_position (stem ) * ss / 2 - Directional_element_interface (beam).get () * beams_i * interbeam_f)); } else @@ -103,16 +103,16 @@ Stem_tremolo::brew_molecule (SCM smob) /* Beams should intersect one beamthickness below stem end */ - Real dy = stem->stem_end_position () * ss / 2; - dy -= mol.extent (Y_AXIS).length () / 2 * stem->get_direction (); + Real dy = Stem::stem_end_position (stem ) * ss / 2; + dy -= mol.extent (Y_AXIS).length () / 2 * Stem::get_direction (stem ); /* uhg. Should use relative coords and placement */ Real whole_note_correction; - if (stem->invisible_b ()) - whole_note_correction = -stem->get_direction () - * stem->support_head ()->extent (X_AXIS).length () / 2; + if (Stem::invisible_b (stem )) + whole_note_correction = -Stem::get_direction (stem ) + * Stem::support_head (stem )->extent (X_AXIS).length () / 2; else whole_note_correction = 0; @@ -127,6 +127,6 @@ Stem_tremolo::brew_molecule (SCM smob) void Stem_tremolo::set_stem (Score_element*me,Score_element *s) { - me->set_elt_pointer ("stem", s->self_scm_); + me->set_elt_property ("stem", s->self_scm_); } diff --git a/lily/stem.cc b/lily/stem.cc index cbbc19ddec..1b7d72042a 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -11,7 +11,7 @@ #include // m_pi #include "directional-element-interface.hh" -#include "dimension-cache.hh" +#include "note-head.hh" #include "stem.hh" #include "debug.hh" #include "paper-def.hh" @@ -29,22 +29,22 @@ void -Stem::set_beaming (int i, Direction d ) +Stem::set_beaming (Score_element*me ,int i, Direction d ) { - SCM pair = get_elt_property ("beaming"); + SCM pair = me->get_elt_property ("beaming"); if (!gh_pair_p (pair)) { pair = gh_cons (gh_int2scm (0),gh_int2scm (0)); - set_elt_property ("beaming", pair); + me-> set_elt_property ("beaming", pair); } index_set_cell (pair, d, gh_int2scm (i)); } int -Stem::beam_count (Direction d) const +Stem::beam_count (Score_element*me,Direction d) { - SCM p=get_elt_property ("beaming"); + SCM p=me->get_elt_property ("beaming"); if (gh_pair_p (p)) return gh_scm2int (index_cell (p,d)); else @@ -52,38 +52,37 @@ Stem::beam_count (Direction d) const } Interval -Stem::head_positions () const +Stem::head_positions (Score_element*me) { - if (!heads_i ()) + if (!heads_i (me)) { Interval iv; return iv; } - - Drul_array e (extremal_heads ()); + Drul_array e (extremal_heads (me)); - return Interval (Staff_symbol_referencer_interface (e[DOWN]).position_f (), - Staff_symbol_referencer_interface ( e[UP]).position_f ()); + return Interval (Staff_symbol_referencer::position_f (e[DOWN]), + Staff_symbol_referencer::position_f ( e[UP])); } Real -Stem::chord_start_f () const +Stem::chord_start_f (Score_element*me) { - return head_positions()[get_direction ()] - * Staff_symbol_referencer_interface (this).staff_space ()/2.0; + return head_positions(me)[get_direction (me)] + * Staff_symbol_referencer::staff_space (me)/2.0; } Real -Stem::stem_end_position () const +Stem::stem_end_position (Score_element*me) { - SCM p =get_elt_property ("stem-end-position"); + SCM p =me->get_elt_property ("stem-end-position"); Real pos; if (!gh_number_p (p)) { - Stem * me = (Stem*) this; - pos = get_default_stem_end_position (); + + pos = get_default_stem_end_position (me); me->set_elt_property ("stem-end-position", gh_double2scm (pos)); } else @@ -93,14 +92,13 @@ Stem::stem_end_position () const } Direction -Stem::get_direction () const +Stem::get_direction (Score_element*me) { - Direction d = Directional_element_interface (this).get (); + Direction d = Directional_element_interface (me).get (); if (!d) { - Stem * me = (Stem*) this; - d = get_default_dir (); + d = get_default_dir (me); // urg, AAARGH! Directional_element_interface (me).set (d); } @@ -109,82 +107,82 @@ Stem::get_direction () const void -Stem::set_stemend (Real se) +Stem::set_stemend (Score_element*me, Real se) { // todo: margins - Direction d= get_direction (); + Direction d= get_direction (me); - if (d && d * head_positions()[get_direction ()] >= se*d) + if (d && d * head_positions(me)[get_direction (me)] >= se*d) warning (_ ("Weird stem size; check for narrow beams")); - set_elt_property ("stem-end-position", gh_double2scm (se)); + me->set_elt_property ("stem-end-position", gh_double2scm (se)); } int -Stem::type_i () const +Stem::type_i (Score_element*me) { - return first_head () ? first_head ()->balltype_i () : 2; + return first_head (me) ? Rhythmic_head::balltype_i (first_head (me)) : 2; } /* Note head that determines hshift for upstems */ Score_element* -Stem::support_head ()const +Stem::support_head (Score_element*me) { - SCM h = get_elt_pointer ("support-head"); + SCM h = me->get_elt_property ("support-head"); Score_element * nh = unsmob_element (h); if (nh) return nh; - else if (heads_i () == 1) + else if (heads_i (me) == 1) { /* UGH. */ - return unsmob_element (gh_car (get_elt_pointer ("heads"))); + return unsmob_element (gh_car (me->get_elt_property ("heads"))); } else - return first_head (); + return first_head (me); } int -Stem::heads_i ()const +Stem::heads_i (Score_element*me) { - Pointer_group_interface gi (this, "heads"); + Pointer_group_interface gi (me, "heads"); return gi.count (); } /* The note head which forms one end of the stem. */ -Rhythmic_head* -Stem::first_head () const +Score_element* +Stem::first_head (Score_element*me) { - return extremal_heads ()[-get_direction ()]; + return extremal_heads (me)[-get_direction (me)]; } /* START is part where stem reaches `last' head. */ -Drul_array -Stem::extremal_heads () const +Drul_array +Stem::extremal_heads (Score_element*me) { const int inf = 1000000; Drul_array extpos; extpos[DOWN] = inf; extpos[UP] = -inf; - Drul_array exthead; + Drul_array exthead; exthead[LEFT] = exthead[RIGHT] =0; - for (SCM s = get_elt_pointer ("heads"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = me->get_elt_property ("heads"); gh_pair_p (s); s = gh_cdr (s)) { - Rhythmic_head * n = dynamic_cast (unsmob_element (gh_car (s))); - Staff_symbol_referencer_interface si (n); + Score_element * n = unsmob_element (gh_car (s)); + - int p = int(si.position_f ()); + int p = int(Staff_symbol_referencer::position_f (n)); Direction d = LEFT; do { @@ -200,57 +198,55 @@ Stem::extremal_heads () const } void -Stem::add_head (Rhythmic_head *n) +Stem::add_head (Score_element*me, Score_element *n) { - n->set_elt_pointer ("stem", this->self_scm_); - n->add_dependency (this); + n->set_elt_property ("stem", me->self_scm_); + n->add_dependency (me); - if (to_boolean (n->get_elt_property ("note-head-interface"))) + if (Note_head::has_interface (n)) { - Pointer_group_interface (this, "heads").add_element (n); + Pointer_group_interface (me, "heads").add_element (n); } else { - n->set_elt_pointer ("rest", n->self_scm_); + n->set_elt_property ("rest", n->self_scm_); } } Stem::Stem (SCM s) : Item (s) { - set_elt_pointer ("heads", SCM_EOL); - - add_offset_callback ( &Stem::off_callback, X_AXIS); + 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 () const +Stem::invisible_b (Score_element*me) { - /* - UGH. Who determines balltype for stem? - */ - Rhythmic_head * nh = dynamic_cast (support_head ()); - return !(heads_i () && nh->balltype_i () >= 1); + return !(heads_i (me) && Rhythmic_head::balltype_i (support_head (me)) >= 1); } int -Stem::get_center_distance (Direction d) const +Stem::get_center_distance (Score_element*me, Direction d) { int staff_center = 0; - int distance = (int) (d*(head_positions()[d] - staff_center)); + int distance = (int) (d*(head_positions(me)[d] - staff_center)); return distance >? 0; } Direction -Stem::get_default_dir () const +Stem::get_default_dir (Score_element*me) { - int du = get_center_distance (UP); - int dd = get_center_distance (DOWN); + int du = get_center_distance (me,UP); + int dd = get_center_distance (me,DOWN); if (sign (dd - du)) return Direction (sign (dd -du)); - return Direction (int(paper_l ()->get_var ("stem_default_neutral_direction"))); + return to_dir (me->get_elt_property ("default-neutral-direction")); } /* @@ -259,15 +255,15 @@ Stem::get_default_dir () const conversions. (but lets wait till we have namespaces in SCM) */ Real -Stem::get_default_stem_end_position () const +Stem::get_default_stem_end_position (Score_element*me) { - bool grace_b = to_boolean (get_elt_property ("grace")); + bool grace_b = to_boolean (me->get_elt_property ("grace")); String type_str = grace_b ? "grace-" : ""; SCM s; Array a; Real length_f = 0.; - SCM scm_len = get_elt_property("length"); + SCM scm_len = me->get_elt_property("length"); if (gh_number_p (scm_len)) { length_f = gh_scm2double (scm_len); @@ -279,7 +275,7 @@ Stem::get_default_stem_end_position () const a.push (gh_scm2double (gh_car (q))); // stem uses half-spaces - length_f = a[((flag_i () - 2) >? 0) ? 0) ? 0) ? 0) get_elt_property ("no-stem-extend")); if (!grace_b && !no_extend_b && dir * st < 0) st = 0.0; @@ -326,39 +322,39 @@ Stem::get_default_stem_end_position () const FIXME: wrong name */ int -Stem::flag_i () const +Stem::flag_i (Score_element*me) { - SCM s = get_elt_property ("duration-log"); + SCM s = me->get_elt_property ("duration-log"); return (gh_number_p (s)) ? gh_scm2int (s) : 2; } void -Stem::position_noteheads () +Stem::position_noteheads (Score_element*me) { - if (!heads_i ()) + if (!heads_i (me)) return; Link_array heads = - Pointer_group_interface__extract_elements (this, (Score_element*)0, "heads"); + Pointer_group_interface__extract_elements (me, (Score_element*)0, "heads"); heads.sort (compare_position); - Direction dir =get_direction (); + Direction dir =get_direction (me); if (dir < 0) heads.reverse (); - Real w = support_head ()->extent (X_AXIS)[dir]; + Real w = support_head (me)->extent (X_AXIS)[dir]; for (int i=0; i < heads.size (); i++) { heads[i]->translate_axis (w - heads[i]->extent (X_AXIS)[dir], X_AXIS); } - bool parity= true; // todo: make this settable. - int lastpos = int (Staff_symbol_referencer_interface (heads[0]).position_f ()); + bool parity= true; // todo: make me settable. + int lastpos = int (Staff_symbol_referencer::position_f (heads[0])); for (int i=1; i < heads.size (); i ++) { - Real p = Staff_symbol_referencer_interface (heads[i]).position_f (); + Real p = Staff_symbol_referencer::position_f (heads[i]); int dy =abs (lastpos- (int)p); if (dy <= 1) @@ -366,7 +362,7 @@ Stem::position_noteheads () if (parity) { Real l = heads[i]->extent (X_AXIS).length (); - heads[i]->translate_axis (l * get_direction (), X_AXIS); + heads[i]->translate_axis (l * get_direction (me), X_AXIS); } parity = !parity; } @@ -377,20 +373,21 @@ Stem::position_noteheads () } } -GLUE_SCORE_ELEMENT(Stem,before_line_breaking); +MAKE_SCHEME_CALLBACK(Stem,before_line_breaking); SCM -Stem::member_before_line_breaking () +Stem::before_line_breaking (SCM smob) { - stem_end_position (); // ugh. Trigger direction calc. - position_noteheads (); + Score_element*me = unsmob_element (smob); + stem_end_position (me); // ugh. Trigger direction calc. + position_noteheads (me); - if (invisible_b ()) + if (invisible_b (me)) { - remove_elt_property ("molecule-callback"); + me->remove_elt_property ("molecule-callback"); // suicide(); } - set_spacing_hints (); + set_spacing_hints (me); return SCM_UNDEFINED; } @@ -404,52 +401,53 @@ Stem::member_before_line_breaking () TODO: more advanced: supply height of noteheads as well, for more advanced spacing possibilities */ void -Stem::set_spacing_hints () +Stem::set_spacing_hints (Score_element*me) { - if (!invisible_b ()) + if (!invisible_b (me)) { - SCM scmdir = gh_int2scm (get_direction ()); - SCM dirlist = column_l ()->get_elt_property ("dir-list"); + SCM scmdir = gh_int2scm (get_direction (me)); + + Item* item = dynamic_cast (me); + Item * col = item->column_l (); + SCM dirlist =col->get_elt_property ("dir-list"); if (dirlist == SCM_UNDEFINED) dirlist = SCM_EOL; if (scm_sloppy_memq (scmdir, dirlist) == SCM_EOL) { dirlist = gh_cons (scmdir, dirlist); - column_l ()->set_elt_property ("dir-list", dirlist); + col->set_elt_property ("dir-list", dirlist); } } } Molecule -Stem::flag () const +Stem::flag (Score_element*me) { String style; - SCM st = get_elt_property ("flag-style"); + SCM st = me->get_elt_property ("flag-style"); if ( gh_string_p (st)) { style = ly_scm2string (st); } - char c = (get_direction () == UP) ? 'u' : 'd'; - Molecule m = lookup_l ()->afm_find (String ("flags-") + to_str (c) + - to_str (flag_i ())); + char c = (get_direction (me) == UP) ? 'u' : 'd'; + Molecule m = me->lookup_l ()->afm_find (String ("flags-") + to_str (c) + + to_str (flag_i (me))); if (!style.empty_b ()) - m.add_molecule(lookup_l ()->afm_find (String ("flags-") + to_str (c) + style)); + m.add_molecule(me->lookup_l ()->afm_find (String ("flags-") + to_str (c) + style)); return m; } Interval Stem::dim_callback (Score_element *se, Axis ) { - Stem * s = dynamic_cast ((Score_element*)se); - Interval r (0, 0); - if (unsmob_element (s->get_elt_pointer ("beam")) || abs (s->flag_i ()) <= 2) + if (unsmob_element (se->get_elt_property ("beam")) || abs (flag_i (se)) <= 2) ; // TODO! else { - r = s->flag ().extent (X_AXIS); + r = flag (se).extent (X_AXIS); } return r; } @@ -458,39 +456,40 @@ Stem::dim_callback (Score_element *se, Axis ) const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! Should be settable. -GLUE_SCORE_ELEMENT(Stem,brew_molecule); +MAKE_SCHEME_CALLBACK(Stem,brew_molecule); SCM -Stem::member_brew_molecule () const +Stem::brew_molecule (SCM smob) { + Score_element*me = unsmob_element (smob); Molecule mol; - - Staff_symbol_referencer_interface si (first_head ()); + Direction d = get_direction (me); - Real y1 = si.position_f(); - Real y2 = stem_end_position (); + + Real y1 = Staff_symbol_referencer::position_f (first_head (me)); + Real y2 = stem_end_position (me); Interval stem_y(y1,y2); stem_y.unite (Interval (y2,y1)); - Real dy = Staff_symbol_referencer_interface (this).staff_space ()/2.0; + Real dy = Staff_symbol_referencer::staff_space (me)/2.0; Real head_wid = 0; - if (support_head ()) - head_wid = support_head ()->extent (X_AXIS).length (); - stem_y[Direction(-get_direction ())] += get_direction () * head_wid * tan(ANGLE)/(2*dy); + if (support_head (me)) + head_wid = support_head (me)->extent (X_AXIS).length (); + stem_y[Direction(-d)] += d * head_wid * tan(ANGLE)/(2*dy); - if (!invisible_b ()) + if (!invisible_b (me)) { - Real stem_width = paper_l ()->get_var ("stemthickness"); - Molecule ss =lookup_l ()->filledbox (Box (Interval (-stem_width/2, stem_width/2), + Real stem_width = me->paper_l ()->get_var ("stemthickness"); + Molecule ss =me->lookup_l ()->filledbox (Box (Interval (-stem_width/2, stem_width/2), Interval (stem_y[DOWN]*dy, stem_y[UP]*dy))); mol.add_molecule (ss); } - if (!beam_l () && abs (flag_i ()) > 2) + if (!beam_l (me) && abs (flag_i (me)) > 2) { - Molecule fl = flag (); - fl.translate_axis(stem_y[get_direction ()]*dy, Y_AXIS); + Molecule fl = flag (me); + fl.translate_axis(stem_y[d]*dy, Y_AXIS); mol.add_molecule (fl); } @@ -498,20 +497,18 @@ Stem::member_brew_molecule () const } Real -Stem::off_callback (Score_element * se, Axis) +Stem::off_callback (Score_element * me, Axis) { - Stem *st = dynamic_cast ((Score_element*)se); - Real r=0; - if (Rhythmic_head * f = st->first_head ()) + if (Score_element * f = first_head (me)) { Interval head_wid(0, f->extent (X_AXIS).length ()); - if (to_boolean (st->get_elt_property ("stem-centered"))) + if (to_boolean (me->get_elt_property ("stem-centered"))) return head_wid.center (); - Real rule_thick = st->paper_l ()->get_var ("stemthickness"); - Direction d = st->get_direction (); + Real rule_thick = me->paper_l ()->get_var ("stemthickness"); + Direction d = get_direction (me); r = head_wid[d] - d * rule_thick ; } return r; @@ -520,39 +517,39 @@ Stem::off_callback (Score_element * se, Axis) Beam* -Stem::beam_l ()const +Stem::beam_l (Score_element*me) { - SCM b= get_elt_pointer ("beam"); + SCM b= me->get_elt_property ("beam"); return dynamic_cast (unsmob_element (b)); } // ugh still very long. Stem_info -Stem::calc_stem_info () const +Stem::calc_stem_info (Score_element*me) { - assert (beam_l ()); + Beam * beam = beam_l (me); - Direction beam_dir = Directional_element_interface (beam_l ()).get (); + Direction beam_dir = Directional_element_interface (beam).get (); if (!beam_dir) { programming_error ("Beam dir not set."); beam_dir = UP; } - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + + Real staff_space = Staff_symbol_referencer::staff_space (me); Real half_space = staff_space / 2; - Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->get_multiplicity ()); - Real thick = gh_scm2double (beam_l ()->get_elt_property ("beam-thickness")); - int multiplicity = beam_l ()->get_multiplicity (); + Real interbeam_f = me->paper_l ()->interbeam_f (beam->get_multiplicity ()); + Real thick = gh_scm2double (beam->get_elt_property ("beam-thickness")); + int multiplicity = beam->get_multiplicity (); Stem_info info; - info.idealy_f_ = chord_start_f (); + info.idealy_f_ = chord_start_f (me); // for simplicity, we calculate as if dir == UP info.idealy_f_ *= beam_dir; - SCM grace_prop = get_elt_property ("grace"); + SCM grace_prop = me->get_elt_property ("grace"); bool grace_b = to_boolean (grace_prop); @@ -575,7 +572,7 @@ Stem::calc_stem_info () const Real stem_length = a[multiplicity get_elt_property ("no-stem-extend")); if (!grace_b && !no_extend_b) { /* highest beam of (UP) beam must never be lower than middle @@ -625,11 +622,11 @@ Stem::calc_stem_info () const info.idealy_f_ = (info.maxy_f_ ? info.miny_f_; - s = beam_l ()->get_elt_property ("shorten"); + s = beam->get_elt_property ("shorten"); if (gh_number_p (s)) info.idealy_f_ -= gh_scm2double (s); - Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ()); + Real interstaff_f = -beam_dir* calc_interstaff_dist (dynamic_cast (me), beam); info.idealy_f_ += interstaff_f; info.miny_f_ += interstaff_f; @@ -638,3 +635,14 @@ Stem::calc_stem_info () const return info; } +bool +Stem::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("stem-interface")); +} + +void +Stem::set_interface (Score_element*m) +{ + return m->set_interface (ly_symbol2scm ("stem-interface")); +} diff --git a/lily/sustain-pedal.cc b/lily/sustain-pedal.cc index 77a3727ecf..eb13be365b 100644 --- a/lily/sustain-pedal.cc +++ b/lily/sustain-pedal.cc @@ -33,7 +33,7 @@ public: }; -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Sustain_pedal,brew_molecule); +MAKE_SCHEME_CALLBACK(Sustain_pedal,brew_molecule); SCM Sustain_pedal::brew_molecule (SCM smob) diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 10efe0c7d8..323b502845 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -33,10 +33,10 @@ ADD_THIS_TRANSLATOR(System_start_delimiter_engraver); void System_start_delimiter_engraver::acknowledge_element (Score_element_info inf) { - if (dynamic_cast (inf.elem_l_)) + if (Staff_symbol::has_interface (inf.elem_l_)) { /* - don't add as Axis_group_interface (delim_).add_element (), + don't add as Axis_group_interface::add_element (delim_, ), because that would set the parent as well */ Pointer_group_interface (delim_).add_element (inf.elem_l_); diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc index 051e0a844b..20bb3fc306 100644 --- a/lily/system-start-delimiter.cc +++ b/lily/system-start-delimiter.cc @@ -55,7 +55,7 @@ System_start_delimiter::simple_bar (Real h) const return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(System_start_delimiter,after_line_breaking); +MAKE_SCHEME_CALLBACK(System_start_delimiter,after_line_breaking); SCM System_start_delimiter::after_line_breaking (SCM smob) @@ -69,7 +69,7 @@ System_start_delimiter::try_collapse (Score_element*me) { SCM gl = me->get_elt_property ("glyph"); - if (scm_ilength (me->get_elt_pointer ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line")) + if (scm_ilength (me->get_elt_property ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line")) { me->suicide (); } @@ -77,7 +77,7 @@ System_start_delimiter::try_collapse (Score_element*me) } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(System_start_delimiter,brew_molecule); +MAKE_SCHEME_CALLBACK(System_start_delimiter,brew_molecule); SCM System_start_delimiter::brew_molecule (SCM smob) diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index 7e2a394326..118f8ff2a9 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -7,14 +7,13 @@ */ -#include "dimension-cache.hh" + #include "engraver.hh" #include "side-position-interface.hh" #include "item.hh" #include "musical-request.hh" - #include "stem.hh" -#include "staff-symbol.hh" +#include "note-head.hh" /** typeset directions that are plain text. @@ -49,23 +48,22 @@ Text_engraver::do_try_music (Music *m) void Text_engraver::acknowledge_element (Score_element_info inf) { - if (to_boolean (inf.elem_l_->get_elt_property ("note-head-interface"))) + if (Note_head::has_interface (inf.elem_l_)) { for (int i=0; i < texts_.size (); i++) { - Side_position_interface st (texts_[i]); - st.add_support (inf.elem_l_); - if (st.get_axis( ) == X_AXIS - && !texts_[i]->parent_l (Y_AXIS)) - texts_[i]->set_parent (inf.elem_l_, Y_AXIS); + Score_element*t = texts_[i]; + Side_position::add_support (t,inf.elem_l_); + if (Side_position::get_axis( t) == X_AXIS + && !t->parent_l (Y_AXIS)) + t->set_parent (inf.elem_l_, Y_AXIS); } } - if (Stem *n = dynamic_cast (inf.elem_l_)) + if (Stem::has_interface (inf.elem_l_)) { for (int i=0; i < texts_.size (); i++) { - Side_position_interface st(texts_[i]); - st.add_support (n); + Side_position::add_support(texts_[i],inf.elem_l_); } } } @@ -78,16 +76,11 @@ Text_engraver::do_process_music () Text_script_req * r = reqs_[i]; Item *text = new Item (get_property ("basicTextScriptProperties")); - Side_position_interface stafy (text); + SCM axisprop = get_property ("scriptHorizontal"); - if (to_boolean (axisprop)) - { - stafy.set_axis (X_AXIS); - // text->set_parent (ss, Y_AXIS); - } - else - stafy.set_axis (Y_AXIS); + + Side_position::set_axis (text, to_boolean (axisprop) ? X_AXIS : Y_AXIS); /* make sure they're in order by adding i to the priority field. @@ -96,7 +89,7 @@ Text_engraver::do_process_music () gh_int2scm (200 + i)); if (r->get_direction ()) - stafy.set_direction (r->get_direction ()); + Side_position::set_direction (text, r->get_direction ()); text->set_elt_property ("text", ly_str02scm ( r->text_str_.ch_C ())); @@ -121,7 +114,7 @@ Text_engraver::do_pre_move_processing () for (int i=0; i < texts_.size (); i++) { Item *ti = texts_[i]; - Side_position_interface (ti).add_staff_support (); + Side_position::add_staff_support (ti); typeset_element (ti); } texts_.clear (); diff --git a/lily/text-item.cc b/lily/text-item.cc index 931c5b843d..4a576ac7c2 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -19,7 +19,7 @@ struct Text_item }; -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Text_item,brew_molecule) +MAKE_SCHEME_CALLBACK(Text_item,brew_molecule) SCM Text_item::brew_molecule (SCM sm) @@ -39,7 +39,7 @@ Text_item::brew_molecule (SCM sm) Molecule m; m.set_empty (false); mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (space)* - Staff_symbol_referencer_interface (s).staff_space ()); + Staff_symbol_referencer::staff_space (s)); } return mol.create_scheme (); } diff --git a/lily/tie-column.cc b/lily/tie-column.cc index 5fccceba2c..10008dc2fa 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -21,7 +21,7 @@ Tie_column::Tie_column (SCM s) void Tie_column::set_interface (Score_element*me) { - me-> set_elt_pointer ("ties", SCM_EOL); + me-> set_elt_property ("ties", SCM_EOL); me->set_extent_callback (0, X_AXIS); me->set_extent_callback (0, Y_AXIS); } @@ -103,7 +103,7 @@ Tie_column::set_directions (Score_element*me) } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie_column,after_line_breaking); +MAKE_SCHEME_CALLBACK(Tie_column,after_line_breaking); SCM Tie_column::after_line_breaking (SCM smob) { diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index 59a05f4c50..4f619e27ae 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -16,13 +16,14 @@ #include "tie-column.hh" #include "pqueue.hh" #include "engraver.hh" +#include "item.hh" struct CHead_melodic_tuple { Melodic_req *req_l_ ; - Rhythmic_head *head_l_; + Score_element *head_l_; Moment end_; CHead_melodic_tuple (); - CHead_melodic_tuple (Rhythmic_head*, Melodic_req*, Moment); + CHead_melodic_tuple (Score_element*, Melodic_req*, Moment); static int pitch_compare (CHead_melodic_tuple const &, CHead_melodic_tuple const &); static int time_compare (CHead_melodic_tuple const &, CHead_melodic_tuple const &); }; @@ -38,7 +39,7 @@ inline int compare (CHead_melodic_tuple const &a, CHead_melodic_tuple const &b) priority queue. If we have a Tie_req, connect the notes that finish just at this time, and note that start at this time. - TODO: should share code with Beam_engraver, Extender_engraver? + TODO: junk the pq. */ class Tie_engraver : public Engraver { @@ -100,12 +101,12 @@ Tie_engraver::set_melisma (bool m) void Tie_engraver::acknowledge_element (Score_element_info i) { - if (Rhythmic_head *nh = dynamic_cast (i.elem_l_)) + if (Rhythmic_head::has_interface (i.elem_l_)) { Note_req * m = dynamic_cast (i.req_l_); if (!m) return; - now_heads_.push (CHead_melodic_tuple (nh, m, now_mom()+ m->length_mom ())); + now_heads_.push (CHead_melodic_tuple (i.elem_l_, m, now_mom()+ m->length_mom ())); } } @@ -224,7 +225,7 @@ Tie_engraver::do_pre_move_processing () tie_p_arr_.clear (); if (tie_column_p_) { - typeset_tie (tie_column_p_); + typeset_element (tie_column_p_); tie_column_p_ =0; } } @@ -232,11 +233,11 @@ Tie_engraver::do_pre_move_processing () void Tie_engraver::typeset_tie (Score_element *her) { - if (!(Tie::head (her,LEFT) && Tie::head (her,RIGHT))) + if (!(Tie::head (her,LEFT) && Tie::head (her,RIGHT))) warning (_ ("lonely tie")); Direction d = LEFT; - Drul_array new_head_drul; + Drul_array new_head_drul; new_head_drul[LEFT] = Tie::head(her,LEFT); new_head_drul[RIGHT] = Tie::head (her,RIGHT); do { @@ -244,8 +245,8 @@ Tie_engraver::typeset_tie (Score_element *her) new_head_drul[d] = Tie::head(her,(Direction)-d); } while (flip(&d) != LEFT); - index_set_cell (her->get_elt_pointer ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ ); - index_set_cell (her->get_elt_pointer ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ ); + index_set_cell (her->get_elt_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ ); + index_set_cell (her->get_elt_property ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ ); typeset_element (her); } @@ -274,7 +275,7 @@ CHead_melodic_tuple::CHead_melodic_tuple () end_ = 0; } -CHead_melodic_tuple::CHead_melodic_tuple (Rhythmic_head *h, Melodic_req*m, Moment mom) +CHead_melodic_tuple::CHead_melodic_tuple (Score_element *h, Melodic_req*m, Moment mom) { head_l_ = h; req_l_ = m; diff --git a/lily/tie.cc b/lily/tie.cc index 7a2a81ef87..9b655230a0 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -24,7 +24,7 @@ void Tie::set_head (Score_element*me,Direction d, Item * head_l) { assert (!head (me,d)); - index_set_cell (me->get_elt_pointer ("heads"), d, head_l->self_scm_); + index_set_cell (me->get_elt_property ("heads"), d, head_l->self_scm_); dynamic_cast (me)->set_bound (d, head_l); me->add_dependency (head_l); @@ -39,24 +39,29 @@ Tie::Tie(SCM s) void Tie::set_interface (Score_element*me) { - me->set_elt_pointer ("heads", gh_cons (SCM_EOL, SCM_EOL)); + me->set_elt_property ("heads", gh_cons (SCM_EOL, SCM_EOL)); + me->set_interface (ly_symbol2scm ("tie-interface")); +} +bool +Tie::has_interface (Score_element*me) +{ + return me->has_interface (ly_symbol2scm ("tie-interface")); } -Rhythmic_head* +Score_element* Tie::head (Score_element*me, Direction d) { - SCM c = me->get_elt_pointer ("heads"); + SCM c = me->get_elt_property ("heads"); c = index_cell (c, d); - return dynamic_cast (unsmob_element (c)); + return unsmob_element (c); } Real Tie::position_f (Score_element*me) { - return head (me,LEFT) - ? Staff_symbol_referencer_interface (head (me,LEFT)).position_f () - : Staff_symbol_referencer_interface (head (me,RIGHT)).position_f () ; + Direction d = head (me,LEFT) ? LEFT:RIGHT; + return Staff_symbol_referencer::position_f (head (me,d)); } @@ -66,8 +71,8 @@ Tie::position_f (Score_element*me) Direction Tie::get_default_dir (Score_element*me) { - Stem * sl = head(me,LEFT) ? head (me,LEFT)->stem_l () :0; - Stem * sr = head(me,RIGHT) ? head (me,RIGHT)->stem_l () :0; + Item * sl = head(me,LEFT) ? Rhythmic_head::stem_l (head (me,LEFT)) :0; + Item * sr = head(me,RIGHT) ? Rhythmic_head::stem_l (head (me,RIGHT)) :0; if (sl && Directional_element_interface (sl).get () == UP && sr && Directional_element_interface (sr).get () == UP) @@ -78,7 +83,7 @@ Tie::get_default_dir (Score_element*me) -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie,after_line_breaking); +MAKE_SCHEME_CALLBACK(Tie,after_line_breaking); SCM Tie::after_line_breaking (SCM smob) { @@ -94,7 +99,7 @@ Tie::after_line_breaking (SCM smob) if (!Directional_element_interface (me).get ()) Directional_element_interface (me).set (Tie::get_default_dir (me)); - Real staff_space = Staff_symbol_referencer_interface (me).staff_space (); + Real staff_space = Staff_symbol_referencer::staff_space (me); Real half_space = staff_space / 2; Real x_gap_f = me->paper_l ()->get_var ("tie_x_gap"); Real y_gap_f = me->paper_l ()->get_var ("tie_y_gap"); @@ -178,7 +183,7 @@ Tie::get_rods () const return a; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie,brew_molecule); +MAKE_SCHEME_CALLBACK(Tie,brew_molecule); SCM Tie::brew_molecule (SCM smob) @@ -206,7 +211,7 @@ Tie::get_curve () const Direction d (Directional_element_interface (me).get ()); Bezier_bow b (get_encompass_offset_arr (), d); - Real staff_space = Staff_symbol_referencer_interface (me).staff_space (); + Real staff_space = Staff_symbol_referencer::staff_space (me); Real h_inf = paper_l ()->get_var ("tie_height_limit_factor") * staff_space; Real r_0 = paper_l ()->get_var ("tie_ratio"); diff --git a/lily/time-signature.cc b/lily/time-signature.cc index 95cc942a59..5cc5118cdb 100644 --- a/lily/time-signature.cc +++ b/lily/time-signature.cc @@ -13,7 +13,7 @@ #include "paper-def.hh" #include "lookup.hh" -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Time_signature,brew_molecule); +MAKE_SCHEME_CALLBACK(Time_signature,brew_molecule); SCM Time_signature::brew_molecule (SCM smob) diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 74efa874af..9096284795 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -125,7 +125,7 @@ Timing_translator::do_creation_processing() daddy_trans_l_->set_property ("timing" , SCM_BOOL_T); daddy_trans_l_->set_property ("currentBarNumber" , gh_int2scm (1)); daddy_trans_l_->set_property ("measurePosition", smobify (new Moment)); - daddy_trans_l_->set_property ("oneBeat", smobify (new Moment (1,4))); + daddy_trans_l_->set_property ("beatLength", smobify (new Moment (1,4))); daddy_trans_l_->set_property ("measureLength", smobify (new Moment (1))); } @@ -133,25 +133,13 @@ Moment Timing_translator::measure_length () const { SCM l = get_property("measureLength"); - if (SMOB_IS_TYPE_B(Moment, l)) - return *SMOB_TO_TYPE (Moment, l); + if (unsmob_moment(l)) + return *unsmob_moment (l); else return Moment (1); } -void -Timing_translator::get_time_signature (int *n, int *d) const -{ - Moment one_beat (1,4); - SCM one = get_property ("beatLength"); - if (SMOB_IS_TYPE_B (Moment, one)) - one_beat = *SMOB_TO_TYPE (Moment, one); - *n = measure_length () / one_beat; - *d = one_beat.den_i (); -} - - void Timing_translator::set_time_signature (int l, int o) { diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc index 00760818d7..87a528f12b 100644 --- a/lily/tuplet-spanner.cc +++ b/lily/tuplet-spanner.cc @@ -26,15 +26,15 @@ void Tuplet_spanner::set_interface (Score_element*me) { - me-> set_elt_pointer ("beams", SCM_EOL); - me->set_elt_pointer ("columns", SCM_EOL); + me-> set_elt_property ("beams", SCM_EOL); + me->set_elt_property ("columns", SCM_EOL); } /* TODO. */ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tuplet_spanner,brew_molecule); +MAKE_SCHEME_CALLBACK(Tuplet_spanner,brew_molecule); SCM Tuplet_spanner::brew_molecule (SCM smob) @@ -63,7 +63,7 @@ Tuplet_spanner::brew_molecule (SCM smob) else if (bracket == ly_symbol2scm ("if-no-beam")) number_visibility = !par_beam; - if (gh_pair_p (me->get_elt_pointer ("columns"))) + if (gh_pair_p (me->get_elt_property ("columns"))) { Link_array column_arr= Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns"); @@ -127,7 +127,7 @@ Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real * Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns"); - Score_element * common = me->common_refpoint (me->get_elt_pointer ("columns"), Y_AXIS); + Score_element * common = me->common_refpoint (me->get_elt_property ("columns"), Y_AXIS); Direction d = Directional_element_interface (me).get (); @@ -188,7 +188,7 @@ Tuplet_spanner::calc_dy (Score_element*me,Real * dy) *dy = column_arr.top ()->extent (Y_AXIS) [d] - column_arr[0]->extent (Y_AXIS) [d]; } -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tuplet_spanner,after_line_breaking); +MAKE_SCHEME_CALLBACK(Tuplet_spanner,after_line_breaking); SCM Tuplet_spanner::after_line_breaking (SCM smob) @@ -220,9 +220,9 @@ Tuplet_spanner::after_line_breaking (SCM smob) me->translate_axis (offset, Y_AXIS); - if (scm_ilength (me->get_elt_pointer ("beams")) == 1) + if (scm_ilength (me->get_elt_property ("beams")) == 1) { - SCM bs = me->get_elt_pointer ("beams"); + SCM bs = me->get_elt_property ("beams"); Score_element *b = unsmob_element (gh_car (bs)); Beam * beam_l = dynamic_cast (b); if (!sp->broken_b () @@ -247,7 +247,7 @@ Tuplet_spanner::get_default_dir (Score_element*me) } d = UP ; - for (SCM s = me->get_elt_pointer ("columns"); gh_pair_p (s); s = gh_cdr (s)) + 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 (sc); diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 261c7956d7..028037df76 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -14,7 +14,8 @@ #include "engraver.hh" #include "spanner.hh" -class Vertical_align_engraver : public Engraver { +class Vertical_align_engraver : public Engraver +{ Spanner * valign_p_; bool qualifies_b (Score_element_info) const; public: @@ -28,7 +29,6 @@ protected: virtual void do_removal_processing(); }; - Vertical_align_engraver::Vertical_align_engraver() { valign_p_ =0; @@ -38,8 +38,8 @@ void Vertical_align_engraver::do_creation_processing() { valign_p_ =new Spanner (SCM_EOL); // todo -> basic props - Align_interface (valign_p_).set_interface (); - Align_interface (valign_p_).set_axis (Y_AXIS); + Align_interface::set_interface (valign_p_); + Align_interface::set_axis (valign_p_,Y_AXIS); valign_p_->set_elt_property ("stacking-dir", gh_int2scm (DOWN)); @@ -54,13 +54,13 @@ Vertical_align_engraver::do_removal_processing() SCM max = get_property ("minVerticalAlign"); if (gh_number_p (min) || gh_number_p (max)) - { - min = gh_number_p (min) ? min : gh_double2scm (0.0); - max = gh_number_p (max) ? max : gh_double2scm (infinity_f); + { + min = gh_number_p (min) ? min : gh_double2scm (0.0); + max = gh_number_p (max) ? max : gh_double2scm (infinity_f); - valign_p_->set_elt_property ("threshold", - gh_cons (min,max)); - } + valign_p_->set_elt_property ("threshold", + gh_cons (min,max)); + } valign_p_->set_bound(RIGHT,unsmob_element (get_property ("currentCommandColumn"))); typeset_element (valign_p_); valign_p_ =0; @@ -72,11 +72,8 @@ Vertical_align_engraver::qualifies_b (Score_element_info i) const { int sz = i.origin_trans_l_arr ((Translator*)this).size() ; - - Axis_group_interface agi(i.elem_l_); - - return sz > 1 && agi.has_interface_b () - && !i.elem_l_->parent_l (Y_AXIS) && agi.axis_b (Y_AXIS); + return sz > 1 && Axis_group_interface::has_interface (i.elem_l_) + && !i.elem_l_->parent_l (Y_AXIS) && Axis_group_interface::axis_b (i.elem_l_, Y_AXIS); } void @@ -84,10 +81,8 @@ Vertical_align_engraver::acknowledge_element (Score_element_info i) { if (qualifies_b (i)) { - Align_interface(valign_p_).add_element (i.elem_l_); + Align_interface::add_element (valign_p_,i.elem_l_); } } - - ADD_THIS_TRANSLATOR(Vertical_align_engraver); diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index fa986542eb..38052c5ba2 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -12,7 +12,6 @@ #include "lookup.hh" #include "molecule.hh" #include "paper-column.hh" -#include "bar.hh" #include "paper-def.hh" #include "volta-spanner.hh" #include "group-interface.hh" @@ -23,8 +22,8 @@ void Volta_spanner::set_interface (Score_element*me) { - me->set_elt_pointer ("bars", SCM_EOL); - Side_position_interface (me).set_axis (Y_AXIS); + me->set_elt_property ("bars", SCM_EOL); + Side_position::set_axis (me, Y_AXIS); Directional_element_interface (me).set (UP); } @@ -40,13 +39,13 @@ Volta_spanner::set_interface (Score_element*me) */ -MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Volta_spanner,brew_molecule); +MAKE_SCHEME_CALLBACK(Volta_spanner,brew_molecule); SCM Volta_spanner::brew_molecule (SCM smob) { Score_element *me = unsmob_element (smob); - Link_array bar_arr - = Pointer_group_interface__extract_elements (me, (Bar*)0, "bars"); + Link_array bar_arr + = Pointer_group_interface__extract_elements (me, (Item*)0, "bars"); if (!bar_arr.size ()) return SCM_EOL; @@ -99,12 +98,12 @@ Volta_spanner::add_bar (Score_element *me, Item* b) Pointer_group_interface gi(me, "bars"); gi.add_element (b); - Side_position_interface (me).add_support (b); + Side_position::add_support (me,b); add_bound_item (dynamic_cast(me), b); } void Volta_spanner::add_column (Score_element*me, Score_element* c) { - Side_position_interface (me).add_support (c); + Side_position::add_support (me,c); } diff --git a/ly/engraver.ly b/ly/engraver.ly index adac158aac..a5412bf776 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -403,6 +403,7 @@ ScoreContext = \translator { basicBarProperties = #`( (break-align-symbol . Staff_bar) + (barsize-procedure . ,Bar::get_staff_bar_size) (molecule-callback . ,Bar::brew_molecule) (visibility-lambda . ,begin-of-line-invisible) (breakable . #t) @@ -414,7 +415,8 @@ ScoreContext = \translator { (thin-kern . 3.0) (hair-thickness . 1.6) (thick-thickness . 6.0) - (bar-interface . #t) + + (interfaces . (bar-interface staff-bar-interface)) ) basicBarNumberProperties = #`( @@ -427,20 +429,28 @@ ScoreContext = \translator { (molecule-callback . ,Beam::brew_molecule) (beam-thickness . 0.42) ; interline (before-line-breaking-callback . ,Beam::before_line_breaking) - (after-line-breaking-callback . ,Beam::after_line_breaking) + (after-line-breaking-callback . ,Beam::after_line_breaking) + (default-neutral-direction . 1) + (interfaces . (beam-interface)) + (damping . 1) ) basicBreakAlignProperties = #`( (breakable . #t) - (before-line-breaking-callback . ,Break_align_item::before_line_breaking) -) - - + (interfaces . (break-align-interface)) + (stacking-dir . 1) + (axes 0) + ) + basicBreakAlignGroupProperties = #`( + (interfaces . (axis-group-interface)) + (axes . (0)) + ) basicBreathingSignProperties = #`( (break-align-symbol . Breathing_sign) (breakable . #t ) (molecule-callback . ,Breathing_sign::brew_molecule) (visibility-lambda . ,begin-of-line-invisible) + (interfaces . (breathing-sign-interface)) ) basicClefItemProperties = #`( (molecule-callback . ,Score_element::brew_molecule) @@ -448,32 +458,36 @@ ScoreContext = \translator { (breakable . #t) (break-align-symbol . Clef_item) (visibility-lambda . ,begin-of-line-visible) - (clef-interface . #t) + (interfaces . (clef-interface)) ) basicChordNameProperties = #`( (molecule-callback . ,Chord_name::brew_molecule) + (interfaces . (chord-name-interface)) ) basicCollisionProperties = #`( (axes 0 1) + (interfaces . (collision-interface)) ) basicCrescendoProperties = #`( (molecule-callback . ,Crescendo::brew_molecule) + (interfaces . (crescendo-interface dynamic-interface)) ) basicDotColumnProperties = #`( - (dot-column-interface . #t) + (interfaces . (dot-column-interface axis-group-interface )) + (axes 0 ) ) basicDotsProperties = #`( (molecule-callback . ,Dots::brew_molecule) (dot-count . 1) - (dots-interface . #t) + (interfaces . (dot-interface)) ) basicDynamicLineSpannerProperties = #`( - (dynamic-interface . #t) + (interfaces (dynamic-interface)) (axes . ( 1)) ) basicDynamicTextProperties = # `( (style . "dynamic") - (dynamic-interface . #t) + (interface (dynamic-interface)) (molecule-callback . ,Text_item::brew_molecule) (script-priority . 100) (self-alignment-Y . 0) @@ -487,7 +501,7 @@ ScoreContext = \translator { (before-line-breaking-callback . ,Grace_align_item::before_line_breaking) ) basicHaraKiriVerticalGroupspannerProperties = #`( - (hara-kiri-interface . #t) + (interfaces . (hara-kiri-interface)) (axes 1) ) basicHyphenSpannerProperties = #`( @@ -498,7 +512,7 @@ ScoreContext = \translator { ) basicKeyProperties = #`( (molecule-callback . ,Key_item::brew_molecule) - (key-item-interface . #t) + (interfaces . (key-item-interface)) (break-align-symbol . Key_item) (visibility-lambda . ,begin-of-line-visible) (breakable . #t) @@ -507,8 +521,13 @@ ScoreContext = \translator { (molecule-callback . ,Local_key_item::brew_molecule) (left-padding . 0.2) (right-padding . 0.4) - (accidentals-interface . #t) + (interfaces . (accidentals-interface )) ) + basicLineOfScoreProperties = #`( ) +%{; (axes . (0 1)) +; (interfaces . (axis-group)) + ; (rank . -1) + ; )%} basicLyricExtenderProperties = #`( (molecule-callback . ,Lyric_extender::brew_molecule) ) @@ -516,12 +535,12 @@ ScoreContext = \translator { (molecule-callback . ,Text_item::brew_molecule) (self-alignment-X . 0) (non-rhythmic . #t) - (text-item-interface . #t) + (interfaces . (text-item-interface)) ) basicMarkProperties = #`( (molecule-callback . ,Text_item::brew_molecule) (breakable . #t) - (mark-interface . #t) + (interfaces . (mark-interface)) (visibility-lambda . ,end-of-line-invisible) ) basicMultiMeasureRestProperties = #`( @@ -530,9 +549,10 @@ ScoreContext = \translator { ) basicNoteColumnProperties = #`( (axes 0 1) + (interfaces . (note-column-interface)) ) basicNoteHeadProperties = #`( - (note-head-interface . #t) + (interfaces . (note-head-interface rhythmic-head-interface)) (molecule-callback . ,Note_head::brew_molecule) ) basicNoteNameProperties = #`( @@ -546,8 +566,9 @@ ScoreContext = \translator { (style . "italic") ) basicPaperColumnProperties = #`( - (paper-column-interface . #t) + (interfaces . (paper-column-interface)) (axes 0) + (rank . -1) ) basicPedalProperties = #`( (molecule-callback . ,Text_item::brew_molecule) @@ -558,16 +579,18 @@ ScoreContext = \translator { ) basicTextProperties = #`( ) basicRestProperties = #`( - (rest-interface . #t) + (interfaces . (rest-interface rhythmic-head-interface)) (molecule-callback . ,Rest::brew_molecule) (minimum-beam-collision-distance . 1.5) ) basicRestCollisionProperties = #`( (minimum-distance . 0.75) + (interfaces . (rest-collision-interface)) ) basicScriptProperties = #`( (molecule-callback . ,Script::brew_molecule) + (interface . (script-interface)) ) basicScriptColumnProperties = #`( (before-line-breaking-callback . ,Script_column::before_line_breaking) @@ -578,11 +601,11 @@ ScoreContext = \translator { ) basicSpanBarProperties = #`( (break-align-symbol . Staff_bar) + (barsize-procedure . ,Span_bar::get_bar_size) (molecule-callback . ,Bar::brew_molecule) (visibility-lambda . ,begin-of-line-invisible) (breakable . #t) (before-line-breaking-callback . ,Span_bar::before_line_breaking) - (after-line-breaking-callback . ,Span_bar::after_line_breaking) ;; ugh duplication! @@ -593,16 +616,17 @@ ScoreContext = \translator { (thin-kern . 3.0) (hair-thickness . 1.6) (thick-thickness . 6.0) - (bar-interface . #t) + (interfaces . (bar-interface span-bar-interface)) ) basicSustainPedalProperties = #`( (no-spacing-rods . #t) (molecule-callback . ,Sustain_pedal::brew_molecule) (self-alignment-X . 0) + (interface . (sustain-pedal-interface)) ) basicSystemStartDelimiterProperties = #`( (molecule-callback . ,System_start_delimiter::brew_molecule) - (after-line-breaking-callback . ,System_start_delimiter::after_line_breaking) + (after-line-breaking-callback . ,System_start_delimiter::after_line_breaking) (collapse-height . 1.0) (thickness . 1.6) (arch-height . 1.5) @@ -615,29 +639,37 @@ ScoreContext = \translator { basicStemProperties = #`( (before-line-breaking-callback . ,Stem::before_line_breaking) (molecule-callback . ,Stem::brew_molecule) - (stem-interface . #t) + + ; if stem is on middle line, choose this direction. + (default-neutral-direction . 1) + (interfaces . (stem-interface)) ) staffSymbolBasicProperties = #`( (molecule-callback . ,Staff_symbol::brew_molecule) - (staff-space . 1.0 ) + (staff-space . 1.0) (line-count . 5 ) + (interfaces . (staff-symbol-interface )) ) basicTextScriptProperties = #`( (molecule-callback . ,Text_item::brew_molecule) (no-spacing-rods . #t) - ) - basicTimeSignatureProperties = #`( - (molecule-callback . ,Time_signature::brew_molecule) - (break-align-symbol . Time_signature) - (visibility-lambda . ,all-visible) - (breakable . #t) + (interfaces . (text-script-interface text-item-interface)) ) basicTieProperties = #`( (molecule-callback . ,Tie::brew_molecule) - (after-line-breaking-callback . ,Tie::after_line_breaking) + (after-line-breaking-callback . ,Tie::after_line_breaking) + (interfaces . (tie-interface)) ) basicTieColumnProperties = #`( (after-line-breaking-callback . ,Tie_column::after_line_breaking) + (interfaces . (tie-column-interface)) + ) + basicTimeSignatureProperties = #`( + (molecule-callback . ,Time_signature::brew_molecule) + (break-align-symbol . Time_signature) + (visibility-lambda . ,all-visible) + (breakable . #t) + (interfaces . (time-signature-interface)) ) basicTupletSpannerProperties = #`( (number-gap . 2.0) @@ -645,6 +677,7 @@ ScoreContext = \translator { (thick . 1.0) (after-line-breaking-callback . ,Tuplet_spanner::after_line_breaking) (molecule-callback . ,Tuplet_spanner::brew_molecule) + (interfaces . (tuplet-spanner-interface)) ) basicStemTremoloProperties = #`( (molecule-callback . ,Stem_tremolo::brew_molecule) @@ -652,8 +685,11 @@ ScoreContext = \translator { (beam-thickness . 0.42) ; interline! ) - basicSingleMaltGroupingItemProperties = #`( - + basicSeparationItemProperties = #`( + (interfaces . (separation-item-interface)) + ) + basicSeparatingGroupSpannerProperties = #`( + (interfaces . (separation-spanner-interface)) ) basicInstrumentNameProperties = #`( (breakable . #t) @@ -666,6 +702,7 @@ ScoreContext = \translator { ) basicVoltaSpannerProperties = #`( (molecule-callback . ,Volta_spanner::brew_molecule) + (interfaces . (volta-spanner-interface)) ) \accepts "Staff"; diff --git a/ly/params.ly b/ly/params.ly index 0fb31179fd..ba6494591d 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -228,9 +228,6 @@ will cause scores to be set looser compression_energy_factor = 0.6; -% if stem is on middle line, choose this direction. -stem_default_neutral_direction = 1.0; - % in staffspace articulation_script_padding_default = 1.0; diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 5c5c756f9e..76274fd3f1 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.68 -Entered-date: 02JUL00 +Version: 1.3.69 +Entered-date: 04JUL00 Description: Keywords: music notation typesetting midi fonts engraving Author: hanwen@cs.uu.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 1000k lilypond-1.3.68.tar.gz + 1000k lilypond-1.3.69.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.68.tar.gz + 1000k lilypond-1.3.69.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index d54470836e..50c4436a70 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.3.68 +Version: 1.3.69 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.68.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.69.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # Icon: lilypond-icon.gif diff --git a/scm/generic-property.scm b/scm/generic-property.scm index 3b3d46665f..1d53b08a85 100644 --- a/scm/generic-property.scm +++ b/scm/generic-property.scm @@ -19,7 +19,7 @@ (define generic-beam-properties - (cons 'Beam + (cons 'beam-interface (list (list 'beamSlopeDamping number? 'damping) (list 'autoKneeGap number? 'auto-knee-gap) @@ -33,7 +33,7 @@ (define generic-stem-properties - (cons 'Stem + (cons 'stem-interface (list (list 'stemVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) @@ -46,7 +46,7 @@ ) (define generic-dot-properties - (cons 'Dots + (cons 'dot-interface (list (list 'dotDirection dir? 'direction) (list 'verticalDirection dir? 'direction) @@ -54,7 +54,8 @@ )) (define generic-script-properties - (cons 'Script (list + (cons 'script-interface + (list (list 'articulationScriptVerticalDirection dir? 'direction) (list 'articulationScriptPadding number? 'padding) @@ -64,7 +65,8 @@ (define generic-text-properties - (cons 'Text_item (list + (cons 'text-item-interface + (list (list 'textStyle string? 'style) (list 'lyricAlignment dir? 'self-alignment-X) (list 'textScriptPadding number? 'padding) @@ -75,26 +77,30 @@ )) (define generic-sustain-pedal-properties - (cons 'Sustain_pedal (list - (list 'textScriptPadding number? 'padding) - (list 'sustainPedalPadding number? 'padding)))) + (cons 'sustain-pedal-interface + (list + (list 'textScriptPadding number? 'padding) + (list 'sustainPedalPadding number? 'padding)))) (define generic-chord-name-properties - (cons 'Chord_name (list - (list 'textScriptWordSpace number? 'word-space) - (list 'chordNameWordSpace number? 'word-space) - (list 'chordNameStyle string? 'style)))) + (cons 'chord-name-interface + (list + (list 'textScriptWordSpace number? 'word-space) + (list 'chordNameWordSpace number? 'word-space) + (list 'chordNameStyle string? 'style)))) (define generic-crescendo-properties - (cons 'Crescendo (list - (list 'dynamicDirection dir? 'direction) - (list 'verticalDirection dir? 'direction) - (list 'dynamicPadding number? 'padding) - (list 'dynamicMinimumSpace number? 'minimum-space) - ))) - + (cons 'crescendo-interface + (list + (list 'dynamicDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) + (list 'dynamicPadding number? 'padding) + (list 'dynamicMinimumSpace number? 'minimum-space) + ))) + (define generic-dynamic-line-spanner-properties - (cons 'Dynamic_line_spanner (list + (cons 'dynamic-interface + (list (list 'dynamicDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'dynamicPadding number? 'padding) @@ -102,78 +108,82 @@ ))) (define generic-volta-spanner-properties - (cons 'Volta_spanner (list + (cons 'volta-spanner-interface (list (list 'voltaVerticalDirection dir? 'direction) (list 'voltaPadding number? 'padding) (list 'voltaMinimumSpace number? 'minimum-space) ))) (define generic-bar-properties - (cons 'Staff_bar (list - (list 'barSize number? 'bar-size)) + (cons 'staff-bar-interface + (list + (list 'barSize number? 'bar-size)) ) ) ; don't do this yet. Depends on whennn the staff is really announced (define generic-staff-symbol-properties - (cons 'Staff_symbol (list - ) + (cons 'staff-symbol-interface + (list + ) ) ) (define generic-breathing-sign-properties - (cons 'Breathing_sign + (cons 'breathing-sign-interface (list (list 'breathingSignVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) ))) (define generic-clef-properties - (cons 'Clef_item + (cons 'clef-interface (list (list 'clefStyle string? 'style)) ) ) (define generic-All-properties - (cons 'all (list (list 'fontSize number? 'fontsize)))) + (cons 'all + (list (list 'fontSize number? 'fontsize)))) (define generic-notehead-properties - (cons 'Note_head + (cons 'note-head-interface (list (list 'noteHeadStyle symbol? 'style)))) (define generic-rest-properties - (cons 'Rest + (cons 'rest-interface (list (list 'restStyle string? 'reststyle)))) (define generic-rest-collision-properties - (cons 'Rest_collision + (cons 'rest-collision-interface (list (list 'maximumRestCount number? 'maximum-rest-count)))) (define generic-tie-properties - (cons 'Tie (list + (cons 'tie-interface + (list (list 'tieVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'tieDash number? 'dashed) ))) (define generic-tie-column-properties - (cons 'Tie_column (list + (cons 'tie-column-interface (list (list 'tieVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) ))) (define generic-note-column-properties - (cons 'Note_column + (cons 'note-column-interface (list (list 'horizontalNoteShift number? 'horizontal-shift) (list 'forceHorizontalShift number? 'force-hshift) ))) (define generic-collision-properties - (cons 'Collision + (cons 'collision-interface (list (list 'collisionMergeDotted boolean? 'merge-differently-dotted) ) @@ -181,14 +191,14 @@ ) (define generic-slur-properties - (cons 'Slur + (cons 'slur-interface (list (list 'slurVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'slurDash number? 'dashed)))) (define generic-timesig-properties - (cons 'Time_signature + (cons 'time-signature-interface (list (list 'timeSignatureStyle string? 'style)))) @@ -196,7 +206,7 @@ (or (boolean? s) (symbol? s))) (define generic-tuplet-spanner-properties - (cons 'Tuplet_spanner + (cons 'tuplet-spanner-interface (list (list 'tupletDirection dir? 'direction) (list 'tupletNumberVisibility symbol-or-boolean? 'tuplet-number-visibility) diff --git a/scm/lily.scm b/scm/lily.scm index 7479ba214e..7088dd1dab 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -231,14 +231,11 @@ ; Make a function that checks score element for being of a specific type. (define (make-type-checker symbol) (lambda (elt) - (display symbol) - (if (eq? #t (ly-get-elt-property elt symbol)) - #t - #f) +; (display symbol) +; (eq? #t (ly-get-elt-property elt symbol)) + (not (eq? #f (memq symbol (ly-get-elt-property elt 'interfaces)))) + )) - - - ;;;;;;;;;;;;;;;;;;; TeX output (define (tex-scm action-name) diff --git a/scm/slur.scm b/scm/slur.scm index 540ce7ac7f..8eaafee36a 100644 --- a/scm/slur.scm +++ b/scm/slur.scm @@ -1,12 +1,12 @@ (define (attached-to-stem slur dir) - (let* ((note-columns (ly-get-elt-pointer slur 'note-columns)) + (let* ((note-columns (ly-get-elt-property slur 'note-columns)) (col (if (= dir 1) (car note-columns) (car (reverse note-columns)))) - (stem (ly-get-elt-pointer col 'stem))) + (stem (ly-get-elt-property col 'stem))) (and (eq? col (ly-get-spanner-bound slur dir)) stem - (ly-get-elt-pointer stem 'heads)))) + (ly-get-elt-property stem 'heads)))) ;; Slur-extremity-rules is a list of rules. Each rule is a pair @@ -27,9 +27,9 @@ (list (cons (lambda (slur dir) ;; urg, code dup - (let* ((note-columns (ly-get-elt-pointer slur 'note-columns)) + (let* ((note-columns (ly-get-elt-property slur 'note-columns)) (col (if (= dir 1) (car note-columns) (car (reverse note-columns)))) - (stem (ly-get-elt-pointer col 'stem))) + (stem (ly-get-elt-property col 'stem))) (and stem (not (= (ly-get-elt-property slur 'direction) (ly-get-elt-property stem 'direction)))))) 'head) @@ -39,11 +39,11 @@ (and (attached-to-stem slur dir) ;; and got beam ;; urg, code dup - (let* ((note-columns (ly-get-elt-pointer slur 'note-columns)) + (let* ((note-columns (ly-get-elt-property slur 'note-columns)) (col (if (= dir 1) (car note-columns) (car (reverse note-columns)))) - (stem (ly-get-elt-pointer col 'stem))) + (stem (ly-get-elt-property col 'stem))) (and stem - (ly-get-elt-pointer stem 'beam) + (ly-get-elt-property stem 'beam) ;; and beam on same side as slur (let ((beaming (ly-get-elt-property stem 'beaming))) (if (pair? beaming) diff --git a/stepmake/bin/flower.py b/stepmake/bin/flower.py deleted file mode 100755 index b105098ed3..0000000000 --- a/stepmake/bin/flower.py +++ /dev/null @@ -1,87 +0,0 @@ -#!@PYTHON@ - -# -# flower.py -- python flower lib -# -# source file of the GNU LilyPond music typesetter -# -# (c) 1997 Han-Wen Nienhuys -# - -import sys -from string import * - -class File: - """silly wrapper for Python file object.""" - def __init__ (self,nm, mode='r'): - if nm: - self.file_ = open (nm, mode); - elif mode == 'w': - self.file_ = sys.stdout - else: - self.file_ = sys.stdin - - self.eof_ = 0; - def readline (self): - l= self.file_.readline (); - if not l: - self.eof_ = 1; - return l; - def write (self, str): - self.file_.write (str) - def eof (self): - return self.eof_ - def close (self): - self.file_.close () - def __del__ (self): - self.close (); - - - -import fnmatch -import os - -_debug = 0 - -_prune = ['(*)'] - - -def my_find(patterns, dir = os.curdir): - list = [] - names = os.listdir(dir) - names.sort() - for name in names: - if name in (os.curdir, os.pardir): - continue - fullname = os.path.join(dir, name) - for pat in patterns: - if fnmatch.fnmatch(name, pat): - list.append(fullname) - if os.path.isdir(fullname) and not os.path.islink(fullname): - for p in _prune: - if fnmatch.fnmatch(name, p): - if _debug: print "skip", `fullname` - break - else: - if _debug: print "descend into", `fullname` - found = my_find(patterns, fullname) - if found: - list = list + found - return list - - -def multiple_find(pats, dirnames): - from find import find - l = [] - for d in dirnames: - l = l + my_find(pats, d) - return l - -def file_exist_b(name): - try: - f = open(name) - except IOError: - return 0 - f.close () - return 1 - diff --git a/stepmake/bin/package-diff.py b/stepmake/bin/package-diff.py index 98fcbfe64b..16e8f992fc 100644 --- a/stepmake/bin/package-diff.py +++ b/stepmake/bin/package-diff.py @@ -1,7 +1,7 @@ #!@PYTHON@ # -# TODO: CLEAN THIS UP. +# TODO: CLEAN THIS UP, merge packagepython.py and release.py # diff --git a/stepmake/bin/packagepython.py b/stepmake/bin/packagepython.py index 10ab9a8065..9fb12ff074 100755 --- a/stepmake/bin/packagepython.py +++ b/stepmake/bin/packagepython.py @@ -1,5 +1,8 @@ #!/usr/bin/python + +#ugh. junkme. + # packagepython.py -- implement general StepMake-wide python stuff # # source file of the GNU LilyPond music typesetter diff --git a/stepmake/bin/show-latest.sh b/stepmake/bin/show-latest.sh deleted file mode 100644 index 731efad9a3..0000000000 --- a/stepmake/bin/show-latest.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# show-latest.sh --- show latest lily - -# @PERL@ @step-bindir@/out/show-latest.pl --package=@package@ $* -# urg -#@step-bindir@/out/show-latest --the-package=@package@ $* -if [ $# -lt 1 ]; then - print="-p" -fi -@abs-step-bindir@/out/package-latest --the-package=@package@ $* $print - diff --git a/stepmake/bin/table-to-html.py b/stepmake/bin/table-to-html.py deleted file mode 100644 index 6cfc2f1c2d..0000000000 --- a/stepmake/bin/table-to-html.py +++ /dev/null @@ -1,149 +0,0 @@ -#!@PYTHON@ - -# table-to-html.py -- convert char-separated table to html table -# -# source file of the GNU LilyPond music typesetter -# -# (c) 1998 Jan Nieuwenhuizen - -version = '0.1' -name = 'table-to-html' - -import os -import sys -import getopt -import string -import time -import re - -format = 'html' - -def program_id (): - return name + ' version ' + version; - -def identify (): - sys.stdout.write (program_id () + '\n') - -def help (): - sys.stdout.write ( -r"""Usage: table-to-html [OPTION]... TABLE-FILE HTML-FILENAME -Generate pretty table from char separated table -Options: - -h, --help print this help - -p, --package=DIR specify package - -s, --separator=SEP specify separator [:] - -t, --latex do latex output instead -""") - sys.exit (0) - - -def header (html): - html.write ('') - -def footer (html): - html.write ('
') - -def convert_html (lines, outname, cols, separator, linesep): - # ugh - html = open (outname, 'w') - - header (html) - i = 0 - for line in lines: - i = i + 1 - if not len(line): - continue - columns = string.split (line, separator) - html_line = '' + string.join (columns, '') + '' - html_line= re.sub (linesep, ' ', html_line) - html.write (html_line) - - if len (columns) <> cols: - print i - raise 'not enough cols' - - footer (html) - html.close () - - -def convert_tex (lines, outname, cols, separator, linesep): - html = open(outname, 'w') - header = r"""\documentclass{article} -\begin{document} -{\parindent -1pc - \parskip 0pc\parsep 0pc - % COMMENT( from the texbook) - \def\length#1{\count0=0 \getlength#1\end} - \def\getlength#1{\ifx#1\end \let\next=\relax - \else\advance\count0 by1 \let\next=\getlength\fi \next} - \def\inlanguage#1#2{{\length{#2}% - \ifnum\count0=0 - \else - \emph{#1}: #2. - \fi}} - \small - - \def\tableentry#1#2#3#4#5#6#7{\par{\bf #1}: #7 - \inlanguage{Fran\c cais}{#2} - \inlanguage{British}{#4} \inlanguage{Deutsch}{#3} - \inlanguage{Nederlands}{#5}\inlanguage{Italiano}{#6}} -""" - - html.write (header) - i = 0 - for line in lines: - i = i + 1 - if not len(line): - continue - columns = string.split (line, separator) - if len (columns) <> cols: - print i - raise 'not enough cols' - - tex_line = '\\tableentry{' + string.join (columns, '}{') + '}\n' - tex_line = re.sub (linesep, ' ', tex_line) - html.write (tex_line) - - html.write(r"""}\end{document}""") - html.close () - -def convert_texinfo (lines, outname, cols, separator, linesep): - pass - - - -identify () -(options, files) = getopt.getopt ( - sys.argv[1:], 'f:tl:o:h:c:s:', ['columns=', 'help', 'format=', 'output=', 'separator=', 'linesep=']) -latex = 0 -separator = '@' -output = '' -linesep = '\r' -for opt in options: - o = opt[0] - a = opt[1] - if o == '--separator' or o == '-s': - separator = a - elif o== '--help' or o == '-h': - help () - elif o=='--format' or o == '-f': - format = a - elif o == '--output' or o == '-o': - output = a - elif o == '--linesep' or o == '-l': - linesep = a - elif o == '--columns' or o == '-c': - cols = string.atoi(a) - else: - print o - raise getopt.error - -lines = open (files[0]).readlines () - -if format == 'latex': - convert_tex (lines, output, cols, separator, linesep) -elif format == 'html': - convert_html (lines, output, cols, separator, linesep) -elif format == 'texi': - convert_texinfo (lines, output, cols, separator, linesep) - diff --git a/stepmake/bin/tar-docxx.sh b/stepmake/bin/tar-docxx.sh deleted file mode 100644 index c1ba5322f3..0000000000 --- a/stepmake/bin/tar-docxx.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -cwd=`pwd` - -if [ "$1" = "" ]; then - echo usage tar-docxx TARBALL - exit 2 -else - TARBALL=$1 -fi - - -# mail-address -if [ "$MAILADDRESS" != "" ]; then - echo mail address is $MAILADDRESS -else - echo "mail-address:6: warning: \$MAILADDRESS undefined" > /dev/stderr - echo $USER@`hostname` -fi - - -if [ ! -e $TARBALL ]; then - echo $TARBALL does not exist - exit 2 -fi - -TARBALLBASE=`basename $TARBALL` - -TAROUTDIR=/tmp/tar-docxx -rm -rf $TAROUTDIR -mkdir -p $TAROUTDIR -echo untarring ... -tar -C $TAROUTDIR -zxf $TARBALL '*.hh' '*.h' - -cd $TAROUTDIR -DATE=`date` - -cat << EOF > banner.html - This program documentation comes from $TARBALLBASE. It was generated by - $USERNAME <$MAILADDRESS> on $DATE -EOF - -mkdir docxx; -echo doc++ ... -doc++ -pSf -B banner.html -d docxx `find -type f` -echo tarring ... -tar -czf $cwd/progdocs.tar.gz docxx/ - -rm -rf $TAROUTDIR diff --git a/stepmake/bin/zet-step.sh b/stepmake/bin/zet-step.sh deleted file mode 100755 index b45e937d3d..0000000000 --- a/stepmake/bin/zet-step.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# zet-step.sh --- configure StepMake sourcetree -# nice in first character unique name -# -export PACKAGE_NAME=StepMake -prefix=$HOME/usr -# -# -. ./stepmake/bin/package-zet.sh -# -# The package root dir looks like this: -# -# -# -# ln -sf $STEPMAKEL_SOURCEDIR/src/stepmake/out/step $prefix/bin/step - -./configure --prefix=$prefix -