Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] Fix iterators in addRegularDash()
Browse files Browse the repository at this point in the history
Fix using of invalid iterators.
  • Loading branch information
pozdnyakov committed Feb 28, 2020
1 parent 55d5b97 commit 01c056f
Showing 1 changed file with 14 additions and 10 deletions.
24 changes: 14 additions & 10 deletions src/mbgl/geometry/line_atlas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,17 @@ void addRoundDash(
const std::vector<DashRange>& ranges, uint32_t yOffset, float stretch, const int n, AlphaImage& image) {
const float halfStretch = stretch * 0.5f;

if (ranges.empty()) return;

for (int y = -n; y <= n; y++) {
int row = yOffset + n + y;
const uint32_t index = image.size.width * row;
uint32_t currIndex = 0;
DashRange range = ranges[currIndex];

for (uint32_t x = 0; x < image.size.width; x++) {
if (x / range.right > 1.0f) {
range = ranges[++currIndex];
for (uint32_t x = 0; x < image.size.width; ++x) {
if (x / range.right > 1.0f && ++currIndex < ranges.size()) {
range = ranges[currIndex];
}

float distLeft = fabsf(x - range.left);
Expand All @@ -84,22 +86,24 @@ void addRegularDash(std::vector<DashRange>& ranges, uint32_t yOffset, AlphaImage
// Collapse any zero-length range
for (auto it = ranges.begin(); it != ranges.end();) {
if (it->isZeroLength) {
ranges.erase(it);
it = ranges.erase(it);
} else {
++it;
}
}

if (ranges.size() >= 2) {
if (ranges.empty()) return;

if (ranges.size() > 1) {
// Collapse neighbouring same-type parts into a single part
for (auto curr = ranges.begin(), next = ranges.begin() + 1; curr != ranges.end() && next != ranges.end();) {
for (auto curr = ranges.begin(), next = ranges.begin() + 1; next != ranges.end();) {
if (next->isDash == curr->isDash) {
next->left = curr->left;
ranges.erase(curr);
curr = ranges.erase(curr);
} else {
++curr;
++next;
}
next = curr + 1;
}
}

Expand All @@ -115,8 +119,8 @@ void addRegularDash(std::vector<DashRange>& ranges, uint32_t yOffset, AlphaImage
DashRange range = ranges[currIndex];

for (uint32_t x = 0; x < image.size.width; ++x) {
if (x / range.right > 1.0f) {
range = ranges[++currIndex];
if (x / range.right > 1.0f && ++currIndex < ranges.size()) {
range = ranges[currIndex];
}

float distLeft = fabsf(x - range.left);
Expand Down

0 comments on commit 01c056f

Please sign in to comment.