- RegionList* rlist = regions_to_read (start, start+cnt);
-
- if (rlist->empty()) {
- delete rlist;
- return cnt;
- }
-
- map<uint32_t,vector<boost::shared_ptr<Region> > > relevant_regions;
- map<uint32_t,vector<boost::shared_ptr<Crossfade> > > relevant_xfades;
- vector<uint32_t> relevant_layers;
-
- for (RegionList::iterator i = rlist->begin(); i != rlist->end(); ++i) {
- if ((*i)->coverage (start, end) != OverlapNone) {
- relevant_regions[(*i)->layer()].push_back (*i);
- relevant_layers.push_back ((*i)->layer());
- }
- }
-
- for (Crossfades::iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
- if ((*i)->coverage (start, end) != OverlapNone) {
- relevant_xfades[(*i)->upper_layer()].push_back (*i);
- }
- }
-
-// RegionSortByLayer layer_cmp;
-// relevant_regions.sort (layer_cmp);
+ /* Find all the regions that are involved in the bit we are reading,
+ and sort them by descending layer and ascending position.
+ */
+ boost::shared_ptr<RegionList> all = regions_touched_locked (start, start + cnt - 1);
+ all->sort (ReadSorter ());