diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-10-29 18:59:07 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-10-31 16:53:07 +0200 |
commit | 384f1a1960c9a21039642afe9bd1df58a93fddfc (patch) | |
tree | cd4a383d82ee78a8bb38f87703a19b61171c5f1d /src/mbgl/renderer | |
parent | 38f536049a8ed8f4bdf7706f4afcbbaf06c974c9 (diff) | |
download | qtlocation-mapboxgl-384f1a1960c9a21039642afe9bd1df58a93fddfc.tar.gz |
[core] Use numeric_limits<>::max() for checking element groups
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/circle_bucket.cpp | 17 | ||||
-rw-r--r-- | src/mbgl/renderer/circle_bucket.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/fill_bucket.cpp | 20 | ||||
-rw-r--r-- | src/mbgl/renderer/fill_bucket.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/line_bucket.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/renderer/line_bucket.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/symbol_bucket.hpp | 4 |
7 files changed, 28 insertions, 29 deletions
diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp index cb6ba7d458..9c1c5a6b44 100644 --- a/src/mbgl/renderer/circle_bucket.cpp +++ b/src/mbgl/renderer/circle_bucket.cpp @@ -31,6 +31,8 @@ bool CircleBucket::hasData() const { } void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { + constexpr const uint16_t vertexLength = 4; + for (auto& circle : geometryCollection) { for(auto & geometry : circle) { auto x = geometry.x; @@ -42,7 +44,7 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { if ((mode != MapMode::Still) && (x < 0 || x >= util::EXTENT || y < 0 || y >= util::EXTENT)) continue; - if (!segments.size() || segments.back().vertexLength + 4 > 65535) { + if (segments.back().vertexLength + vertexLength > std::numeric_limits<uint16_t>::max()) { // Move to a new segments because the old one can't hold the geometry. segments.emplace_back(vertices.size(), triangles.size()); } @@ -62,18 +64,15 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) { vertices.emplace_back(x, y, -1, 1); // 4 auto& segment = segments.back(); + assert(segment.vertexLength <= std::numeric_limits<uint16_t>::max()); uint16_t index = segment.vertexLength; // 1, 2, 3 // 1, 4, 3 - triangles.emplace_back(index, - static_cast<uint16_t>(index + 1), - static_cast<uint16_t>(index + 2)); - triangles.emplace_back(index, - static_cast<uint16_t>(index + 3), - static_cast<uint16_t>(index + 2)); - - segment.vertexLength += 4; + triangles.emplace_back(index, index + 1, index + 2); + triangles.emplace_back(index, index + 3, index + 2); + + segment.vertexLength += vertexLength; segment.primitiveLength += 2; } } diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp index a682d423d6..494e64cc0f 100644 --- a/src/mbgl/renderer/circle_bucket.hpp +++ b/src/mbgl/renderer/circle_bucket.hpp @@ -22,7 +22,7 @@ public: std::vector<CircleVertex> vertices; std::vector<gl::Triangle> triangles; - std::vector<gl::Segment> segments; + std::vector<gl::Segment> segments { { 0, 0 } }; optional<gl::VertexBuffer<CircleVertex>> vertexBuffer; optional<gl::IndexBuffer<gl::Triangle>> indexBuffer; diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index 2c69524c0d..86b3946f64 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -39,7 +39,7 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { for (const auto& ring : polygon) { totalVertices += ring.size(); - if (totalVertices > 65535) + if (totalVertices > std::numeric_limits<uint16_t>::max()) throw GeometryTooLongException(); } @@ -51,21 +51,20 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { if (nVertices == 0) continue; - if (lineSegments.empty() || lineSegments.back().vertexLength + nVertices > 65535) { + if (lineSegments.back().vertexLength + nVertices > std::numeric_limits<uint16_t>::max()) { lineSegments.emplace_back(vertices.size(), lines.size()); } auto& lineSegment = lineSegments.back(); + assert(lineSegment.vertexLength <= std::numeric_limits<uint16_t>::max()); uint16_t lineIndex = lineSegment.vertexLength; vertices.emplace_back(ring[0].x, ring[0].y); - lines.emplace_back(static_cast<uint16_t>(lineIndex + nVertices - 1), - static_cast<uint16_t>(lineIndex)); + lines.emplace_back(lineIndex + nVertices - 1, lineIndex); for (uint32_t i = 1; i < nVertices; i++) { vertices.emplace_back(ring[i].x, ring[i].y); - lines.emplace_back(static_cast<uint16_t>(lineIndex + i - 1), - static_cast<uint16_t>(lineIndex + i)); + lines.emplace_back(lineIndex + i - 1, lineIndex + i); } lineSegment.vertexLength += nVertices; @@ -77,17 +76,18 @@ void FillBucket::addGeometry(const GeometryCollection& geometry) { std::size_t nIndicies = indices.size(); assert(nIndicies % 3 == 0); - if (triangleSegments.empty() || triangleSegments.back().vertexLength + totalVertices > 65535) { + if (triangleSegments.back().vertexLength + totalVertices > std::numeric_limits<uint16_t>::max()) { triangleSegments.emplace_back(startVertices, triangles.size()); } auto& triangleSegment = triangleSegments.back(); + assert(triangleSegment.vertexLength <= std::numeric_limits<uint16_t>::max()); uint16_t triangleIndex = triangleSegment.vertexLength; for (uint32_t i = 0; i < nIndicies; i += 3) { - triangles.emplace_back(static_cast<uint16_t>(triangleIndex + indices[i]), - static_cast<uint16_t>(triangleIndex + indices[i + 1]), - static_cast<uint16_t>(triangleIndex + indices[i + 2])); + triangles.emplace_back(triangleIndex + indices[i], + triangleIndex + indices[i + 1], + triangleIndex + indices[i + 2]); } triangleSegment.vertexLength += totalVertices; diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp index 715b8e2745..58fa916f82 100644 --- a/src/mbgl/renderer/fill_bucket.hpp +++ b/src/mbgl/renderer/fill_bucket.hpp @@ -22,8 +22,8 @@ public: std::vector<FillVertex> vertices; std::vector<gl::Line> lines; std::vector<gl::Triangle> triangles; - std::vector<gl::Segment> lineSegments; - std::vector<gl::Segment> triangleSegments; + std::vector<gl::Segment> lineSegments { { 0, 0 } }; + std::vector<gl::Segment> triangleSegments { { 0, 0 } }; optional<gl::VertexBuffer<FillVertex>> vertexBuffer; optional<gl::IndexBuffer<gl::Line>> lineIndexBuffer; diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index 229b14d489..0298e174a1 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -348,17 +348,17 @@ void LineBucket::addGeometry(const GeometryCoordinates& coordinates) { const std::size_t endVertex = vertices.size(); const std::size_t vertexCount = endVertex - startVertex; - if (segments.empty() || segments.back().vertexLength + vertexCount > 65535) { + if (segments.back().vertexLength + vertexCount > std::numeric_limits<uint16_t>::max()) { + // Move to a new group because the old one can't hold the geometry. segments.emplace_back(startVertex, triangles.size()); } auto& segment = segments.back(); + assert(segment.vertexLength <= std::numeric_limits<uint16_t>::max()); uint16_t index = segment.vertexLength; for (const auto& triangle : triangleStore) { - triangles.emplace_back(static_cast<uint16_t>(index + triangle.a), - static_cast<uint16_t>(index + triangle.b), - static_cast<uint16_t>(index + triangle.c)); + triangles.emplace_back(index + triangle.a, index + triangle.b, index + triangle.c); } segment.vertexLength += vertexCount; diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp index 7b4c5f1b57..3ee142a70b 100644 --- a/src/mbgl/renderer/line_bucket.hpp +++ b/src/mbgl/renderer/line_bucket.hpp @@ -28,7 +28,7 @@ public: std::vector<LineVertex> vertices; std::vector<gl::Triangle> triangles; - std::vector<gl::Segment> segments; + std::vector<gl::Segment> segments { { 0, 0 } }; optional<gl::VertexBuffer<LineVertex>> vertexBuffer; optional<gl::IndexBuffer<gl::Triangle>> indexBuffer; diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index a905e25363..881475e4a9 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -36,7 +36,7 @@ public: struct TextBuffer { std::vector<SymbolVertex> vertices; std::vector<gl::Triangle> triangles; - std::vector<gl::Segment> segments; + std::vector<gl::Segment> segments { { 0, 0 } }; optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer; optional<gl::IndexBuffer<gl::Triangle>> indexBuffer; @@ -45,7 +45,7 @@ public: struct IconBuffer { std::vector<SymbolVertex> vertices; std::vector<gl::Triangle> triangles; - std::vector<gl::Segment> segments; + std::vector<gl::Segment> segments { { 0, 0 } }; optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer; optional<gl::IndexBuffer<gl::Triangle>> indexBuffer; |