Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 2011 Mike Solomon <mike@apollinemike.com> | 4 Copyright (C) 2011 Mike Solomon <mike@apollinemike.com> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include <algorithm> | 21 #include <algorithm> |
22 | 22 |
23 #include "grob.hh" | 23 #include "grob.hh" |
24 #include "item.hh" | 24 #include "item.hh" |
25 #include "pointer-group-interface.hh" | 25 #include "pointer-group-interface.hh" |
26 #include "pure-from-neighbor-interface.hh" | 26 #include "pure-from-neighbor-interface.hh" |
27 #include "engraver.hh" | 27 #include "engraver.hh" |
28 | 28 |
29 class Pure_from_neighbor_engraver : public Engraver | 29 class Pure_from_neighbor_engraver : public Engraver |
30 { | 30 { |
31 vector<Grob *> items_; | |
32 vector<Grob *> pure_relevants_; | 31 vector<Grob *> pure_relevants_; |
32 vector<Grob *> need_pure_heights_from_neighbors_; | |
33 | 33 |
34 public: | 34 public: |
35 TRANSLATOR_DECLARATIONS (Pure_from_neighbor_engraver); | 35 TRANSLATOR_DECLARATIONS (Pure_from_neighbor_engraver); |
36 protected: | 36 protected: |
37 DECLARE_ACKNOWLEDGER (pure_from_neighbor); | 37 DECLARE_ACKNOWLEDGER (pure_from_neighbor); |
38 DECLARE_ACKNOWLEDGER (item); | 38 DECLARE_ACKNOWLEDGER (item); |
39 void finalize (); | 39 void finalize (); |
40 }; | 40 }; |
41 | 41 |
42 Pure_from_neighbor_engraver::Pure_from_neighbor_engraver () | 42 Pure_from_neighbor_engraver::Pure_from_neighbor_engraver () |
43 { | 43 { |
44 } | 44 } |
45 | 45 |
46 void | 46 void |
47 Pure_from_neighbor_engraver::acknowledge_item (Grob_info i) | 47 Pure_from_neighbor_engraver::acknowledge_item (Grob_info i) |
48 { | 48 { |
49 SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); | 49 SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); |
Keith
2011/11/05 23:11:45
Now, this fills 'items_' with things that pass the
| |
50 if (!Pure_from_neighbor_interface::has_interface (i.item ()) | 50 if (!Pure_from_neighbor_interface::has_interface (i.item ()) |
51 && to_boolean (scm_call_1 (pure_relevant_p, i.item ()->self_scm ()))) | 51 && to_boolean (scm_call_1 (pure_relevant_p, i.item ()->self_scm ()))) |
52 items_.push_back (i.item ()); | 52 pure_relevants_.push_back (i.item ()); |
53 } | 53 } |
54 | |
55 // note that this can get out of hand if there are lots of vertical axis groups. .. | |
56 | 54 |
57 void | 55 void |
58 Pure_from_neighbor_engraver::acknowledge_pure_from_neighbor (Grob_info i) | 56 Pure_from_neighbor_engraver::acknowledge_pure_from_neighbor (Grob_info i) |
59 { | 57 { |
60 pure_relevants_.push_back (i.item ()); | 58 need_pure_heights_from_neighbors_.push_back (i.item ()); |
Keith
2011/11/05 23:11:45
But 'pure_relevants_' is something different from
| |
61 } | 59 } |
62 | 60 |
63 void | 61 void |
64 Pure_from_neighbor_engraver::finalize () | 62 Pure_from_neighbor_engraver::finalize () |
65 { | 63 { |
66 if (!pure_relevants_.size ()) | 64 if (!need_pure_heights_from_neighbors_.size ()) |
67 return; | 65 return; |
68 | 66 |
67 vector_sort (need_pure_heights_from_neighbors_, Grob::less); | |
69 vector_sort (pure_relevants_, Grob::less); | 68 vector_sort (pure_relevants_, Grob::less); |
70 vector_sort (items_, Grob::less); | |
71 | 69 |
72 //first, clump pure_relevants into vectors of grobs that have the same column. | 70 /* |
71 first, clump need_pure_heights_from_neighbors into | |
72 vectors of grobs that have the same column. | |
73 */ | |
73 ·· | 74 ·· |
74 vsize l = 0; | 75 vsize l = 0; |
75 vector<vector<Grob *> > pure_relevants; | 76 vector<vector<Grob *> > need_pure_heights_from_neighbors; |
76 do | 77 do |
77 { | 78 { |
78 vector<Grob *> temp; | 79 vector<Grob *> temp; |
79 temp.push_back (pure_relevants_[l]); | 80 temp.push_back (need_pure_heights_from_neighbors_[l]); |
80 for (; | 81 for (; |
81 (l < pure_relevants_.size () - 1 | 82 (l < need_pure_heights_from_neighbors_.size () - 1 |
82 && (pure_relevants_[l]->spanned_rank_interval ()[LEFT] | 83 && (need_pure_heights_from_neighbors_[l]->spanned_rank_interval ()[L EFT] |
83 == pure_relevants_[l + 1]->spanned_rank_interval ()[LEFT])); | 84 == need_pure_heights_from_neighbors_[l + 1]->spanned_rank_interv al ()[LEFT])); |
84 l++) | 85 l++) |
85 temp.push_back (pure_relevants_[l + 1]); | 86 temp.push_back (need_pure_heights_from_neighbors_[l + 1]); |
86 pure_relevants.push_back (temp); | 87 need_pure_heights_from_neighbors.push_back (temp); |
87 l++; | 88 l++; |
88 } | 89 } |
89 while (l < pure_relevants_.size ()); | 90 while (l < need_pure_heights_from_neighbors_.size ()); |
90 | 91 |
91 /* | 92 /* |
92 then, loop through the items list, adding the items | 93 then, loop through the pure_relevants_ list, adding the items |
93 to the pure grobs on either side. | 94 to the elements of need_pure_heights_from_neighbors_ on either side. |
94 */ | 95 */ |
95 | 96 |
96 int pos[2] = {-1, 0}; | 97 int pos[2] = {-1, 0}; |
97 for (vsize i = 0; i < items_.size (); i++) | 98 for (vsize i = 0; i < pure_relevants_.size (); i++) |
98 { | 99 { |
99 if (pos[1] < (int) pure_relevants.size () | 100 if (pos[1] < (int) need_pure_heights_from_neighbors.size () |
100 && (items_[i]->spanned_rank_interval ()[LEFT] | 101 && (pure_relevants_[i]->spanned_rank_interval ()[LEFT] |
101 > pure_relevants[pos[1]][0]->spanned_rank_interval ()[LEFT])) | 102 > need_pure_heights_from_neighbors[pos[1]][0]->spanned_rank_interv al ()[LEFT])) |
102 { | 103 { |
103 pos[0] = pos[1]; | 104 pos[0] = pos[1]; |
104 pos[1]++; | 105 pos[1]++; |
105 } | 106 } |
106 for (int j = 0; j < 2; j++) | 107 for (int j = 0; j < 2; j++) |
107 if (pos[j] >= 0 && pos[j] < (int) pure_relevants.size ()) | 108 if (pos[j] >= 0 && pos[j] < (int) need_pure_heights_from_neighbors.size ()) |
108 for (vsize k = 0; k < pure_relevants[pos[j]].size (); k++) | 109 for (vsize k = 0; k < need_pure_heights_from_neighbors[pos[j]].size () ; k++) |
109 Pointer_group_interface::add_grob (pure_relevants[pos[j]][k], ly_sym bol2scm ("neighbors"), items_[i]); | 110 Pointer_group_interface::add_grob (need_pure_heights_from_neighbors[ pos[j]][k], ly_symbol2scm ("neighbors"), pure_relevants_[i]); |
110 } | 111 } |
111 | 112 |
113 need_pure_heights_from_neighbors_.clear (); | |
112 pure_relevants_.clear (); | 114 pure_relevants_.clear (); |
113 items_.clear (); | |
114 } | 115 } |
115 | 116 |
116 #include "translator.icc" | 117 #include "translator.icc" |
117 | 118 |
118 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); | 119 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); |
119 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); | 120 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); |
120 ADD_TRANSLATOR (Pure_from_neighbor_engraver, | 121 ADD_TRANSLATOR (Pure_from_neighbor_engraver, |
121 /* doc */ | 122 /* doc */ |
122 "Coordinates items that get their pure heights from their neighb ors.", | 123 "Coordinates items that get their pure heights from their neighb ors.", |
123 | 124 |
124 /* create */ | 125 /* create */ |
125 "", | 126 "", |
126 | 127 |
127 /* read */ | 128 /* read */ |
128 "", | 129 "", |
129 | 130 |
130 /* write */ | 131 /* write */ |
131 "" | 132 "" |
132 ); | 133 ); |
LEFT | RIGHT |