@@ -20,6 +20,8 @@ module.exports = function(gd, plotinfo, cdimage, imageLayer) {
20
20
var cd0 = cd [ 0 ] ;
21
21
var trace = cd0 . trace ;
22
22
23
+ var z = cd0 . z ;
24
+ var tupleLength = trace . colormodel . length ;
23
25
var x = cd0 . x ;
24
26
var y = cd0 . y ;
25
27
var w = cd0 . w ;
@@ -34,16 +36,26 @@ module.exports = function(gd, plotinfo, cdimage, imageLayer) {
34
36
var imageWidth = Math . round ( right - left ) ;
35
37
var imageHeight = Math . round ( top - bottom ) ;
36
38
39
+ // Reduce image size when zoomed in to save memory
40
+ var extra = 0.5 ; // half the axis size
41
+ left = Math . max ( - extra * xa . _length , left ) ;
42
+ right = Math . min ( ( 1 + extra ) * xa . _length , right ) ;
43
+ top = Math . max ( - extra * ya . _length , top ) ;
44
+ bottom = Math . max ( ( 1 + extra ) * ya . _length , bottom ) ;
45
+
46
+ imageWidth = Math . round ( right - left ) ;
47
+ imageHeight = Math . round ( bottom - top ) ;
48
+
37
49
var canvas = document . createElement ( 'canvas' ) ;
38
- var z = cd0 . z ;
39
- canvas . width = cd0 . w ;
40
- canvas . height = cd0 . h ;
50
+ canvas . width = imageWidth ;
51
+ canvas . height = imageHeight ;
41
52
var context = canvas . getContext ( '2d' ) ;
42
- var tupleLength = trace . colormodel . length ;
53
+ var ipx = function ( i ) { return Lib . constrain ( Math . round ( xa . c2p ( x + i * xscale ) - left ) , 0 , imageWidth ) ; } ;
54
+ var jpx = function ( j ) { return Lib . constrain ( Math . round ( ya . c2p ( y - j * yscale ) - top ) , 0 , imageHeight ) ; } ;
43
55
for ( var i = 0 ; i < cd0 . w ; i ++ ) {
44
56
for ( var j = 0 ; j < cd0 . h ; j ++ ) {
45
57
context . fillStyle = trace . colormodel + '(' + z [ j ] [ i ] . slice ( 0 , tupleLength ) . join ( ',' ) + ')' ;
46
- context . fillRect ( i , j , 1 , 1 ) ;
58
+ context . fillRect ( ipx ( i ) , jpx ( j ) , ipx ( i + 1 ) - ipx ( i ) , jpx ( j + 1 ) - jpx ( j ) ) ;
47
59
}
48
60
}
49
61
@@ -55,18 +67,29 @@ module.exports = function(gd, plotinfo, cdimage, imageLayer) {
55
67
preserveAspectRatio : 'none'
56
68
} ) ;
57
69
70
+ // var canvas = document.createElement('canvas');
71
+ // canvas.width = cd0.w;
72
+ // canvas.height = cd0.h;
73
+ // var context = canvas.getContext('2d');
74
+ // for(var i = 0; i < cd0.w; i++) {
75
+ // for(var j = 0; j < cd0.h; j++) {
76
+ // context.fillStyle = trace.colormodel + '(' + z[j][i].slice(0, tupleLength).join(',') + ')';
77
+ // context.fillRect(i, j, 1, 1);
78
+ // }
79
+ // }
80
+ //
81
+ // TODO: support additional smoothing options
82
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering
83
+ // http://phrogz.net/tmp/canvas_image_zoom.html
84
+ // image3
85
+ // .attr('style', 'image-rendering: optimizeSpeed; image-rendering: -o-crisp-edges; image-rendering: -webkit-optimize-contrast; image-rendering: optimize-contrast; image-rendering: crisp-edges; image-rendering: pixelated;');
86
+
58
87
image3 . attr ( {
59
88
height : imageHeight ,
60
89
width : imageWidth ,
61
90
x : left ,
62
91
y : top ,
63
92
'xlink:href' : canvas . toDataURL ( 'image/png' )
64
93
} ) ;
65
-
66
- // TODO: support additional smoothing options
67
- // https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering
68
- // http://phrogz.net/tmp/canvas_image_zoom.html
69
- image3
70
- . attr ( 'style' , 'image-rendering: optimizeSpeed; image-rendering: -o-crisp-edges; image-rendering: -webkit-optimize-contrast; image-rendering: optimize-contrast; image-rendering: crisp-edges; image-rendering: pixelated;' ) ;
71
94
} ) ;
72
95
} ;
0 commit comments