diff --git a/Makefile b/Makefile index 3e385b175..2b566cbbf 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ PDF_JS_FILES = \ pattern.js \ stream.js \ worker.js \ + ../external/jpgjs/jpg.js \ $(NULL) # make server diff --git a/examples/helloworld/index.html b/examples/helloworld/index.html index a48e3705b..a2485d918 100644 --- a/examples/helloworld/index.html +++ b/examples/helloworld/index.html @@ -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. diff --git a/src/core.js b/src/core.js index 5e97763ab..6ff34dfbe 100644 --- a/src/core.js +++ b/src/core.js @@ -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]; diff --git a/src/evaluator.js b/src/evaluator.js index 064288c6f..3b33519d8 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -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()]); diff --git a/src/image.js b/src/image.js index 71aa0f113..17ef7b06d 100644 --- a/src/image.js +++ b/src/image.js @@ -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; })(); diff --git a/src/stream.js b/src/stream.js index 73b096f1e..de07e1387 100644 --- a/src/stream.js +++ b/src/stream.js @@ -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; diff --git a/test/test_slave.html b/test/test_slave.html index 91852d5a5..166251af9 100644 --- a/test/test_slave.html +++ b/test/test_slave.html @@ -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"> diff --git a/web/viewer.html b/web/viewer.html index a72503eee..e441a9847 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -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>