X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpure-from-neighbor-engraver.cc;h=cea3936161c4c62357250ca9ca664b7a00275bcb;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=506127c50dd25b95e553d589ef27eeaf556e3068;hpb=b64dcb418b66fb57b41067381ada9127a0e7e671;p=lilypond.git diff --git a/lily/pure-from-neighbor-engraver.cc b/lily/pure-from-neighbor-engraver.cc index 506127c50d..cea3936161 100644 --- a/lily/pure-from-neighbor-engraver.cc +++ b/lily/pure-from-neighbor-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ #include "pure-from-neighbor-interface.hh" #include "engraver.hh" +#include "translator.icc" + class Pure_from_neighbor_engraver : public Engraver { vector pure_relevants_; @@ -34,24 +36,34 @@ class Pure_from_neighbor_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Pure_from_neighbor_engraver); protected: - DECLARE_ACKNOWLEDGER (pure_from_neighbor); - DECLARE_ACKNOWLEDGER (item); + void acknowledge_pure_from_neighbor (Grob_info); + void acknowledge_item (Grob_info); void finalize (); }; -Pure_from_neighbor_engraver::Pure_from_neighbor_engraver () +Pure_from_neighbor_engraver::Pure_from_neighbor_engraver (Context *c) + : Engraver (c) { } void Pure_from_neighbor_engraver::acknowledge_item (Grob_info i) { - SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); - if (!Pure_from_neighbor_interface::has_interface (i.item ()) - && to_boolean (scm_call_1 (pure_relevant_p, i.item ()->self_scm ()))) + if (!has_interface (i.item ())) pure_relevants_.push_back (i.item ()); } +bool +in_same_column (Grob *g1, Grob *g2) +{ + return (g1->spanned_rank_interval ()[LEFT] + == g2->spanned_rank_interval ()[LEFT]) + && (g1->spanned_rank_interval ()[RIGHT] + == g2->spanned_rank_interval ()[RIGHT]) + && (g1->spanned_rank_interval ()[LEFT] + == g1->spanned_rank_interval ()[RIGHT]); +} + void Pure_from_neighbor_engraver::acknowledge_pure_from_neighbor (Grob_info i) { @@ -80,8 +92,10 @@ Pure_from_neighbor_engraver::finalize () temp.push_back (need_pure_heights_from_neighbors_[l]); for (; (l < need_pure_heights_from_neighbors_.size () - 1 - && (need_pure_heights_from_neighbors_[l]->spanned_rank_interval ()[LEFT] - == need_pure_heights_from_neighbors_[l + 1]->spanned_rank_interval ()[LEFT])); + && ((need_pure_heights_from_neighbors_[l] + ->spanned_rank_interval ()[LEFT]) + == (need_pure_heights_from_neighbors_[l + 1] + ->spanned_rank_interval ()[LEFT]))); l++) temp.push_back (need_pure_heights_from_neighbors_[l + 1]); need_pure_heights_from_neighbors.push_back (temp); @@ -94,30 +108,42 @@ Pure_from_neighbor_engraver::finalize () to the elements of need_pure_heights_from_neighbors_ on either side. */ - int pos[2] = {-1, 0}; + int pos[2] = { -1, 0}; for (vsize i = 0; i < pure_relevants_.size (); i++) { - if (pos[1] < (int) need_pure_heights_from_neighbors.size () - && (pure_relevants_[i]->spanned_rank_interval ()[LEFT] - > need_pure_heights_from_neighbors[pos[1]][0]->spanned_rank_interval ()[LEFT])) + while (pos[1] < (int) need_pure_heights_from_neighbors.size () + && (pure_relevants_[i]->spanned_rank_interval ()[LEFT] + > (need_pure_heights_from_neighbors[pos[1]][0] + ->spanned_rank_interval ()[LEFT]))) { pos[0] = pos[1]; pos[1]++; } for (int j = 0; j < 2; j++) - if (pos[j] >= 0 && pos[j] < (int) need_pure_heights_from_neighbors.size ()) - for (vsize k = 0; k < need_pure_heights_from_neighbors[pos[j]].size (); k++) - Pointer_group_interface::add_grob (need_pure_heights_from_neighbors[pos[j]][k], ly_symbol2scm ("neighbors"), pure_relevants_[i]); + if (pos[j] >= 0 && pos[j] + < (int) need_pure_heights_from_neighbors.size ()) + for (vsize k = 0; + k < need_pure_heights_from_neighbors[pos[j]].size (); + k++) + if (!in_same_column (need_pure_heights_from_neighbors[pos[j]][k], + pure_relevants_[i])) + Pointer_group_interface::add_grob + (need_pure_heights_from_neighbors[pos[j]][k], + ly_symbol2scm ("neighbors"), + pure_relevants_[i]); } need_pure_heights_from_neighbors_.clear (); pure_relevants_.clear (); } -#include "translator.icc" +void +Pure_from_neighbor_engraver::boot () +{ + ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); + ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); +} -ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); -ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); ADD_TRANSLATOR (Pure_from_neighbor_engraver, /* doc */ "Coordinates items that get their pure heights from their neighbors.",