Skip to content

Commit cfca36c

Browse files
committed
Merge pull request mozilla#2042 from brendandahl/color-key-mask
Adds support for color key mask.
2 parents b1181c1 + d26ecff commit cfca36c

File tree

3 files changed

+57
-20
lines changed

3 files changed

+57
-20
lines changed

src/image.js

Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,12 @@ var PDFImage = (function PDFImageClosure() {
9797
if (smask) {
9898
this.smask = new PDFImage(xref, res, smask, false);
9999
} else if (mask) {
100-
this.mask = new PDFImage(xref, res, mask, false);
100+
if (isStream(mask)) {
101+
this.mask = new PDFImage(xref, res, mask, false);
102+
} else {
103+
// Color key mask (just an array).
104+
this.mask = mask;
105+
}
101106
}
102107
}
103108
/**
@@ -129,11 +134,15 @@ var PDFImage = (function PDFImageClosure() {
129134
maskPromise.resolve(null);
130135
} else {
131136
smaskPromise.resolve(null);
132-
if (mask && isStream(mask)) {
133-
handleImageData(handler, xref, res, mask, maskPromise);
134-
} else if (mask) {
135-
TODO('handle color key masking');
136-
maskPromise.resolve(null);
137+
if (mask) {
138+
if (isStream(mask)) {
139+
handleImageData(handler, xref, res, mask, maskPromise);
140+
} else if (isArray(mask)) {
141+
maskPromise.resolve(mask);
142+
} else {
143+
warn('Unsupported mask format.');
144+
maskPromise.resolve(null);
145+
}
137146
} else {
138147
maskPromise.resolve(null);
139148
}
@@ -279,7 +288,7 @@ var PDFImage = (function PDFImageClosure() {
279288
}
280289
return output;
281290
},
282-
getOpacity: function PDFImage_getOpacity(width, height) {
291+
getOpacity: function PDFImage_getOpacity(width, height, image) {
283292
var smask = this.smask;
284293
var mask = this.mask;
285294
var originalWidth = this.width;
@@ -294,18 +303,40 @@ var PDFImage = (function PDFImageClosure() {
294303
if (sw != width || sh != height)
295304
buf = PDFImage.resize(buf, smask.bpc, 1, sw, sh, width, height);
296305
} else if (mask) {
297-
var sw = mask.width;
298-
var sh = mask.height;
299-
buf = new Uint8Array(sw * sh);
300-
mask.numComps = 1;
301-
mask.fillGrayBuffer(buf);
302-
303-
// Need to invert values in buffer
304-
for (var i = 0, ii = sw * sh; i < ii; ++i)
305-
buf[i] = 255 - buf[i];
306-
307-
if (sw != width || sh != height)
308-
buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height);
306+
if (mask instanceof PDFImage) {
307+
var sw = mask.width;
308+
var sh = mask.height;
309+
buf = new Uint8Array(sw * sh);
310+
mask.numComps = 1;
311+
mask.fillGrayBuffer(buf);
312+
313+
// Need to invert values in buffer
314+
for (var i = 0, ii = sw * sh; i < ii; ++i)
315+
buf[i] = 255 - buf[i];
316+
317+
if (sw != width || sh != height)
318+
buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height);
319+
} else if (isArray(mask)) {
320+
// Color key mask: if any of the compontents are outside the range
321+
// then they should be painted.
322+
buf = new Uint8Array(width * height);
323+
var numComps = this.numComps;
324+
for (var i = 0, ii = width * height; i < ii; ++i) {
325+
var opacity = 0;
326+
var imageOffset = i * numComps;
327+
for (var j = 0; j < numComps; ++j) {
328+
var color = image[imageOffset + j];
329+
var maskOffset = j * 2;
330+
if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
331+
opacity = 255;
332+
break;
333+
}
334+
}
335+
buf[i] = opacity;
336+
}
337+
} else {
338+
error('Unknown mask format.');
339+
}
309340
} else {
310341
buf = new Uint8Array(width * height);
311342
for (var i = 0, ii = width * height; i < ii; ++i)
@@ -357,7 +388,7 @@ var PDFImage = (function PDFImageClosure() {
357388
comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
358389
originalHeight, width, height);
359390
var compsPos = 0;
360-
var opacity = this.getOpacity(width, height);
391+
var opacity = this.getOpacity(width, height, imgArray);
361392
var opacityPos = 0;
362393
var length = width * actualHeight * 4;
363394

test/pdfs/colorkeymask.pdf

158 KB
Binary file not shown.

test/test_manifest.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,5 +673,11 @@
673673
"md5": "2ac7c68e26a8ef797aead15e4875cc6d",
674674
"rounds": 1,
675675
"type": "load"
676+
},
677+
{ "id": "colorkeymask",
678+
"file": "pdfs/colorkeymask.pdf",
679+
"md5": "9f11e815b485f7f0e1fa5c116c636cf9",
680+
"rounds": 1,
681+
"type": "eq"
676682
}
677683
]

0 commit comments

Comments
 (0)