From 60f464fe4944205d4e7f5a04464aaf93a70b51b0 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 24 Aug 2004 22:36:43 +0000 Subject: [PATCH] * lily/slur-quanting.cc (score_extra_encompass): avoid other slurs too. * input/regression/phrasing-slur-slur-avoid.ly: new file. --- ChangeLog | 5 + input/regression/phrasing-slur-slur-avoid.ly | 13 ++ lily/phrasing-slur-engraver.cc | 153 ++++++++----------- lily/slur-engraver.cc | 1 - lily/slur-quanting.cc | 91 ++++++----- 5 files changed, 133 insertions(+), 130 deletions(-) create mode 100644 input/regression/phrasing-slur-slur-avoid.ly diff --git a/ChangeLog b/ChangeLog index f4d4637064..4420f02f2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2004-08-25 Han-Wen Nienhuys + * lily/slur-quanting.cc (score_extra_encompass): avoid other slurs + too. + + * input/regression/phrasing-slur-slur-avoid.ly: new file. + * lily/ottava-bracket.cc (print): always start from right edge of a broken bound. This fixes ottava-clef.ps diff --git a/input/regression/phrasing-slur-slur-avoid.ly b/input/regression/phrasing-slur-slur-avoid.ly new file mode 100644 index 0000000000..eef536b099 --- /dev/null +++ b/input/regression/phrasing-slur-slur-avoid.ly @@ -0,0 +1,13 @@ + +\version "2.3.8" +\header{ + texidoc="@code{PhrasingSlur}s go over normal slurs." +} + +\paper { raggedright = ##t } + +\relative c''{ + c8 \( (d e f) g ( a b c) + c ( b a g) f ( e d c)\) +} + diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index 176350d561..73fd4b4061 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -4,168 +4,135 @@ (c) 1997--2004 Han-Wen Nienhuys */ +#include "context.hh" +#include "directional-element-interface.hh" +#include "engraver.hh" #include "event.hh" #include "new-slur.hh" -#include "warn.hh" #include "note-column.hh" -#include "context.hh" - -#include "engraver.hh" #include "spanner.hh" +#include "tie.hh" /* - TODO: - - copy from new slur engraver. This code handles nesting (which - doesn't exist for slurs) - + It is possible that a slur starts and ends on the same note. At + least, it is for phrasing slurs: a note can be both beginning and + ending of a phrase. */ + class Phrasing_slur_engraver : public Engraver { - Link_array eventses_; - Link_array new_phrasing_slur_evs_; - Link_array phrasing_slurs_; - Link_array end_phrasing_slurs_; - Moment last_start_; + Drul_array events_; + Music * running_slur_start_; + Link_array slurs_; + Link_array end_slurs_; protected: virtual bool try_music (Music*); virtual void acknowledge_grob (Grob_info); virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); virtual void finalize (); - virtual void process_acknowledged_grobs (); + virtual void process_music (); public: TRANSLATOR_DECLARATIONS (Phrasing_slur_engraver); - }; Phrasing_slur_engraver::Phrasing_slur_engraver () { - last_start_ = Moment (-1); + events_[START] =events_[STOP] = 0; } bool -Phrasing_slur_engraver::try_music (Music *ev) +Phrasing_slur_engraver::try_music (Music *m) { - if (ev->is_mus_type ("phrasing-slur-event")) + if (m->is_mus_type ("phrasing-slur-event")) { /* - Let's not start more than one phrasing slur per moment. + Let's not start more than one slur per moment. */ - - Direction d = to_dir (ev->get_property ("span-direction")); - + Direction d = to_dir (m->get_property ("span-direction")); if (d == START) { - if (now_mom () > last_start_) - { - new_phrasing_slur_evs_.push (ev); - last_start_ = now_mom (); - return true; - } + events_[START] = m; + return true; } - else + else if (d == STOP) { - new_phrasing_slur_evs_.push (ev); + if (slurs_.is_empty ()) + return false; + + events_[STOP] = m; return true; } } return false; } + void Phrasing_slur_engraver::acknowledge_grob (Grob_info info) { + Grob *e =info.grob_; if (Note_column::has_interface (info.grob_)) { - Grob *e =info.grob_; - for (int i = 0; i < phrasing_slurs_.size (); i++) - New_slur::add_column (phrasing_slurs_[i], e); - for (int i = 0; i < end_phrasing_slurs_.size (); i++) - New_slur::add_column (end_phrasing_slurs_[i], e); + for (int i = slurs_.size (); i--; ) + New_slur::add_column (slurs_[i], e); + for (int i = end_slurs_.size (); i-- ; ) + New_slur::add_column (end_slurs_[i], e); + } + else + { + /* + TODO: maybe take more objects? + */ + for (int i = slurs_.size (); i--; ) + New_slur::add_extra_encompass (slurs_[i], e); + for (int i = end_slurs_.size (); i--; ) + New_slur::add_extra_encompass (end_slurs_[i], e); } } void Phrasing_slur_engraver::finalize () { - for (int i = 0; i < phrasing_slurs_.size (); i++) - { - /* - Let's not typeset unterminated stuff - */ - phrasing_slurs_[i]->suicide (); - } - phrasing_slurs_.clear (); - - for (int i=0; i < eventses_.size (); i++) - { - eventses_[i]->origin ()->warning (_ ("unterminated phrasing slur")); - } + if (slurs_.size ()) + slurs_[0]->warning (_("unterminated slur")); } void -Phrasing_slur_engraver::process_acknowledged_grobs () +Phrasing_slur_engraver::process_music () { - Link_array start_phrasing_slurs; - for (int i=0; i< new_phrasing_slur_evs_.size (); i++) + if (events_[STOP]) { - Music* phrasing_slur_ev = new_phrasing_slur_evs_[i]; - // end phrasing slur: move the phrasing slur to other array - - Direction d = to_dir (phrasing_slur_ev->get_property ("span-direction")); - - if (d == STOP) - { - if (phrasing_slurs_.is_empty ()) - phrasing_slur_ev->origin ()->warning (_f ("can't find start of phrasing slur")); - else - { - Grob* phrasing_slur = phrasing_slurs_.pop (); - end_phrasing_slurs_.push (phrasing_slur); - eventses_.pop (); - } - } - else if (d == START) - { - // push a new phrasing_slur onto stack. - // (use temp. array to wait for all phrasing_slur STOPs) - Grob* phrasing_slur = make_spanner ("PhrasingSlur", phrasing_slur_ev->self_scm ()); + end_slurs_ = slurs_; + slurs_.clear (); + } + + if (events_[START] && slurs_.is_empty ()) + { + Music *ev = events_[START]; - if (Direction updown = to_dir (phrasing_slur_ev->get_property ("direction"))) - { - phrasing_slur->set_property ("direction", scm_int2num (updown)); - } + Grob * slur = make_spanner ("Slur", events_[START]->self_scm ()); + Direction updown = to_dir (ev->get_property ("direction")); + if (updown) + set_grob_direction (slur, updown); - start_phrasing_slurs.push (phrasing_slur); - eventses_.push (phrasing_slur_ev); - } + slurs_.push (slur); } - for (int i=0; i < start_phrasing_slurs.size (); i++) - phrasing_slurs_.push (start_phrasing_slurs[i]); - new_phrasing_slur_evs_.clear (); } void Phrasing_slur_engraver::stop_translation_timestep () { - end_phrasing_slurs_.clear (); -} - -void -Phrasing_slur_engraver::start_translation_timestep () -{ - new_phrasing_slur_evs_.clear (); + end_slurs_.clear (); + events_[START] = events_[STOP] = 0; } - ENTER_DESCRIPTION (Phrasing_slur_engraver, /* descr */ "Print phrasing slurs. Similar to @ref{Slur_engraver}", /* creats*/ "PhrasingSlur", /* accepts */ "phrasing-slur-event", -/* acks */ "note-column-interface", +/* acks */ "note-column-interface slur-interface", /* reads */ "", /* write */ ""); diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index bad108894a..b596b952ac 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -6,7 +6,6 @@ #include "event.hh" #include "new-slur.hh" -#include "warn.hh" #include "note-column.hh" #include "context.hh" #include "directional-element-interface.hh" diff --git a/lily/slur-quanting.cc b/lily/slur-quanting.cc index 10c2aa29b8..8c704e084f 100644 --- a/lily/slur-quanting.cc +++ b/lily/slur-quanting.cc @@ -887,53 +887,69 @@ score_extra_encompass (Grob *me, Grob *common[], Array xidxs; Array yexts; Array xexts; - for (int i = 0; i < encompasses.size (); i++) + + for (int i = encompasses.size (); i--; ) { - Grob *g = encompasses [i]; - Interval xe = g->extent (common[X_AXIS], X_AXIS); - Interval ye = g->extent (common[Y_AXIS], Y_AXIS); + if (New_slur::has_interface (encompasses[i])) + { + Grob * small_slur = encompasses[i]; + Bezier b = New_slur::get_curve (small_slur); - Real xp = 0.0; + Offset z = b.curve_point (0.5); + z += Offset (small_slur->relative_coordinate (common[X_AXIS], X_AXIS), + small_slur->relative_coordinate (common[Y_AXIS], Y_AXIS)); - if (Accidental_interface::has_interface (g)) + xexts.push (Interval (z[X_AXIS], z[X_AXIS])); + xidxs.push (0.0); + yexts.push (z[Y_AXIS] + thick * Interval (-0.5, 0.5)); + } + else { - /* Begin copy accidental.cc */ - bool parens = false; - if (to_boolean (g->get_property ("cautionary"))) + Grob *g = encompasses [i]; + Interval xe = g->extent (common[X_AXIS], X_AXIS); + Interval ye = g->extent (common[Y_AXIS], Y_AXIS); + + Real xp = 0.0; + + if (Accidental_interface::has_interface (g)) { - SCM cstyle = g->get_property ("cautionary-style"); - parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses")); - } + /* Begin copy accidental.cc */ + bool parens = false; + if (to_boolean (g->get_property ("cautionary"))) + { + SCM cstyle = g->get_property ("cautionary-style"); + parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses")); + } - SCM accs = g->get_property ("accidentals"); - SCM scm_style = g->get_property ("style"); - if (!ly_c_symbol_p (scm_style) - && !parens - && scm_ilength (accs) == 1) - { - /* End copy accidental.cc */ - switch (ly_scm2int (ly_car (accs))) + SCM accs = g->get_property ("accidentals"); + SCM scm_style = g->get_property ("style"); + if (!ly_c_symbol_p (scm_style) + && !parens + && scm_ilength (accs) == 1) { - case FLAT: - case DOUBLE_FLAT: - xp = LEFT; - break ; - case SHARP: - xp = 0.5 * dir; - break ; - case NATURAL: - xp = -dir; - break; + /* End copy accidental.cc */ + switch (ly_scm2int (ly_car (accs))) + { + case FLAT: + case DOUBLE_FLAT: + xp = LEFT; + break ; + case SHARP: + xp = 0.5 * dir; + break ; + case NATURAL: + xp = -dir; + break; + } } } - } - xidxs.push (xp); - ye.widen (thick * 0.5); - yexts.push (ye); - xexts.push (xe); + xidxs.push (xp); + ye.widen (thick * 0.5); + yexts.push (ye); + xexts.push (xe); + } } - for (int i = 0; i < scores->size (); i++) { Real demerit = 0.0; @@ -1088,6 +1104,9 @@ score_slopes (Grob *me, Grob *common[], #endif (*scores)[i].score_ += demerit; } + + + } -- 2.39.2