@@ -97,7 +97,12 @@ var PDFImage = (function PDFImageClosure() {
97
97
if (smask ) {
98
98
this .smask = new PDFImage (xref , res , smask , false );
99
99
} 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
+ }
101
106
}
102
107
}
103
108
/**
@@ -129,11 +134,15 @@ var PDFImage = (function PDFImageClosure() {
129
134
maskPromise .resolve (null );
130
135
} else {
131
136
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
+ }
137
146
} else {
138
147
maskPromise .resolve (null );
139
148
}
@@ -279,7 +288,7 @@ var PDFImage = (function PDFImageClosure() {
279
288
}
280
289
return output ;
281
290
},
282
- getOpacity : function PDFImage_getOpacity (width , height ) {
291
+ getOpacity : function PDFImage_getOpacity (width , height , image ) {
283
292
var smask = this .smask ;
284
293
var mask = this .mask ;
285
294
var originalWidth = this .width ;
@@ -294,18 +303,37 @@ var PDFImage = (function PDFImageClosure() {
294
303
if (sw != width || sh != height )
295
304
buf = PDFImage .resize (buf , smask .bpc , 1 , sw , sh , width , height );
296
305
} 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
+ for (var i = 0 , ii = width * height ; i < ii ; ++i ) {
324
+ var opacity = 0 ;
325
+ for (var j = 0 ; j < this .numComps ; ++j ) {
326
+ var color = image [i * this .numComps + j ];
327
+ if (color < mask [j * 2 ] || color > mask [j * 2 + 1 ]) {
328
+ opacity = 255 ;
329
+ break ;
330
+ }
331
+ }
332
+ buf [i ] = opacity ;
333
+ }
334
+ } else {
335
+ error ('Unknown mask format.' );
336
+ }
309
337
} else {
310
338
buf = new Uint8Array (width * height );
311
339
for (var i = 0 , ii = width * height ; i < ii ; ++i )
@@ -357,7 +385,7 @@ var PDFImage = (function PDFImageClosure() {
357
385
comps = PDFImage .resize (comps , this .bpc , 3 , originalWidth ,
358
386
originalHeight , width , height );
359
387
var compsPos = 0 ;
360
- var opacity = this .getOpacity (width , height );
388
+ var opacity = this .getOpacity (width , height , imgArray );
361
389
var opacityPos = 0 ;
362
390
var length = width * actualHeight * 4 ;
363
391
0 commit comments