Skip to content

Commit 1529f3b

Browse files
authored
Merge pull request #5386 from plotly/followup-5354
Fix download image and add image test for images with source and fast zsmooth
2 parents cecb4e5 + f83e287 commit 1529f3b

File tree

5 files changed

+77
-8
lines changed

5 files changed

+77
-8
lines changed

src/traces/image/plot.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) {
2626
var plotGroup = d3.select(this);
2727
var cd0 = cd[0];
2828
var trace = cd0.trace;
29-
var fastImage = supportsPixelatedImage && !trace._hasZ && trace._hasSource && xa.type === 'linear' && ya.type === 'linear';
30-
trace._fastImage = fastImage;
29+
var realImage = (
30+
((trace.zsmooth === 'fast') || (trace.zsmooth === false && supportsPixelatedImage)) &&
31+
!trace._hasZ && trace._hasSource && xa.type === 'linear' && ya.type === 'linear'
32+
);
33+
trace._realImage = realImage;
3134

3235
var z = cd0.z;
3336
var x0 = cd0.x0;
@@ -73,7 +76,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) {
7376
}
7477

7578
// Reduce image size when zoomed in to save memory
76-
if(!fastImage) {
79+
if(!realImage) {
7780
var extra = 0.5; // half the axis size
7881
left = Math.max(-extra * xa._length, left);
7982
right = Math.min((1 + extra) * xa._length, right);
@@ -138,7 +141,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) {
138141

139142
var style = (trace.zsmooth === false) ? constants.pixelatedStyle : '';
140143

141-
if(fastImage) {
144+
if(realImage) {
142145
var xRange = Lib.simpleMap(xa.range, xa.r2l);
143146
var yRange = Lib.simpleMap(ya.range, ya.r2l);
144147

@@ -194,7 +197,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) {
194197
canvas = drawMagnifiedPixelsOnCanvas(function(i, j) {return z[j][i];});
195198
href = canvas.toDataURL('image/png');
196199
} else if(trace._hasSource) {
197-
if(fastImage) {
200+
if(realImage) {
198201
href = trace.source;
199202
} else {
200203
var context = trace._canvas.el.getContext('2d');
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
{
2+
"data": [
3+
{
4+
"zsmooth": "fast",
5+
"colormodel": "rgba",
6+
"type": "image",
7+
"source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAlCAYAAAAA7LqSAAADmklEQVR4nO2XUWhTVxjHfyfdmKMN1oelK9QSLUVY2RWHrEKtLw66KQX30Ifpg0qxz31wb8O0UNjL1I3h09iDAy000D0Z0DJhEdslBXN7SwZBJmmbErKwNuU2UXDes4d4r700bib33KflD+Ge8+We78sv3/fdcy401VRTTTXVVFMIvxwnEhG5c97fP+lbLPARZHz8qBwY+AAA0zTp69MA/4B8cTo+flRq2n4MY42dMMFgEICRkZ+Uxw2odgigafudq2majn3nWLV8ATGMNdf44cPfd9lVyxeQwcF3MIw1gsEgY2OLzM9fYmDgPebnLzlQquVLj1y//pFcWan+R1eujLm+KxYTHDr0o/K4b6l2GI2efPnY3eTUqSMUiwmgBQDD+ANNC6sOCSgurUxmVAKUSpfp6tpHLJYiFksBL4AXaFr45Vy9lGUkkxmVhpEll9ukra1q6+raB+D68d3d76oK6ZKSjGQyozIWS5HLbVIujwCQyz0jHL4LVIHsT3f3r0xNfS3/zV8jUlpaNsT6eoS2tq/Q9TnSaZOZmRAzMyFKpcvo+hz5fEE5jGcQOxt2GeXzBQC2t6fY3p5y3bu+HnFsqmE8gdh9AThlZGtr67kzDoU6CIU6nPnGxioXLnzD0NCXLC7+rQTGE4jd3MePJ9H1OQBu3PjW2SO2tp6TTvfQ2dnhWjc9PSvs++2rVyl7aun6XTY2Vl22dLqHw4erp97Ozg6WlnqIRqfFqzVqIMADiL3x7cyGrb1733bGds8ArvK6f/+HRkPXVMNHhWj0pMzlNkkmw46tvT1NofAUTXtfPnnyrKbvgwf3yImJpPIznufSOns2C8Dt22EKhafMzq6KfL7XKpfZ1cStrUEeP/YasbY8Hd6KxS/kvXvfkc3eQdO+Z3j4kTh27BMrELCoVCpYlvUqkBBIKWltrb5cLSz8ojQrnpzZEOHwaYaHHwkAISSVSgWAlpYWDCMZMIxkwLIshBAIoXxTBzyA3Lr1p8xm7zA4+DnnzoUEwNWrnzkpEEKQSi04/peXFwMA5XKZoSGT8+c/tHZ7bVwNgcTjJQfixIl2AXDt2qeWlILe3iKAC8LW0lIicOZMdXzggNrDY90g8XhJPnjwswsCqiVlmn8hhETXf3ut38nJhC9vpXU5fR2ErWy2ws2by//pc2WlXE/YN9Ibg9gQ4fDpmhCgvlx8UTxekvF4qeYjJxLptyYmPq6reS9e7Kt7zf9C/wDLc4opp/2WUgAAAABJRU5ErkJggg=="
8+
},
9+
{
10+
"zsmooth": "fast",
11+
"colormodel": "rgba",
12+
"type": "image",
13+
"xaxis": "x2",
14+
"yaxis": "y2",
15+
"source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAlCAYAAAAA7LqSAAADmklEQVR4nO2XUWhTVxjHfyfdmKMN1oelK9QSLUVY2RWHrEKtLw66KQX30Ifpg0qxz31wb8O0UNjL1I3h09iDAy000D0Z0DJhEdslBXN7SwZBJmmbErKwNuU2UXDes4d4r700bib33KflD+Ge8+We78sv3/fdcy401VRTTTXVVFMIvxwnEhG5c97fP+lbLPARZHz8qBwY+AAA0zTp69MA/4B8cTo+flRq2n4MY42dMMFgEICRkZ+Uxw2odgigafudq2majn3nWLV8ATGMNdf44cPfd9lVyxeQwcF3MIw1gsEgY2OLzM9fYmDgPebnLzlQquVLj1y//pFcWan+R1eujLm+KxYTHDr0o/K4b6l2GI2efPnY3eTUqSMUiwmgBQDD+ANNC6sOCSgurUxmVAKUSpfp6tpHLJYiFksBL4AXaFr45Vy9lGUkkxmVhpEll9ukra1q6+raB+D68d3d76oK6ZKSjGQyozIWS5HLbVIujwCQyz0jHL4LVIHsT3f3r0xNfS3/zV8jUlpaNsT6eoS2tq/Q9TnSaZOZmRAzMyFKpcvo+hz5fEE5jGcQOxt2GeXzBQC2t6fY3p5y3bu+HnFsqmE8gdh9AThlZGtr67kzDoU6CIU6nPnGxioXLnzD0NCXLC7+rQTGE4jd3MePJ9H1OQBu3PjW2SO2tp6TTvfQ2dnhWjc9PSvs++2rVyl7aun6XTY2Vl22dLqHw4erp97Ozg6WlnqIRqfFqzVqIMADiL3x7cyGrb1733bGds8ArvK6f/+HRkPXVMNHhWj0pMzlNkkmw46tvT1NofAUTXtfPnnyrKbvgwf3yImJpPIznufSOns2C8Dt22EKhafMzq6KfL7XKpfZ1cStrUEeP/YasbY8Hd6KxS/kvXvfkc3eQdO+Z3j4kTh27BMrELCoVCpYlvUqkBBIKWltrb5cLSz8ojQrnpzZEOHwaYaHHwkAISSVSgWAlpYWDCMZMIxkwLIshBAIoXxTBzyA3Lr1p8xm7zA4+DnnzoUEwNWrnzkpEEKQSi04/peXFwMA5XKZoSGT8+c/tHZ7bVwNgcTjJQfixIl2AXDt2qeWlILe3iKAC8LW0lIicOZMdXzggNrDY90g8XhJPnjwswsCqiVlmn8hhETXf3ut38nJhC9vpXU5fR2ErWy2ws2by//pc2WlXE/YN9Ibg9gQ4fDpmhCgvlx8UTxekvF4qeYjJxLptyYmPq6reS9e7Kt7zf9C/wDLc4opp/2WUgAAAABJRU5ErkJggg=="
16+
},
17+
{
18+
"zsmooth": "fast",
19+
"colormodel": "rgba",
20+
"type": "image",
21+
"xaxis": "x3",
22+
"yaxis": "y3",
23+
"source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAlCAYAAAAA7LqSAAADmklEQVR4nO2XUWhTVxjHfyfdmKMN1oelK9QSLUVY2RWHrEKtLw66KQX30Ifpg0qxz31wb8O0UNjL1I3h09iDAy000D0Z0DJhEdslBXN7SwZBJmmbErKwNuU2UXDes4d4r700bib33KflD+Ge8+We78sv3/fdcy401VRTTTXVVFMIvxwnEhG5c97fP+lbLPARZHz8qBwY+AAA0zTp69MA/4B8cTo+flRq2n4MY42dMMFgEICRkZ+Uxw2odgigafudq2majn3nWLV8ATGMNdf44cPfd9lVyxeQwcF3MIw1gsEgY2OLzM9fYmDgPebnLzlQquVLj1y//pFcWan+R1eujLm+KxYTHDr0o/K4b6l2GI2efPnY3eTUqSMUiwmgBQDD+ANNC6sOCSgurUxmVAKUSpfp6tpHLJYiFksBL4AXaFr45Vy9lGUkkxmVhpEll9ukra1q6+raB+D68d3d76oK6ZKSjGQyozIWS5HLbVIujwCQyz0jHL4LVIHsT3f3r0xNfS3/zV8jUlpaNsT6eoS2tq/Q9TnSaZOZmRAzMyFKpcvo+hz5fEE5jGcQOxt2GeXzBQC2t6fY3p5y3bu+HnFsqmE8gdh9AThlZGtr67kzDoU6CIU6nPnGxioXLnzD0NCXLC7+rQTGE4jd3MePJ9H1OQBu3PjW2SO2tp6TTvfQ2dnhWjc9PSvs++2rVyl7aun6XTY2Vl22dLqHw4erp97Ozg6WlnqIRqfFqzVqIMADiL3x7cyGrb1733bGds8ArvK6f/+HRkPXVMNHhWj0pMzlNkkmw46tvT1NofAUTXtfPnnyrKbvgwf3yImJpPIznufSOns2C8Dt22EKhafMzq6KfL7XKpfZ1cStrUEeP/YasbY8Hd6KxS/kvXvfkc3eQdO+Z3j4kTh27BMrELCoVCpYlvUqkBBIKWltrb5cLSz8ojQrnpzZEOHwaYaHHwkAISSVSgWAlpYWDCMZMIxkwLIshBAIoXxTBzyA3Lr1p8xm7zA4+DnnzoUEwNWrnzkpEEKQSi04/peXFwMA5XKZoSGT8+c/tHZ7bVwNgcTjJQfixIl2AXDt2qeWlILe3iKAC8LW0lIicOZMdXzggNrDY90g8XhJPnjwswsCqiVlmn8hhETXf3ut38nJhC9vpXU5fR2ErWy2ws2by//pc2WlXE/YN9Ibg9gQ4fDpmhCgvlx8UTxekvF4qeYjJxLptyYmPq6reS9e7Kt7zf9C/wDLc4opp/2WUgAAAABJRU5ErkJggg=="
24+
},
25+
{
26+
"zsmooth": "fast",
27+
"colormodel": "rgba",
28+
"type": "image",
29+
"xaxis": "x4",
30+
"yaxis": "y4",
31+
"source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAlCAYAAAAA7LqSAAADmklEQVR4nO2XUWhTVxjHfyfdmKMN1oelK9QSLUVY2RWHrEKtLw66KQX30Ifpg0qxz31wb8O0UNjL1I3h09iDAy000D0Z0DJhEdslBXN7SwZBJmmbErKwNuU2UXDes4d4r700bib33KflD+Ge8+We78sv3/fdcy401VRTTTXVVFMIvxwnEhG5c97fP+lbLPARZHz8qBwY+AAA0zTp69MA/4B8cTo+flRq2n4MY42dMMFgEICRkZ+Uxw2odgigafudq2majn3nWLV8ATGMNdf44cPfd9lVyxeQwcF3MIw1gsEgY2OLzM9fYmDgPebnLzlQquVLj1y//pFcWan+R1eujLm+KxYTHDr0o/K4b6l2GI2efPnY3eTUqSMUiwmgBQDD+ANNC6sOCSgurUxmVAKUSpfp6tpHLJYiFksBL4AXaFr45Vy9lGUkkxmVhpEll9ukra1q6+raB+D68d3d76oK6ZKSjGQyozIWS5HLbVIujwCQyz0jHL4LVIHsT3f3r0xNfS3/zV8jUlpaNsT6eoS2tq/Q9TnSaZOZmRAzMyFKpcvo+hz5fEE5jGcQOxt2GeXzBQC2t6fY3p5y3bu+HnFsqmE8gdh9AThlZGtr67kzDoU6CIU6nPnGxioXLnzD0NCXLC7+rQTGE4jd3MePJ9H1OQBu3PjW2SO2tp6TTvfQ2dnhWjc9PSvs++2rVyl7aun6XTY2Vl22dLqHw4erp97Ozg6WlnqIRqfFqzVqIMADiL3x7cyGrb1733bGds8ArvK6f/+HRkPXVMNHhWj0pMzlNkkmw46tvT1NofAUTXtfPnnyrKbvgwf3yImJpPIznufSOns2C8Dt22EKhafMzq6KfL7XKpfZ1cStrUEeP/YasbY8Hd6KxS/kvXvfkc3eQdO+Z3j4kTh27BMrELCoVCpYlvUqkBBIKWltrb5cLSz8ojQrnpzZEOHwaYaHHwkAISSVSgWAlpYWDCMZMIxkwLIshBAIoXxTBzyA3Lr1p8xm7zA4+DnnzoUEwNWrnzkpEEKQSi04/peXFwMA5XKZoSGT8+c/tHZ7bVwNgcTjJQfixIl2AXDt2qeWlILe3iKAC8LW0lIicOZMdXzggNrDY90g8XhJPnjwswsCqiVlmn8hhETXf3ut38nJhC9vpXU5fR2ErWy2ws2by//pc2WlXE/YN9Ibg9gQ4fDpmhCgvlx8UTxekvF4qeYjJxLptyYmPq6reS9e7Kt7zf9C/wDLc4opp/2WUgAAAABJRU5ErkJggg=="
32+
}
33+
],
34+
"layout": {
35+
"grid": {
36+
"rows": 2,
37+
"columns": 2,
38+
"pattern": "independent"
39+
},
40+
"width": 600,
41+
"height": 600,
42+
"margin": {
43+
"t": 35,
44+
"l": 35,
45+
"b": 35,
46+
"r": 35
47+
},
48+
"xaxis2": {
49+
"autorange": "reversed"
50+
},
51+
"yaxis3": {
52+
"range": [
53+
"8",
54+
"32"
55+
]
56+
},
57+
"yaxis4": {
58+
"autorange": true
59+
},
60+
"xaxis4": {
61+
"autorange": "reversed"
62+
}
63+
}
64+
}

test/jasmine/tests/image_test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ describe('image plot', function() {
410410
var mockCopy = Lib.extendDeep({}, mock);
411411
Plotly.newPlot(gd, mockCopy)
412412
.then(function(gd) {
413-
expect(gd.calcdata[0][0].trace._fastImage).toBeTruthy();
413+
expect(gd.calcdata[0][0].trace._realImage).toBeTruthy();
414414
})
415415
.then(done, done.fail);
416416
});
@@ -424,11 +424,11 @@ describe('image plot', function() {
424424
var mockCopy = Lib.extendDeep({}, mock);
425425
Plotly.newPlot(gd, mockCopy)
426426
.then(function(gd) {
427-
expect(gd.calcdata[0][0].trace._fastImage).toBe(true);
427+
expect(gd.calcdata[0][0].trace._realImage).toBe(true);
428428
return Plotly.relayout(gd, attr[0], attr[1]);
429429
})
430430
.then(function(gd) {
431-
expect(gd.calcdata[0][0].trace._fastImage).toBe(false, 'when ' + attr[0] + ' is ' + attr[1]);
431+
expect(gd.calcdata[0][0].trace._realImage).toBe(false, 'when ' + attr[0] + ' is ' + attr[1]);
432432
})
433433
.then(done, done.fail);
434434
});

test/jasmine/tests/mock_test.js

+2
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ var list = [
655655
'image_non_numeric',
656656
'image_opacity',
657657
'image_source_axis_reverse',
658+
'image_source_axis_reverse_zsmooth',
658659
'image_with_gaps',
659660
'image_with_heatmap',
660661
'image_zmin_zmax',
@@ -1746,6 +1747,7 @@ figs['image_colormodel'] = require('@mocks/image_colormodel');
17461747
figs['image_non_numeric'] = require('@mocks/image_non_numeric');
17471748
figs['image_opacity'] = require('@mocks/image_opacity');
17481749
figs['image_source_axis_reverse'] = require('@mocks/image_source_axis_reverse');
1750+
figs['image_source_axis_reverse_zsmooth'] = require('@mocks/image_source_axis_reverse_zsmooth');
17491751
figs['image_with_gaps'] = require('@mocks/image_with_gaps');
17501752
figs['image_with_heatmap'] = require('@mocks/image_with_heatmap');
17511753
figs['image_zmin_zmax'] = require('@mocks/image_zmin_zmax');

0 commit comments

Comments
 (0)