Skip to content

Commit 7477eb5

Browse files
committed
Snapshot implementation
1 parent 3c83850 commit 7477eb5

5 files changed

Lines changed: 78 additions & 0 deletions

File tree

v3/src/renderer/canvas/CanvasRenderer.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var DrawImage = require('./utils/DrawImage');
33
var BlitImage = require('./utils/BlitImage');
44
var GetBlendModes = require('./utils/GetBlendModes');
55
var GetContext = require('../../canvas/GetContext');
6+
var Snapshot = require('../../snapshot/Snapshot');
67

78
var CanvasRenderer = function (game)
89
{
@@ -257,9 +258,21 @@ CanvasRenderer.prototype = {
257258
this.currentAlpha = 1;
258259
this.currentBlendMode = 0;
259260

261+
if (this.snapshotCallback)
262+
{
263+
264+
this.snapshotCallback(Snapshot.CanvasSnapshot(this.gameCanvas));
265+
this.snapshotCallback = null;
266+
}
267+
260268
// Add Post-render hook
261269
},
262270

271+
snapshot: function (callback)
272+
{
273+
this.snapshotCallback = callback;
274+
},
275+
263276
/**
264277
* Removes everything from the renderer and optionally removes the Canvas DOM element.
265278
*

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var BlendModes = require('../BlendModes');
1616
var ScaleModes = require('../ScaleModes');
1717
var ResourceManager = require('./ResourceManager');
1818
var Resources = require('./resources');
19+
var Snapshot = require('../../snapshot/Snapshot');
1920

2021
var WebGLRenderer = function (game)
2122
{
@@ -60,6 +61,7 @@ var WebGLRenderer = function (game)
6061
this.currentShader = null;
6162
this.resourceManager = null;
6263
this.currentRenderTarget = null;
64+
this.snapshotCallback = null;
6365

6466
this.init();
6567
};
@@ -386,11 +388,25 @@ WebGLRenderer.prototype = {
386388
{
387389
this.currentRenderer.flush();
388390
}
391+
392+
if (this.snapshotCallback)
393+
{
394+
395+
this.snapshotCallback(Snapshot.WebGLSnapshot(this.view));
396+
this.snapshotCallback = null;
397+
}
398+
389399
// Add Post-render hook
390400

391401
// console.log('%c render end ', 'color: #ffffff; background: #ff0000;');
392402
},
393403

404+
snapshot: function (callback)
405+
{
406+
this.snapshotCallback = callback;
407+
},
408+
409+
394410
destroy: function ()
395411
{
396412
this.gl = null;

v3/src/snapshot/CanvasSnapshot.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var CanvasSnapshot = function (canvas)
2+
{
3+
var src = canvas.toDataURL();
4+
var image = new Image();
5+
image.src = src;
6+
return image;
7+
};
8+
9+
module.exports = CanvasSnapshot;

v3/src/snapshot/Snapshot.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
CanvasSnapshot: require('./CanvasSnapshot'),
3+
WebGLSnapshot: require('./WebGLSnapshot')
4+
};

v3/src/snapshot/WebGLSnapshot.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
var WebGLSnapshot = function (canvas)
2+
{
3+
var gl = canvas.getContext('experimental-webgl');
4+
var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);
5+
gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
6+
7+
var canvas = document.createElement('canvas');
8+
var ctx = canvas.getContext('2d');
9+
var imageData;
10+
canvas.width = gl.drawingBufferWidth;
11+
canvas.height = gl.drawingBufferHeight;
12+
13+
imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
14+
var data = imageData.data;
15+
for (var y = 0; y < canvas.height; y += 1)
16+
{
17+
for (var x = 0; x < canvas.width; x += 1)
18+
{
19+
var si = ((canvas.height - y) * canvas.width + x) * 4;
20+
var di = (y * canvas.width + x) * 4;
21+
data[di + 0] = pixels[si + 0];
22+
data[di + 1] = pixels[si + 1];
23+
data[di + 2] = pixels[si + 2];
24+
data[di + 3] = pixels[si + 3];
25+
}
26+
}
27+
ctx.putImageData(imageData, 0, 0);
28+
29+
var src = canvas.toDataURL();
30+
var image = new Image();
31+
image.src = src;
32+
33+
return image;
34+
};
35+
36+
module.exports = WebGLSnapshot;

0 commit comments

Comments
 (0)