pdfjs-dist 2.0.489 → 2.2.228
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/CODE_OF_CONDUCT.md +15 -0
- package/bower.json +1 -1
- package/build/pdf.js +18515 -11402
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +48266 -37137
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/external/url/url-lib.js +627 -0
- package/image_decoders/pdf.image_decoders.js +11350 -0
- package/image_decoders/pdf.image_decoders.js.map +1 -0
- package/image_decoders/pdf.image_decoders.min.js +1 -0
- package/lib/core/annotation.js +587 -242
- package/lib/core/arithmetic_decoder.js +275 -245
- package/lib/core/bidi.js +65 -6
- package/lib/core/ccitt.js +173 -18
- package/lib/core/ccitt_stream.js +15 -6
- package/lib/core/cff_parser.js +433 -61
- package/lib/core/charsets.js +5 -4
- package/lib/core/chunked_stream.js +400 -152
- package/lib/core/cmap.js +326 -87
- package/lib/core/colorspace.js +874 -594
- package/lib/core/core_utils.js +147 -0
- package/lib/core/crypto.js +290 -45
- package/lib/core/document.js +560 -268
- package/lib/core/encodings.js +19 -10
- package/lib/core/evaluator.js +1005 -360
- package/lib/core/font_renderer.js +331 -97
- package/lib/core/fonts.js +812 -195
- package/lib/core/function.js +284 -71
- package/lib/core/glyphlist.js +4 -3
- package/lib/core/image.js +169 -62
- package/lib/core/image_utils.js +111 -0
- package/lib/core/jbig2.js +479 -66
- package/lib/core/jbig2_stream.js +19 -8
- package/lib/core/jpeg_stream.js +38 -13
- package/lib/core/jpg.js +253 -29
- package/lib/core/jpx.js +396 -6
- package/lib/core/jpx_stream.js +18 -6
- package/lib/core/metrics.js +15 -15
- package/lib/core/murmurhash3.js +56 -34
- package/lib/core/obj.js +1354 -488
- package/lib/core/operator_list.js +144 -31
- package/lib/core/parser.js +539 -191
- package/lib/core/pattern.js +148 -14
- package/lib/core/pdf_manager.js +323 -133
- package/lib/core/primitives.js +111 -24
- package/lib/core/ps_parser.js +134 -45
- package/lib/core/standard_fonts.js +17 -17
- package/lib/core/stream.js +313 -34
- package/lib/core/type1_parser.js +143 -13
- package/lib/core/unicode.js +32 -5
- package/lib/core/worker.js +217 -190
- package/lib/core/worker_stream.js +277 -0
- package/lib/display/annotation_layer.js +450 -133
- package/lib/display/api.js +1597 -784
- package/lib/display/api_compatibility.js +11 -13
- package/lib/display/canvas.js +360 -44
- package/lib/display/content_disposition.js +83 -32
- package/lib/display/display_utils.js +747 -0
- package/lib/display/fetch_stream.js +221 -90
- package/lib/display/font_loader.js +468 -236
- package/lib/display/metadata.js +38 -16
- package/lib/display/network.js +635 -428
- package/lib/display/network_utils.js +32 -19
- package/lib/display/node_stream.js +367 -175
- package/lib/display/pattern_helper.js +81 -31
- package/lib/display/svg.js +1235 -519
- package/lib/display/text_layer.js +153 -29
- package/lib/display/transport_stream.js +345 -94
- package/lib/display/webgl.js +64 -18
- package/lib/display/worker_options.js +5 -4
- package/lib/display/xml_parser.js +166 -53
- package/lib/examples/node/domstubs.js +60 -4
- package/lib/pdf.js +36 -14
- package/lib/pdf.worker.js +5 -3
- package/lib/shared/compatibility.js +158 -564
- package/lib/shared/global_scope.js +2 -2
- package/lib/shared/is_node.js +4 -4
- package/lib/shared/message_handler.js +521 -0
- package/lib/shared/streams_polyfill.js +21 -17
- package/lib/shared/url_polyfill.js +56 -0
- package/lib/shared/util.js +243 -710
- package/lib/test/unit/annotation_spec.js +870 -401
- package/lib/test/unit/api_spec.js +657 -345
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +54 -11
- package/lib/test/unit/clitests_helper.js +10 -8
- package/lib/test/unit/cmap_spec.js +95 -41
- package/lib/test/unit/colorspace_spec.js +115 -63
- package/lib/test/unit/core_utils_spec.js +191 -0
- package/lib/test/unit/crypto_spec.js +17 -5
- package/lib/test/unit/custom_spec.js +43 -55
- package/lib/test/unit/display_svg_spec.js +34 -18
- package/lib/test/unit/display_utils_spec.js +273 -0
- package/lib/test/unit/document_spec.js +8 -13
- package/lib/test/unit/encodings_spec.js +25 -45
- package/lib/test/unit/evaluator_spec.js +38 -15
- package/lib/test/unit/fetch_stream_spec.js +109 -0
- package/lib/test/unit/function_spec.js +17 -5
- package/lib/test/unit/jasmine-boot.js +33 -20
- package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
- package/lib/test/unit/metadata_spec.js +71 -11
- package/lib/test/unit/murmurhash3_spec.js +3 -3
- package/lib/test/unit/network_spec.js +19 -54
- package/lib/test/unit/network_utils_spec.js +91 -14
- package/lib/test/unit/node_stream_spec.js +56 -32
- package/lib/test/unit/parser_spec.js +162 -71
- package/lib/test/unit/pdf_find_controller_spec.js +230 -0
- package/lib/test/unit/pdf_find_utils_spec.js +63 -0
- package/lib/test/unit/pdf_history_spec.js +21 -9
- package/lib/test/unit/primitives_spec.js +53 -20
- package/lib/test/unit/stream_spec.js +12 -4
- package/lib/test/unit/test_utils.js +273 -56
- package/lib/test/unit/testreporter.js +21 -3
- package/lib/test/unit/type1_parser_spec.js +8 -6
- package/lib/test/unit/ui_utils_spec.js +454 -16
- package/lib/test/unit/unicode_spec.js +18 -15
- package/lib/test/unit/util_spec.js +87 -128
- package/lib/web/annotation_layer_builder.js +39 -22
- package/lib/web/app.js +1290 -588
- package/lib/web/app_options.js +100 -62
- package/lib/web/base_viewer.js +511 -182
- package/lib/web/chromecom.js +261 -117
- package/lib/web/debugger.js +166 -22
- package/lib/web/download_manager.js +32 -13
- package/lib/web/firefox_print_service.js +20 -10
- package/lib/web/firefoxcom.js +315 -80
- package/lib/web/genericcom.js +89 -30
- package/lib/web/genericl10n.js +142 -30
- package/lib/web/grab_to_pan.js +28 -4
- package/lib/web/interfaces.js +170 -47
- package/lib/web/overlay_manager.js +235 -85
- package/lib/web/password_prompt.js +22 -14
- package/lib/web/pdf_attachment_viewer.js +38 -18
- package/lib/web/pdf_cursor_tools.js +39 -16
- package/lib/web/pdf_document_properties.js +255 -136
- package/lib/web/pdf_find_bar.js +84 -40
- package/lib/web/pdf_find_controller.js +495 -184
- package/lib/web/pdf_find_utils.js +111 -0
- package/lib/web/pdf_history.js +190 -53
- package/lib/web/pdf_link_service.js +138 -77
- package/lib/web/pdf_outline_viewer.js +122 -46
- package/lib/web/pdf_page_view.js +191 -67
- package/lib/web/pdf_presentation_mode.js +99 -34
- package/lib/web/pdf_print_service.js +61 -13
- package/lib/web/pdf_rendering_queue.js +28 -9
- package/lib/web/pdf_sidebar.js +141 -81
- package/lib/web/pdf_sidebar_resizer.js +42 -16
- package/lib/web/pdf_single_page_viewer.js +74 -66
- package/lib/web/pdf_thumbnail_view.js +104 -33
- package/lib/web/pdf_thumbnail_viewer.js +66 -26
- package/lib/web/pdf_viewer.component.js +112 -32
- package/lib/web/pdf_viewer.js +91 -52
- package/lib/web/preferences.js +284 -89
- package/lib/web/secondary_toolbar.js +165 -40
- package/lib/web/text_layer_builder.js +134 -59
- package/lib/web/toolbar.js +78 -43
- package/lib/web/ui_utils.js +462 -136
- package/lib/web/view_history.js +215 -67
- package/lib/web/viewer_compatibility.js +4 -13
- package/package.json +5 -4
- package/web/pdf_viewer.css +79 -11
- package/web/pdf_viewer.js +6107 -3748
- package/web/pdf_viewer.js.map +1 -1
- package/lib/display/dom_utils.js +0 -309
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/test/unit/fonts_spec.js +0 -81
- package/lib/web/dom_events.js +0 -137
package/lib/core/image.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @licstart The following is the entire license notice for the
|
3
3
|
* Javascript code in this page
|
4
4
|
*
|
5
|
-
* Copyright
|
5
|
+
* Copyright 2019 Mozilla Foundation
|
6
6
|
*
|
7
7
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
8
|
* you may not use this file except in compliance with the License.
|
@@ -19,41 +19,50 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
24
|
Object.defineProperty(exports, "__esModule", {
|
25
25
|
value: true
|
26
26
|
});
|
27
|
-
exports.PDFImage =
|
27
|
+
exports.PDFImage = void 0;
|
28
28
|
|
29
|
-
var
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
var
|
31
|
+
var _primitives = require("./primitives");
|
32
32
|
|
33
|
-
var
|
33
|
+
var _colorspace = require("./colorspace");
|
34
34
|
|
35
|
-
var
|
35
|
+
var _stream = require("./stream");
|
36
36
|
|
37
|
-
var
|
37
|
+
var _jpeg_stream = require("./jpeg_stream");
|
38
38
|
|
39
|
-
var
|
39
|
+
var _jpx = require("./jpx");
|
40
40
|
|
41
|
-
|
41
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
42
|
+
|
43
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
44
|
+
|
45
|
+
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
46
|
+
|
47
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
42
48
|
|
43
49
|
var PDFImage = function PDFImageClosure() {
|
44
50
|
function handleImageData(image, nativeDecoder) {
|
45
51
|
if (nativeDecoder && nativeDecoder.canDecode(image)) {
|
46
|
-
return nativeDecoder.decode(image)
|
52
|
+
return nativeDecoder.decode(image)["catch"](function (reason) {
|
47
53
|
(0, _util.warn)('Native image decoding failed -- trying to recover: ' + (reason && reason.message));
|
48
54
|
return image;
|
49
55
|
});
|
50
56
|
}
|
57
|
+
|
51
58
|
return Promise.resolve(image);
|
52
59
|
}
|
60
|
+
|
53
61
|
function decodeAndClamp(value, addend, coefficient, max) {
|
54
62
|
value = addend + value * coefficient;
|
55
63
|
return value < 0 ? 0 : value > max ? max : value;
|
56
64
|
}
|
65
|
+
|
57
66
|
function resizeImageMask(src, bpc, w1, h1, w2, h2) {
|
58
67
|
var length = w2 * h2;
|
59
68
|
var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
|
@@ -66,103 +75,140 @@ var PDFImage = function PDFImageClosure() {
|
|
66
75
|
oldIndex;
|
67
76
|
var xScaled = new Uint16Array(w2);
|
68
77
|
var w1Scanline = w1;
|
78
|
+
|
69
79
|
for (i = 0; i < w2; i++) {
|
70
80
|
xScaled[i] = Math.floor(i * xRatio);
|
71
81
|
}
|
82
|
+
|
72
83
|
for (i = 0; i < h2; i++) {
|
73
84
|
py = Math.floor(i * yRatio) * w1Scanline;
|
85
|
+
|
74
86
|
for (j = 0; j < w2; j++) {
|
75
87
|
oldIndex = py + xScaled[j];
|
76
88
|
dest[newIndex++] = src[oldIndex];
|
77
89
|
}
|
78
90
|
}
|
91
|
+
|
79
92
|
return dest;
|
80
93
|
}
|
94
|
+
|
81
95
|
function PDFImage(_ref) {
|
82
96
|
var xref = _ref.xref,
|
83
97
|
res = _ref.res,
|
84
98
|
image = _ref.image,
|
85
99
|
_ref$isInline = _ref.isInline,
|
86
|
-
isInline = _ref$isInline ===
|
100
|
+
isInline = _ref$isInline === void 0 ? false : _ref$isInline,
|
87
101
|
_ref$smask = _ref.smask,
|
88
|
-
smask = _ref$smask ===
|
102
|
+
smask = _ref$smask === void 0 ? null : _ref$smask,
|
89
103
|
_ref$mask = _ref.mask,
|
90
|
-
mask = _ref$mask ===
|
104
|
+
mask = _ref$mask === void 0 ? null : _ref$mask,
|
91
105
|
_ref$isMask = _ref.isMask,
|
92
|
-
isMask = _ref$isMask ===
|
106
|
+
isMask = _ref$isMask === void 0 ? false : _ref$isMask,
|
93
107
|
pdfFunctionFactory = _ref.pdfFunctionFactory;
|
94
|
-
|
95
108
|
this.image = image;
|
96
109
|
var dict = image.dict;
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
110
|
+
var filter = dict.get('Filter');
|
111
|
+
|
112
|
+
if ((0, _primitives.isName)(filter)) {
|
113
|
+
switch (filter.name) {
|
114
|
+
case 'JPXDecode':
|
115
|
+
var jpxImage = new _jpx.JpxImage();
|
116
|
+
jpxImage.parseImageProperties(image.stream);
|
117
|
+
image.stream.reset();
|
118
|
+
image.width = jpxImage.width;
|
119
|
+
image.height = jpxImage.height;
|
120
|
+
image.bitsPerComponent = jpxImage.bitsPerComponent;
|
121
|
+
image.numComps = jpxImage.componentsCount;
|
122
|
+
break;
|
123
|
+
|
124
|
+
case 'JBIG2Decode':
|
125
|
+
image.bitsPerComponent = 1;
|
126
|
+
image.numComps = 1;
|
127
|
+
break;
|
108
128
|
}
|
109
129
|
}
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
130
|
+
|
131
|
+
var width = dict.get('Width', 'W');
|
132
|
+
var height = dict.get('Height', 'H');
|
133
|
+
|
134
|
+
if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
|
135
|
+
(0, _util.warn)('PDFImage - using the Width/Height of the image data, ' + 'rather than the image dictionary.');
|
136
|
+
width = image.width;
|
137
|
+
height = image.height;
|
114
138
|
}
|
139
|
+
|
140
|
+
if (width < 1 || height < 1) {
|
141
|
+
throw new _util.FormatError("Invalid image width: ".concat(width, " or ") + "height: ".concat(height));
|
142
|
+
}
|
143
|
+
|
144
|
+
this.width = width;
|
145
|
+
this.height = height;
|
115
146
|
this.interpolate = dict.get('Interpolate', 'I') || false;
|
116
147
|
this.imageMask = dict.get('ImageMask', 'IM') || false;
|
117
148
|
this.matte = dict.get('Matte') || false;
|
118
149
|
var bitsPerComponent = image.bitsPerComponent;
|
150
|
+
|
119
151
|
if (!bitsPerComponent) {
|
120
152
|
bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
|
153
|
+
|
121
154
|
if (!bitsPerComponent) {
|
122
155
|
if (this.imageMask) {
|
123
156
|
bitsPerComponent = 1;
|
124
157
|
} else {
|
125
|
-
throw new _util.FormatError(
|
158
|
+
throw new _util.FormatError("Bits per component missing in image: ".concat(this.imageMask));
|
126
159
|
}
|
127
160
|
}
|
128
161
|
}
|
162
|
+
|
129
163
|
this.bpc = bitsPerComponent;
|
164
|
+
|
130
165
|
if (!this.imageMask) {
|
131
166
|
var colorSpace = dict.get('ColorSpace', 'CS');
|
167
|
+
|
132
168
|
if (!colorSpace) {
|
133
169
|
(0, _util.info)('JPX images (which do not require color spaces)');
|
170
|
+
|
134
171
|
switch (image.numComps) {
|
135
172
|
case 1:
|
136
173
|
colorSpace = _primitives.Name.get('DeviceGray');
|
137
174
|
break;
|
175
|
+
|
138
176
|
case 3:
|
139
177
|
colorSpace = _primitives.Name.get('DeviceRGB');
|
140
178
|
break;
|
179
|
+
|
141
180
|
case 4:
|
142
181
|
colorSpace = _primitives.Name.get('DeviceCMYK');
|
143
182
|
break;
|
183
|
+
|
144
184
|
default:
|
145
|
-
throw new Error(
|
185
|
+
throw new Error("JPX images with ".concat(image.numComps, " ") + 'color components not supported.');
|
146
186
|
}
|
147
187
|
}
|
188
|
+
|
148
189
|
var resources = isInline ? res : null;
|
149
190
|
this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, resources, pdfFunctionFactory);
|
150
191
|
this.numComps = this.colorSpace.numComps;
|
151
192
|
}
|
193
|
+
|
152
194
|
this.decode = dict.getArray('Decode', 'D');
|
153
195
|
this.needsDecode = false;
|
154
|
-
|
196
|
+
|
197
|
+
if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
|
155
198
|
this.needsDecode = true;
|
156
199
|
var max = (1 << bitsPerComponent) - 1;
|
157
200
|
this.decodeCoefficients = [];
|
158
201
|
this.decodeAddends = [];
|
202
|
+
var isIndexed = this.colorSpace && this.colorSpace.name === 'Indexed';
|
203
|
+
|
159
204
|
for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
|
160
205
|
var dmin = this.decode[i];
|
161
206
|
var dmax = this.decode[i + 1];
|
162
|
-
this.decodeCoefficients[j] = dmax - dmin;
|
163
|
-
this.decodeAddends[j] = max * dmin;
|
207
|
+
this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
|
208
|
+
this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
|
164
209
|
}
|
165
210
|
}
|
211
|
+
|
166
212
|
if (smask) {
|
167
213
|
this.smask = new PDFImage({
|
168
214
|
xref: xref,
|
@@ -175,6 +221,7 @@ var PDFImage = function PDFImageClosure() {
|
|
175
221
|
if ((0, _primitives.isStream)(mask)) {
|
176
222
|
var maskDict = mask.dict,
|
177
223
|
imageMask = maskDict.get('ImageMask', 'IM');
|
224
|
+
|
178
225
|
if (!imageMask) {
|
179
226
|
(0, _util.warn)('Ignoring /Mask in image without /ImageMask.');
|
180
227
|
} else {
|
@@ -192,27 +239,29 @@ var PDFImage = function PDFImageClosure() {
|
|
192
239
|
}
|
193
240
|
}
|
194
241
|
}
|
242
|
+
|
195
243
|
PDFImage.buildImage = function (_ref2) {
|
196
244
|
var handler = _ref2.handler,
|
197
245
|
xref = _ref2.xref,
|
198
246
|
res = _ref2.res,
|
199
247
|
image = _ref2.image,
|
200
248
|
_ref2$isInline = _ref2.isInline,
|
201
|
-
isInline = _ref2$isInline ===
|
249
|
+
isInline = _ref2$isInline === void 0 ? false : _ref2$isInline,
|
202
250
|
_ref2$nativeDecoder = _ref2.nativeDecoder,
|
203
|
-
nativeDecoder = _ref2$nativeDecoder ===
|
251
|
+
nativeDecoder = _ref2$nativeDecoder === void 0 ? null : _ref2$nativeDecoder,
|
204
252
|
pdfFunctionFactory = _ref2.pdfFunctionFactory;
|
205
|
-
|
206
253
|
var imagePromise = handleImageData(image, nativeDecoder);
|
207
254
|
var smaskPromise;
|
208
255
|
var maskPromise;
|
209
256
|
var smask = image.dict.get('SMask');
|
210
257
|
var mask = image.dict.get('Mask');
|
258
|
+
|
211
259
|
if (smask) {
|
212
260
|
smaskPromise = handleImageData(smask, nativeDecoder);
|
213
261
|
maskPromise = Promise.resolve(null);
|
214
262
|
} else {
|
215
263
|
smaskPromise = Promise.resolve(null);
|
264
|
+
|
216
265
|
if (mask) {
|
217
266
|
if ((0, _primitives.isStream)(mask)) {
|
218
267
|
maskPromise = handleImageData(mask, nativeDecoder);
|
@@ -226,6 +275,7 @@ var PDFImage = function PDFImageClosure() {
|
|
226
275
|
maskPromise = Promise.resolve(null);
|
227
276
|
}
|
228
277
|
}
|
278
|
+
|
229
279
|
return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (_ref3) {
|
230
280
|
var _ref4 = _slicedToArray(_ref3, 3),
|
231
281
|
imageData = _ref4[0],
|
@@ -243,47 +293,54 @@ var PDFImage = function PDFImageClosure() {
|
|
243
293
|
});
|
244
294
|
});
|
245
295
|
};
|
296
|
+
|
246
297
|
PDFImage.createMask = function (_ref5) {
|
247
298
|
var imgArray = _ref5.imgArray,
|
248
299
|
width = _ref5.width,
|
249
300
|
height = _ref5.height,
|
250
301
|
imageIsFromDecodeStream = _ref5.imageIsFromDecodeStream,
|
251
302
|
inverseDecode = _ref5.inverseDecode;
|
252
|
-
|
253
303
|
var computedLength = (width + 7 >> 3) * height;
|
254
304
|
var actualLength = imgArray.byteLength;
|
255
305
|
var haveFullData = computedLength === actualLength;
|
256
306
|
var data, i;
|
307
|
+
|
257
308
|
if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
|
258
309
|
data = imgArray;
|
259
310
|
} else if (!inverseDecode) {
|
260
|
-
data = new
|
311
|
+
data = new Uint8ClampedArray(actualLength);
|
261
312
|
data.set(imgArray);
|
262
313
|
} else {
|
263
|
-
data = new
|
314
|
+
data = new Uint8ClampedArray(computedLength);
|
264
315
|
data.set(imgArray);
|
316
|
+
|
265
317
|
for (i = actualLength; i < computedLength; i++) {
|
266
318
|
data[i] = 0xff;
|
267
319
|
}
|
268
320
|
}
|
321
|
+
|
269
322
|
if (inverseDecode) {
|
270
323
|
for (i = 0; i < actualLength; i++) {
|
271
324
|
data[i] ^= 0xFF;
|
272
325
|
}
|
273
326
|
}
|
327
|
+
|
274
328
|
return {
|
275
329
|
data: data,
|
276
330
|
width: width,
|
277
331
|
height: height
|
278
332
|
};
|
279
333
|
};
|
334
|
+
|
280
335
|
PDFImage.prototype = {
|
281
336
|
get drawWidth() {
|
282
337
|
return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
|
283
338
|
},
|
339
|
+
|
284
340
|
get drawHeight() {
|
285
341
|
return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
|
286
342
|
},
|
343
|
+
|
287
344
|
decodeBuffer: function decodeBuffer(buffer) {
|
288
345
|
var bpc = this.bpc;
|
289
346
|
var numComps = this.numComps;
|
@@ -291,13 +348,17 @@ var PDFImage = function PDFImageClosure() {
|
|
291
348
|
var decodeCoefficients = this.decodeCoefficients;
|
292
349
|
var max = (1 << bpc) - 1;
|
293
350
|
var i, ii;
|
351
|
+
|
294
352
|
if (bpc === 1) {
|
295
353
|
for (i = 0, ii = buffer.length; i < ii; i++) {
|
296
354
|
buffer[i] = +!buffer[i];
|
297
355
|
}
|
356
|
+
|
298
357
|
return;
|
299
358
|
}
|
359
|
+
|
300
360
|
var index = 0;
|
361
|
+
|
301
362
|
for (i = 0, ii = this.width * this.height; i < ii; i++) {
|
302
363
|
for (var j = 0; j < numComps; j++) {
|
303
364
|
buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
|
@@ -307,9 +368,11 @@ var PDFImage = function PDFImageClosure() {
|
|
307
368
|
},
|
308
369
|
getComponents: function getComponents(buffer) {
|
309
370
|
var bpc = this.bpc;
|
371
|
+
|
310
372
|
if (bpc === 8) {
|
311
373
|
return buffer;
|
312
374
|
}
|
375
|
+
|
313
376
|
var width = this.width;
|
314
377
|
var height = this.height;
|
315
378
|
var numComps = this.numComps;
|
@@ -321,11 +384,14 @@ var PDFImage = function PDFImageClosure() {
|
|
321
384
|
var i = 0,
|
322
385
|
ii,
|
323
386
|
buf;
|
387
|
+
|
324
388
|
if (bpc === 1) {
|
325
389
|
var mask, loop1End, loop2End;
|
390
|
+
|
326
391
|
for (var j = 0; j < height; j++) {
|
327
392
|
loop1End = i + (rowComps & ~7);
|
328
393
|
loop2End = i + rowComps;
|
394
|
+
|
329
395
|
while (i < loop1End) {
|
330
396
|
buf = buffer[bufferPos++];
|
331
397
|
output[i] = buf >> 7 & 1;
|
@@ -338,9 +404,11 @@ var PDFImage = function PDFImageClosure() {
|
|
338
404
|
output[i + 7] = buf & 1;
|
339
405
|
i += 8;
|
340
406
|
}
|
407
|
+
|
341
408
|
if (i < loop2End) {
|
342
409
|
buf = buffer[bufferPos++];
|
343
410
|
mask = 128;
|
411
|
+
|
344
412
|
while (i < loop2End) {
|
345
413
|
output[i++] = +!!(buf & mask);
|
346
414
|
mask >>= 1;
|
@@ -350,15 +418,18 @@ var PDFImage = function PDFImageClosure() {
|
|
350
418
|
} else {
|
351
419
|
var bits = 0;
|
352
420
|
buf = 0;
|
421
|
+
|
353
422
|
for (i = 0, ii = length; i < ii; ++i) {
|
354
423
|
if (i % rowComps === 0) {
|
355
424
|
buf = 0;
|
356
425
|
bits = 0;
|
357
426
|
}
|
427
|
+
|
358
428
|
while (bits < bpc) {
|
359
429
|
buf = buf << 8 | buffer[bufferPos++];
|
360
430
|
bits += 8;
|
361
431
|
}
|
432
|
+
|
362
433
|
var remainingBits = bits - bpc;
|
363
434
|
var value = buf >> remainingBits;
|
364
435
|
output[i] = value < 0 ? 0 : value > max ? max : value;
|
@@ -366,17 +437,20 @@ var PDFImage = function PDFImageClosure() {
|
|
366
437
|
bits = remainingBits;
|
367
438
|
}
|
368
439
|
}
|
440
|
+
|
369
441
|
return output;
|
370
442
|
},
|
371
443
|
fillOpacity: function fillOpacity(rgbaBuf, width, height, actualHeight, image) {
|
372
444
|
var smask = this.smask;
|
373
445
|
var mask = this.mask;
|
374
446
|
var alphaBuf, sw, sh, i, ii, j;
|
447
|
+
|
375
448
|
if (smask) {
|
376
449
|
sw = smask.width;
|
377
450
|
sh = smask.height;
|
378
|
-
alphaBuf = new
|
451
|
+
alphaBuf = new Uint8ClampedArray(sw * sh);
|
379
452
|
smask.fillGrayBuffer(alphaBuf);
|
453
|
+
|
380
454
|
if (sw !== width || sh !== height) {
|
381
455
|
alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
|
382
456
|
}
|
@@ -384,35 +458,42 @@ var PDFImage = function PDFImageClosure() {
|
|
384
458
|
if (mask instanceof PDFImage) {
|
385
459
|
sw = mask.width;
|
386
460
|
sh = mask.height;
|
387
|
-
alphaBuf = new
|
461
|
+
alphaBuf = new Uint8ClampedArray(sw * sh);
|
388
462
|
mask.numComps = 1;
|
389
463
|
mask.fillGrayBuffer(alphaBuf);
|
464
|
+
|
390
465
|
for (i = 0, ii = sw * sh; i < ii; ++i) {
|
391
466
|
alphaBuf[i] = 255 - alphaBuf[i];
|
392
467
|
}
|
468
|
+
|
393
469
|
if (sw !== width || sh !== height) {
|
394
470
|
alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
|
395
471
|
}
|
396
472
|
} else if (Array.isArray(mask)) {
|
397
|
-
alphaBuf = new
|
473
|
+
alphaBuf = new Uint8ClampedArray(width * height);
|
398
474
|
var numComps = this.numComps;
|
475
|
+
|
399
476
|
for (i = 0, ii = width * height; i < ii; ++i) {
|
400
477
|
var opacity = 0;
|
401
478
|
var imageOffset = i * numComps;
|
479
|
+
|
402
480
|
for (j = 0; j < numComps; ++j) {
|
403
481
|
var color = image[imageOffset + j];
|
404
482
|
var maskOffset = j * 2;
|
483
|
+
|
405
484
|
if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
|
406
485
|
opacity = 255;
|
407
486
|
break;
|
408
487
|
}
|
409
488
|
}
|
489
|
+
|
410
490
|
alphaBuf[i] = opacity;
|
411
491
|
}
|
412
492
|
} else {
|
413
493
|
throw new _util.FormatError('Unknown mask format.');
|
414
494
|
}
|
415
495
|
}
|
496
|
+
|
416
497
|
if (alphaBuf) {
|
417
498
|
for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
|
418
499
|
rgbaBuf[j] = alphaBuf[i];
|
@@ -425,40 +506,42 @@ var PDFImage = function PDFImageClosure() {
|
|
425
506
|
},
|
426
507
|
undoPreblend: function undoPreblend(buffer, width, height) {
|
427
508
|
var matte = this.smask && this.smask.matte;
|
509
|
+
|
428
510
|
if (!matte) {
|
429
511
|
return;
|
430
512
|
}
|
513
|
+
|
431
514
|
var matteRgb = this.colorSpace.getRgb(matte, 0);
|
432
515
|
var matteR = matteRgb[0];
|
433
516
|
var matteG = matteRgb[1];
|
434
517
|
var matteB = matteRgb[2];
|
435
518
|
var length = width * height * 4;
|
436
|
-
|
519
|
+
|
437
520
|
for (var i = 0; i < length; i += 4) {
|
438
521
|
var alpha = buffer[i + 3];
|
522
|
+
|
439
523
|
if (alpha === 0) {
|
440
524
|
buffer[i] = 255;
|
441
525
|
buffer[i + 1] = 255;
|
442
526
|
buffer[i + 2] = 255;
|
443
527
|
continue;
|
444
528
|
}
|
529
|
+
|
445
530
|
var k = 255 / alpha;
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;
|
450
|
-
buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;
|
451
|
-
buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;
|
531
|
+
buffer[i] = (buffer[i] - matteR) * k + matteR;
|
532
|
+
buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
|
533
|
+
buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
|
452
534
|
}
|
453
535
|
},
|
454
536
|
createImageData: function createImageData() {
|
455
537
|
var forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
456
|
-
|
457
538
|
var drawWidth = this.drawWidth;
|
458
539
|
var drawHeight = this.drawHeight;
|
459
540
|
var imgData = {
|
460
541
|
width: drawWidth,
|
461
|
-
height: drawHeight
|
542
|
+
height: drawHeight,
|
543
|
+
kind: 0,
|
544
|
+
data: null
|
462
545
|
};
|
463
546
|
var numComps = this.numComps;
|
464
547
|
var originalWidth = this.width;
|
@@ -466,37 +549,47 @@ var PDFImage = function PDFImageClosure() {
|
|
466
549
|
var bpc = this.bpc;
|
467
550
|
var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
|
468
551
|
var imgArray;
|
552
|
+
|
469
553
|
if (!forceRGBA) {
|
470
554
|
var kind;
|
555
|
+
|
471
556
|
if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
|
472
557
|
kind = _util.ImageKind.GRAYSCALE_1BPP;
|
473
558
|
} else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {
|
474
559
|
kind = _util.ImageKind.RGB_24BPP;
|
475
560
|
}
|
561
|
+
|
476
562
|
if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
|
477
563
|
imgData.kind = kind;
|
478
564
|
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
565
|
+
|
479
566
|
if (this.image instanceof _stream.DecodeStream) {
|
480
567
|
imgData.data = imgArray;
|
481
568
|
} else {
|
482
|
-
var newArray = new
|
569
|
+
var newArray = new Uint8ClampedArray(imgArray.length);
|
483
570
|
newArray.set(imgArray);
|
484
571
|
imgData.data = newArray;
|
485
572
|
}
|
573
|
+
|
486
574
|
if (this.needsDecode) {
|
487
|
-
(0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP);
|
575
|
+
(0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, 'PDFImage.createImageData: The image must be grayscale.');
|
488
576
|
var buffer = imgData.data;
|
577
|
+
|
489
578
|
for (var i = 0, ii = buffer.length; i < ii; i++) {
|
490
579
|
buffer[i] ^= 0xff;
|
491
580
|
}
|
492
581
|
}
|
582
|
+
|
493
583
|
return imgData;
|
494
584
|
}
|
585
|
+
|
495
586
|
if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
|
496
587
|
var imageLength = originalHeight * rowBytes;
|
588
|
+
|
497
589
|
switch (this.colorSpace.name) {
|
498
590
|
case 'DeviceGray':
|
499
591
|
imageLength *= 3;
|
592
|
+
|
500
593
|
case 'DeviceRGB':
|
501
594
|
case 'DeviceCMYK':
|
502
595
|
imgData.kind = _util.ImageKind.RGB_24BPP;
|
@@ -505,36 +598,44 @@ var PDFImage = function PDFImageClosure() {
|
|
505
598
|
}
|
506
599
|
}
|
507
600
|
}
|
601
|
+
|
508
602
|
imgArray = this.getImageBytes(originalHeight * rowBytes);
|
509
603
|
var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
|
510
604
|
var comps = this.getComponents(imgArray);
|
511
605
|
var alpha01, maybeUndoPreblend;
|
606
|
+
|
512
607
|
if (!forceRGBA && !this.smask && !this.mask) {
|
513
608
|
imgData.kind = _util.ImageKind.RGB_24BPP;
|
514
|
-
imgData.data = new
|
609
|
+
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
|
515
610
|
alpha01 = 0;
|
516
611
|
maybeUndoPreblend = false;
|
517
612
|
} else {
|
518
613
|
imgData.kind = _util.ImageKind.RGBA_32BPP;
|
519
|
-
imgData.data = new
|
614
|
+
imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
|
520
615
|
alpha01 = 1;
|
521
616
|
maybeUndoPreblend = true;
|
522
617
|
this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
|
523
618
|
}
|
619
|
+
|
524
620
|
if (this.needsDecode) {
|
525
621
|
this.decodeBuffer(comps);
|
526
622
|
}
|
623
|
+
|
527
624
|
this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
|
625
|
+
|
528
626
|
if (maybeUndoPreblend) {
|
529
627
|
this.undoPreblend(imgData.data, drawWidth, actualHeight);
|
530
628
|
}
|
629
|
+
|
531
630
|
return imgData;
|
532
631
|
},
|
533
632
|
fillGrayBuffer: function fillGrayBuffer(buffer) {
|
534
633
|
var numComps = this.numComps;
|
634
|
+
|
535
635
|
if (numComps !== 1) {
|
536
|
-
throw new _util.FormatError(
|
636
|
+
throw new _util.FormatError("Reading gray scale from a color image: ".concat(numComps));
|
537
637
|
}
|
638
|
+
|
538
639
|
var width = this.width;
|
539
640
|
var height = this.height;
|
540
641
|
var bpc = this.bpc;
|
@@ -542,8 +643,10 @@ var PDFImage = function PDFImageClosure() {
|
|
542
643
|
var imgArray = this.getImageBytes(height * rowBytes);
|
543
644
|
var comps = this.getComponents(imgArray);
|
544
645
|
var i, length;
|
646
|
+
|
545
647
|
if (bpc === 1) {
|
546
648
|
length = width * height;
|
649
|
+
|
547
650
|
if (this.needsDecode) {
|
548
651
|
for (i = 0; i < length; ++i) {
|
549
652
|
buffer[i] = comps[i] - 1 & 255;
|
@@ -553,27 +656,31 @@ var PDFImage = function PDFImageClosure() {
|
|
553
656
|
buffer[i] = -comps[i] & 255;
|
554
657
|
}
|
555
658
|
}
|
659
|
+
|
556
660
|
return;
|
557
661
|
}
|
662
|
+
|
558
663
|
if (this.needsDecode) {
|
559
664
|
this.decodeBuffer(comps);
|
560
665
|
}
|
666
|
+
|
561
667
|
length = width * height;
|
562
668
|
var scale = 255 / ((1 << bpc) - 1);
|
669
|
+
|
563
670
|
for (i = 0; i < length; ++i) {
|
564
|
-
buffer[i] = scale * comps[i]
|
671
|
+
buffer[i] = scale * comps[i];
|
565
672
|
}
|
566
673
|
},
|
567
674
|
getImageBytes: function getImageBytes(length, drawWidth, drawHeight) {
|
568
675
|
var forceRGB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
569
|
-
|
570
676
|
this.image.reset();
|
571
677
|
this.image.drawWidth = drawWidth || this.width;
|
572
678
|
this.image.drawHeight = drawHeight || this.height;
|
573
679
|
this.image.forceRGB = !!forceRGB;
|
574
|
-
return this.image.getBytes(length);
|
680
|
+
return this.image.getBytes(length, true);
|
575
681
|
}
|
576
682
|
};
|
577
683
|
return PDFImage;
|
578
684
|
}();
|
685
|
+
|
579
686
|
exports.PDFImage = PDFImage;
|