From 5a8cf17bccba6a03a6059fe122d3fa7b1781ba58 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 27 Jul 2018 15:33:35 -0700 Subject: [PATCH] Don't default-show text/icons that depend on the placement of a paired icon/text. Fixes issue #7032. --- src/symbol/placement.js | 11 ++- .../mapbox-gl-js#7032/expected.png | Bin 0 -> 4852 bytes .../regressions/mapbox-gl-js#7032/style.json | 75 ++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#7032/expected.png create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#7032/style.json diff --git a/src/symbol/placement.js b/src/symbol/placement.js index fc996d57627..ce645c8e45f 100644 --- a/src/symbol/placement.js +++ b/src/symbol/placement.js @@ -366,9 +366,16 @@ export class Placement { const layout = bucket.layers[0].layout; const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); + const textAllowOverlap = layout.get('text-allow-overlap'); + const iconAllowOverlap = layout.get('icon-allow-overlap'); + // If allow-overlap is true, we can show symbols before placement runs on them + // But we have to wait for placement if we potentially depend on a paired icon/text + // with allow-overlap: false. + // See https://github.com/mapbox/mapbox-gl-js/issues/7032 const defaultOpacityState = new JointOpacityState(null, 0, - layout.get('text-allow-overlap'), - layout.get('icon-allow-overlap'), true); + textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), + iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), + true); for (let s = 0; s < bucket.symbolInstances.length; s++) { const symbolInstance = bucket.symbolInstances[s]; diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#7032/expected.png b/test/integration/render-tests/regressions/mapbox-gl-js#7032/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..73a3a03a12457ac4b9ef9af6847fc5d369bca6d0 GIT binary patch literal 4852 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 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#7032/style.json b/test/integration/render-tests/regressions/mapbox-gl-js#7032/style.json new file mode 100644 index 00000000000..e9859c4d43c --- /dev/null +++ b/test/integration/render-tests/regressions/mapbox-gl-js#7032/style.json @@ -0,0 +1,75 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 128, + "width": 128, + "description": "This test renders before the first placement happens, to exercise default opacities. Before fixing #7032, the restaurant icon would incorrectly appear even though its matched text hadn't been placed.", + "fadeDuration": 100, + "operations": [ + ["wait"], + ["wait", 50] + ] + } + }, + "center": [ 0, 0 ], + "zoom": 0, + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Point", + "coordinates": [ 0, 0 ] + } + } + ] + } + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sprite": "local://sprites/sprite", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Needs Placement", + "icon-image": "restaurant-12", + "text-allow-overlap": false, + "icon-allow-overlap": true, + "text-optional": false, + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + } + }, + { + "id": "label", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Shows w/o Placement", + "text-allow-overlap": true, + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + } + } + ] +}