summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-07-23 11:44:15 +0300
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2019-07-23 11:44:15 +0300
commit71230065e58e773eabf425a37fd0c233f18c1b93 (patch)
tree1e90b3dbf0b709955bc57288679b440406dc4455
parent533e2a37e3e69e300d0ce3dd4578c5cb753f984e (diff)
downloadqtlocation-mapboxgl-upstream/alexshalamov_wip_qrf.tar.gz
offset line returns geometrycollectionupstream/alexshalamov_wip_qrf
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp24
1 files changed, 9 insertions, 15 deletions
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp
index 5c56826bd7..54e2faf962 100644
--- a/src/mbgl/renderer/layers/render_line_layer.cpp
+++ b/src/mbgl/renderer/layers/render_line_layer.cpp
@@ -214,16 +214,12 @@ void RenderLineLayer::render(PaintParameters& parameters) {
}
}
-optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const double offset) {
- if (offset == 0) return {};
+GeometryCollection offsetLine(GeometryCollection rings, const double offset) {
+ if (offset == 0 || rings.empty()) return rings;
- GeometryCollection newRings;
- Point<double> zero(0, 0);
- for (const auto& ring : rings) {
- newRings.emplace_back();
- auto& newRing = newRings.back();
-
- for (auto i = ring.begin(); i != ring.end(); i++) {
+ const Point<double> zero(0, 0);
+ for (auto& ring : rings) {
+ for (auto i = ring.begin(); i != ring.end(); ++i) {
auto& p = *i;
Point<double> aToB = i == ring.begin() ?
@@ -237,11 +233,11 @@ optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const d
const double cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;
extrude *= (1.0 / cosHalfAngle);
- newRing.push_back(convertPoint<int16_t>(extrude * offset) + p);
+ ring = {convertPoint<int16_t>(extrude * offset) + p};
}
}
- return newRings;
+ return rings;
}
bool RenderLineLayer::queryIntersectsFeature(
@@ -264,14 +260,12 @@ bool RenderLineLayer::queryIntersectsFeature(
auto offset = evaluated.get<style::LineOffset>()
.evaluate(feature, zoom, style::LineOffset::defaultValue()) * pixelsToTileUnits;
- // Apply offset to geometry
- auto offsetGeometry = offsetLine(feature.getGeometries(), offset);
-
// Test intersection
const float halfWidth = getLineWidth(feature, zoom) / 2.0 * pixelsToTileUnits;
return util::polygonIntersectsBufferedMultiLine(
translatedQueryGeometry.value_or(queryGeometry),
- offsetGeometry.value_or(feature.getGeometries()),
+ // Apply offset to geometry if offset is > 0;
+ offsetLine(feature.getGeometries(), offset),
halfWidth);
}