// read canvas/webgl pixels 'use strict' var isBrowser = require('is-browser') var flipData = require('flip-pixels') var clipData = require('clip-pixels') var canvas, ctx module.exports = function read (gl, o) { var width = o.shape[0], height = o.shape[1] var clip = o.clip // drawing webgl to 2d canvas is faster if (isBrowser && gl.canvas) { if (!ctx) { canvas = document.createElement('canvas') ctx = canvas.getContext('2d') } canvas.width = gl.drawingBufferWidth canvas.height = gl.drawingBufferHeight ctx.drawImage(gl.canvas, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight) var result = ctx.getImageData(clip.x, clip.y, clip.width || width, clip.height || height) return result } // flipping pixels is slower var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4) gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels) var result = { } result.width = gl.drawingBufferWidth result.height = gl.drawingBufferHeight pixels = flipData(pixels, result.width, result.height) result.data = pixels if (clip.x || clip.y || (clip.width && clip.width !== result.width) || (clip.height && clip.height !== result.height) ) { pixels = new Uint8Array(clipData(pixels, [result.width, result.height], [clip.x, clip.y, clip.width, clip.height])) result.data = pixels result.width = clip.width result.height = clip.height } return Promise.resolve(result) }