From 6235e3a61cd3fd91cda5b9fecf3ac2581a82bc86 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 3 Jun 2014 08:51:57 -0500 Subject: [PATCH 1/2] Adds color components decoding to the JPEG --- src/core/jpg.js | 15 ++++++++++++--- src/core/stream.js | 22 ++++++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/core/jpg.js b/src/core/jpg.js index cb61a237c..1b043a09f 100644 --- a/src/core/jpg.js +++ b/src/core/jpg.js @@ -811,7 +811,7 @@ var JpegImage = (function jpegImage() { var scaleX = this.width / width, scaleY = this.height / height; var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j; + var x, y, i, j, k; var index; var offset = 0; var output; @@ -843,6 +843,17 @@ var JpegImage = (function jpegImage() { } } } + + // decodeTransform will contains pairs of multiplier (-256..256) and + // additive + var transform = this.decodeTransform; + if (transform) { + for (i = 0; i < dataLength;) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; + } + } + } return data; }, @@ -852,8 +863,6 @@ var JpegImage = (function jpegImage() { return true; } else if (this.numComponents == 3) { return true; - } else if (typeof this.colorTransform !== 'undefined') { - return !!this.colorTransform; } else { return false; } diff --git a/src/core/stream.js b/src/core/stream.js index f2996a66b..669cab152 100644 --- a/src/core/stream.js +++ b/src/core/stream.js @@ -878,9 +878,27 @@ var JpegStream = (function JpegStreamClosure() { } try { var jpegImage = new JpegImage(); - if (this.colorTransform != -1) { - jpegImage.colorTransform = this.colorTransform; + + // checking if values needs to be transformed before conversion + if (this.dict && isArray(this.dict.get('Decode'))) { + var decodeArr = this.dict.get('Decode'); + var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; + var decodeArrLength = decodeArr.length; + var transform = new Int32Array(decodeArrLength); + var transformNeeded = false; + var maxValue = (1 << bitsPerComponent) - 1; + for (var i = 0; i < decodeArrLength; i += 2) { + transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; + transform[i + 1] = (decodeArr[i] * maxValue) | 0; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } + } + if (transformNeeded) { + jpegImage.decodeTransform = transform; + } } + jpegImage.parse(this.bytes); var data = jpegImage.getData(this.drawWidth, this.drawHeight, /* forceRGBoutput = */true); From d379e31d7b0b6014b9c598cb84e4324163f7b055 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 3 Jun 2014 08:56:16 -0500 Subject: [PATCH 2/2] Adds CMYK JPEG test --- test/pdfs/issue4883.pdf.link | 1 + test/test_manifest.json | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 test/pdfs/issue4883.pdf.link diff --git a/test/pdfs/issue4883.pdf.link b/test/pdfs/issue4883.pdf.link new file mode 100644 index 000000000..b6883b9c7 --- /dev/null +++ b/test/pdfs/issue4883.pdf.link @@ -0,0 +1 @@ +http://web.archive.org/web/20140603135304/http://www.tipp2014.nl/TIPP2014_3rd_bulletin.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index d7fd30bcc..9bfb11a5f 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -1613,6 +1613,16 @@ "lastPage": 2, "type": "eq" }, + { "id": "issue4883", + "file": "pdfs/issue4883.pdf", + "md5": "2fac0d9a189ca5fcef8626153d050be8", + "rounds": 1, + "link": true, + "firstPage": 1, + "lastPage": 1, + "type": "eq", + "about": "CMYK JPEG with Decode" + }, { "id": "bug903856", "file": "pdfs/bug903856.pdf", "md5": "286eaa9d06a5809f4f08f2093cef8f3f",