summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-10-08 11:35:52 -0700
committerMolly Lloyd <molly@mapbox.com>2018-10-09 09:42:56 -0700
commitbd3683d32f816a5bb2cf442f2d9d5b5057f62e39 (patch)
treeb356dfa2382fd8e1d08d54a8e6e1c5e8dd82e631
parentd21c126f9def8627c2b33ec1eabde266cb9c42fe (diff)
downloadqtlocation-mapboxgl-bd3683d32f816a5bb2cf442f2d9d5b5057f62e39.tar.gz
[core] fix crash in line-pattern when running tests in debug mode
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp20
-rw-r--r--src/mbgl/renderer/paint_property_binder.hpp2
2 files changed, 12 insertions, 10 deletions
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp
index 2811a1ffdd..e499de8c4e 100644
--- a/src/mbgl/renderer/layers/render_line_layer.cpp
+++ b/src/mbgl/renderer/layers/render_line_layer.cpp
@@ -81,13 +81,11 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) {
}
LineBucket& bucket = *bucket_;
- auto draw = [&] (auto& program, auto&& uniformValues, const optional<ImagePosition>& patternPositionA, const optional<ImagePosition>& patternPositionB) {
+ auto draw = [&] (auto& program, auto&& uniformValues) {
auto& programInstance = program.get(evaluated);
const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID());
- paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade);
-
const auto allUniformValues = programInstance.computeAllUniformValues(
std::move(uniformValues),
paintPropertyBinders,
@@ -135,7 +133,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) {
posA,
posB,
crossfade,
- parameters.lineAtlas.getSize().width), {}, {});
+ parameters.lineAtlas.getSize().width));
} else if (!unevaluated.get<LinePattern>().isUndefined()) {
const auto linePatternValue = evaluated.get<LinePattern>().constantOr(Faded<std::basic_string<char>>{ "", ""});
@@ -146,6 +144,12 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) {
optional<ImagePosition> posA = geometryTile.getPattern(linePatternValue.from);
optional<ImagePosition> posB = geometryTile.getPattern(linePatternValue.to);
+ // if pattern property is constant and patterns aren't available, don't draw
+ if (!linePatternValue.to.empty() && (!posA || !posB)) continue;
+
+ const auto& binders = bucket.paintPropertyBinders.at(getID());
+ binders.setPatternParameters(posA, posB, crossfade);
+
draw(parameters.programs.linePattern,
LinePatternProgram::uniformValues(
@@ -155,9 +159,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) {
parameters.pixelsToGLUnits,
texsize,
crossfade,
- parameters.pixelRatio),
- *posA,
- *posB);
+ parameters.pixelRatio));
} else if (!unevaluated.get<LineGradient>().getValue().isUndefined()) {
if (!colorRampTexture) {
colorRampTexture = parameters.context.createTexture(colorRamp);
@@ -169,14 +171,14 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) {
evaluated,
tile,
parameters.state,
- parameters.pixelsToGLUnits), {}, {});
+ parameters.pixelsToGLUnits));
} else {
draw(parameters.programs.line,
LineProgram::uniformValues(
evaluated,
tile,
parameters.state,
- parameters.pixelsToGLUnits), {}, {});
+ parameters.pixelsToGLUnits));
}
}
}
diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp
index 31abec68a9..3f801d09ff 100644
--- a/src/mbgl/renderer/paint_property_binder.hpp
+++ b/src/mbgl/renderer/paint_property_binder.hpp
@@ -134,7 +134,7 @@ public:
void upload(gl::Context&) override {}
void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, CrossfadeParameters&) override {
- if (!posA && !posB) {
+ if (!posA || !posB) {
return;
} else {
constantPatternPositions = std::tuple<std::array<uint16_t, 4>, std::array<uint16_t, 4>> { posB->tlbr(), posA->tlbr() };