From 15c06fa1814fa41b2c7a4a60d6d06cd6b90c4a5d Mon Sep 17 00:00:00 2001 From: Antoine Roy-Gobeil Date: Tue, 22 Oct 2019 13:11:53 -0400 Subject: [PATCH] image: handle missing pixels in z --- src/traces/image/hover.js | 3 +++ src/traces/image/plot.js | 2 +- test/image/baselines/image_with_gaps.png | Bin 0 -> 11951 bytes test/image/mocks/image_with_gaps.json | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 test/image/baselines/image_with_gaps.png create mode 100644 test/image/mocks/image_with_gaps.json diff --git a/src/traces/image/hover.js b/src/traces/image/hover.js index abf3380bdac..9996dc0c598 100644 --- a/src/traces/image/hover.js +++ b/src/traces/image/hover.js @@ -28,6 +28,9 @@ module.exports = function hoverPoints(pointData, xval, yval) { var nx = Math.floor((xval - cd0.x0) / trace.dx); var ny = Math.floor(Math.abs(yval - cd0.y0) / trace.dy); + // return early if pixel is undefined + if(!cd0.z[ny][nx]) return; + var hoverinfo = cd0.hi || trace.hoverinfo; var fmtColor; if(hoverinfo) { diff --git a/src/traces/image/plot.js b/src/traces/image/plot.js index 170d8366859..632e4b927e6 100644 --- a/src/traces/image/plot.js +++ b/src/traces/image/plot.js @@ -120,7 +120,7 @@ module.exports.plot = function(gd, plotinfo, cdimage, imageLayer) { for(var i = 0; i < cd0.w; i++) { if(ipx(i + 1) === ipx(i)) continue; for(var j = 0; j < cd0.h; j++) { - if(jpx(j + 1) === jpx(j)) continue; + if(jpx(j + 1) === jpx(j) || !z[j][i]) continue; c = trace._scaler(z[j][i]); context.fillStyle = trace.colormodel + '(' + fmt(c).join(',') + ')'; context.fillRect(ipx(i), jpx(j), ipx(i + 1) - ipx(i), jpx(j + 1) - jpx(j)); diff --git a/test/image/baselines/image_with_gaps.png b/test/image/baselines/image_with_gaps.png new file mode 100644 index 0000000000000000000000000000000000000000..658bf22470df4bdf2484cd4d16f82989d1ce9558 GIT binary patch literal 11951 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/image_with_gaps.json b/test/image/mocks/image_with_gaps.json new file mode 100644 index 00000000000..cd9e9950a1c --- /dev/null +++ b/test/image/mocks/image_with_gaps.json @@ -0,0 +1,14 @@ +{ + "data": [{ + "type": "image", + "z": [ + [[1, 0, 0], [0, 1, 0], [0, 0, 1]], + [[1, 0, 0], [0, 1, 0]], + [[1, 0, 0]] + ], + "zmax": [1, 1, 1] + }], + "layout": { + "width": 400, "height": 400, "title": {"text": "Image with missing pixels"} + } +}