Adds support for color key mask.
This commit is contained in:
parent
b1181c1d80
commit
19fa6a5260
64
src/image.js
64
src/image.js
@ -97,7 +97,12 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
if (smask) {
|
if (smask) {
|
||||||
this.smask = new PDFImage(xref, res, smask, false);
|
this.smask = new PDFImage(xref, res, smask, false);
|
||||||
} else if (mask) {
|
} else if (mask) {
|
||||||
this.mask = new PDFImage(xref, res, mask, false);
|
if (isStream(mask)) {
|
||||||
|
this.mask = new PDFImage(xref, res, mask, false);
|
||||||
|
} else {
|
||||||
|
// Color key mask (just an array).
|
||||||
|
this.mask = mask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -129,11 +134,15 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
maskPromise.resolve(null);
|
maskPromise.resolve(null);
|
||||||
} else {
|
} else {
|
||||||
smaskPromise.resolve(null);
|
smaskPromise.resolve(null);
|
||||||
if (mask && isStream(mask)) {
|
if (mask) {
|
||||||
handleImageData(handler, xref, res, mask, maskPromise);
|
if (isStream(mask)) {
|
||||||
} else if (mask) {
|
handleImageData(handler, xref, res, mask, maskPromise);
|
||||||
TODO('handle color key masking');
|
} else if (isArray(mask)) {
|
||||||
maskPromise.resolve(null);
|
maskPromise.resolve(mask);
|
||||||
|
} else {
|
||||||
|
warn('Unsupported mask format.');
|
||||||
|
maskPromise.resolve(null);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
maskPromise.resolve(null);
|
maskPromise.resolve(null);
|
||||||
}
|
}
|
||||||
@ -279,7 +288,7 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
},
|
},
|
||||||
getOpacity: function PDFImage_getOpacity(width, height) {
|
getOpacity: function PDFImage_getOpacity(width, height, image) {
|
||||||
var smask = this.smask;
|
var smask = this.smask;
|
||||||
var mask = this.mask;
|
var mask = this.mask;
|
||||||
var originalWidth = this.width;
|
var originalWidth = this.width;
|
||||||
@ -294,18 +303,37 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
if (sw != width || sh != height)
|
if (sw != width || sh != height)
|
||||||
buf = PDFImage.resize(buf, smask.bpc, 1, sw, sh, width, height);
|
buf = PDFImage.resize(buf, smask.bpc, 1, sw, sh, width, height);
|
||||||
} else if (mask) {
|
} else if (mask) {
|
||||||
var sw = mask.width;
|
if (mask instanceof PDFImage) {
|
||||||
var sh = mask.height;
|
var sw = mask.width;
|
||||||
buf = new Uint8Array(sw * sh);
|
var sh = mask.height;
|
||||||
mask.numComps = 1;
|
buf = new Uint8Array(sw * sh);
|
||||||
mask.fillGrayBuffer(buf);
|
mask.numComps = 1;
|
||||||
|
mask.fillGrayBuffer(buf);
|
||||||
|
|
||||||
// Need to invert values in buffer
|
// Need to invert values in buffer
|
||||||
for (var i = 0, ii = sw * sh; i < ii; ++i)
|
for (var i = 0, ii = sw * sh; i < ii; ++i)
|
||||||
buf[i] = 255 - buf[i];
|
buf[i] = 255 - buf[i];
|
||||||
|
|
||||||
if (sw != width || sh != height)
|
if (sw != width || sh != height)
|
||||||
buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height);
|
buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height);
|
||||||
|
} else if (isArray(mask)) {
|
||||||
|
// Color key mask: if any of the compontents are outside the range
|
||||||
|
// then they should be painted.
|
||||||
|
buf = new Uint8Array(width * height);
|
||||||
|
for (var i = 0, ii = width * height; i < ii; ++i) {
|
||||||
|
var opacity = 0;
|
||||||
|
for (var j = 0; j < this.numComps; ++j) {
|
||||||
|
var color = image[i * this.numComps + j];
|
||||||
|
if (color < mask[j * 2] || color > mask[j * 2 + 1]) {
|
||||||
|
opacity = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf[i] = opacity;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error('Unknown mask format.');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
buf = new Uint8Array(width * height);
|
buf = new Uint8Array(width * height);
|
||||||
for (var i = 0, ii = width * height; i < ii; ++i)
|
for (var i = 0, ii = width * height; i < ii; ++i)
|
||||||
@ -357,7 +385,7 @@ var PDFImage = (function PDFImageClosure() {
|
|||||||
comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
|
comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
|
||||||
originalHeight, width, height);
|
originalHeight, width, height);
|
||||||
var compsPos = 0;
|
var compsPos = 0;
|
||||||
var opacity = this.getOpacity(width, height);
|
var opacity = this.getOpacity(width, height, imgArray);
|
||||||
var opacityPos = 0;
|
var opacityPos = 0;
|
||||||
var length = width * actualHeight * 4;
|
var length = width * actualHeight * 4;
|
||||||
|
|
||||||
|
BIN
test/pdfs/colorkeymask.pdf
Normal file
BIN
test/pdfs/colorkeymask.pdf
Normal file
Binary file not shown.
@ -673,5 +673,11 @@
|
|||||||
"md5": "2ac7c68e26a8ef797aead15e4875cc6d",
|
"md5": "2ac7c68e26a8ef797aead15e4875cc6d",
|
||||||
"rounds": 1,
|
"rounds": 1,
|
||||||
"type": "load"
|
"type": "load"
|
||||||
|
},
|
||||||
|
{ "id": "colorkeymask",
|
||||||
|
"file": "pdfs/colorkeymask.pdf",
|
||||||
|
"md5": "9f11e815b485f7f0e1fa5c116c636cf9",
|
||||||
|
"rounds": 1,
|
||||||
|
"type": "eq"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user