X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faccidental-placement.cc;h=bc091cb6afb75e6649112197c8dcaf7ac03c1938;hb=b8f63200f0dde97e6d066e5f1082808e224d9774;hp=ff68bbdf0ae19b79c079bf2ee0bb2514a2c51ee2;hpb=d112160d20aa98f8e8fc9bba9b5e6147d7fa2d89;p=lilypond.git diff --git a/lily/accidental-placement.cc b/lily/accidental-placement.cc index ff68bbdf0a..bc091cb6af 100644 --- a/lily/accidental-placement.cc +++ b/lily/accidental-placement.cc @@ -9,12 +9,12 @@ #include "accidental-placement.hh" +#include "item.hh" #include "rhythmic-head.hh" #include "accidental-interface.hh" #include "music.hh" #include "note-collision.hh" #include "note-column.hh" -#include "pitch.hh" #include "pointer-group-interface.hh" #include "skyline.hh" #include "stream-event.hh" @@ -110,8 +110,8 @@ Accidental_placement::get_relevant_accidental_extent (Grob *me, struct Accidental_placement_entry { - vector left_skyline_; - vector right_skyline_; + Skyline left_skyline_; + Skyline right_skyline_; Interval vertical_extent_; vector extents_; vector grobs_; @@ -302,27 +302,46 @@ Accidental_placement::calc_positioning_done (SCM smob) vector_sort (heads, less ()); uniq (heads); + + vector stems; + for (vsize i = 0; i < heads.size (); i++) + { + if (Grob *s = Rhythmic_head::get_stem (heads[i])) + stems.push_back (s); + } + + vector_sort (stems, less ()); + uniq (stems); + common[Y_AXIS] = common_refpoint_of_array (heads, common[Y_AXIS], Y_AXIS); + common[Y_AXIS] = common_refpoint_of_array (stems, common[Y_AXIS], Y_AXIS); + + for (vsize i = 0; i < heads.size (); i++) + { + if (Grob *s = Rhythmic_head::get_stem (heads[i])) + { + stems.push_back (s); + common[Y_AXIS] = s->common_refpoint (common[Y_AXIS], Y_AXIS); + } + } + + vector_sort (stems, less ()); + uniq (stems); + for (vsize i = apes.size (); i--;) { Accidental_placement_entry *ape = apes[i]; - ape->left_skyline_ = empty_skyline (LEFT); - ape->right_skyline_ = empty_skyline (RIGHT); for (vsize j = apes[i]->grobs_.size (); j--;) { Grob *a = apes[i]->grobs_[j]; - vector boxes = Accidental_interface::accurate_boxes (a, common); ape->extents_.insert (ape->extents_.end (), boxes.begin (), boxes.end ()); - for (vsize j = boxes.size (); j--;) - { - insert_extent_into_skyline (&ape->left_skyline_, boxes[j], Y_AXIS, LEFT); - insert_extent_into_skyline (&ape->right_skyline_, boxes[j], Y_AXIS, RIGHT); - } } + ape->left_skyline_ = Skyline (ape->extents_, 4, Y_AXIS, LEFT); + ape->right_skyline_ = Skyline (ape->extents_, 4, Y_AXIS, RIGHT); } Interval total; @@ -340,40 +359,34 @@ Accidental_placement::calc_positioning_done (SCM smob) Accidental_placement_entry *head_ape = new Accidental_placement_entry; common[X_AXIS] = common_refpoint_of_array (heads, common[X_AXIS], X_AXIS); - vector head_skyline (empty_skyline (LEFT)); - - vector stems; - for (vsize i = 0; i < heads.size (); i++) - if (Grob *s = Rhythmic_head::get_stem (heads[i])) - stems.push_back (s); - vector_sort (stems, less ()); - uniq (stems); - concat (heads, stems); vector head_extents; for (vsize i = heads.size (); i--;) - { - Box b (heads[i]->extent (common[X_AXIS], X_AXIS), - heads[i]->extent (common[Y_AXIS], Y_AXIS)); + head_extents.push_back (Box (heads[i]->extent (common[X_AXIS], X_AXIS), + heads[i]->extent (common[Y_AXIS], Y_AXIS))); - insert_extent_into_skyline (&head_skyline, b, Y_AXIS, LEFT); + for (vsize i = 0; i < stems.size (); i ++) + { + int very_large = INT_MAX; + + head_extents.push_back (Box (stems[i]->extent (common[X_AXIS], X_AXIS), + stems[i]->pure_height (common[Y_AXIS], 0, very_large))); } - head_ape->left_skyline_ = head_skyline; + head_ape->left_skyline_ = Skyline (head_extents, 4, Y_AXIS, LEFT); head_ape->offset_ = 0.0; Real padding = robust_scm2double (me->get_property ("padding"), 0.2); - vector left_skyline = head_ape->left_skyline_; - heighten_skyline (&left_skyline, - -robust_scm2double (me->get_property ("right-padding"), 0)); + Skyline left_skyline = head_ape->left_skyline_; + left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0)) +; /* Add accs entries right-to-left. */ for (vsize i = apes.size (); i-- > 0;) { - Real offset - = -skyline_meshing_distance (apes[i]->right_skyline_, left_skyline); + Real offset = -apes[i]->right_skyline_.distance (left_skyline); if (isinf (offset)) offset = (i < apes.size () - 1) ? apes[i + 1]->offset_ : 0.0; else @@ -381,9 +394,9 @@ Accidental_placement::calc_positioning_done (SCM smob) apes[i]->offset_ = offset; - vector new_left_skyline = apes[i]->left_skyline_; - heighten_skyline (&new_left_skyline, apes[i]->offset_); - merge_skyline (&new_left_skyline, left_skyline, LEFT); + Skyline new_left_skyline = apes[i]->left_skyline_; + new_left_skyline.raise (apes[i]->offset_); + new_left_skyline.merge (left_skyline); left_skyline = new_left_skyline; } @@ -418,7 +431,6 @@ Accidental_placement::calc_positioning_done (SCM smob) } ADD_INTERFACE (Accidental_placement, - "accidental-placement-interface", "Resolve accidental collisions.", /* properties */ @@ -426,4 +438,6 @@ ADD_INTERFACE (Accidental_placement, "left-padding " "padding " "positioning-done " - "right-padding ") + "right-padding " + "script-priority " + )