|
4 | 4 | * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} |
5 | 5 | */ |
6 | 6 |
|
| 7 | +var GetFastValue = require('../../utils/object/GetFastValue'); |
| 8 | + |
7 | 9 | /** |
8 | 10 | * Takes a snapshot of the current frame displayed by a WebGL canvas. |
9 | 11 | * |
|
16 | 18 | * |
17 | 19 | * @return {HTMLImageElement} A new image which contains a snapshot of the canvas's contents. |
18 | 20 | */ |
19 | | -var WebGLSnapshot = function (sourceCanvas, type, encoderOptions) |
| 21 | +var WebGLSnapshot = function (sourceCanvas, snapshotConfig) |
20 | 22 | { |
21 | | - if (!type) { type = 'image/png'; } |
22 | | - if (!encoderOptions) { encoderOptions = 0.92; } |
| 23 | + var type = GetFastValue(snapshotConfig, 'type', 'image/png'); |
| 24 | + var encoderOptions = GetFastValue(snapshotConfig, 'encoder', 0.92); |
| 25 | + var x = GetFastValue(snapshotConfig, 'x', 0); |
| 26 | + var y = GetFastValue(snapshotConfig, 'y', 0); |
| 27 | + var getPixel = GetFastValue(snapshotConfig, 'getPixel', false); |
23 | 28 |
|
24 | 29 | var gl = sourceCanvas.getContext('experimental-webgl'); |
25 | | - var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4); |
26 | | - gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels); |
27 | | - |
28 | | - // CanvasPool? |
29 | | - var canvas = document.createElement('canvas'); |
30 | | - var ctx = canvas.getContext('2d'); |
31 | | - var imageData; |
32 | | - |
33 | | - canvas.width = gl.drawingBufferWidth; |
34 | | - canvas.height = gl.drawingBufferHeight; |
35 | 30 |
|
36 | | - imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); |
| 31 | + if (getPixel) |
| 32 | + { |
| 33 | + var pixel = new Uint8Array(4); |
37 | 34 |
|
38 | | - var data = imageData.data; |
| 35 | + gl.readPixels(x, gl.drawingBufferHeight - y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); |
39 | 36 |
|
40 | | - for (var y = 0; y < canvas.height; y += 1) |
| 37 | + return pixel; |
| 38 | + } |
| 39 | + else |
41 | 40 | { |
42 | | - for (var x = 0; x < canvas.width; x += 1) |
| 41 | + var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4); |
| 42 | + |
| 43 | + gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels); |
| 44 | + |
| 45 | + // CanvasPool? |
| 46 | + var canvas = document.createElement('canvas'); |
| 47 | + var ctx = canvas.getContext('2d'); |
| 48 | + var imageData; |
| 49 | + |
| 50 | + canvas.width = gl.drawingBufferWidth; |
| 51 | + canvas.height = gl.drawingBufferHeight; |
| 52 | + |
| 53 | + imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); |
| 54 | + |
| 55 | + var data = imageData.data; |
| 56 | + |
| 57 | + for (var y = 0; y < canvas.height; y += 1) |
43 | 58 | { |
44 | | - var si = ((canvas.height - y) * canvas.width + x) * 4; |
45 | | - var di = (y * canvas.width + x) * 4; |
46 | | - data[di + 0] = pixels[si + 0]; |
47 | | - data[di + 1] = pixels[si + 1]; |
48 | | - data[di + 2] = pixels[si + 2]; |
49 | | - data[di + 3] = pixels[si + 3]; |
| 59 | + for (var x = 0; x < canvas.width; x += 1) |
| 60 | + { |
| 61 | + var si = ((canvas.height - y) * canvas.width + x) * 4; |
| 62 | + var di = (y * canvas.width + x) * 4; |
| 63 | + data[di + 0] = pixels[si + 0]; |
| 64 | + data[di + 1] = pixels[si + 1]; |
| 65 | + data[di + 2] = pixels[si + 2]; |
| 66 | + data[di + 3] = pixels[si + 3]; |
| 67 | + } |
50 | 68 | } |
| 69 | + |
| 70 | + ctx.putImageData(imageData, 0, 0); |
| 71 | + |
| 72 | + var src = canvas.toDataURL(type, encoderOptions); |
| 73 | + var image = new Image(); |
| 74 | + |
| 75 | + image.src = src; |
| 76 | + |
| 77 | + return image; |
51 | 78 | } |
52 | | - |
53 | | - ctx.putImageData(imageData, 0, 0); |
54 | | - |
55 | | - var src = canvas.toDataURL(type, encoderOptions); |
56 | | - var image = new Image(); |
57 | | - |
58 | | - image.src = src; |
59 | | - |
60 | | - return image; |
61 | 79 | }; |
62 | 80 |
|
63 | 81 | module.exports = WebGLSnapshot; |
0 commit comments