From 11f565547c760ffcd91788480376b5f617805e6f Mon Sep 17 00:00:00 2001 From: fkaelberer Date: Sat, 19 Apr 2014 19:34:42 +0200 Subject: [PATCH] Fix corrupted images #4649 --- src/core/image.js | 4 +++- src/core/jpx.js | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/core/image.js b/src/core/image.js index e1a2b97e2..730582494 100644 --- a/src/core/image.js +++ b/src/core/image.js @@ -107,8 +107,10 @@ var PDFImage = (function PDFImageClosure() { case 3: colorSpace = Name.get('DeviceRGB'); break; + case 4: + colorSpace = Name.get('DeviceCMYK'); + break; default: - // TODO: Find out how four color channels are handled. CMYK? Alpha? error('JPX images with ' + this.numComps + ' color components not supported.'); } diff --git a/src/core/jpx.js b/src/core/jpx.js index 2e27f677e..4c4294bc9 100644 --- a/src/core/jpx.js +++ b/src/core/jpx.js @@ -1077,11 +1077,13 @@ var JpxImage = (function JpxImageClosure() { // Section G.2.2 Inverse multi component transform var shift, offset, max, min; - var pos = 0, j, jj, y0, y1, y2, r, g, b, val; + var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var y2items = transformedTiles[2].items; - var y1items = transformedTiles[1].items; + var fourComponents = componentsCount === 4; var y0items = transformedTiles[0].items; + var y1items = transformedTiles[1].items; + var y2items = transformedTiles[2].items; + var y3items = fourComponents ? transformedTiles[3].items : null; // HACK: The multiple component transform formulas below assume that // all components have the same precision. With this in mind, we @@ -1104,6 +1106,11 @@ var JpxImage = (function JpxImageClosure() { out[pos++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift; out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift; out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + offset) >> shift; + if (fourComponents) { + k = y3items[j]; + out[pos++] = + k <= min ? 0 : k >= max ? 255 : (k + offset) >> shift; + } } } else { // inverse reversible multiple component transform @@ -1117,6 +1124,11 @@ var JpxImage = (function JpxImageClosure() { out[pos++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift; out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift; out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + offset) >> shift; + if (fourComponents) { + k = y3items[j]; + out[pos++] = + k <= min ? 0 : k >= max ? 255 : (k + offset) >> shift; + } } } } else { // no multi-component transform