Fix: IndexMask slice and offset ignores offset

The mask was sliced, but the original mask was used from before the
slicing, causing an unsliced mask to be used with the new offsets.
This caused a crash in the hair styles demo file.
This commit is contained in:
Hans Goudey
2023-05-24 16:22:01 -04:00
parent d049e622bd
commit 6bf3831b2c

View File

@@ -134,20 +134,20 @@ IndexMask IndexMask::slice_and_offset(const int64_t start,
if (std::optional<IndexRange> range = this->to_range()) {
return range->slice(start, size).shift(offset);
}
const IndexMask sliced_mask = this->slice(start, size);
IndexMask sliced_mask = this->slice(start, size);
if (offset == 0) {
return sliced_mask;
}
if (std::optional<IndexRange> range = sliced_mask.to_range()) {
return range->shift(offset);
}
MutableSpan<int64_t> new_segment_offsets = memory.allocate_array<int64_t>(segments_num_);
for (const int64_t i : IndexRange(segments_num_)) {
new_segment_offsets[i] = segment_offsets_[i] + offset;
MutableSpan<int64_t> new_segment_offsets = memory.allocate_array<int64_t>(
sliced_mask.segments_num_);
for (const int64_t i : new_segment_offsets.index_range()) {
new_segment_offsets[i] = sliced_mask.segment_offsets_[i] + offset;
}
IndexMask offset_mask = *this;
offset_mask.segment_offsets_ = new_segment_offsets.data();
return offset_mask;
sliced_mask.segment_offsets_ = new_segment_offsets.data();
return sliced_mask;
}
IndexMask IndexMask::complement(const IndexRange universe, IndexMaskMemory &memory) const