Browse Source

Fix corrupted images #4649

fkaelberer 11 years ago
parent
commit
11f565547c
  1. 4
      src/core/image.js
  2. 18
      src/core/jpx.js

4
src/core/image.js

@ -107,8 +107,10 @@ var PDFImage = (function PDFImageClosure() {
case 3: case 3:
colorSpace = Name.get('DeviceRGB'); colorSpace = Name.get('DeviceRGB');
break; break;
case 4:
colorSpace = Name.get('DeviceCMYK');
break;
default: default:
// TODO: Find out how four color channels are handled. CMYK? Alpha?
error('JPX images with ' + this.numComps + error('JPX images with ' + this.numComps +
' color components not supported.'); ' color components not supported.');
} }

18
src/core/jpx.js

@ -1077,11 +1077,13 @@ var JpxImage = (function JpxImageClosure() {
// Section G.2.2 Inverse multi component transform // Section G.2.2 Inverse multi component transform
var shift, offset, max, min; 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) { if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
var y2items = transformedTiles[2].items; var fourComponents = componentsCount === 4;
var y1items = transformedTiles[1].items;
var y0items = transformedTiles[0].items; 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 // HACK: The multiple component transform formulas below assume that
// all components have the same precision. With this in mind, we // 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++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift;
out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift; out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift;
out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + 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 { } else {
// inverse reversible multiple component transform // 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++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift;
out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift; out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift;
out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + 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 } else { // no multi-component transform

Loading…
Cancel
Save