Avoid truncating JPEG images with DeviceGray ColourSpaces when using the src/core/jpg.js built-in decoder

The bug that this patch fixes is limited to the built-in JPEG decoder, and was unearthed by PR 9260. The underlying issue has existed since PR 6984, where the contents of this patch ought to have been included (if it weren't for the fact that we had no *easy* way to test `src/core/jpg.js` back then).

*Please note:* The slight movement in the reference test is a result of using the `src/core/jpg.js` decoder, rather than the native browser one.
This commit is contained in:
Jonas Jenwald 2017-12-29 17:15:08 +01:00
parent 25bbff4692
commit 8c4b7d0439
2 changed files with 17 additions and 9 deletions

View File

@ -546,14 +546,21 @@ var PDFImage = (function PDFImageClosure() {
}
return imgData;
}
if (this.image instanceof JpegStream && !this.smask && !this.mask &&
(this.colorSpace.name === 'DeviceGray' ||
this.colorSpace.name === 'DeviceRGB' ||
this.colorSpace.name === 'DeviceCMYK')) {
imgData.kind = ImageKind.RGB_24BPP;
imgData.data = this.getImageBytes(originalHeight * rowBytes,
drawWidth, drawHeight, true);
return imgData;
if (this.image instanceof JpegStream && !this.smask && !this.mask) {
let imageLength = originalHeight * rowBytes;
switch (this.colorSpace.name) {
case 'DeviceGray':
// Avoid truncating the image, since `JpegImage.getData`
// will expand the image data when `forceRGB === true`.
imageLength *= 3;
/* falls through */
case 'DeviceRGB':
case 'DeviceCMYK':
imgData.kind = ImageKind.RGB_24BPP;
imgData.data = this.getImageBytes(imageLength,
drawWidth, drawHeight, /* forceRGB = */ true);
return imgData;
}
}
}

View File

@ -1318,7 +1318,8 @@
"link": true,
"firstPage": 2,
"lastPage": 2,
"type": "eq"
"type": "eq",
"nativeImageDecoderSupport": "none"
},
{ "id": "issue6071",
"file": "pdfs/issue6071.pdf",