From bb895b6dec470dd8f15f1cd763e67e31a74fcae9 Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Mar 2002 22:47:06 +0000 Subject: [PATCH] lilypond-1.3.34 --- input/bugs/hara-clef.ly | 10 ++++ input/test/bar-break.ly | 23 ++++++++++ input/test/bb.ly | 23 ++++++++++ lily/align-element.cc | 58 ++++++++++++++++-------- lily/axis-group-element.cc | 37 ++++++++------- lily/break-align-item.cc | 2 +- lily/clef-item.cc | 6 +-- lily/cross-staff.cc | 9 ++-- lily/dimension-cache.cc | 10 ++-- lily/include/align-element.hh | 16 ++----- lily/include/axis-group-element.hh | 8 +--- lily/include/dimension-cache-callback.hh | 18 ++++++++ lily/include/dimension-cache.hh | 8 ++-- lily/include/lily-proto.hh | 1 + lily/score-element.cc | 45 ++++++++++-------- lily/side-position-interface.cc | 14 ++---- lily/vertical-align-engraver.cc | 23 +++++----- ly/engraver.ly | 3 +- ly/params.ly | 1 + scm/lily.scm | 1 + scripts/mudela-book.py | 4 ++ 21 files changed, 208 insertions(+), 112 deletions(-) create mode 100644 input/bugs/hara-clef.ly create mode 100644 input/test/bar-break.ly create mode 100644 input/test/bb.ly create mode 100644 lily/include/dimension-cache-callback.hh diff --git a/input/bugs/hara-clef.ly b/input/bugs/hara-clef.ly new file mode 100644 index 0000000000..639ebaa150 --- /dev/null +++ b/input/bugs/hara-clef.ly @@ -0,0 +1,10 @@ + +\score { +\notes < \context Staff { \clef "G^8"; s1 s1 s1 } + \context Staff = CC { c1 c c } > + +\paper { +\translator { + \HaraKiriStaffContext +}} +} diff --git a/input/test/bar-break.ly b/input/test/bar-break.ly new file mode 100644 index 0000000000..d45a9ddf01 --- /dev/null +++ b/input/test/bar-break.ly @@ -0,0 +1,23 @@ +\score +{ + \context StaffGroup = a < + \context PianoStaff = b < + \context Staff = "c" \notes\relative c'' { b1 \break b } + \context Staff = "d" \notes\relative c'' { b1 \break b } + > + > + + \paper { + indent=100.0\mm; + linewidth=150.0\mm; + \translator + { + \StaffContext + \consists "Staff_margin_engraver"; + numberOfStaffLines = #1 + marginScriptPadding = #10 % urg: this is in PT + instrument = #"Foo" + instr = #"Foo" + } + } +} diff --git a/input/test/bb.ly b/input/test/bb.ly new file mode 100644 index 0000000000..0c01477ada --- /dev/null +++ b/input/test/bb.ly @@ -0,0 +1,23 @@ +\score +{ + \context StaffGroup = a < + \context PianoStaff = b < + \context Staff = "c" \notes\relative c'' { b1 \break b } + \context Staff = "d" \notes\relative c'' { b1 \break b } + > + > + + \paper { + indent=100.0\mm; + linewidth=150.0\mm; + \translator + { + \StaffContext + \consists "Staff_margin_engraver"; + numberOfStaffLines = #1 + marginScriptPadding = #30 % urg: this is in PT + instrument = #"Foo" + instr = #"Bar" + } + } +} diff --git a/lily/align-element.cc b/lily/align-element.cc index c75902783b..d892e73316 100644 --- a/lily/align-element.cc +++ b/lily/align-element.cc @@ -13,23 +13,39 @@ #include "hash-table-iter.hh" #include "dimension-cache.hh" -void -Align_element::after_line_breaking() +/* + This callback is set in the children of the align element. It does + not compute anything, but a side effect of a->do_side_processing () + is that the elements are placed correctly. */ +Real +Align_element::alignment_callback (Dimension_cache const *c) { - if (axis () == Y_AXIS) - do_side_processing (); + Axis ax = c->axis (); + Score_element * sc = c->element_l ()->parent_l (ax); + Align_element * a = dynamic_cast (sc); + if (a && a->get_elt_property ("alignment-done") == SCM_UNDEFINED) + { + a->do_side_processing (ax); + } + return 0.0; } void -Align_element::before_line_breaking () +Align_element::add_element (Score_element* s) { - if (axis () == X_AXIS) - do_side_processing (); + s->add_offset_callback (alignment_callback, axis ()); + Axis_group_element::add_element (s); } +/* + Hairy function to put elements where they should be. Can be tweaked + from the outside by setting minimum-space and extra-space in its + children */ void -Align_element::do_side_processing () +Align_element::do_side_processing (Axis a) { + set_elt_property ("alignment-done", SCM_BOOL_T); + SCM d = get_elt_property ("stacking-dir"); Direction stacking_dir = gh_number_p(d) ? to_dir (d) : CENTER; if (!stacking_dir) @@ -42,7 +58,7 @@ Align_element::do_side_processing () Link_array all_elts (elem_l_arr ()); for (int i=0; i < all_elts.size(); i++) { - Interval y = all_elts[i]->extent(axis ()) + all_elts[i]->relative_coordinate (this, axis ()); + Interval y = all_elts[i]->extent(a) + all_elts[i]->relative_coordinate (this, a); if (!y.empty_b()) { Score_element *e =dynamic_cast(all_elts[i]); @@ -71,6 +87,15 @@ Align_element::do_side_processing () } } + + Interval threshold = Interval (0, Interval::infinity ()); + SCM thr = get_elt_property ("threshold"); + if (gh_pair_p (thr)) + { + threshold[SMALLER] = gh_scm2double (gh_car (thr)); + threshold[BIGGER] = gh_scm2double (gh_cdr (thr)); + } + Real where_f=0; for (int i=0 ; i < elems.size(); i++) { @@ -80,20 +105,15 @@ Align_element::do_side_processing () if (i) { - dy = (dy >? threshold_interval_[SMALLER] ) - ? threshold[SMALLER] ) + translate_axis (where_f, axis ()); + elems[i]->translate_axis (where_f, a); } } -Align_element::Align_element() -{ - threshold_interval_ = Interval (0, Interval::infinity ()); -} int Align_element::get_count (Score_element*s)const @@ -113,13 +133,13 @@ Align_element::get_count (Score_element*s)const Axis Align_element::axis () const { - return axes_[0]; + return Axis (gh_scm2int (gh_car (get_elt_property ("axes")))); } void Align_element::set_axis (Axis a) { - set_axes (a,a); + set_axes (a, a); } diff --git a/lily/axis-group-element.cc b/lily/axis-group-element.cc index 7e2cdacf13..d3235510d4 100644 --- a/lily/axis-group-element.cc +++ b/lily/axis-group-element.cc @@ -10,13 +10,6 @@ #include "dimension-cache.hh" #include "group-interface.hh" -Link_array -Axis_group_element::get_extra_dependencies() const -{ - Link_array e(elem_l_arr ()); - return e; -} - Link_array Axis_group_element::elem_l_arr () const { @@ -44,9 +37,6 @@ Axis_group_element::get_children () Axis_group_element::Axis_group_element() { - axes_[0] = (Axis)-1 ; - axes_[1] = (Axis)-1 ; - set_elt_property ("elements", SCM_EOL); set_elt_property ("transparent", SCM_BOOL_T); } @@ -54,8 +44,13 @@ Axis_group_element::Axis_group_element() void Axis_group_element::set_axes (Axis a1, Axis a2) { - axes_[0] = a1 ; - axes_[1] = a2 ; + SCM ax = gh_cons (gh_int2scm (a1), SCM_EOL); + if (a1 != a2) + ax= gh_cons (gh_int2scm (a2), ax); + + + set_elt_property ("axes", ax); + if (a1 != X_AXIS && a2 != X_AXIS) set_empty (X_AXIS); if (a1 != Y_AXIS && a2 != Y_AXIS) @@ -87,19 +82,29 @@ Axis_group_element::extent_callback (Dimension_cache const *c) } +bool +Axis_group_element::axis_b (Axis a )const +{ + return dim_cache_[a]->extent_callback_l_ == extent_callback; +} + void Axis_group_element::add_element (Score_element *e) { used_b_ =true; e->used_b_ = true; - - for (int i = 0; i < 2; i++) + + for (SCM ax = get_elt_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax)) { - if (!e->parent_l (axes_[i])) - e->set_parent (this, axes_[i]); + Axis a = (Axis) gh_scm2int (gh_car (ax)); + + if (!e->parent_l (a)) + e->set_parent (this, a); } Group_interface gi (this); gi.add_element (e); + + add_dependency (e); } diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc index dfb91c3845..0d67818da9 100644 --- a/lily/break-align-item.cc +++ b/lily/break-align-item.cc @@ -155,5 +155,5 @@ Break_align_item::Break_align_item () set_elt_property ("stacking-dir" , gh_int2scm (RIGHT)); set_axis (X_AXIS); - dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self); + add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); } diff --git a/lily/clef-item.cc b/lily/clef-item.cc index d49534d727..a7c9661293 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -74,9 +74,9 @@ Clef_item::do_add_processing () g->set_parent (this, X_AXIS); g->set_elt_property ("self-alignment-X", gh_int2scm (0)); - g->dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self); - g->dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::centered_on_parent); - + 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->set_elt_property ("direction", octave_dir); add_dependency (g); // just to be sure. diff --git a/lily/cross-staff.cc b/lily/cross-staff.cc index ca44c30e9d..c7855b5836 100644 --- a/lily/cross-staff.cc +++ b/lily/cross-staff.cc @@ -12,11 +12,14 @@ calc_interstaff_dist (Item const *item, Spanner const *span) Align_element * align = dynamic_cast (common); if (align && align->axis() == Y_AXIS) { - if (align->threshold_interval_[MIN] != - align->threshold_interval_[MAX]) + SCM threshold = align->get_elt_property ("threshold"); + if (!gh_pair_p (threshold) + || !scm_equal_p (gh_car (threshold), gh_cdr (threshold))) warning (_ ("minVerticalAlign != maxVerticalAlign: cross staff spanners may be broken")); - interstaff = align->threshold_interval_[MIN]; + interstaff = 0.0; + if (gh_pair_p (threshold)) + interstaff = gh_scm2double (gh_car (threshold)); Score_element const * span_refpoint = span; while (span_refpoint->parent_l (Y_AXIS) != common) diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc index 69ff282b0a..f314dbc24e 100644 --- a/lily/dimension-cache.cc +++ b/lily/dimension-cache.cc @@ -14,7 +14,7 @@ Dimension_cache::Dimension_cache (Dimension_cache const &d) { init(); - callback_l_ = d.callback_l_; + extent_callback_l_ = d.extent_callback_l_; basic_offset_ = d.basic_offset_; extra_offset_ = d.extra_offset_; off_valid_b_ = d.off_valid_b_; @@ -30,7 +30,7 @@ Dimension_cache::Dimension_cache () void Dimension_cache::init() { - callback_l_ =0; + extent_callback_l_ =0; basic_offset_ =0.0; extra_offset_ =0.0; @@ -113,13 +113,13 @@ Dimension_cache::get_dim () const { Interval r; Dimension_cache *nc = ((Dimension_cache*)this); - if (!callback_l_) + if (!extent_callback_l_) { nc->dim_.set_empty (); } else if (!valid_b_) { - nc->dim_= (*callback_l_ ) (nc); + nc->dim_= (*extent_callback_l_ ) (nc); nc->valid_b_ = true; } @@ -130,7 +130,7 @@ Dimension_cache::get_dim () const void Dimension_cache::set_callback (Dim_cache_callback c) { - callback_l_ =c; + extent_callback_l_ =c; } diff --git a/lily/include/align-element.hh b/lily/include/align-element.hh index 49d4e4bab1..b4fae22642 100644 --- a/lily/include/align-element.hh +++ b/lily/include/align-element.hh @@ -34,24 +34,18 @@ Which side to align? -1: left side, 0: centered (around center_l_ if not nil, or around center of width), 1: right side - ***** - - align-dir: deprecate! Use Side_pos_interface::self_align - */ class Align_element : public virtual Axis_group_element { public: - Interval threshold_interval_ ; - Axis axis () const; - - Align_element (); + void set_axis (Axis); int get_count (Score_element*)const; + void add_element (Score_element *); + static Real alignment_callback (Dimension_cache const *); protected: - virtual void after_line_breaking () ; - virtual void before_line_breaking (); - virtual void do_side_processing (); + virtual void do_side_processing (Axis); + }; #endif // VERTICAL_ALIGN_ITEM_HH diff --git a/lily/include/axis-group-element.hh b/lily/include/axis-group-element.hh index 83acd188b1..75cf8d13d9 100644 --- a/lily/include/axis-group-element.hh +++ b/lily/include/axis-group-element.hh @@ -21,19 +21,13 @@ */ class Axis_group_element : public virtual Score_element { - /// modify fields of E for removal. - void do_remove (Score_element*e); - protected: - virtual Link_array get_extra_dependencies() const; virtual Link_array elem_l_arr() const; static Interval extent_callback (Dimension_cache const*); public: - Axis axes_[2]; - void add_element (Score_element*); - + bool axis_b (Axis) const; Axis_group_element (); void set_axes (Axis,Axis); diff --git a/lily/include/dimension-cache-callback.hh b/lily/include/dimension-cache-callback.hh new file mode 100644 index 0000000000..b12dc1078d --- /dev/null +++ b/lily/include/dimension-cache-callback.hh @@ -0,0 +1,18 @@ +/* + dimension-cache-callback.hh -- declare + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#ifndef DIMENSION_CACHE_CALLBACK_HH +#define DIMENSION_CACHE_CALLBACK_HH + +class Dimension_cache; +typedef Interval (*Dim_cache_callback)(Dimension_cache const *); +typedef Real (*Offset_cache_callback)(Dimension_cache const *); + +#endif /* DIMENSION_CACHE_CALLBACK_HH */ + diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh index 52985161a3..e110041d0b 100644 --- a/lily/include/dimension-cache.hh +++ b/lily/include/dimension-cache.hh @@ -14,10 +14,8 @@ #include "real.hh" #include "lily-proto.hh" #include "parray.hh" +#include "dimension-cache-callback.hh" -class Dimension_cache; -typedef Interval (*Dim_cache_callback)(Dimension_cache const *); -typedef Real (*Offset_cache_callback)(Dimension_cache const *); /** Adminstration of offset dimension info. @@ -38,12 +36,12 @@ class Dimension_cache friend class Score_element; void init (); -public: Array off_callbacks_; /** What to call to find extent. Nil means empty. */ - Dim_cache_callback callback_l_; +public: + Dim_cache_callback extent_callback_l_; static Interval point_dimension_callback (Dimension_cache const* ); Axis axis () const; Real get_offset () const; diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index d5f93d6a06..8309d245a9 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -113,6 +113,7 @@ struct Key_item; struct Key_performer; struct Keyword; struct Keyword_table; +struct Left_edge_item; struct Lily_stream; struct Line_group_engraver; struct Line_of_score; diff --git a/lily/score-element.cc b/lily/score-element.cc index 141d95a22d..a2d31ab4a5 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -202,14 +202,14 @@ Score_element::add_processing() if (get_elt_property ("self-alignment-X") != SCM_UNDEFINED && !dim_cache_[X_AXIS]->off_callback_l_) { - dim_cache_[X_AXIS]->off_callbacks_.push (Side_position_interface::aligned_on_self); + add_offset_callback (Side_position_interface::aligned_on_self,X_AXIS); } if (get_elt_property ("self-alignment-Y") != SCM_UNDEFINED && !dim_cache_[X_AXIS]->off_callback_l_) { - dim_cache_[Y_AXIS]->set_offset_callback (Side_position_interface::aligned_on_self); + add_offset_callback (Side_position_interface::aligned_on_self, Y_AXIS); } #endif @@ -228,16 +228,12 @@ Score_element::calculate_dependencies (int final, int busy, assert (status_i_!= busy); status_i_= busy; - Link_array dependency_arr = - Group_interface__extract_elements (this, (Score_element*)0, "dependencies"); - - for (int i=0; i < dependency_arr.size(); i++) - dependency_arr[i]->calculate_dependencies (final, busy, funcptr); + for (SCM d= get_elt_property ("dependencies"); d != SCM_EOL; d = gh_cdr (d)) + { + unsmob_element (gh_car (d)) + ->calculate_dependencies (final, busy, funcptr); + } - Link_array extra (get_extra_dependencies()); - for (int i=0; i < extra.size(); i++) - extra[i]->calculate_dependencies (final, busy, funcptr); - (this->*funcptr)(); status_i_= final; } @@ -453,13 +449,6 @@ Score_element::handle_prebroken_dependencies() } } -Link_array -Score_element::get_extra_dependencies() const -{ - Link_array empty; - return empty; -} - bool Score_element::linked_b() const { @@ -499,13 +488,13 @@ Score_element::common_refpoint (Score_element const* s, Axis a) const void Score_element::set_empty (Axis a) { - dim_cache_[a]->callback_l_ =0; + dim_cache_[a]->extent_callback_l_ =0; } bool Score_element::empty_b (Axis a)const { - return !dim_cache_[a]->callback_l_; + return !dim_cache_[a]->extent_callback_l_; } Interval @@ -542,6 +531,22 @@ Score_element::name () const return classname (this); } +void +Score_element::add_offset_callback (Offset_cache_callback cb, Axis a) +{ + dim_cache_[a]->off_callbacks_.push (cb); +} + +bool +Score_element::has_offset_callback_b (Offset_cache_callback cb, Axis a)const +{ + for (int i= dim_cache_[a]->off_callbacks_.size (); i--;) + { + if (dim_cache_[a]->off_callbacks_[i] == cb) + return true; + } + return false; +} void Score_element::set_parent (Score_element *g, Axis a) diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index ba8861c502..787a22ac94 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -230,26 +230,22 @@ Side_position_interface::set_axis (Axis a) if (elt_l_->get_elt_property ("side-support") == SCM_UNDEFINED) elt_l_->set_elt_property ("side-support" ,SCM_EOL); - elt_l_->dim_cache_[a]->off_callbacks_.push (aligned_side); + elt_l_->add_offset_callback (aligned_side, a); } void Side_position_interface::set_quantised (Axis a) { - Dimension_cache * c = elt_l_->dim_cache_[a]; - - c->off_callbacks_.push (quantised_position); + elt_l_->add_offset_callback (quantised_position, a); } Axis Side_position_interface::get_axis () const { - 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; + if (elt_l_->has_offset_callback_b (&side_position, X_AXIS) + || elt_l_->has_offset_callback_b (&aligned_side , X_AXIS)) + return X_AXIS; return Y_AXIS; diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 001d79f494..46da337596 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -32,18 +32,17 @@ Vertical_align_engraver::do_creation_processing() void Vertical_align_engraver::do_removal_processing() { - SCM dist (get_property ("maxVerticalAlign")); - if (gh_number_p(dist)) - { - valign_p_->threshold_interval_[BIGGER] = gh_scm2double (dist); - } - - dist = get_property ("minVerticalAlign"); - if (gh_number_p(dist)) - { - valign_p_->threshold_interval_[SMALLER] = gh_scm2double (dist); - } + SCM min = get_property ("maxVerticalAlign"); + 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); + + valign_p_->set_elt_property ("threshold", + gh_cons (min,max)); + } valign_p_->set_bound(RIGHT,get_staff_info().command_pcol_l ()); typeset_element (valign_p_); valign_p_ =0; @@ -57,7 +56,7 @@ Vertical_align_engraver::qualifies_b (Score_element_info i) const Axis_group_element * elt = dynamic_cast (i.elem_l_); - return sz > 1 && elt && elt->axes_[0] == Y_AXIS && !elt->parent_l (Y_AXIS); + return sz > 1 && elt && !elt->parent_l (Y_AXIS) && elt->axis_b (Y_AXIS); } void diff --git a/ly/engraver.ly b/ly/engraver.ly index 93ca721d07..f95e8cdf8d 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -113,7 +113,7 @@ VoiceContext = \translator { \type "Engraver_group_engraver"; \name Voice; - dynamicPadding = #5.0 + dynamicPadding = #2.0 Generic_property_list = #generic-voice-properties \consists "Output_property_engraver"; @@ -329,6 +329,7 @@ ScoreContext = \translator { % \consists "Score_priority_engraver"; \consists "Break_align_engraver"; breakAlignOrder = #'( + "Left_edge_item" "Span_bar" "Breathing_sign" "Clef_item" diff --git a/ly/params.ly b/ly/params.ly index 0f3052930e..c57a1120d5 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -41,6 +41,7 @@ arithmetic_multiplier = 0.9 * \quartwidth ; #'Stem_tremolo::beam-width = 1.5 * \quartwidth ; +#'Left_edge_item::visibility-lambda = #begin-of-line-visible #'Clef_item::visibility-lambda = #begin-of-line-visible #'Key_item::visibility-lambda = #begin-of-line-visible #'Breathing_sign::visibility-lambda = #begin-of-line-invisible diff --git a/scm/lily.scm b/scm/lily.scm index aef1ec55cc..f5965cb7f2 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -100,6 +100,7 @@ ;; (Measured in staff space) (define space-alist '( + (("" "Left_edge_item") . (minimum-space -15.0)) (("" "Clef_item") . (minimum-space 1.0)) (("" "Staff_bar") . (minimum-space 0.0)) (("" "Clef_item") . (minimum-space 1.0)) diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index f84a660505..a78822588d 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -96,6 +96,9 @@ output_dict= { # override EndLilyPondOutput, since @tex is done # in a sandbox, you can't do \input lilyponddefs at the # top of the document. + +# should also support fragment in + 'output-all': r"""@tex \catcode`\@=12 \input lilyponddefs @@ -104,6 +107,7 @@ output_dict= { \catcode`\@=0 @end tex @html +

@end html """, -- 2.39.5