From: fred Date: Tue, 26 Mar 2002 22:44:02 +0000 (+0000) Subject: lilypond-1.3.9 X-Git-Tag: release/1.5.59~1960 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=51e9d01ae7c84cd148ce885ef7d4f3809fb2ad5c;p=lilypond.git lilypond-1.3.9 --- diff --git a/CHANGES b/CHANGES index 04fcd9ab2a..dcf9175885 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,15 @@ +pl 8.hwn2 + - staff-support for Crescendi. + - padding for accidentals. + - cascading offset callbacks + +pl 8.hwn1 + - note-head-side + - naming Staff_sidify -> Side_position_interface + + + +*********** pl7.mb1 - bf: timeSignatureStyle works again diff --git a/Documentation/topdocs/index.tely b/Documentation/topdocs/index.tely index dc1e42e5ff..4f137441ae 100644 --- a/Documentation/topdocs/index.tely +++ b/Documentation/topdocs/index.tely @@ -64,17 +64,6 @@ project. The webpages for the stable version reside at GNU. has the development pages. @end itemize -@ignore -@unnumberedsec NEWS - - -This is what the latest version brings: -@example - -top_of_NEWS - -@end example -@end ignore @unnumberedsec Download @@ -92,7 +81,6 @@ binary RPMs: @uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/} @item Debian binary @uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex} @item Windows NT: @uref{http://home.austin.rr.com/jbr/jeff/lilypond/} @item i386 RPM: @uref{http://linux.umbc.edu/software/lilypond/rpms/} -@item i386 RPM: @uref{ftp://ftp.freshmeat.net/pub/rpms/lilypond/} @item Windows NT: @uref{http://home.austin.rr.com/jbr/jeff/lilypond/} @end itemize diff --git a/TODO b/TODO index a3a4e28c82..48be8ed92c 100644 --- a/TODO +++ b/TODO @@ -9,9 +9,11 @@ Most of the items are marked in the code as well Grep -i for TODO, FIXME and ugh/ugr/urg. .* TODO -. * agressive type-checking for SCM stuff. +. * use hash tabs iso. alist_ for elt property? +. * agressive type-checking for SCM stuff. + . * TODO^2: -. *make a TODO.texi, like http://www.gnu.org/software/guile/ideas.html +. * make a TODO.texi, like http://www.gnu.org/software/guile/ideas.html . * make this file understandable for 3rd parties. . * \accepts -> \acceptedby . * context in embedded SCM errors. @@ -34,7 +36,6 @@ it's some sort of a numerical (truncation/roundoff) problem. John . * fix #'margin-shape; setting indent to 0 with \shape fails . * Fixed size staff/system heights; -. * . * ly2dvi : don't repeat opus if same. . * hara kiri _8 clef. . * junk -M ? @@ -443,13 +444,8 @@ hesitate to ask. . * account for rhythmic position in measure . * etc. -. * Output class, handles : (smallish) -. * help text /(c) notice? -. * version line -. * warning /errors/progress -. * abort on error/warning; exit status -. * quiet/ignore-version options -. * logfile output + +. * logfile output? . * PS . * speed up PS code. diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc index 5899d4474a..b7cf04207a 100644 --- a/lily/dimension-cache.cc +++ b/lily/dimension-cache.cc @@ -18,7 +18,7 @@ Dimension_cache::Dimension_cache (Dimension_cache const &d) basic_offset_ = d.basic_offset_; extra_offset_ = d.extra_offset_; off_valid_b_ = d.off_valid_b_; - off_callback_l_ = d.off_callback_l_; + off_callbacks_ = d.off_callbacks_; } Dimension_cache::Dimension_cache () @@ -40,7 +40,6 @@ Dimension_cache::init() valid_b_ = false; empty_b_ = false; off_valid_b_ = false; - off_callback_l_ =0; } @@ -62,13 +61,13 @@ Dimension_cache::set_offset (Real x) */ - basic_offset_ = x; + extra_offset_ = x; } void Dimension_cache::translate (Real x) { - basic_offset_ += x; + extra_offset_ += x; } Real @@ -100,11 +99,14 @@ Dimension_cache::axis () const Real Dimension_cache::get_offset () const { - if (!off_valid_b_ && off_callback_l_ ) + if (!off_valid_b_) { Dimension_cache *d = (Dimension_cache*) this; + + d->basic_offset_ =0.0; d->off_valid_b_ = true; - d->basic_offset_ = (*off_callback_l_) (d); + for (int i=0; i < off_callbacks_.size (); i++) + d->basic_offset_ += (*off_callbacks_[i]) (d); } return basic_offset_ + extra_offset_; @@ -166,8 +168,4 @@ Dimension_cache::set_callback (Dim_cache_callback c) callback_l_ =c; } -void -Dimension_cache::set_offset_callback (Offset_cache_callback c) -{ - off_callback_l_ =c; -} + diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 101837a9cb..d112945de1 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -113,7 +113,9 @@ Dynamic_engraver::do_process_requests() text_p_->set_elt_property ("style", gh_str02scm ("dynamic")); text_p_->set_elt_property ("script-priority", gh_int2scm (100)); - Staff_sidify (text_p_).set_axis (Y_AXIS); + text_p_->set_elt_property ("staff-support", SCM_BOOL_T); + + Side_position_interface (text_p_).set_axis (Y_AXIS); if (absd->get_direction ()) @@ -134,7 +136,6 @@ Dynamic_engraver::do_process_requests() if (isdir_b (prop) && to_dir (prop)) text_p_->set_elt_property ("direction", prop); - prop = get_property ("dynamicPadding", 0); if (gh_number_p(prop)) { @@ -165,8 +166,10 @@ Dynamic_engraver::do_process_requests() assert (!new_cresc_p); new_cresc_p = new Crescendo; new_cresc_p->grow_dir_ = (span_l->span_type_str_ == "crescendo") ? BIGGER : SMALLER; + new_cresc_p->set_elt_property ("staff-support", SCM_BOOL_T); + - Staff_sidify (new_cresc_p).set_axis (Y_AXIS); + Side_position_interface (new_cresc_p).set_axis (Y_AXIS); announce_element (Score_element_info (new_cresc_p, span_l)); } } @@ -177,6 +180,8 @@ Dynamic_engraver::do_process_requests() if (cresc_p_) { ::warning (_ ("Too many crescendi here")); + + typeset_element (cresc_p_); cresc_p_ = 0; @@ -223,7 +228,6 @@ Dynamic_engraver::typeset_all () if (to_end_cresc_p_) { to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_pcol_l ()); - typeset_element (to_end_cresc_p_); to_end_cresc_p_ =0; @@ -246,13 +250,13 @@ Dynamic_engraver::acknowledge_element (Score_element_info i) ) { if (text_p_) - Staff_sidify (text_p_).add_support (i.elem_l_); + Side_position_interface (text_p_).add_support (i.elem_l_); if (to_end_cresc_p_) - Staff_sidify (to_end_cresc_p_).add_support (i.elem_l_); + Side_position_interface (to_end_cresc_p_).add_support (i.elem_l_); if (cresc_p_) - Staff_sidify(cresc_p_).add_support (i.elem_l_); + Side_position_interface(cresc_p_).add_support (i.elem_l_); } } diff --git a/lily/grace-align-item.cc b/lily/grace-align-item.cc index 3ffb02c42d..ed1989cd9b 100644 --- a/lily/grace-align-item.cc +++ b/lily/grace-align-item.cc @@ -34,12 +34,7 @@ Grace_align_item::do_pre_processing () translate_axis (-0.5* nhw, X_AXIS); // ugh. } -void -Grace_align_item::do_substitute_element_pointer (Score_element*o, Score_element*n) -{ - Axis_align_item::do_substitute_element_pointer (o,n); - Note_head_side::do_substitute_element_pointer( o,n); -} + void Grace_align_item::do_add_processing () { diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh index e63ffc9ee2..fc23932284 100644 --- a/lily/include/dimension-cache.hh +++ b/lily/include/dimension-cache.hh @@ -46,7 +46,7 @@ class Dimension_cache void init (); public: - Offset_cache_callback off_callback_l_; + Array off_callbacks_; Axis axis () const; Real get_offset () const; diff --git a/lily/include/grace-align-item.hh b/lily/include/grace-align-item.hh index e12dbeead2..9780c3f818 100644 --- a/lily/include/grace-align-item.hh +++ b/lily/include/grace-align-item.hh @@ -20,7 +20,6 @@ public: Grace_align_item (); protected: virtual void do_add_processing (); - virtual void do_substitute_element_pointer (Score_element*,Score_element*); virtual void do_pre_processing (); }; #endif /* GRACE_ALIGN_ITEM_HH */ diff --git a/lily/include/local-key-item.hh b/lily/include/local-key-item.hh index 931c984c6e..e10468474a 100644 --- a/lily/include/local-key-item.hh +++ b/lily/include/local-key-item.hh @@ -43,14 +43,13 @@ struct Local_key_cautionary_tuple class Local_key_item : public Note_head_side, public Staff_symbol_referencer { Array accidental_arr_; - Molecule accidental (int,bool) const; + Molecule accidental (int,bool,bool) const; public: int c0_position_i_; Local_key_item (); void add_pitch (Musical_pitch, bool cautionary, bool natural); protected: virtual void do_pre_processing(); - virtual void do_substitute_element_pointer (Score_element*,Score_element*); virtual Molecule* do_brew_molecule_p() const; }; #endif // LOCALKEYITEM_HH diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh index 79a3daca6c..2f770ba431 100644 --- a/lily/include/score-element.hh +++ b/lily/include/score-element.hh @@ -101,7 +101,8 @@ public: #funcptr# is the function to call to update this element. */ void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr); - static SCM handle_broken_smobs (SCM, Line_of_score*); + + static SCM handle_broken_smobs (SCM, SCM criterion); virtual Score_element *find_broken_piece (Line_of_score*) const; protected: diff --git a/lily/include/staff-sym-engraver.hh b/lily/include/staff-sym-engraver.hh index 3c016b07df..18d2efceab 100644 --- a/lily/include/staff-sym-engraver.hh +++ b/lily/include/staff-sym-engraver.hh @@ -7,8 +7,8 @@ */ -#ifndef STAFF_SYM_GRAV_HH -#define STAFF_SYM_GRAV_HH +#ifndef STAFF_SYMBOL_GRAV_HH +#define STAFF_SYMBOL_GRAV_HH #include "engraver.hh" #include "moment.hh" @@ -29,4 +29,4 @@ protected: virtual void do_creation_processing(); }; -#endif // STAFF_SYM_GRAV_HH +#endif // STAFF_SYMBOL_GRAV_HH diff --git a/lily/include/staff-symbol-referencer.hh b/lily/include/staff-symbol-referencer.hh index 2dc8ae8c00..f90fe8c1e3 100644 --- a/lily/include/staff-symbol-referencer.hh +++ b/lily/include/staff-symbol-referencer.hh @@ -1,5 +1,5 @@ /* - staff-sym-referencer.hh -- declare Staff_sym_referencer + staff-sym-referencer.hh -- declare staff_symbol_referencer source file of the GNU LilyPond music typesetter @@ -7,8 +7,8 @@ */ -#ifndef STAFF_SYM_REFERENCER_HH -#define STAFF_SYM_REFERENCER_HH +#ifndef STAFF_SYMBOL_REFERENCER_HH +#define STAFF_SYMBOL_REFERENCER_HH #include "score-element.hh" @@ -19,13 +19,14 @@ */ class Staff_symbol_referencer : public virtual Score_element { - int position_i_; + Real position_f_; + protected: - Staff_symbol * staff_sym_l_; + Staff_symbol * staff_symbol_l_; public: Staff_symbol_referencer (); - void set_position (int); + void set_position (Real); void set_staff_symbol (Staff_symbol*); /** @@ -39,7 +40,8 @@ public: virtual void do_substitute_element_pointer (Score_element*,Score_element*); virtual void do_pre_processing (); virtual Real position_f () const; + }; -#endif /* STAFF_SYM_REFERENCER_HH */ +#endif /* STAFF_SYMBOL_REFERENCER_HH */ diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index 1ff239da0f..a8823c59c9 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -44,9 +44,14 @@ Local_key_item::do_pre_processing() } Molecule -Local_key_item::accidental (int j, bool cautionary) const +Local_key_item::accidental (int j, bool cautionary, bool natural) const { Molecule m (lookup_l ()->afm_find (String ("accidentals-") + to_str (j))); + if (natural) + { + Molecule prefix = 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-(")); @@ -87,7 +92,9 @@ Local_key_item::do_brew_molecule_p() const (c0_position_i_ + p.notename_i_) * note_distance; - Molecule m (accidental (p.accidental_i_, accidental_arr_[i].cautionary_b_)); + Molecule m (accidental (p.accidental_i_, + accidental_arr_[i].cautionary_b_, + accidental_arr_[i].natural_b_)); m.translate_axis (dy, Y_AXIS); octave_mol_p->add_at_edge (X_AXIS, RIGHT, m, 0); @@ -103,18 +110,26 @@ Local_key_item::do_brew_molecule_p() const if (accidental_arr_.size()) { - Box b(Interval (0, 0.6 * note_distance), Interval (0,0)); - Molecule m (lookup_l ()->fill (b)); - output->add_at_edge (X_AXIS, RIGHT, m, 0); + Drul_array pads; + + /* + Use a cons? + */ + pads[RIGHT] = get_elt_property ("right-padding"); + pads[LEFT] = get_elt_property ("left-padding"); + + Direction d = LEFT; + do { + if (!gh_number_p (pads[d])) + continue; + + Box b(Interval (0, gh_scm2double (pads[d]) * note_distance), + Interval (0,0)); + Molecule m (lookup_l ()->fill (b)); + output->add_at_edge (X_AXIS, d, m, 0); + } while ( flip (&d)!= LEFT); } return output; } -void -Local_key_item::do_substitute_element_pointer (Score_element *o, Score_element*n) -{ - Note_head_side::do_substitute_element_pointer (o,n); - Staff_symbol_referencer::do_substitute_element_pointer (o,n); - -} diff --git a/lily/lookup.cc b/lily/lookup.cc index 35bdc323a3..7f98f45965 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -448,18 +448,6 @@ Molecule Lookup::staff_brace (Real y, int staff_size) const { Molecule m; - /* - (define (pianobrace y staffht) - (let* ((step 1.0) - (minht (* 2 staffht)) - (maxht (* 7 minht)) - ) - (string-append - (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))) 0) - (char (max 0 (/ (- (min y (- maxht step)) minht) step)))) - ) - ) - */ Real step = 1.0; int minht = 2 * staff_size; diff --git a/lily/note-head-side.cc b/lily/note-head-side.cc index ea52f53a6d..1406da12a6 100644 --- a/lily/note-head-side.cc +++ b/lily/note-head-side.cc @@ -7,50 +7,26 @@ */ +#include "staff-side.hh" #include "note-head-side.hh" - void Note_head_side::add_support (Item*head_l) { - if (support_l_arr_.find_l(head_l)) - return ; - support_l_arr_.push (head_l); - add_dependency (head_l); + Side_position_interface s (this); + s.add_support (head_l); } -void -Note_head_side::do_pre_processing () -{ - Interval x_int; - for (int i=0; i < support_l_arr_.size(); i++) - { - Graphical_element *common = - common_refpoint (support_l_arr_[i], X_AXIS); - Real x = support_l_arr_[i]->relative_coordinate (common, X_AXIS) - - relative_coordinate (common, X_AXIS); - - x_int.unite (x + support_l_arr_[i]->extent (X_AXIS)); - } - - if (x_int.empty_b ()) - x_int = Interval(0,0); - - translate_axis (-extent(X_AXIS)[-notehead_align_dir_] + x_int[notehead_align_dir_], X_AXIS); -} -void -Note_head_side::do_substitute_element_pointer (Score_element*o,Score_element*n) +Note_head_side::Note_head_side() { - if (Item* o_l = dynamic_cast (o)) - support_l_arr_.substitute (o_l,dynamic_cast (n)); + Side_position_interface s(this); + s.set_axis (X_AXIS); + s.set_direction (LEFT); } -Note_head_side:: Note_head_side() -{ - notehead_align_dir_ = LEFT; -} bool Note_head_side::supported_b ()const { - return support_l_arr_.size (); + Side_position_interface s(this); + return s.supported_b (); } diff --git a/lily/score-element.cc b/lily/score-element.cc index f3f0322ba4..b87027a0c8 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -24,7 +24,7 @@ #include "misc.hh" #include "paper-outputter.hh" #include "dimension-cache.hh" - +#include "staff-side.hh" Interval Score_element::dim_cache_callback (Dimension_cache const*c) @@ -37,30 +37,6 @@ Score_element::dim_cache_callback (Dimension_cache const*c) } - -Real -set_alignment_callback (Dimension_cache const *c) -{ - String s ("self-alignment-"); - Axis ax = c->axis (); - s += (ax == X_AXIS) ? "X" : "Y"; - Score_element *elm = dynamic_cast (c->element_l ()); - SCM align (elm->get_elt_property (s)); - if (isdir_b (align)) - { - Direction d = to_dir (align); - Interval ext(elm->extent (ax)); - if (d) - { - return - ext[d]; - } - return - ext.center (); - } - else - return 0.0; -} - - Score_element::Score_element() { output_p_ =0; @@ -84,6 +60,10 @@ Score_element::Score_element (Score_element const&s) self_scm_ = SCM_EOL; used_b_ = true; original_l_ =(Score_element*) &s; + + /* + should protect because smobify_self () might trigger GC. + */ element_property_alist_ = scm_protect_object (scm_list_copy (s.element_property_alist_)); dependency_arr_ = s.dependency_arr_; output_p_ =0; @@ -231,15 +211,23 @@ Score_element::add_processing() return; status_i_ ++; - if (get_elt_property ("self-alignment-X") != SCM_UNDEFINED) +#if 0 + /* + UGH. UGH. UGH. + */ + if (get_elt_property ("self-alignment-X") != SCM_UNDEFINED + && !dim_cache_[X_AXIS]->off_callback_l_) { - dim_cache_[X_AXIS]->set_offset_callback (set_alignment_callback); + dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::self_alignment); } - if (get_elt_property ("self-alignment-Y") != SCM_UNDEFINED) + if (get_elt_property ("self-alignment-Y") != SCM_UNDEFINED + && !dim_cache_[X_AXIS]->off_callback_l_) + { - dim_cache_[Y_AXIS]->set_offset_callback (set_alignment_callback); + dim_cache_[Y_AXIS]->set_offset_callback (Side_position_interface::self_alignment); } +#endif do_add_processing(); } @@ -263,8 +251,6 @@ Score_element::calculate_dependencies (int final, int busy, for (int i=0; i < extra.size(); i++) extra[i]->calculate_dependencies (final, busy, funcptr); - invalidate_cache (X_AXIS); - invalidate_cache (Y_AXIS); (this->*funcptr)(); status_i_= final; } @@ -376,30 +362,46 @@ Score_element::substitute_dependency (Score_element* old, Score_element* new_l) /** - Do break substitution, and return new value. - */ -SCM -Score_element::handle_broken_smobs (SCM s, Line_of_score * line) + Do break substitution in S, using CRITERION. Return new value. + CRITERION is either a SMOB pointer to the desired line, or a number + representing the break direction. */ +SCM +Score_element::handle_broken_smobs (SCM s, SCM criterion) { if (SMOB_IS_TYPE_B (Score_element, s)) { Score_element *sc = SMOB_TO_TYPE (Score_element, s); - Score_element * br =0; - if (sc->line_l () != line) + + if (gh_number_p (criterion)) { - br = sc->find_broken_piece (line); + Item * i = dynamic_cast (sc); + Direction d = to_dir (criterion); + if (i && i->break_status_dir () != d) + { + Item *br = i->find_broken_piece (d); + return (br) ? br->self_scm_ : SCM_UNDEFINED; + } } + else + { + Score_element * ln = SMOB_TO_TYPE (Score_element, criterion); + Line_of_score * line = dynamic_cast (ln); + Score_element * br =0; + if (sc->line_l () != line) + { + br = sc->find_broken_piece (line); + return (br) ? br->self_scm_ : SCM_UNDEFINED; + } - if (br) - return br->self_scm_; + } } else if (gh_pair_p (s)) { /* UGH! breaks on circular lists. - */ - gh_set_car_x (s, handle_broken_smobs (gh_car (s), line)); - gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), line)); + */ + gh_set_car_x (s, handle_broken_smobs (gh_car (s), criterion)); + gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), criterion)); } return s; } @@ -411,7 +413,8 @@ Score_element::handle_broken_dependencies() if (!line) return; - element_property_alist_ = handle_broken_smobs (element_property_alist_, line); + element_property_alist_ = handle_broken_smobs (element_property_alist_, + line->self_scm_); Link_array new_deps; @@ -438,8 +441,12 @@ Score_element::handle_broken_dependencies() void Score_element::handle_prebroken_dependencies() { - element_property_alist_ - = handle_broken_smobs (element_property_alist_, line_l ()); + if (Item*i =dynamic_cast (this)) + { + element_property_alist_ + = handle_broken_smobs (element_property_alist_, + gh_int2scm (i->break_status_dir ())); + } Link_array old_arr, new_arr; diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index b41f04fe14..a959550a77 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -50,7 +50,7 @@ Script_engraver::do_process_requests() continue; } Script *p =new Script; - Staff_sidify stafy (p); + Side_position_interface stafy (p); list = gh_cdr (list); p->set_elt_property ("molecule", @@ -75,13 +75,14 @@ Script_engraver::do_process_requests() stafy.set_direction (l->get_direction ()); SCM axisprop = get_property ("scriptHorizontal",0); - if (gh_boolean_p (axisprop) && gh_scm2bool (axisprop)) + bool xaxis = gh_boolean_p (axisprop) && gh_scm2bool (axisprop); + if (xaxis) stafy.set_axis (X_AXIS); else stafy.set_axis (Y_AXIS); - if (follow_staff && !gh_boolean_p (axisprop) && gh_scm2bool (axisprop)) - p->set_elt_property ("no-staff-support", SCM_BOOL_T); + if (!follow_staff && ! xaxis) + p->set_elt_property ("staff-support", SCM_BOOL_T); p->set_elt_property ("script-priority", priority); @@ -98,7 +99,7 @@ Script_engraver::acknowledge_element (Score_element_info inf) { for (int i=0; i < script_p_arr_.size(); i++) { - Staff_sidify stafy (script_p_arr_[i]); + Side_position_interface stafy (script_p_arr_[i]); stafy.elt_l_->set_elt_property ("direction-source", s->self_scm_); stafy.add_support (s); } @@ -107,7 +108,7 @@ Script_engraver::acknowledge_element (Score_element_info inf) { for (int i=0; i < script_p_arr_.size(); i++) { - Staff_sidify stafy(script_p_arr_[i]); + Side_position_interface stafy(script_p_arr_[i]); if (!stafy.elt_l_->parent_l (X_AXIS)) { diff --git a/lily/script.cc b/lily/script.cc index 97e60577ea..f523de37bb 100644 --- a/lily/script.cc +++ b/lily/script.cc @@ -7,11 +7,6 @@ */ -/* - - TODO: Quantisation support (staccato dots between stafflines) - -*/ #include "debug.hh" #include "script.hh" #include "lookup.hh" @@ -56,19 +51,10 @@ Script::do_pre_processing () void Script::do_post_processing () { - Direction d = Staff_sidify (this).get_direction (); + Direction d = Side_position_interface (this).get_direction (); Molecule m (get_molecule(d)); - - /* - UGH UGH UGH - */ -#if 0 - if (staff_side_l_->get_elt_property ("no-staff-support") == SCM_UNDEFINED) - translate_axis (- m.dim_[Y_AXIS][Direction (-d)], Y_AXIS); -#endif } - Molecule* Script::do_brew_molecule_p () const { diff --git a/lily/staff-side.cc b/lily/staff-side.cc index 669f8a5ac6..bea519b2dd 100644 --- a/lily/staff-side.cc +++ b/lily/staff-side.cc @@ -14,29 +14,24 @@ #include "dimensions.hh" #include "dimension-cache.hh" -Staff_sidify::Staff_sidify (Score_element *e) +Side_position_interface::Side_position_interface (Score_element *e) { elt_l_ = e; } void -Staff_sidify::add_support (Score_element*e) +Side_position_interface::add_support (Score_element*e) { SCM sup = elt_l_->get_elt_property ("side-support"); elt_l_->set_elt_property ("side-support", gh_cons (e->self_scm_,sup)); } -Real -Staff_sidify::aligned_position (Dimension_cache const *c) -{ - return position_self (c); -} Direction -Staff_sidify::get_direction () const +Side_position_interface::get_direction () const { SCM d = elt_l_->get_elt_property ("direction"); if (isdir_b (d)) @@ -54,7 +49,7 @@ Staff_sidify::get_direction () const { Score_element * e = SMOB_TO_TYPE(Score_element,other_elt); - return relative_dir * Staff_sidify (e).get_direction (); + return relative_dir * Side_position_interface (e).get_direction (); } return DOWN; @@ -64,7 +59,7 @@ Staff_sidify::get_direction () const Callback that does the aligning. */ Real -Staff_sidify::position_self (Dimension_cache const * c) +Side_position_interface::side_position (Dimension_cache const * c) { Score_element * me = dynamic_cast (c->element_l ()); @@ -74,13 +69,18 @@ Staff_sidify::position_self (Dimension_cache const * c) SCM support = me->get_elt_property ("side-support"); for (SCM s = support; s != SCM_EOL; s = gh_cdr (s)) { - assert (SMOB_IS_TYPE_B (Score_element, gh_car (s))); + if (!SMOB_IS_TYPE_B (Score_element, gh_car (s))) + continue; + Score_element * e = SMOB_TO_TYPE(Score_element, gh_car (s)); common = common->common_refpoint (e, axis); } for (SCM s = support; s != SCM_EOL; s = gh_cdr (s)) { + if (!SMOB_IS_TYPE_B (Score_element, gh_car (s))) + continue; + Score_element * e = SMOB_TO_TYPE(Score_element, gh_car (s)); Real coord = e->relative_coordinate (common, axis); @@ -96,7 +96,7 @@ Staff_sidify::position_self (Dimension_cache const * c) Real off = me->parent_l (axis)->relative_coordinate (common, axis); - Direction dir = Staff_sidify (me).get_direction (); + Direction dir = Side_position_interface (me).get_direction (); SCM pad = me->remove_elt_property ("padding"); if (pad != SCM_UNDEFINED) @@ -111,34 +111,121 @@ Staff_sidify::position_self (Dimension_cache const * c) return total_off; } +Real +Side_position_interface::self_alignment (Dimension_cache const *c) +{ + String s ("self-alignment-"); + Axis ax = c->axis (); + s += (ax == X_AXIS) ? "X" : "Y"; + Score_element *elm = dynamic_cast (c->element_l ()); + SCM align (elm->get_elt_property (s)); + if (isdir_b (align)) + { + Direction d = to_dir (align); + Interval ext(elm->extent (ax)); + if (d) + { + return - ext[d]; + } + return - ext.center (); + } + else + return 0.0; +} + + +Real +Side_position_interface::aligned_side (Dimension_cache const *c) +{ + Score_element * me = dynamic_cast (c->element_l ()); + Side_position_interface s(me); + Direction d = s.get_direction (); + Axis ax = c->axis (); + Real o = side_position (c); + + Interval iv = me->extent (ax); + + if (!iv.empty_b ()) + { + o += - iv[-d]; + + SCM pad = me->get_elt_property ("padding"); + if (gh_number_p (pad)) + o += d *gh_scm2double (pad) ; + } + return o; +} + +#if 0 + +/* + need cascading off callbacks for this. + */ +Side_position_interface::quantised_side (Dimension_cache const *c) +{ + Score_element * me = dynamic_cast (c->element_l ()); + Side_position_interface s(me); + Direction d = s.get_direction (); + Axis ax = c->axis (); + Real o = side_position (c); + Staff_symbol_referencer * st = dynamic_cast (me); + + if (st && ax == Y_AXIS) + { + st->translate_axis (o, Y_AXIS); + st->set_position (); + + st->lines_i (); + st->quantise_to_next_line (d); + st->translate_axis (o, -Y_AXIS); + } + + return o; +} +#endif + + + void -Staff_sidify::set_axis (Axis a) +Side_position_interface::set_axis (Axis a) { - if (elt_l_->get_elt_property ("transparent") == SCM_UNDEFINED) + // prop transparent ? + if (elt_l_->get_elt_property ("side-support") == SCM_UNDEFINED) elt_l_->set_elt_property ("side-support" ,SCM_EOL); Axis other = Axis ((a +1)%2); - elt_l_->dim_cache_[a]->set_offset_callback (position_self); - elt_l_->dim_cache_[other]->set_offset_callback (0); + elt_l_->dim_cache_[a]->off_callbacks_.push (aligned_side); } + Axis -Staff_sidify::get_axis () const +Side_position_interface::get_axis () const { - if (elt_l_->dim_cache_[X_AXIS]->off_callback_l_ == position_self) // UGH. - return X_AXIS; - else - return Y_AXIS; + Dimension_cache * c = elt_l_->dim_cache_[X_AXIS]; + for (int i=0 ; i < c->off_callbacks_.size();i ++) + if (c->off_callbacks_[i] == side_position + ||c->off_callbacks_[i] == aligned_side) + return X_AXIS; + + + return Y_AXIS; } void -Staff_sidify::set_direction (Direction d) +Side_position_interface::set_direction (Direction d) { elt_l_->set_elt_property ("direction", gh_int2scm (d)); } bool -Staff_sidify::is_staff_side_b () +Side_position_interface::is_staff_side_b () const { return elt_l_->get_elt_property ("side-support") != SCM_UNDEFINED; } + +bool +Side_position_interface::supported_b () const +{ + SCM s =elt_l_->get_elt_property ("side-support"); + return s != SCM_UNDEFINED && s != SCM_EOL; +} diff --git a/lily/staff-sym-engraver.cc b/lily/staff-sym-engraver.cc index 188cdc48ac..695d109999 100644 --- a/lily/staff-sym-engraver.cc +++ b/lily/staff-sym-engraver.cc @@ -12,6 +12,7 @@ #include "paper-column.hh" #include "staff-symbol-referencer.hh" #include "paper-def.hh" +#include "staff-side.hh" Staff_symbol_engraver::~Staff_symbol_engraver() { @@ -61,6 +62,14 @@ Staff_symbol_engraver::acknowledge_element (Score_element_info s) { st->set_staff_symbol (span_p_); } + + SCM ss =s.elem_l_->remove_elt_property ("staff-support"); + if (gh_boolean_p (ss) && gh_scm2bool (ss)) + { + Side_position_interface si (s.elem_l_); + if (si.is_staff_side_b ()) + si.add_support (span_p_); + } } diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc index 4a0a5b7558..22b29af539 100644 --- a/lily/staff-symbol-referencer.cc +++ b/lily/staff-symbol-referencer.cc @@ -15,43 +15,44 @@ Staff_symbol_referencer::Staff_symbol_referencer () { - staff_sym_l_ =0; - position_i_ =0; + staff_symbol_l_ =0; + position_f_ =0; } void -Staff_symbol_referencer::do_substitute_element_pointer (Score_element *o, Score_element*n) +Staff_symbol_referencer::do_substitute_element_pointer (Score_element *o, + Score_element*n) { - if (staff_sym_l_ == o) + if (staff_symbol_l_ == o) { - staff_sym_l_ = dynamic_cast (n); + staff_symbol_l_ = dynamic_cast (n); } } int Staff_symbol_referencer::lines_i () const { - return (staff_sym_l_) ? staff_sym_l_->no_lines_i_ : 5; + return (staff_symbol_l_) ? staff_symbol_l_->no_lines_i_ : 5; } void Staff_symbol_referencer::set_staff_symbol (Staff_symbol*s) { - staff_sym_l_ =s; + staff_symbol_l_ =s; add_dependency (s); } Staff_symbol* Staff_symbol_referencer::staff_symbol_l () const { - return staff_sym_l_; + return staff_symbol_l_; } Real Staff_symbol_referencer::staff_line_leading_f () const { - if (staff_sym_l_) - return staff_sym_l_->staff_line_leading_f_; + if (staff_symbol_l_) + return staff_symbol_l_->staff_line_leading_f_; else if (pscore_l_ && paper_l ()) paper_l ()->get_var ("interline"); @@ -61,11 +62,11 @@ Staff_symbol_referencer::staff_line_leading_f () const Real Staff_symbol_referencer::position_f () const { - Real p = position_i_; - if (staff_sym_l_ ) + Real p = position_f_; + if (staff_symbol_l_ ) { - Graphical_element * c = common_refpoint (staff_sym_l_, Y_AXIS); - Real y = relative_coordinate (c, Y_AXIS) - staff_sym_l_->relative_coordinate (c, Y_AXIS); + Graphical_element * c = common_refpoint (staff_symbol_l_, Y_AXIS); + Real y = relative_coordinate (c, Y_AXIS) - staff_symbol_l_->relative_coordinate (c, Y_AXIS); p += 2.0 * y / staff_line_leading_f (); } @@ -74,22 +75,26 @@ Staff_symbol_referencer::position_f () const +/* + should use offset callback! + */ void Staff_symbol_referencer::do_pre_processing () { - translate_axis (position_i_ * staff_line_leading_f () /2.0, Y_AXIS); - position_i_ =0; + translate_axis (position_f_ * staff_line_leading_f () /2.0, Y_AXIS); + position_f_ =0; } void -Staff_symbol_referencer::set_position (int p) +Staff_symbol_referencer::set_position (Real p) { Real halfspace = staff_line_leading_f ()* 0.5; translate_axis (- halfspace * position_f (), Y_AXIS); - if (staff_sym_l_) + if (staff_symbol_l_) translate_axis (halfspace * p, Y_AXIS); else - position_i_ = p; + position_f_ = p; } + diff --git a/ly/params.ly b/ly/params.ly index 581520e325..61ac19f2dc 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -306,3 +306,7 @@ Wordwrap =0.0; #'margin-shape = #'() + +% +#'Local_key_item::left-padding = #'0.2 +#'Local_key_item::right-padding = #'0.4