From 12e2badcb781322c0449e69dc820efe961fe26ce Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 26 Mar 2007 00:48:35 -0300 Subject: [PATCH] Fix #51. - Add Note_column::dot_column() - In collision resolution, add inner voice stems to outer voice dot columns --- input/regression/dot-up-voice-collision.ly | 18 ++++++++++++++++++ lily/dot-column.cc | 16 +++++++++++++--- lily/include/note-column.hh | 1 + lily/note-collision.cc | 17 +++++++++++++++++ lily/note-column.cc | 14 ++++++++++++++ 5 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 input/regression/dot-up-voice-collision.ly diff --git a/input/regression/dot-up-voice-collision.ly b/input/regression/dot-up-voice-collision.ly new file mode 100644 index 0000000000..20092328c4 --- /dev/null +++ b/input/regression/dot-up-voice-collision.ly @@ -0,0 +1,18 @@ +\header { + + texidoc = "in collisions, the stems of outer voice are added to the + dot support of the inner voices." + +} + +\version "2.11.21" + +\layout { ragged-right = ##t } + +\new Staff { + \key e \major \time 3/4 + \relative c'' { + << { dis4. } \\ + { fis,4 } \\ { b4 } >> + } +} diff --git a/lily/dot-column.cc b/lily/dot-column.cc index 133f88ad3c..36c9513797 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -83,21 +83,31 @@ Dot_column::calc_positioning_done (SCM smob) Rest collisions should wait after line breaking. */ + Interval y; if (Rest::has_interface (s)) { base_x.unite (s->extent (commonx, X_AXIS)); continue; } + else if (Stem::has_interface (s)) + { + Real y1 = Stem::head_positions (s)[-get_grob_direction (s)]; + Real y2 = y1 + get_grob_direction (s) * 7; + + y.add_point (y1); + y.add_point (y2); + } + else + y = s->extent (s, Y_AXIS); - Interval y = s->extent (s, Y_AXIS); y *= 2 / ss; y += Staff_symbol_referencer::get_position (s); Box b (s->extent (commonx, X_AXIS), y); boxes.push_back (b); - if (Grob *s = unsmob_grob (s->get_object ("stem"))) - stems.insert (s); + if (Grob *stem = unsmob_grob (s->get_object ("stem"))) + stems.insert (stem); } for (set::const_iterator i(stems.begin()); diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh index 60c2668890..429b83af3e 100644 --- a/lily/include/note-column.hh +++ b/lily/include/note-column.hh @@ -34,6 +34,7 @@ public: static void set_dotcol (Grob *me, Grob *); static void add_head (Grob *me, Grob *); static bool has_rests (Grob *me); + static Grob *dot_column (Grob *me); DECLARE_GROB_INTERFACE(); static Item *get_stem (Grob *); diff --git a/lily/note-collision.cc b/lily/note-collision.cc index be69b231f2..6feb71c863 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -507,6 +507,23 @@ Note_collision_interface::automatic_shift (Grob *me, } while ((flip (&d)) != UP); + + /* + see input/regression/dot-up-voice-collision.ly + */ + for (vsize i = 0; i < clash_groups[UP].size (); i++) + { + Grob *g = clash_groups[UP][i]; + Grob *dc = Note_column::dot_column (g); + + if (dc) + for (vsize j = i + 1; j < clash_groups[UP].size (); j++) + { + Grob *stem = Note_column::get_stem (clash_groups[UP][j]); + Side_position_interface::add_support (dc, stem); + } + } + /* Check if chords are meshing */ diff --git a/lily/note-column.cc b/lily/note-column.cc index 380182f856..3f57d3e63c 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -181,6 +181,20 @@ Note_column::accidentals (Grob *me) return acc; } +Grob * +Note_column::dot_column (Grob *me) +{ + extract_grob_set (me, "note-heads", heads); + for (vsize i = 0; i < heads.size (); i++) + { + Grob *dots = unsmob_grob (heads[i]->get_object ("dot")); + if (dots) + return dots->get_parent (X_AXIS); + } + + return 0; +} + Grob * Note_column::arpeggio (Grob *me) { -- 2.39.2