Merge pull request #4933 from nnethercote/fix-4926-masking
Fix mishandling of incomplete, inverted masks.
This commit is contained in:
commit
480e0939dc
@ -199,11 +199,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
var bitStrideLength = (width + 7) >> 3;
|
var bitStrideLength = (width + 7) >> 3;
|
||||||
var imgArray = image.getBytes(bitStrideLength * height);
|
var imgArray = image.getBytes(bitStrideLength * height);
|
||||||
var decode = dict.get('Decode', 'D');
|
var decode = dict.get('Decode', 'D');
|
||||||
var canTransfer = image instanceof DecodeStream;
|
|
||||||
var inverseDecode = (!!decode && decode[0] > 0);
|
var inverseDecode = (!!decode && decode[0] > 0);
|
||||||
|
|
||||||
imgData = PDFImage.createMask(imgArray, width, height,
|
imgData = PDFImage.createMask(imgArray, width, height,
|
||||||
canTransfer, inverseDecode);
|
image instanceof DecodeStream,
|
||||||
|
inverseDecode);
|
||||||
imgData.cached = true;
|
imgData.cached = true;
|
||||||
args = [imgData];
|
args = [imgData];
|
||||||
operatorList.addOp(OPS.paintImageMaskXObject, args);
|
operatorList.addOp(OPS.paintImageMaskXObject, args);
|
||||||
|
@ -248,23 +248,40 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
PDFImage.createMask =
|
PDFImage.createMask =
|
||||||
function PDFImage_createMask(imgArray, width, height, canTransfer,
|
function PDFImage_createMask(imgArray, width, height,
|
||||||
inverseDecode) {
|
imageIsFromDecodeStream, inverseDecode) {
|
||||||
// If imgArray came from a DecodeStream, we're safe to transfer it.
|
|
||||||
// Otherwise, copy it.
|
// |imgArray| might not contain full data for every pixel of the mask, so
|
||||||
|
// we need to distinguish between |computedLength| and |actualLength|.
|
||||||
|
// In particular, if inverseDecode is true, then the array we return must
|
||||||
|
// have a length of |computedLength|.
|
||||||
|
|
||||||
|
var computedLength = ((width + 7) >> 3) * height;
|
||||||
var actualLength = imgArray.byteLength;
|
var actualLength = imgArray.byteLength;
|
||||||
var data;
|
var haveFullData = computedLength == actualLength;
|
||||||
if (canTransfer) {
|
var data, i;
|
||||||
|
|
||||||
|
if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
|
||||||
|
// imgArray came from a DecodeStream and its data is in an appropriate
|
||||||
|
// form, so we can just transfer it.
|
||||||
data = imgArray;
|
data = imgArray;
|
||||||
} else {
|
} else if (!inverseDecode) {
|
||||||
data = new Uint8Array(actualLength);
|
data = new Uint8Array(actualLength);
|
||||||
data.set(imgArray);
|
data.set(imgArray);
|
||||||
|
} else {
|
||||||
|
data = new Uint8Array(computedLength);
|
||||||
|
data.set(imgArray);
|
||||||
|
for (i = actualLength; i < computedLength; i++) {
|
||||||
|
data[i] = 0xff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Invert if necessary. It's safe to modify the array -- whether it's the
|
|
||||||
|
// If necessary, invert the original mask data (but not any extra we might
|
||||||
|
// have added above). It's safe to modify the array -- whether it's the
|
||||||
// original or a copy, we're about to transfer it anyway, so nothing else
|
// original or a copy, we're about to transfer it anyway, so nothing else
|
||||||
// in this thread can be relying on its contents.
|
// in this thread can be relying on its contents.
|
||||||
if (inverseDecode) {
|
if (inverseDecode) {
|
||||||
for (var i = 0; i < actualLength; i++) {
|
for (i = 0; i < actualLength; i++) {
|
||||||
data[i] = ~data[i];
|
data[i] = ~data[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
test/pdfs/issue4926.pdf.link
Normal file
1
test/pdfs/issue4926.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://www.conservation.ca.gov/cgs/information/publications/cgs_notes/note_17/documents/note_17.pdf
|
@ -1655,5 +1655,12 @@
|
|||||||
"firstPage": 9,
|
"firstPage": 9,
|
||||||
"lastPage": 9,
|
"lastPage": 9,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
|
},
|
||||||
|
{ "id": "issue4926",
|
||||||
|
"file": "pdfs/issue4926.pdf",
|
||||||
|
"md5": "ed881c8ea2f9bc4be94ecb7f2b2c149b",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"type": "eq"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user