From 97802aac6464399e970802cc263461e8b02e3239 Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Mon, 5 Dec 2011 17:59:03 +0100
Subject: [PATCH 1/2] Inline JpegImageLoader to remove new JpegImageLoader call

---
 src/canvas.js |  5 ++---
 src/core.js   | 11 +++++++++--
 src/image.js  | 31 ++-----------------------------
 src/obj.js    |  2 +-
 4 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/src/canvas.js b/src/canvas.js
index 0913b582a..bba584be1 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -969,8 +969,8 @@ var CanvasGraphics = (function canvasGraphics() {
     },
 
     paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
-      var image = this.objs.get(objId);
-      if (!image) {
+      var domImage = this.objs.get(objId);
+      if (!domImage) {
         error('Dependent image isn\'t ready yet');
       }
 
@@ -980,7 +980,6 @@ var CanvasGraphics = (function canvasGraphics() {
       // scale the image to the unit square
       ctx.scale(1 / w, -1 / h);
 
-      var domImage = image.getImage();
       ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
                     0, -h, w, h);
 
diff --git a/src/core.js b/src/core.js
index 284b3cb40..a52f2bdd0 100644
--- a/src/core.js
+++ b/src/core.js
@@ -560,8 +560,15 @@ var PDFDoc = (function pdfDoc() {
 
         switch (type) {
           case 'JpegStream':
-            var IR = data[2];
-            new JpegImageLoader(id, IR, this.objs);
+            var imageData = data[2];
+
+            var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
+            var img = new Image();
+            img.onload = (function jpegImageLoaderOnload() {
+              this.objs.resolve(id, img);
+            }).bind(this);
+            img.src = src;
+
             break;
           case 'Font':
             var name = data[2];
diff --git a/src/image.js b/src/image.js
index 17ef7b06d..5392202c7 100644
--- a/src/image.js
+++ b/src/image.js
@@ -130,11 +130,11 @@ var PDFImage = (function pdfImage() {
       var buf = new Uint8Array(width * height);
 
       if (smask) {
-        if (smask.image.getImage) {
+        if (smask.image.src) {
           // smask is a DOM image
           var tempCanvas = new ScratchCanvas(width, height);
           var tempCtx = tempCanvas.getContext('2d');
-          var domImage = smask.image.getImage();
+          var domImage = smask.image;
           tempCtx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
             0, 0, width, height);
           var data = tempCtx.getImageData(0, 0, width, height).data;
@@ -228,30 +228,3 @@ var PDFImage = (function pdfImage() {
   };
   return constructor;
 })();
-
-var JpegImageLoader = (function jpegImage() {
-  function JpegImageLoader(objId, imageData, objs) {
-    var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-
-    var img = new Image();
-    img.onload = (function jpegImageLoaderOnload() {
-      this.loaded = true;
-
-      objs.resolve(objId, this);
-
-      if (this.onLoad)
-        this.onLoad();
-    }).bind(this);
-    img.src = src;
-    this.domImage = img;
-  }
-
-  JpegImageLoader.prototype = {
-    getImage: function jpegImageLoaderGetImage() {
-      return this.domImage;
-    }
-  };
-
-  return JpegImageLoader;
-})();
-
diff --git a/src/obj.js b/src/obj.js
index 7aebb732a..e00e54b91 100644
--- a/src/obj.js
+++ b/src/obj.js
@@ -589,7 +589,7 @@ var XRef = (function xRefXRef() {
           e = parser.getObj();
         }
         // Don't cache streams since they are mutable (except images).
-        if (!isStream(e) || e.getImage)
+        if (!isStream(e) || e.src)
           this.cache[num] = e;
         return e;
       }

From af8e2a1189d29e1d01d73cd3f1619679e3e7d6b3 Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Wed, 7 Dec 2011 19:03:13 +0100
Subject: [PATCH 2/2] Address review comments by yury

---
 src/core.js  | 9 +--------
 src/image.js | 8 ++++++++
 src/obj.js   | 2 +-
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/core.js b/src/core.js
index a52f2bdd0..980a7b1e9 100644
--- a/src/core.js
+++ b/src/core.js
@@ -561,14 +561,7 @@ var PDFDoc = (function pdfDoc() {
         switch (type) {
           case 'JpegStream':
             var imageData = data[2];
-
-            var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-            var img = new Image();
-            img.onload = (function jpegImageLoaderOnload() {
-              this.objs.resolve(id, img);
-            }).bind(this);
-            img.src = src;
-
+            loadJpegStream(id, imageData, this.objs);
             break;
           case 'Font':
             var name = data[2];
diff --git a/src/image.js b/src/image.js
index 5392202c7..217e081c2 100644
--- a/src/image.js
+++ b/src/image.js
@@ -228,3 +228,11 @@ var PDFImage = (function pdfImage() {
   };
   return constructor;
 })();
+
+function loadJpegStream(id, imageData, objs) {
+  var img = new Image();
+  img.onload = (function jpegImageLoaderOnload() {
+    objs.resolve(id, img);
+  });
+  img.src = 'data:image/jpeg;base64,' + window.btoa(imageData);
+}
diff --git a/src/obj.js b/src/obj.js
index e00e54b91..e105e2e65 100644
--- a/src/obj.js
+++ b/src/obj.js
@@ -589,7 +589,7 @@ var XRef = (function xRefXRef() {
           e = parser.getObj();
         }
         // Don't cache streams since they are mutable (except images).
-        if (!isStream(e) || e.src)
+        if (!isStream(e) || e instanceof JpegStream)
           this.cache[num] = e;
         return e;
       }