pdfjs-dist 2.5.207 → 2.6.347
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/bower.json +1 -1
- package/build/pdf.js +867 -216
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +10214 -8547
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/es5/build/pdf.js +2023 -1046
- package/es5/build/pdf.js.map +1 -1
- package/es5/build/pdf.min.js +22 -0
- package/es5/build/pdf.worker.js +11136 -8144
- package/es5/build/pdf.worker.js.map +1 -1
- package/es5/build/pdf.worker.min.js +22 -0
- package/es5/image_decoders/pdf.image_decoders.js +12529 -0
- package/es5/image_decoders/pdf.image_decoders.js.map +1 -0
- package/es5/image_decoders/pdf.image_decoders.min.js +22 -0
- package/es5/web/images/shadow.png +0 -0
- package/es5/web/pdf_viewer.css +8 -5
- package/es5/web/pdf_viewer.js +195 -51
- package/es5/web/pdf_viewer.js.map +1 -1
- package/image_decoders/pdf.image_decoders.js +24 -16
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +1 -1
- package/lib/core/annotation.js +479 -43
- package/lib/core/cff_parser.js +643 -615
- package/lib/core/chunked_stream.js +64 -50
- package/lib/core/colorspace.js +126 -104
- package/lib/core/crypto.js +37 -0
- package/lib/core/document.js +128 -75
- package/lib/core/evaluator.js +3015 -2754
- package/lib/core/fonts.js +47 -46
- package/lib/core/function.js +79 -6
- package/lib/core/image.js +364 -357
- package/lib/core/image_utils.js +109 -8
- package/lib/core/jpg.js +8 -3
- package/lib/core/obj.js +255 -34
- package/lib/core/operator_list.js +17 -15
- package/lib/core/parser.js +40 -3
- package/lib/core/pattern.js +24 -11
- package/lib/core/primitives.js +112 -53
- package/lib/core/type1_parser.js +2 -0
- package/lib/core/worker.js +102 -37
- package/lib/core/writer.js +242 -0
- package/lib/display/annotation_layer.js +51 -10
- package/lib/display/annotation_storage.js +89 -0
- package/lib/display/api.js +140 -54
- package/lib/display/canvas.js +215 -46
- package/lib/display/display_utils.js +55 -18
- package/lib/display/fetch_stream.js +6 -0
- package/lib/display/font_loader.js +26 -15
- package/lib/display/metadata.js +1 -7
- package/lib/display/network.js +0 -14
- package/lib/display/node_utils.js +87 -0
- package/lib/display/optional_content_config.js +184 -0
- package/lib/display/svg.js +1 -1
- package/lib/display/text_layer.js +4 -1
- package/lib/pdf.js +2 -2
- package/lib/pdf.worker.js +2 -2
- package/lib/shared/is_node.js +1 -1
- package/lib/shared/util.js +13 -10
- package/lib/test/unit/annotation_spec.js +520 -50
- package/lib/test/unit/annotation_storage_spec.js +83 -0
- package/lib/test/unit/api_spec.js +16 -6
- package/lib/test/unit/cmap_spec.js +4 -4
- package/lib/test/unit/colorspace_spec.js +216 -24
- package/lib/test/unit/crypto_spec.js +51 -4
- package/lib/test/unit/custom_spec.js +129 -1
- package/lib/test/unit/document_spec.js +112 -1
- package/lib/test/unit/evaluator_spec.js +29 -10
- package/lib/test/unit/jasmine-boot.js +1 -1
- package/lib/test/unit/metadata_spec.js +3 -3
- package/lib/test/unit/primitives_spec.js +242 -63
- package/lib/test/unit/test_utils.js +42 -89
- package/lib/test/unit/testreporter.js +17 -6
- package/lib/test/unit/util_spec.js +13 -12
- package/lib/test/unit/writer_spec.js +84 -0
- package/lib/web/annotation_layer_builder.js +13 -9
- package/lib/web/app.js +231 -26
- package/lib/web/app_options.js +1 -6
- package/lib/web/base_tree_viewer.js +100 -0
- package/lib/web/base_viewer.js +53 -4
- package/lib/web/download_manager.js +3 -10
- package/lib/web/firefox_print_service.js +32 -12
- package/lib/web/firefoxcom.js +20 -6
- package/lib/web/interfaces.js +1 -1
- package/lib/web/pdf_attachment_viewer.js +80 -38
- package/lib/web/pdf_find_controller.js +2 -1
- package/lib/web/pdf_layer_viewer.js +208 -0
- package/lib/web/pdf_outline_viewer.js +24 -57
- package/lib/web/pdf_page_view.js +29 -6
- package/lib/web/pdf_print_service.js +13 -11
- package/lib/web/pdf_sidebar.js +46 -25
- package/lib/web/pdf_thumbnail_view.js +16 -3
- package/lib/web/pdf_thumbnail_viewer.js +17 -1
- package/lib/web/pdf_viewer.component.js +2 -2
- package/lib/web/preferences.js +1 -1
- package/lib/web/toolbar.js +1 -1
- package/lib/web/ui_utils.js +7 -1
- package/package.json +3 -1
- package/types/display/annotation_layer.d.ts +61 -0
- package/types/display/annotation_storage.d.ts +36 -0
- package/types/display/api.d.ts +1107 -0
- package/types/display/api_compatibility.d.ts +1 -0
- package/types/display/canvas.d.ts +4 -0
- package/types/display/content_disposition.d.ts +7 -0
- package/types/display/display_utils.d.ts +243 -0
- package/types/display/fetch_stream.d.ts +67 -0
- package/types/display/font_loader.d.ts +19 -0
- package/types/display/metadata.d.ts +9 -0
- package/types/display/network.d.ts +80 -0
- package/types/display/network_utils.d.ts +14 -0
- package/types/display/node_stream.d.ts +72 -0
- package/types/display/node_utils.d.ts +6 -0
- package/types/display/optional_content_config.d.ts +12 -0
- package/types/display/pattern_helper.d.ts +5 -0
- package/types/display/svg.d.ts +2 -0
- package/types/display/text_layer.d.ts +83 -0
- package/types/display/transport_stream.d.ts +57 -0
- package/types/display/webgl.d.ts +20 -0
- package/types/display/worker_options.d.ts +27 -0
- package/types/display/xml_parser.d.ts +35 -0
- package/types/pdf.d.ts +33 -0
- package/types/shared/compatibility.d.ts +1 -0
- package/types/shared/is_node.d.ts +1 -0
- package/types/shared/message_handler.d.ts +62 -0
- package/types/shared/util.d.ts +421 -0
- package/web/images/shadow.png +0 -0
- package/web/pdf_viewer.css +8 -5
- package/web/pdf_viewer.js +109 -33
- package/web/pdf_viewer.js.map +1 -1
- package/webpack.js +1 -9
- package/es5/web/images/texture.png +0 -0
- package/web/images/texture.png +0 -0
package/lib/core/image.js
CHANGED
@@ -38,58 +38,58 @@ var _jpeg_stream = require("./jpeg_stream.js");
|
|
38
38
|
|
39
39
|
var _jpx = require("./jpx.js");
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
value = addend + value * coefficient;
|
44
|
-
|
45
|
-
if (value < 0) {
|
46
|
-
value = 0;
|
47
|
-
} else if (value > max) {
|
48
|
-
value = max;
|
49
|
-
}
|
41
|
+
function decodeAndClamp(value, addend, coefficient, max) {
|
42
|
+
value = addend + value * coefficient;
|
50
43
|
|
51
|
-
|
44
|
+
if (value < 0) {
|
45
|
+
value = 0;
|
46
|
+
} else if (value > max) {
|
47
|
+
value = max;
|
52
48
|
}
|
53
49
|
|
54
|
-
|
55
|
-
|
56
|
-
let dest;
|
50
|
+
return value;
|
51
|
+
}
|
57
52
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
dest = new Uint16Array(length);
|
62
|
-
} else {
|
63
|
-
dest = new Uint32Array(length);
|
64
|
-
}
|
53
|
+
function resizeImageMask(src, bpc, w1, h1, w2, h2) {
|
54
|
+
var length = w2 * h2;
|
55
|
+
let dest;
|
65
56
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
var xScaled = new Uint16Array(w2);
|
74
|
-
var w1Scanline = w1;
|
75
|
-
|
76
|
-
for (i = 0; i < w2; i++) {
|
77
|
-
xScaled[i] = Math.floor(i * xRatio);
|
78
|
-
}
|
57
|
+
if (bpc <= 8) {
|
58
|
+
dest = new Uint8Array(length);
|
59
|
+
} else if (bpc <= 16) {
|
60
|
+
dest = new Uint16Array(length);
|
61
|
+
} else {
|
62
|
+
dest = new Uint32Array(length);
|
63
|
+
}
|
79
64
|
|
80
|
-
|
81
|
-
|
65
|
+
var xRatio = w1 / w2;
|
66
|
+
var yRatio = h1 / h2;
|
67
|
+
var i,
|
68
|
+
j,
|
69
|
+
py,
|
70
|
+
newIndex = 0,
|
71
|
+
oldIndex;
|
72
|
+
var xScaled = new Uint16Array(w2);
|
73
|
+
var w1Scanline = w1;
|
74
|
+
|
75
|
+
for (i = 0; i < w2; i++) {
|
76
|
+
xScaled[i] = Math.floor(i * xRatio);
|
77
|
+
}
|
82
78
|
|
83
|
-
|
84
|
-
|
85
|
-
dest[newIndex++] = src[oldIndex];
|
86
|
-
}
|
87
|
-
}
|
79
|
+
for (i = 0; i < h2; i++) {
|
80
|
+
py = Math.floor(i * yRatio) * w1Scanline;
|
88
81
|
|
89
|
-
|
82
|
+
for (j = 0; j < w2; j++) {
|
83
|
+
oldIndex = py + xScaled[j];
|
84
|
+
dest[newIndex++] = src[oldIndex];
|
85
|
+
}
|
90
86
|
}
|
91
87
|
|
92
|
-
|
88
|
+
return dest;
|
89
|
+
}
|
90
|
+
|
91
|
+
class PDFImage {
|
92
|
+
constructor({
|
93
93
|
xref,
|
94
94
|
res,
|
95
95
|
image,
|
@@ -97,7 +97,8 @@ var PDFImage = function PDFImageClosure() {
|
|
97
97
|
smask = null,
|
98
98
|
mask = null,
|
99
99
|
isMask = false,
|
100
|
-
pdfFunctionFactory
|
100
|
+
pdfFunctionFactory,
|
101
|
+
localColorSpaceCache
|
101
102
|
}) {
|
102
103
|
this.image = image;
|
103
104
|
var dict = image.dict;
|
@@ -157,7 +158,7 @@ var PDFImage = function PDFImageClosure() {
|
|
157
158
|
this.bpc = bitsPerComponent;
|
158
159
|
|
159
160
|
if (!this.imageMask) {
|
160
|
-
|
161
|
+
let colorSpace = dict.getRaw("ColorSpace") || dict.getRaw("CS");
|
161
162
|
|
162
163
|
if (!colorSpace) {
|
163
164
|
(0, _util.info)("JPX images (which do not require color spaces)");
|
@@ -180,8 +181,13 @@ var PDFImage = function PDFImageClosure() {
|
|
180
181
|
}
|
181
182
|
}
|
182
183
|
|
183
|
-
|
184
|
-
|
184
|
+
this.colorSpace = _colorspace.ColorSpace.parse({
|
185
|
+
cs: colorSpace,
|
186
|
+
xref,
|
187
|
+
resources: isInline ? res : null,
|
188
|
+
pdfFunctionFactory,
|
189
|
+
localColorSpaceCache
|
190
|
+
});
|
185
191
|
this.numComps = this.colorSpace.numComps;
|
186
192
|
}
|
187
193
|
|
@@ -209,7 +215,8 @@ var PDFImage = function PDFImageClosure() {
|
|
209
215
|
res,
|
210
216
|
image: smask,
|
211
217
|
isInline,
|
212
|
-
pdfFunctionFactory
|
218
|
+
pdfFunctionFactory,
|
219
|
+
localColorSpaceCache
|
213
220
|
});
|
214
221
|
} else if (mask) {
|
215
222
|
if ((0, _primitives.isStream)(mask)) {
|
@@ -225,7 +232,8 @@ var PDFImage = function PDFImageClosure() {
|
|
225
232
|
image: mask,
|
226
233
|
isInline,
|
227
234
|
isMask: true,
|
228
|
-
pdfFunctionFactory
|
235
|
+
pdfFunctionFactory,
|
236
|
+
localColorSpaceCache
|
229
237
|
});
|
230
238
|
}
|
231
239
|
} else {
|
@@ -234,12 +242,13 @@ var PDFImage = function PDFImageClosure() {
|
|
234
242
|
}
|
235
243
|
}
|
236
244
|
|
237
|
-
|
245
|
+
static async buildImage({
|
238
246
|
xref,
|
239
247
|
res,
|
240
248
|
image,
|
241
249
|
isInline = false,
|
242
|
-
pdfFunctionFactory
|
250
|
+
pdfFunctionFactory,
|
251
|
+
localColorSpaceCache
|
243
252
|
}) {
|
244
253
|
const imageData = image;
|
245
254
|
let smaskData = null;
|
@@ -257,18 +266,19 @@ var PDFImage = function PDFImageClosure() {
|
|
257
266
|
}
|
258
267
|
}
|
259
268
|
|
260
|
-
return
|
269
|
+
return new PDFImage({
|
261
270
|
xref,
|
262
271
|
res,
|
263
272
|
image: imageData,
|
264
273
|
isInline,
|
265
274
|
smask: smaskData,
|
266
275
|
mask: maskData,
|
267
|
-
pdfFunctionFactory
|
268
|
-
|
269
|
-
|
276
|
+
pdfFunctionFactory,
|
277
|
+
localColorSpaceCache
|
278
|
+
});
|
279
|
+
}
|
270
280
|
|
271
|
-
|
281
|
+
static createMask({
|
272
282
|
imgArray,
|
273
283
|
width,
|
274
284
|
height,
|
@@ -305,378 +315,375 @@ var PDFImage = function PDFImageClosure() {
|
|
305
315
|
width,
|
306
316
|
height
|
307
317
|
};
|
308
|
-
}
|
309
|
-
|
310
|
-
PDFImage.prototype = {
|
311
|
-
get drawWidth() {
|
312
|
-
return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
|
313
|
-
},
|
314
|
-
|
315
|
-
get drawHeight() {
|
316
|
-
return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
|
317
|
-
},
|
318
|
-
|
319
|
-
decodeBuffer(buffer) {
|
320
|
-
var bpc = this.bpc;
|
321
|
-
var numComps = this.numComps;
|
322
|
-
var decodeAddends = this.decodeAddends;
|
323
|
-
var decodeCoefficients = this.decodeCoefficients;
|
324
|
-
var max = (1 << bpc) - 1;
|
325
|
-
var i, ii;
|
326
|
-
|
327
|
-
if (bpc === 1) {
|
328
|
-
for (i = 0, ii = buffer.length; i < ii; i++) {
|
329
|
-
buffer[i] = +!buffer[i];
|
330
|
-
}
|
318
|
+
}
|
331
319
|
|
332
|
-
|
333
|
-
|
320
|
+
get drawWidth() {
|
321
|
+
return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
|
322
|
+
}
|
334
323
|
|
335
|
-
|
324
|
+
get drawHeight() {
|
325
|
+
return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
|
326
|
+
}
|
336
327
|
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
328
|
+
decodeBuffer(buffer) {
|
329
|
+
var bpc = this.bpc;
|
330
|
+
var numComps = this.numComps;
|
331
|
+
var decodeAddends = this.decodeAddends;
|
332
|
+
var decodeCoefficients = this.decodeCoefficients;
|
333
|
+
var max = (1 << bpc) - 1;
|
334
|
+
var i, ii;
|
335
|
+
|
336
|
+
if (bpc === 1) {
|
337
|
+
for (i = 0, ii = buffer.length; i < ii; i++) {
|
338
|
+
buffer[i] = +!buffer[i];
|
342
339
|
}
|
343
|
-
},
|
344
340
|
|
345
|
-
|
346
|
-
|
341
|
+
return;
|
342
|
+
}
|
347
343
|
|
348
|
-
|
349
|
-
return buffer;
|
350
|
-
}
|
344
|
+
var index = 0;
|
351
345
|
|
352
|
-
|
353
|
-
var
|
354
|
-
|
355
|
-
|
356
|
-
var bufferPos = 0;
|
357
|
-
let output;
|
358
|
-
|
359
|
-
if (bpc <= 8) {
|
360
|
-
output = new Uint8Array(length);
|
361
|
-
} else if (bpc <= 16) {
|
362
|
-
output = new Uint16Array(length);
|
363
|
-
} else {
|
364
|
-
output = new Uint32Array(length);
|
346
|
+
for (i = 0, ii = this.width * this.height; i < ii; i++) {
|
347
|
+
for (var j = 0; j < numComps; j++) {
|
348
|
+
buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
|
349
|
+
index++;
|
365
350
|
}
|
351
|
+
}
|
352
|
+
}
|
366
353
|
|
367
|
-
|
368
|
-
|
369
|
-
var i = 0,
|
370
|
-
ii,
|
371
|
-
buf;
|
372
|
-
|
373
|
-
if (bpc === 1) {
|
374
|
-
var mask, loop1End, loop2End;
|
375
|
-
|
376
|
-
for (var j = 0; j < height; j++) {
|
377
|
-
loop1End = i + (rowComps & ~7);
|
378
|
-
loop2End = i + rowComps;
|
379
|
-
|
380
|
-
while (i < loop1End) {
|
381
|
-
buf = buffer[bufferPos++];
|
382
|
-
output[i] = buf >> 7 & 1;
|
383
|
-
output[i + 1] = buf >> 6 & 1;
|
384
|
-
output[i + 2] = buf >> 5 & 1;
|
385
|
-
output[i + 3] = buf >> 4 & 1;
|
386
|
-
output[i + 4] = buf >> 3 & 1;
|
387
|
-
output[i + 5] = buf >> 2 & 1;
|
388
|
-
output[i + 6] = buf >> 1 & 1;
|
389
|
-
output[i + 7] = buf & 1;
|
390
|
-
i += 8;
|
391
|
-
}
|
354
|
+
getComponents(buffer) {
|
355
|
+
var bpc = this.bpc;
|
392
356
|
|
393
|
-
|
394
|
-
|
395
|
-
|
357
|
+
if (bpc === 8) {
|
358
|
+
return buffer;
|
359
|
+
}
|
396
360
|
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
361
|
+
var width = this.width;
|
362
|
+
var height = this.height;
|
363
|
+
var numComps = this.numComps;
|
364
|
+
var length = width * height * numComps;
|
365
|
+
var bufferPos = 0;
|
366
|
+
let output;
|
367
|
+
|
368
|
+
if (bpc <= 8) {
|
369
|
+
output = new Uint8Array(length);
|
370
|
+
} else if (bpc <= 16) {
|
371
|
+
output = new Uint16Array(length);
|
372
|
+
} else {
|
373
|
+
output = new Uint32Array(length);
|
374
|
+
}
|
375
|
+
|
376
|
+
var rowComps = width * numComps;
|
377
|
+
var max = (1 << bpc) - 1;
|
378
|
+
var i = 0,
|
379
|
+
ii,
|
380
|
+
buf;
|
381
|
+
|
382
|
+
if (bpc === 1) {
|
383
|
+
var mask, loop1End, loop2End;
|
384
|
+
|
385
|
+
for (var j = 0; j < height; j++) {
|
386
|
+
loop1End = i + (rowComps & ~7);
|
387
|
+
loop2End = i + rowComps;
|
388
|
+
|
389
|
+
while (i < loop1End) {
|
390
|
+
buf = buffer[bufferPos++];
|
391
|
+
output[i] = buf >> 7 & 1;
|
392
|
+
output[i + 1] = buf >> 6 & 1;
|
393
|
+
output[i + 2] = buf >> 5 & 1;
|
394
|
+
output[i + 3] = buf >> 4 & 1;
|
395
|
+
output[i + 4] = buf >> 3 & 1;
|
396
|
+
output[i + 5] = buf >> 2 & 1;
|
397
|
+
output[i + 6] = buf >> 1 & 1;
|
398
|
+
output[i + 7] = buf & 1;
|
399
|
+
i += 8;
|
402
400
|
}
|
403
|
-
} else {
|
404
|
-
var bits = 0;
|
405
|
-
buf = 0;
|
406
401
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
bits = 0;
|
411
|
-
}
|
402
|
+
if (i < loop2End) {
|
403
|
+
buf = buffer[bufferPos++];
|
404
|
+
mask = 128;
|
412
405
|
|
413
|
-
while (
|
414
|
-
|
415
|
-
|
406
|
+
while (i < loop2End) {
|
407
|
+
output[i++] = +!!(buf & mask);
|
408
|
+
mask >>= 1;
|
416
409
|
}
|
410
|
+
}
|
411
|
+
}
|
412
|
+
} else {
|
413
|
+
var bits = 0;
|
414
|
+
buf = 0;
|
417
415
|
|
418
|
-
|
419
|
-
|
416
|
+
for (i = 0, ii = length; i < ii; ++i) {
|
417
|
+
if (i % rowComps === 0) {
|
418
|
+
buf = 0;
|
419
|
+
bits = 0;
|
420
|
+
}
|
420
421
|
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
422
|
+
while (bits < bpc) {
|
423
|
+
buf = buf << 8 | buffer[bufferPos++];
|
424
|
+
bits += 8;
|
425
|
+
}
|
426
|
+
|
427
|
+
var remainingBits = bits - bpc;
|
428
|
+
let value = buf >> remainingBits;
|
426
429
|
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
+
if (value < 0) {
|
431
|
+
value = 0;
|
432
|
+
} else if (value > max) {
|
433
|
+
value = max;
|
430
434
|
}
|
435
|
+
|
436
|
+
output[i] = value;
|
437
|
+
buf = buf & (1 << remainingBits) - 1;
|
438
|
+
bits = remainingBits;
|
431
439
|
}
|
440
|
+
}
|
432
441
|
|
433
|
-
|
434
|
-
|
442
|
+
return output;
|
443
|
+
}
|
435
444
|
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
445
|
+
fillOpacity(rgbaBuf, width, height, actualHeight, image) {
|
446
|
+
var smask = this.smask;
|
447
|
+
var mask = this.mask;
|
448
|
+
var alphaBuf, sw, sh, i, ii, j;
|
440
449
|
|
441
|
-
|
442
|
-
|
443
|
-
|
450
|
+
if (smask) {
|
451
|
+
sw = smask.width;
|
452
|
+
sh = smask.height;
|
453
|
+
alphaBuf = new Uint8ClampedArray(sw * sh);
|
454
|
+
smask.fillGrayBuffer(alphaBuf);
|
455
|
+
|
456
|
+
if (sw !== width || sh !== height) {
|
457
|
+
alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
|
458
|
+
}
|
459
|
+
} else if (mask) {
|
460
|
+
if (mask instanceof PDFImage) {
|
461
|
+
sw = mask.width;
|
462
|
+
sh = mask.height;
|
444
463
|
alphaBuf = new Uint8ClampedArray(sw * sh);
|
445
|
-
|
464
|
+
mask.numComps = 1;
|
465
|
+
mask.fillGrayBuffer(alphaBuf);
|
466
|
+
|
467
|
+
for (i = 0, ii = sw * sh; i < ii; ++i) {
|
468
|
+
alphaBuf[i] = 255 - alphaBuf[i];
|
469
|
+
}
|
446
470
|
|
447
471
|
if (sw !== width || sh !== height) {
|
448
|
-
alphaBuf = resizeImageMask(alphaBuf,
|
472
|
+
alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
|
449
473
|
}
|
450
|
-
} else if (mask) {
|
451
|
-
|
452
|
-
|
453
|
-
sh = mask.height;
|
454
|
-
alphaBuf = new Uint8ClampedArray(sw * sh);
|
455
|
-
mask.numComps = 1;
|
456
|
-
mask.fillGrayBuffer(alphaBuf);
|
457
|
-
|
458
|
-
for (i = 0, ii = sw * sh; i < ii; ++i) {
|
459
|
-
alphaBuf[i] = 255 - alphaBuf[i];
|
460
|
-
}
|
474
|
+
} else if (Array.isArray(mask)) {
|
475
|
+
alphaBuf = new Uint8ClampedArray(width * height);
|
476
|
+
var numComps = this.numComps;
|
461
477
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
for (i = 0, ii = width * height; i < ii; ++i) {
|
470
|
-
var opacity = 0;
|
471
|
-
var imageOffset = i * numComps;
|
472
|
-
|
473
|
-
for (j = 0; j < numComps; ++j) {
|
474
|
-
var color = image[imageOffset + j];
|
475
|
-
var maskOffset = j * 2;
|
476
|
-
|
477
|
-
if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
|
478
|
-
opacity = 255;
|
479
|
-
break;
|
480
|
-
}
|
481
|
-
}
|
478
|
+
for (i = 0, ii = width * height; i < ii; ++i) {
|
479
|
+
var opacity = 0;
|
480
|
+
var imageOffset = i * numComps;
|
481
|
+
|
482
|
+
for (j = 0; j < numComps; ++j) {
|
483
|
+
var color = image[imageOffset + j];
|
484
|
+
var maskOffset = j * 2;
|
482
485
|
|
483
|
-
|
486
|
+
if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
|
487
|
+
opacity = 255;
|
488
|
+
break;
|
489
|
+
}
|
484
490
|
}
|
485
|
-
} else {
|
486
|
-
throw new _util.FormatError("Unknown mask format.");
|
487
|
-
}
|
488
|
-
}
|
489
491
|
|
490
|
-
|
491
|
-
for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
|
492
|
-
rgbaBuf[j] = alphaBuf[i];
|
492
|
+
alphaBuf[i] = opacity;
|
493
493
|
}
|
494
494
|
} else {
|
495
|
-
|
496
|
-
rgbaBuf[j] = 255;
|
497
|
-
}
|
495
|
+
throw new _util.FormatError("Unknown mask format.");
|
498
496
|
}
|
499
|
-
}
|
500
|
-
|
501
|
-
undoPreblend(buffer, width, height) {
|
502
|
-
var matte = this.smask && this.smask.matte;
|
497
|
+
}
|
503
498
|
|
504
|
-
|
505
|
-
|
499
|
+
if (alphaBuf) {
|
500
|
+
for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
|
501
|
+
rgbaBuf[j] = alphaBuf[i];
|
502
|
+
}
|
503
|
+
} else {
|
504
|
+
for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
|
505
|
+
rgbaBuf[j] = 255;
|
506
506
|
}
|
507
|
+
}
|
508
|
+
}
|
507
509
|
|
508
|
-
|
509
|
-
|
510
|
-
var matteG = matteRgb[1];
|
511
|
-
var matteB = matteRgb[2];
|
512
|
-
var length = width * height * 4;
|
510
|
+
undoPreblend(buffer, width, height) {
|
511
|
+
var matte = this.smask && this.smask.matte;
|
513
512
|
|
514
|
-
|
515
|
-
|
513
|
+
if (!matte) {
|
514
|
+
return;
|
515
|
+
}
|
516
516
|
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
}
|
517
|
+
var matteRgb = this.colorSpace.getRgb(matte, 0);
|
518
|
+
var matteR = matteRgb[0];
|
519
|
+
var matteG = matteRgb[1];
|
520
|
+
var matteB = matteRgb[2];
|
521
|
+
var length = width * height * 4;
|
523
522
|
|
524
|
-
|
525
|
-
|
526
|
-
buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
|
527
|
-
buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
|
528
|
-
}
|
529
|
-
},
|
530
|
-
|
531
|
-
createImageData(forceRGBA = false) {
|
532
|
-
var drawWidth = this.drawWidth;
|
533
|
-
var drawHeight = this.drawHeight;
|
534
|
-
var imgData = {
|
535
|
-
width: drawWidth,
|
536
|
-
height: drawHeight,
|
537
|
-
kind: 0,
|
538
|
-
data: null
|
539
|
-
};
|
540
|
-
var numComps = this.numComps;
|
541
|
-
var originalWidth = this.width;
|
542
|
-
var originalHeight = this.height;
|
543
|
-
var bpc = this.bpc;
|
544
|
-
var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
|
545
|
-
var imgArray;
|
546
|
-
|
547
|
-
if (!forceRGBA) {
|
548
|
-
var kind;
|
549
|
-
|
550
|
-
if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
|
551
|
-
kind = _util.ImageKind.GRAYSCALE_1BPP;
|
552
|
-
} else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
|
553
|
-
kind = _util.ImageKind.RGB_24BPP;
|
554
|
-
}
|
523
|
+
for (var i = 0; i < length; i += 4) {
|
524
|
+
var alpha = buffer[i + 3];
|
555
525
|
|
556
|
-
|
557
|
-
|
558
|
-
|
526
|
+
if (alpha === 0) {
|
527
|
+
buffer[i] = 255;
|
528
|
+
buffer[i + 1] = 255;
|
529
|
+
buffer[i + 2] = 255;
|
530
|
+
continue;
|
531
|
+
}
|
559
532
|
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
}
|
533
|
+
var k = 255 / alpha;
|
534
|
+
buffer[i] = (buffer[i] - matteR) * k + matteR;
|
535
|
+
buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
|
536
|
+
buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
|
537
|
+
}
|
538
|
+
}
|
567
539
|
|
568
|
-
|
569
|
-
|
570
|
-
|
540
|
+
createImageData(forceRGBA = false) {
|
541
|
+
var drawWidth = this.drawWidth;
|
542
|
+
var drawHeight = this.drawHeight;
|
543
|
+
var imgData = {
|
544
|
+
width: drawWidth,
|
545
|
+
height: drawHeight,
|
546
|
+
kind: 0,
|
547
|
+
data: null
|
548
|
+
};
|
549
|
+
var numComps = this.numComps;
|
550
|
+
var originalWidth = this.width;
|
551
|
+
var originalHeight = this.height;
|
552
|
+
var bpc = this.bpc;
|
553
|
+
var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
|
554
|
+
var imgArray;
|
555
|
+
|
556
|
+
if (!forceRGBA) {
|
557
|
+
var kind;
|
558
|
+
|
559
|
+
if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
|
560
|
+
kind = _util.ImageKind.GRAYSCALE_1BPP;
|
561
|
+
} else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
|
562
|
+
kind = _util.ImageKind.RGB_24BPP;
|
563
|
+
}
|
571
564
|
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
}
|
565
|
+
if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
|
566
|
+
imgData.kind = kind;
|
567
|
+
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
576
568
|
|
577
|
-
|
569
|
+
if (this.image instanceof _stream.DecodeStream) {
|
570
|
+
imgData.data = imgArray;
|
571
|
+
} else {
|
572
|
+
var newArray = new Uint8ClampedArray(imgArray.length);
|
573
|
+
newArray.set(imgArray);
|
574
|
+
imgData.data = newArray;
|
578
575
|
}
|
579
576
|
|
580
|
-
if (this.
|
581
|
-
|
582
|
-
|
583
|
-
switch (this.colorSpace.name) {
|
584
|
-
case "DeviceGray":
|
585
|
-
imageLength *= 3;
|
577
|
+
if (this.needsDecode) {
|
578
|
+
(0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale.");
|
579
|
+
var buffer = imgData.data;
|
586
580
|
|
587
|
-
|
588
|
-
|
589
|
-
imgData.kind = _util.ImageKind.RGB_24BPP;
|
590
|
-
imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
|
591
|
-
return imgData;
|
581
|
+
for (var i = 0, ii = buffer.length; i < ii; i++) {
|
582
|
+
buffer[i] ^= 0xff;
|
592
583
|
}
|
593
584
|
}
|
585
|
+
|
586
|
+
return imgData;
|
594
587
|
}
|
595
588
|
|
596
|
-
|
597
|
-
|
598
|
-
var comps = this.getComponents(imgArray);
|
599
|
-
var alpha01, maybeUndoPreblend;
|
589
|
+
if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
|
590
|
+
let imageLength = originalHeight * rowBytes;
|
600
591
|
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
alpha01 = 0;
|
605
|
-
maybeUndoPreblend = false;
|
606
|
-
} else {
|
607
|
-
imgData.kind = _util.ImageKind.RGBA_32BPP;
|
608
|
-
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
|
609
|
-
alpha01 = 1;
|
610
|
-
maybeUndoPreblend = true;
|
611
|
-
this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
|
612
|
-
}
|
592
|
+
switch (this.colorSpace.name) {
|
593
|
+
case "DeviceGray":
|
594
|
+
imageLength *= 3;
|
613
595
|
|
614
|
-
|
615
|
-
|
596
|
+
case "DeviceRGB":
|
597
|
+
case "DeviceCMYK":
|
598
|
+
imgData.kind = _util.ImageKind.RGB_24BPP;
|
599
|
+
imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
|
600
|
+
return imgData;
|
601
|
+
}
|
616
602
|
}
|
603
|
+
}
|
617
604
|
|
618
|
-
|
605
|
+
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
606
|
+
var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
|
607
|
+
var comps = this.getComponents(imgArray);
|
608
|
+
var alpha01, maybeUndoPreblend;
|
619
609
|
|
620
|
-
|
621
|
-
|
622
|
-
|
610
|
+
if (!forceRGBA && !this.smask && !this.mask) {
|
611
|
+
imgData.kind = _util.ImageKind.RGB_24BPP;
|
612
|
+
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
|
613
|
+
alpha01 = 0;
|
614
|
+
maybeUndoPreblend = false;
|
615
|
+
} else {
|
616
|
+
imgData.kind = _util.ImageKind.RGBA_32BPP;
|
617
|
+
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
|
618
|
+
alpha01 = 1;
|
619
|
+
maybeUndoPreblend = true;
|
620
|
+
this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
|
621
|
+
}
|
623
622
|
|
624
|
-
|
625
|
-
|
623
|
+
if (this.needsDecode) {
|
624
|
+
this.decodeBuffer(comps);
|
625
|
+
}
|
626
626
|
|
627
|
-
|
628
|
-
var numComps = this.numComps;
|
627
|
+
this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
|
629
628
|
|
630
|
-
|
631
|
-
|
632
|
-
|
629
|
+
if (maybeUndoPreblend) {
|
630
|
+
this.undoPreblend(imgData.data, drawWidth, actualHeight);
|
631
|
+
}
|
633
632
|
|
634
|
-
|
635
|
-
|
636
|
-
var bpc = this.bpc;
|
637
|
-
var rowBytes = width * numComps * bpc + 7 >> 3;
|
638
|
-
var imgArray = this.getImageBytes(height * rowBytes);
|
639
|
-
var comps = this.getComponents(imgArray);
|
640
|
-
var i, length;
|
633
|
+
return imgData;
|
634
|
+
}
|
641
635
|
|
642
|
-
|
643
|
-
|
636
|
+
fillGrayBuffer(buffer) {
|
637
|
+
var numComps = this.numComps;
|
644
638
|
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
}
|
649
|
-
} else {
|
650
|
-
for (i = 0; i < length; ++i) {
|
651
|
-
buffer[i] = -comps[i] & 255;
|
652
|
-
}
|
653
|
-
}
|
639
|
+
if (numComps !== 1) {
|
640
|
+
throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);
|
641
|
+
}
|
654
642
|
|
655
|
-
|
656
|
-
|
643
|
+
var width = this.width;
|
644
|
+
var height = this.height;
|
645
|
+
var bpc = this.bpc;
|
646
|
+
var rowBytes = width * numComps * bpc + 7 >> 3;
|
647
|
+
var imgArray = this.getImageBytes(height * rowBytes);
|
648
|
+
var comps = this.getComponents(imgArray);
|
649
|
+
var i, length;
|
650
|
+
|
651
|
+
if (bpc === 1) {
|
652
|
+
length = width * height;
|
657
653
|
|
658
654
|
if (this.needsDecode) {
|
659
|
-
|
655
|
+
for (i = 0; i < length; ++i) {
|
656
|
+
buffer[i] = comps[i] - 1 & 255;
|
657
|
+
}
|
658
|
+
} else {
|
659
|
+
for (i = 0; i < length; ++i) {
|
660
|
+
buffer[i] = -comps[i] & 255;
|
661
|
+
}
|
660
662
|
}
|
661
663
|
|
662
|
-
|
663
|
-
|
664
|
+
return;
|
665
|
+
}
|
664
666
|
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
this.image.forceRGB = !!forceRGB;
|
675
|
-
return this.image.getBytes(length, true);
|
667
|
+
if (this.needsDecode) {
|
668
|
+
this.decodeBuffer(comps);
|
669
|
+
}
|
670
|
+
|
671
|
+
length = width * height;
|
672
|
+
var scale = 255 / ((1 << bpc) - 1);
|
673
|
+
|
674
|
+
for (i = 0; i < length; ++i) {
|
675
|
+
buffer[i] = scale * comps[i];
|
676
676
|
}
|
677
|
+
}
|
678
|
+
|
679
|
+
getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {
|
680
|
+
this.image.reset();
|
681
|
+
this.image.drawWidth = drawWidth || this.width;
|
682
|
+
this.image.drawHeight = drawHeight || this.height;
|
683
|
+
this.image.forceRGB = !!forceRGB;
|
684
|
+
return this.image.getBytes(length, true);
|
685
|
+
}
|
677
686
|
|
678
|
-
|
679
|
-
return PDFImage;
|
680
|
-
}();
|
687
|
+
}
|
681
688
|
|
682
689
|
exports.PDFImage = PDFImage;
|