]> git.parisson.com Git - pdf.js.git/commitdiff
Adds cmyk jpg support. Treats the cmyk jpg as a regular stream.
authorBrendan Dahl <brendan.dahl@gmail.com>
Tue, 8 Nov 2011 16:48:10 +0000 (08:48 -0800)
committerBrendan Dahl <brendan.dahl@gmail.com>
Tue, 8 Nov 2011 16:48:10 +0000 (08:48 -0800)
Makefile
examples/helloworld/index.html
src/core.js
src/evaluator.js
src/image.js
src/stream.js
test/test_slave.html
web/viewer.html

index 3e385b175dd0b30c13db4bf6f7a32a0c7f03c664..2b566cbbf662529d599a90110a119facafdbb2c7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,7 @@ PDF_JS_FILES = \
   pattern.js \
   stream.js \
   worker.js \
+  ../external/jpgjs/jpg.js \
        $(NULL)
 
 # make server
index a48e3705bebb2cb6122d23d1dfa70af1198155c5..a2485d91884f78ea46c22e5bddee2ed6eb29e0a5 100644 (file)
@@ -22,6 +22,7 @@
   <script type="text/javascript" src="../../src/pattern.js"></script>
   <script type="text/javascript" src="../../src/stream.js"></script>
   <script type="text/javascript" src="../../src/worker.js"></script>
+  <script type="text/javascript" src="../../external/jpgjs/jpg.js"></script>
 
   <script type="text/javascript">
     // Specify the main script used to create a new PDF.JS web worker.
index 5e97763abc80f58f7c943056b708efc05325ab8d..6ff34dfbe0f045122d4b3a3b8d2fe9f16080023b 100644 (file)
@@ -546,7 +546,7 @@ var PDFDoc = (function pdfDoc() {
         switch (type) {
           case 'JpegStream':
             var IR = data[2];
-            new JpegImage(id, IR, this.objs);
+            new JpegImageLoader(id, IR, this.objs);
             break;
           case 'Font':
             var name = data[2];
index 064288c6fbd8221f5912b3748848b0b504fac9d7..3b33519d8b52c01e5833d765dd9089c3fb9112d8 100644 (file)
@@ -179,7 +179,7 @@ var PartialEvaluator = (function partialEvaluator() {
         var w = dict.get('Width', 'W');
         var h = dict.get('Height', 'H');
 
-        if (image instanceof JpegStream) {
+        if (image instanceof JpegStream && image.isNative) {
           var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
           handler.send('obj', [objId, 'JpegStream', image.getIR()]);
 
index 71aa0f1131c8bcccdbdc31b356527b0effeb5da1..17ef7b06d822e69dfbb6877b112be44ae43f40cc 100644 (file)
@@ -229,12 +229,12 @@ var PDFImage = (function pdfImage() {
   return constructor;
 })();
 
-var JpegImage = (function jpegImage() {
-  function JpegImage(objId, imageData, objs) {
+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 jpegImageOnload() {
+    img.onload = (function jpegImageLoaderOnload() {
       this.loaded = true;
 
       objs.resolve(objId, this);
@@ -246,12 +246,12 @@ var JpegImage = (function jpegImage() {
     this.domImage = img;
   }
 
-  JpegImage.prototype = {
-    getImage: function jpegImageGetImage() {
+  JpegImageLoader.prototype = {
+    getImage: function jpegImageLoaderGetImage() {
       return this.domImage;
     }
   };
 
-  return JpegImage;
+  return JpegImageLoader;
 })();
 
index 73b096f1e69f72078030abc9d3091565af265903..de07e1387e0e1efb07d298ffa5716a983b0e2af3 100644 (file)
@@ -793,20 +793,46 @@ var JpegStream = (function jpegStream() {
     // TODO: per poppler, some images may have 'junk' before that
     // need to be removed
     this.dict = dict;
+    this.isNative = true;
+
+    if (isAdobeImage(bytes)) {
+      // when bug 674619 land, let's check if browser can do
+      // normal cmyk and then we won't have to the following
+      var cs = dict.get('ColorSpace');
+      if (isName(cs) && cs.name === 'DeviceCMYK') {
+        this.isNative = false;
+        this.bytes = bytes;
+      } else {
+        bytes = fixAdobeImage(bytes);
+        this.src = bytesToString(bytes);
+      }
+    } else {
+      this.src = bytesToString(bytes);
+    }
 
-    if (isAdobeImage(bytes))
-      bytes = fixAdobeImage(bytes);
-
-    this.src = bytesToString(bytes);
+    DecodeStream.call(this);
   }
 
-  constructor.prototype = {
-    getIR: function jpegStreamGetIR() {
-      return this.src;
-    },
-    getChar: function jpegStreamGetChar() {
+  constructor.prototype = Object.create(DecodeStream.prototype);
+
+  constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) {
+    if (this.bufferLength)
+      return;
+    var jpegImage = new JpegImage();
+    jpegImage.parse(this.bytes);
+    var width = jpegImage.width;
+    var height = jpegImage.height;
+    var dataLength = width * height * 4;
+    var data = new Uint8Array(dataLength);
+    jpegImage.getData(data, width, height);
+    this.buffer = data;
+    this.bufferLength = data.length;
+  };
+  constructor.prototype.getIR = function jpegStreamGetIR() {
+    return this.src;
+  };
+  constructor.prototype.getChar = function jpegStreamGetChar() {
       error('internal error: getChar is not valid on JpegStream');
-    }
   };
 
   return constructor;
index 91852d5a56405aaf79f2149a3abc41d05c85442d..166251af9ae10753d7edcf51990a2a653e0841b7 100644 (file)
@@ -21,6 +21,7 @@
     <script type="text/javascript" src="/src/pattern.js"></script>
     <script type="text/javascript" src="/src/stream.js"></script>
     <script type="text/javascript" src="/src/worker.js"></script>
+    <script type="text/javascript" src="/external/jpgjs/jpg.js"></script>
     <script type="text/javascript" src="driver.js"></script>
 
     <script type="text/javascript">
index a72503eee62b933cec779afd0d2f6334b6c1c837..e441a984791fa93dd60972475b0e899fafccb11b 100644 (file)
@@ -25,7 +25,7 @@
         <script type="text/javascript" src="../src/pattern.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/stream.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/worker.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
-
+        <script type="text/javascript" src="../external/jpgjs/jpg.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
 
         <script type="text/javascript" src="viewer.js"></script>