diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-10-08 11:35:52 -0700 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-10-09 09:42:56 -0700 |
commit | bd3683d32f816a5bb2cf442f2d9d5b5057f62e39 (patch) | |
tree | b356dfa2382fd8e1d08d54a8e6e1c5e8dd82e631 | |
parent | d21c126f9def8627c2b33ec1eabde266cb9c42fe (diff) | |
download | qtlocation-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.cpp | 20 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_property_binder.hpp | 2 |
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() }; |