From 01d2929401c99343a9ec4e896d1c9e226828afc5 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Fri, 4 Nov 2011 07:55:27 +0100 Subject: [PATCH] Add feature detection for using Uint8Array as imageData --- src/canvas.js | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 9b3ed0ba9..af2555c4e 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -3,6 +3,29 @@ 'use strict'; +// Some browsers can use UInt8Array directly as imageData. +PDFJS.FEATURE_CANVAS_UINT_IMAGE_DATA = false; +if (typeof window !== 'undefined') { + window.addEventListener('load', function featureCanvasUIntImgaData() { + var canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + var ctx = canvas.getContext('2d'); + + try { + ctx.putImageData({ + width: 1, + height: 1, + data: new Uint8Array(4) + }, 0, 0); + } catch (e) { + return; + } + + PDFJS.FEATURE_CANVAS_UINT_IMAGE_DATA = true; + }); +} + // contexts store most of the state we need natively. // However, PDF needs a bit more state, which we store here. @@ -789,17 +812,18 @@ var CanvasGraphics = (function canvasGraphics() { var tmpCtx = tmpCanvas.getContext('2d'); var tmpImgData; - // Some browsers can set an UInt8Array directly as imageData, some - // can't. As long as we don't have proper feature detection, just - // copy over each pixel and set the imageData that way. - tmpImgData = tmpCtx.getImageData(0, 0, w, h); + if (PDFJS.FEATURE_CANVAS_UINT_IMAGE_DATA) { + tmpImgData = imgData; + } else { + tmpImgData = tmpCtx.getImageData(0, 0, w, h); - // Copy over the imageData. - var tmpImgDataPixels = tmpImgData.data; - var len = tmpImgDataPixels.length; + // Copy over the imageData pixel by pixel. + var tmpImgDataPixels = tmpImgData.data; + var len = tmpImgDataPixels.length; - while (len--) { - tmpImgDataPixels[len] = imgData.data[len]; + while (len--) { + tmpImgDataPixels[len] = imgData.data[len]; + } } tmpCtx.putImageData(tmpImgData, 0, 0);