]> git.parisson.com Git - pdf.js.git/commitdiff
Add feature detection for using Uint8Array as imageData
authorJulian Viereck <julian.viereck@gmail.com>
Fri, 4 Nov 2011 06:55:27 +0000 (07:55 +0100)
committerJulian Viereck <julian.viereck@gmail.com>
Tue, 29 Nov 2011 18:31:47 +0000 (19:31 +0100)
src/canvas.js

index 9b3ed0ba9ad66d8e8d9347570ccb7ea074ff6497..af2555c4e8baab99520b78a5b40f871c1bd2b584 100644 (file)
@@ -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;
+  });
+}
+
 // <canvas> 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);