pdfjs-dist 2.3.200 → 2.4.456
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/README.md +4 -0
- package/bower.json +1 -1
- package/build/pdf.js +6499 -17971
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +22 -1
- package/build/pdf.worker.entry.js +5 -3
- package/build/pdf.worker.js +19303 -29896
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +22 -1
- package/es5/build/pdf.js +25473 -0
- package/es5/build/pdf.js.map +1 -0
- package/{lib/shared/global_scope.js → es5/build/pdf.worker.entry.js} +5 -10
- package/es5/build/pdf.worker.js +57878 -0
- package/es5/build/pdf.worker.js.map +1 -0
- package/es5/web/images/annotation-check.svg +11 -0
- package/es5/web/images/annotation-comment.svg +16 -0
- package/es5/web/images/annotation-help.svg +26 -0
- package/es5/web/images/annotation-insert.svg +10 -0
- package/es5/web/images/annotation-key.svg +11 -0
- package/es5/web/images/annotation-newparagraph.svg +11 -0
- package/es5/web/images/annotation-noicon.svg +7 -0
- package/es5/web/images/annotation-note.svg +42 -0
- package/es5/web/images/annotation-paragraph.svg +16 -0
- package/es5/web/images/loading-icon.gif +0 -0
- package/es5/web/images/shadow.png +0 -0
- package/es5/web/images/texture.png +0 -0
- package/es5/web/pdf_viewer.css +407 -0
- package/es5/web/pdf_viewer.js +7757 -0
- package/es5/web/pdf_viewer.js.map +1 -0
- package/image_decoders/pdf.image_decoders.js +1333 -4839
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +22 -1
- package/lib/README.md +7 -0
- package/lib/core/annotation.js +683 -1066
- package/lib/core/arithmetic_decoder.js +81 -97
- package/lib/core/bidi.js +54 -46
- package/lib/core/ccitt.js +88 -81
- package/lib/core/ccitt_stream.js +15 -14
- package/lib/core/cff_parser.js +196 -193
- package/lib/core/charsets.js +4 -4
- package/lib/core/chunked_stream.js +441 -569
- package/lib/core/cmap.js +220 -279
- package/lib/core/colorspace.js +699 -863
- package/lib/core/core_utils.js +59 -80
- package/lib/core/crypto.js +379 -437
- package/lib/core/document.js +564 -673
- package/lib/core/encodings.js +15 -15
- package/lib/core/evaluator.js +983 -889
- package/lib/core/font_renderer.js +128 -171
- package/lib/core/fonts.js +451 -400
- package/lib/core/function.js +289 -285
- package/lib/core/glyphlist.js +4527 -4527
- package/lib/core/image.js +138 -117
- package/lib/core/image_utils.js +46 -63
- package/lib/core/jbig2.js +324 -332
- package/lib/core/jbig2_stream.js +18 -17
- package/lib/core/jpeg_stream.js +133 -24
- package/lib/core/jpg.js +238 -210
- package/lib/core/jpx.js +158 -157
- package/lib/core/jpx_stream.js +28 -28
- package/lib/core/metrics.js +2928 -2928
- package/lib/core/murmurhash3.js +87 -102
- package/lib/core/obj.js +1111 -1302
- package/lib/core/operator_list.js +55 -42
- package/lib/core/parser.js +956 -987
- package/lib/core/pattern.js +69 -69
- package/lib/core/pdf_manager.js +149 -316
- package/lib/core/primitives.js +45 -77
- package/lib/core/ps_parser.js +175 -214
- package/lib/core/standard_fonts.js +237 -236
- package/lib/core/stream.js +83 -77
- package/lib/core/type1_parser.js +78 -68
- package/lib/core/unicode.js +1654 -1654
- package/lib/core/worker.js +148 -196
- package/lib/core/worker_stream.js +101 -210
- package/lib/display/annotation_layer.js +733 -1155
- package/lib/display/api.js +1539 -1928
- package/lib/display/api_compatibility.js +10 -8
- package/lib/display/canvas.js +159 -158
- package/lib/display/content_disposition.js +36 -55
- package/lib/display/display_utils.js +298 -551
- package/lib/display/fetch_stream.js +181 -305
- package/lib/display/font_loader.js +273 -416
- package/lib/display/metadata.js +86 -98
- package/lib/display/network.js +376 -511
- package/lib/display/network_utils.js +20 -19
- package/lib/display/node_stream.js +276 -460
- package/lib/display/pattern_helper.js +76 -44
- package/lib/display/svg.js +1137 -1405
- package/lib/display/text_layer.js +75 -82
- package/lib/display/transport_stream.js +236 -374
- package/lib/display/webgl.js +70 -83
- package/lib/display/worker_options.js +3 -3
- package/lib/display/xml_parser.js +303 -392
- package/lib/examples/node/domstubs.js +37 -37
- package/lib/pdf.js +22 -21
- package/lib/pdf.worker.js +5 -5
- package/lib/shared/compatibility.js +2 -251
- package/lib/shared/is_node.js +7 -6
- package/lib/shared/message_handler.js +222 -194
- package/lib/shared/util.js +269 -405
- package/lib/test/unit/annotation_spec.js +1089 -1014
- package/lib/test/unit/api_spec.js +617 -544
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +63 -62
- package/lib/test/unit/clitests_helper.js +7 -9
- package/lib/test/unit/cmap_spec.js +84 -86
- package/lib/test/unit/colorspace_spec.js +154 -154
- package/lib/test/unit/core_utils_spec.js +125 -105
- package/lib/test/unit/crypto_spec.js +181 -181
- package/lib/test/unit/custom_spec.js +22 -24
- package/lib/test/unit/display_svg_spec.js +35 -36
- package/lib/test/unit/display_utils_spec.js +139 -149
- package/lib/test/unit/document_spec.js +16 -16
- package/lib/test/unit/encodings_spec.js +12 -34
- package/lib/test/unit/evaluator_spec.js +81 -95
- package/lib/test/unit/fetch_stream_spec.js +30 -30
- package/lib/test/unit/function_spec.js +206 -204
- package/lib/test/unit/jasmine-boot.js +48 -32
- package/lib/test/unit/message_handler_spec.js +172 -162
- package/lib/test/unit/metadata_spec.js +69 -69
- package/lib/test/unit/murmurhash3_spec.js +12 -12
- package/lib/test/unit/network_spec.js +12 -12
- package/lib/test/unit/network_utils_spec.js +152 -152
- package/lib/test/unit/node_stream_spec.js +74 -90
- package/lib/test/unit/parser_spec.js +107 -113
- package/lib/test/unit/pdf_find_controller_spec.js +55 -86
- package/lib/test/unit/pdf_find_utils_spec.js +32 -32
- package/lib/test/unit/pdf_history_spec.js +32 -32
- package/lib/test/unit/primitives_spec.js +117 -115
- package/lib/test/unit/stream_spec.js +16 -14
- package/lib/test/unit/test_utils.js +119 -285
- package/lib/test/unit/testreporter.js +19 -19
- package/lib/test/unit/type1_parser_spec.js +41 -41
- package/lib/test/unit/ui_utils_spec.js +318 -426
- package/lib/test/unit/unicode_spec.js +42 -42
- package/lib/test/unit/util_spec.js +122 -143
- package/lib/web/annotation_layer_builder.js +66 -103
- package/lib/web/app.js +1166 -1196
- package/lib/web/app_options.js +61 -77
- package/lib/web/base_viewer.js +804 -850
- package/lib/web/chromecom.js +164 -249
- package/lib/web/debugger.js +149 -205
- package/lib/web/download_manager.js +38 -57
- package/lib/web/firefox_print_service.js +35 -30
- package/lib/web/firefoxcom.js +175 -374
- package/lib/web/genericcom.js +26 -108
- package/lib/web/genericl10n.js +24 -153
- package/lib/web/grab_to_pan.js +30 -30
- package/lib/web/interfaces.js +80 -258
- package/lib/web/overlay_manager.js +70 -246
- package/lib/web/password_prompt.js +38 -64
- package/lib/web/pdf_attachment_viewer.js +105 -130
- package/lib/web/pdf_cursor_tools.js +75 -102
- package/lib/web/pdf_document_properties.js +227 -376
- package/lib/web/pdf_find_bar.js +137 -171
- package/lib/web/pdf_find_controller.js +492 -549
- package/lib/web/pdf_find_utils.js +13 -13
- package/lib/web/pdf_history.js +395 -406
- package/lib/web/pdf_link_service.js +302 -349
- package/lib/web/pdf_outline_viewer.js +148 -209
- package/lib/web/pdf_page_view.js +449 -507
- package/lib/web/pdf_presentation_mode.js +304 -357
- package/lib/web/pdf_print_service.js +90 -104
- package/lib/web/pdf_rendering_queue.js +87 -108
- package/lib/web/pdf_sidebar.js +264 -304
- package/lib/web/pdf_sidebar_resizer.js +92 -119
- package/lib/web/pdf_single_page_viewer.js +77 -126
- package/lib/web/pdf_thumbnail_view.js +276 -297
- package/lib/web/pdf_thumbnail_viewer.js +186 -206
- package/lib/web/pdf_viewer.component.js +20 -21
- package/lib/web/pdf_viewer.js +55 -115
- package/lib/web/preferences.js +66 -273
- package/lib/web/secondary_toolbar.js +164 -196
- package/lib/web/text_layer_builder.js +284 -317
- package/lib/web/toolbar.js +216 -211
- package/lib/web/ui_utils.js +303 -404
- package/lib/web/view_history.js +49 -222
- package/lib/web/viewer_compatibility.js +7 -5
- package/package.json +2 -9
- package/web/pdf_viewer.css +25 -18
- package/web/pdf_viewer.js +3481 -4764
- package/web/pdf_viewer.js.map +1 -1
- package/webpack.js +14 -5
- package/lib/shared/streams_polyfill.js +0 -43
package/lib/core/jpg.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 2020 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.
|
@@ -26,67 +26,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
26
26
|
});
|
27
27
|
exports.JpegImage = void 0;
|
28
28
|
|
29
|
-
var _util = require("../shared/util");
|
29
|
+
var _util = require("../shared/util.js");
|
30
30
|
|
31
|
-
|
31
|
+
var _core_utils = require("./core_utils.js");
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
38
|
-
|
39
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
40
|
-
|
41
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
42
|
-
|
43
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
44
|
-
|
45
|
-
var JpegError =
|
46
|
-
/*#__PURE__*/
|
47
|
-
function (_BaseException) {
|
48
|
-
_inherits(JpegError, _BaseException);
|
49
|
-
|
50
|
-
function JpegError(msg) {
|
51
|
-
_classCallCheck(this, JpegError);
|
52
|
-
|
53
|
-
return _possibleConstructorReturn(this, _getPrototypeOf(JpegError).call(this, "JPEG error: ".concat(msg)));
|
33
|
+
class JpegError extends _util.BaseException {
|
34
|
+
constructor(msg) {
|
35
|
+
super(`JPEG error: ${msg}`);
|
54
36
|
}
|
55
37
|
|
56
|
-
|
57
|
-
}(_util.BaseException);
|
58
|
-
|
59
|
-
var DNLMarkerError =
|
60
|
-
/*#__PURE__*/
|
61
|
-
function (_BaseException2) {
|
62
|
-
_inherits(DNLMarkerError, _BaseException2);
|
63
|
-
|
64
|
-
function DNLMarkerError(message, scanLines) {
|
65
|
-
var _this;
|
38
|
+
}
|
66
39
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
return _this;
|
40
|
+
class DNLMarkerError extends _util.BaseException {
|
41
|
+
constructor(message, scanLines) {
|
42
|
+
super(message);
|
43
|
+
this.scanLines = scanLines;
|
72
44
|
}
|
73
45
|
|
74
|
-
|
75
|
-
}(_util.BaseException);
|
76
|
-
|
77
|
-
var EOIMarkerError =
|
78
|
-
/*#__PURE__*/
|
79
|
-
function (_BaseException3) {
|
80
|
-
_inherits(EOIMarkerError, _BaseException3);
|
81
|
-
|
82
|
-
function EOIMarkerError() {
|
83
|
-
_classCallCheck(this, EOIMarkerError);
|
84
|
-
|
85
|
-
return _possibleConstructorReturn(this, _getPrototypeOf(EOIMarkerError).apply(this, arguments));
|
86
|
-
}
|
46
|
+
}
|
87
47
|
|
88
|
-
|
89
|
-
}(_util.BaseException);
|
48
|
+
class EOIMarkerError extends _util.BaseException {}
|
90
49
|
|
91
50
|
var JpegImage = function JpegImageClosure() {
|
92
51
|
var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
|
@@ -99,13 +58,10 @@ var JpegImage = function JpegImageClosure() {
|
|
99
58
|
var dctSqrt2 = 5793;
|
100
59
|
var dctSqrt1d2 = 2896;
|
101
60
|
|
102
|
-
function JpegImage(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
_ref$colorTransform = _ref.colorTransform,
|
107
|
-
colorTransform = _ref$colorTransform === void 0 ? -1 : _ref$colorTransform;
|
108
|
-
|
61
|
+
function JpegImage({
|
62
|
+
decodeTransform = null,
|
63
|
+
colorTransform = -1
|
64
|
+
} = {}) {
|
109
65
|
this._decodeTransform = decodeTransform;
|
110
66
|
this._colorTransform = colorTransform;
|
111
67
|
}
|
@@ -169,8 +125,7 @@ var JpegImage = function JpegImageClosure() {
|
|
169
125
|
return 64 * ((component.blocksPerLine + 1) * row + col);
|
170
126
|
}
|
171
127
|
|
172
|
-
function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
|
173
|
-
var parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
|
128
|
+
function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) {
|
174
129
|
var mcusPerLine = frame.mcusPerLine;
|
175
130
|
var progressive = frame.progressive;
|
176
131
|
var startOffset = offset,
|
@@ -185,22 +140,31 @@ var JpegImage = function JpegImageClosure() {
|
|
185
140
|
|
186
141
|
bitsData = data[offset++];
|
187
142
|
|
188
|
-
if (bitsData ===
|
143
|
+
if (bitsData === 0xff) {
|
189
144
|
var nextByte = data[offset++];
|
190
145
|
|
191
146
|
if (nextByte) {
|
192
|
-
if (nextByte ===
|
147
|
+
if (nextByte === 0xdc && parseDNLMarker) {
|
148
|
+
offset += 2;
|
149
|
+
const scanLines = (0, _core_utils.readUint16)(data, offset);
|
193
150
|
offset += 2;
|
194
|
-
var scanLines = data[offset++] << 8 | data[offset++];
|
195
151
|
|
196
152
|
if (scanLines > 0 && scanLines !== frame.scanLines) {
|
197
|
-
throw new DNLMarkerError(
|
153
|
+
throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
|
154
|
+
}
|
155
|
+
} else if (nextByte === 0xd9) {
|
156
|
+
if (parseDNLMarker) {
|
157
|
+
const maybeScanLines = blockRow * 8;
|
158
|
+
|
159
|
+
if (maybeScanLines > 0 && maybeScanLines < frame.scanLines / 10) {
|
160
|
+
throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines);
|
161
|
+
}
|
198
162
|
}
|
199
|
-
|
200
|
-
throw new EOIMarkerError(
|
163
|
+
|
164
|
+
throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
|
201
165
|
}
|
202
166
|
|
203
|
-
throw new JpegError(
|
167
|
+
throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
|
204
168
|
}
|
205
169
|
}
|
206
170
|
|
@@ -214,13 +178,15 @@ var JpegImage = function JpegImageClosure() {
|
|
214
178
|
while (true) {
|
215
179
|
node = node[readBit()];
|
216
180
|
|
217
|
-
|
218
|
-
|
219
|
-
|
181
|
+
switch (typeof node) {
|
182
|
+
case "number":
|
183
|
+
return node;
|
220
184
|
|
221
|
-
|
222
|
-
|
185
|
+
case "object":
|
186
|
+
continue;
|
223
187
|
}
|
188
|
+
|
189
|
+
throw new JpegError("invalid huffman sequence");
|
224
190
|
}
|
225
191
|
}
|
226
192
|
|
@@ -330,8 +296,8 @@ var JpegImage = function JpegImageClosure() {
|
|
330
296
|
var rs;
|
331
297
|
|
332
298
|
while (k <= e) {
|
333
|
-
|
334
|
-
|
299
|
+
const offsetZ = offset + dctZigZag[k];
|
300
|
+
const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
|
335
301
|
|
336
302
|
switch (successiveACState) {
|
337
303
|
case 0:
|
@@ -349,7 +315,7 @@ var JpegImage = function JpegImageClosure() {
|
|
349
315
|
}
|
350
316
|
} else {
|
351
317
|
if (s !== 1) {
|
352
|
-
throw new JpegError(
|
318
|
+
throw new JpegError("invalid ACn encoding");
|
353
319
|
}
|
354
320
|
|
355
321
|
successiveACNextValue = receiveAndExtend(s);
|
@@ -402,17 +368,19 @@ var JpegImage = function JpegImageClosure() {
|
|
402
368
|
}
|
403
369
|
}
|
404
370
|
|
371
|
+
let blockRow = 0;
|
372
|
+
|
405
373
|
function decodeMcu(component, decode, mcu, row, col) {
|
406
374
|
var mcuRow = mcu / mcusPerLine | 0;
|
407
375
|
var mcuCol = mcu % mcusPerLine;
|
408
|
-
|
376
|
+
blockRow = mcuRow * component.v + row;
|
409
377
|
var blockCol = mcuCol * component.h + col;
|
410
378
|
var offset = getBlockBufferOffset(component, blockRow, blockCol);
|
411
379
|
decode(component, offset);
|
412
380
|
}
|
413
381
|
|
414
382
|
function decodeBlock(component, decode, mcu) {
|
415
|
-
|
383
|
+
blockRow = mcu / component.blocksPerLine | 0;
|
416
384
|
var blockCol = mcu % component.blocksPerLine;
|
417
385
|
var offset = getBlockBufferOffset(component, blockRow, blockCol);
|
418
386
|
decode(component, offset);
|
@@ -484,17 +452,17 @@ var JpegImage = function JpegImageClosure() {
|
|
484
452
|
if (!fileMarker) {
|
485
453
|
break;
|
486
454
|
} else if (fileMarker.invalid) {
|
487
|
-
(0, _util.warn)(
|
455
|
+
(0, _util.warn)("decodeScan - unexpected MCU data, current marker is: " + fileMarker.invalid);
|
488
456
|
offset = fileMarker.offset;
|
489
457
|
}
|
490
458
|
|
491
459
|
var marker = fileMarker && fileMarker.marker;
|
492
460
|
|
493
|
-
if (!marker || marker <=
|
494
|
-
throw new JpegError(
|
461
|
+
if (!marker || marker <= 0xff00) {
|
462
|
+
throw new JpegError("decodeScan - a valid marker was not found.");
|
495
463
|
}
|
496
464
|
|
497
|
-
if (marker >=
|
465
|
+
if (marker >= 0xffd0 && marker <= 0xffd7) {
|
498
466
|
offset += 2;
|
499
467
|
} else {
|
500
468
|
break;
|
@@ -504,7 +472,7 @@ var JpegImage = function JpegImageClosure() {
|
|
504
472
|
fileMarker = findNextFileMarker(data, offset);
|
505
473
|
|
506
474
|
if (fileMarker && fileMarker.invalid) {
|
507
|
-
(0, _util.warn)(
|
475
|
+
(0, _util.warn)("decodeScan - unexpected Scan data, current marker is: " + fileMarker.invalid);
|
508
476
|
offset = fileMarker.offset;
|
509
477
|
}
|
510
478
|
|
@@ -519,7 +487,7 @@ var JpegImage = function JpegImageClosure() {
|
|
519
487
|
var t;
|
520
488
|
|
521
489
|
if (!qt) {
|
522
|
-
throw new JpegError(
|
490
|
+
throw new JpegError("missing required Quantization Table.");
|
523
491
|
}
|
524
492
|
|
525
493
|
for (var row = 0; row < 64; row += 8) {
|
@@ -602,7 +570,15 @@ var JpegImage = function JpegImageClosure() {
|
|
602
570
|
|
603
571
|
if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
|
604
572
|
t = dctSqrt2 * p0 + 8192 >> 14;
|
605
|
-
|
573
|
+
|
574
|
+
if (t < -2040) {
|
575
|
+
t = 0;
|
576
|
+
} else if (t >= 2024) {
|
577
|
+
t = 255;
|
578
|
+
} else {
|
579
|
+
t = t + 2056 >> 4;
|
580
|
+
}
|
581
|
+
|
606
582
|
blockData[blockBufferOffset + col] = t;
|
607
583
|
blockData[blockBufferOffset + col + 8] = t;
|
608
584
|
blockData[blockBufferOffset + col + 16] = t;
|
@@ -649,14 +625,71 @@ var JpegImage = function JpegImageClosure() {
|
|
649
625
|
p5 = v2 - v5;
|
650
626
|
p3 = v3 + v4;
|
651
627
|
p4 = v3 - v4;
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
628
|
+
|
629
|
+
if (p0 < 16) {
|
630
|
+
p0 = 0;
|
631
|
+
} else if (p0 >= 4080) {
|
632
|
+
p0 = 255;
|
633
|
+
} else {
|
634
|
+
p0 >>= 4;
|
635
|
+
}
|
636
|
+
|
637
|
+
if (p1 < 16) {
|
638
|
+
p1 = 0;
|
639
|
+
} else if (p1 >= 4080) {
|
640
|
+
p1 = 255;
|
641
|
+
} else {
|
642
|
+
p1 >>= 4;
|
643
|
+
}
|
644
|
+
|
645
|
+
if (p2 < 16) {
|
646
|
+
p2 = 0;
|
647
|
+
} else if (p2 >= 4080) {
|
648
|
+
p2 = 255;
|
649
|
+
} else {
|
650
|
+
p2 >>= 4;
|
651
|
+
}
|
652
|
+
|
653
|
+
if (p3 < 16) {
|
654
|
+
p3 = 0;
|
655
|
+
} else if (p3 >= 4080) {
|
656
|
+
p3 = 255;
|
657
|
+
} else {
|
658
|
+
p3 >>= 4;
|
659
|
+
}
|
660
|
+
|
661
|
+
if (p4 < 16) {
|
662
|
+
p4 = 0;
|
663
|
+
} else if (p4 >= 4080) {
|
664
|
+
p4 = 255;
|
665
|
+
} else {
|
666
|
+
p4 >>= 4;
|
667
|
+
}
|
668
|
+
|
669
|
+
if (p5 < 16) {
|
670
|
+
p5 = 0;
|
671
|
+
} else if (p5 >= 4080) {
|
672
|
+
p5 = 255;
|
673
|
+
} else {
|
674
|
+
p5 >>= 4;
|
675
|
+
}
|
676
|
+
|
677
|
+
if (p6 < 16) {
|
678
|
+
p6 = 0;
|
679
|
+
} else if (p6 >= 4080) {
|
680
|
+
p6 = 255;
|
681
|
+
} else {
|
682
|
+
p6 >>= 4;
|
683
|
+
}
|
684
|
+
|
685
|
+
if (p7 < 16) {
|
686
|
+
p7 = 0;
|
687
|
+
} else if (p7 >= 4080) {
|
688
|
+
p7 = 255;
|
689
|
+
} else {
|
690
|
+
p7 >>= 4;
|
691
|
+
}
|
692
|
+
|
660
693
|
blockData[blockBufferOffset + col] = p0;
|
661
694
|
blockData[blockBufferOffset + col + 8] = p1;
|
662
695
|
blockData[blockBufferOffset + col + 16] = p2;
|
@@ -683,23 +716,17 @@ var JpegImage = function JpegImageClosure() {
|
|
683
716
|
return component.blockData;
|
684
717
|
}
|
685
718
|
|
686
|
-
function findNextFileMarker(data, currentPos) {
|
687
|
-
|
688
|
-
|
689
|
-
function peekUint16(pos) {
|
690
|
-
return data[pos] << 8 | data[pos + 1];
|
691
|
-
}
|
692
|
-
|
693
|
-
var maxPos = data.length - 1;
|
719
|
+
function findNextFileMarker(data, currentPos, startPos = currentPos) {
|
720
|
+
const maxPos = data.length - 1;
|
694
721
|
var newPos = startPos < currentPos ? startPos : currentPos;
|
695
722
|
|
696
723
|
if (currentPos >= maxPos) {
|
697
724
|
return null;
|
698
725
|
}
|
699
726
|
|
700
|
-
var currentMarker =
|
727
|
+
var currentMarker = (0, _core_utils.readUint16)(data, currentPos);
|
701
728
|
|
702
|
-
if (currentMarker >=
|
729
|
+
if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
|
703
730
|
return {
|
704
731
|
invalid: null,
|
705
732
|
marker: currentMarker,
|
@@ -707,14 +734,14 @@ var JpegImage = function JpegImageClosure() {
|
|
707
734
|
};
|
708
735
|
}
|
709
736
|
|
710
|
-
var newMarker =
|
737
|
+
var newMarker = (0, _core_utils.readUint16)(data, newPos);
|
711
738
|
|
712
|
-
while (!(newMarker >=
|
739
|
+
while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
|
713
740
|
if (++newPos >= maxPos) {
|
714
741
|
return null;
|
715
742
|
}
|
716
743
|
|
717
|
-
newMarker =
|
744
|
+
newMarker = (0, _core_utils.readUint16)(data, newPos);
|
718
745
|
}
|
719
746
|
|
720
747
|
return {
|
@@ -725,24 +752,17 @@ var JpegImage = function JpegImageClosure() {
|
|
725
752
|
}
|
726
753
|
|
727
754
|
JpegImage.prototype = {
|
728
|
-
parse
|
729
|
-
|
730
|
-
|
731
|
-
dnlScanLines = _ref2$dnlScanLines === void 0 ? null : _ref2$dnlScanLines;
|
732
|
-
|
733
|
-
function readUint16() {
|
734
|
-
var value = data[offset] << 8 | data[offset + 1];
|
735
|
-
offset += 2;
|
736
|
-
return value;
|
737
|
-
}
|
738
|
-
|
755
|
+
parse(data, {
|
756
|
+
dnlScanLines = null
|
757
|
+
} = {}) {
|
739
758
|
function readDataBlock() {
|
740
|
-
|
741
|
-
|
759
|
+
const length = (0, _core_utils.readUint16)(data, offset);
|
760
|
+
offset += 2;
|
761
|
+
let endOffset = offset + length - 2;
|
742
762
|
var fileMarker = findNextFileMarker(data, endOffset, offset);
|
743
763
|
|
744
764
|
if (fileMarker && fileMarker.invalid) {
|
745
|
-
(0, _util.warn)(
|
765
|
+
(0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
|
746
766
|
endOffset = fileMarker.offset;
|
747
767
|
}
|
748
768
|
|
@@ -775,43 +795,45 @@ var JpegImage = function JpegImageClosure() {
|
|
775
795
|
var jfif = null;
|
776
796
|
var adobe = null;
|
777
797
|
var frame, resetInterval;
|
778
|
-
|
798
|
+
let numSOSMarkers = 0;
|
779
799
|
var quantizationTables = [];
|
780
800
|
var huffmanTablesAC = [],
|
781
801
|
huffmanTablesDC = [];
|
782
|
-
|
802
|
+
let fileMarker = (0, _core_utils.readUint16)(data, offset);
|
803
|
+
offset += 2;
|
783
804
|
|
784
|
-
if (fileMarker !==
|
785
|
-
throw new JpegError(
|
805
|
+
if (fileMarker !== 0xffd8) {
|
806
|
+
throw new JpegError("SOI not found");
|
786
807
|
}
|
787
808
|
|
788
|
-
fileMarker = readUint16();
|
809
|
+
fileMarker = (0, _core_utils.readUint16)(data, offset);
|
810
|
+
offset += 2;
|
789
811
|
|
790
|
-
markerLoop: while (fileMarker !==
|
812
|
+
markerLoop: while (fileMarker !== 0xffd9) {
|
791
813
|
var i, j, l;
|
792
814
|
|
793
815
|
switch (fileMarker) {
|
794
|
-
case
|
795
|
-
case
|
796
|
-
case
|
797
|
-
case
|
798
|
-
case
|
799
|
-
case
|
800
|
-
case
|
801
|
-
case
|
802
|
-
case
|
803
|
-
case
|
804
|
-
case
|
805
|
-
case
|
806
|
-
case
|
807
|
-
case
|
808
|
-
case
|
809
|
-
case
|
810
|
-
case
|
816
|
+
case 0xffe0:
|
817
|
+
case 0xffe1:
|
818
|
+
case 0xffe2:
|
819
|
+
case 0xffe3:
|
820
|
+
case 0xffe4:
|
821
|
+
case 0xffe5:
|
822
|
+
case 0xffe6:
|
823
|
+
case 0xffe7:
|
824
|
+
case 0xffe8:
|
825
|
+
case 0xffe9:
|
826
|
+
case 0xffea:
|
827
|
+
case 0xffeb:
|
828
|
+
case 0xffec:
|
829
|
+
case 0xffed:
|
830
|
+
case 0xffee:
|
831
|
+
case 0xffef:
|
832
|
+
case 0xfffe:
|
811
833
|
var appData = readDataBlock();
|
812
834
|
|
813
|
-
if (fileMarker ===
|
814
|
-
if (appData[0] ===
|
835
|
+
if (fileMarker === 0xffe0) {
|
836
|
+
if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
|
815
837
|
jfif = {
|
816
838
|
version: {
|
817
839
|
major: appData[5],
|
@@ -827,8 +849,8 @@ var JpegImage = function JpegImageClosure() {
|
|
827
849
|
}
|
828
850
|
}
|
829
851
|
|
830
|
-
if (fileMarker ===
|
831
|
-
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] ===
|
852
|
+
if (fileMarker === 0xffee) {
|
853
|
+
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {
|
832
854
|
adobe = {
|
833
855
|
version: appData[5] << 8 | appData[6],
|
834
856
|
flags0: appData[7] << 8 | appData[8],
|
@@ -840,8 +862,9 @@ var JpegImage = function JpegImageClosure() {
|
|
840
862
|
|
841
863
|
break;
|
842
864
|
|
843
|
-
case
|
844
|
-
|
865
|
+
case 0xffdb:
|
866
|
+
const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);
|
867
|
+
offset += 2;
|
845
868
|
var quantizationTablesEnd = quantizationTablesLength + offset - 2;
|
846
869
|
var z;
|
847
870
|
|
@@ -857,10 +880,11 @@ var JpegImage = function JpegImageClosure() {
|
|
857
880
|
} else if (quantizationTableSpec >> 4 === 1) {
|
858
881
|
for (j = 0; j < 64; j++) {
|
859
882
|
z = dctZigZag[j];
|
860
|
-
tableData[z] = readUint16();
|
883
|
+
tableData[z] = (0, _core_utils.readUint16)(data, offset);
|
884
|
+
offset += 2;
|
861
885
|
}
|
862
886
|
} else {
|
863
|
-
throw new JpegError(
|
887
|
+
throw new JpegError("DQT - invalid table spec");
|
864
888
|
}
|
865
889
|
|
866
890
|
quantizationTables[quantizationTableSpec & 15] = tableData;
|
@@ -868,21 +892,23 @@ var JpegImage = function JpegImageClosure() {
|
|
868
892
|
|
869
893
|
break;
|
870
894
|
|
871
|
-
case
|
872
|
-
case
|
873
|
-
case
|
895
|
+
case 0xffc0:
|
896
|
+
case 0xffc1:
|
897
|
+
case 0xffc2:
|
874
898
|
if (frame) {
|
875
|
-
throw new JpegError(
|
899
|
+
throw new JpegError("Only single frame JPEGs supported");
|
876
900
|
}
|
877
901
|
|
878
|
-
|
902
|
+
offset += 2;
|
879
903
|
frame = {};
|
880
|
-
frame.extended = fileMarker ===
|
881
|
-
frame.progressive = fileMarker ===
|
904
|
+
frame.extended = fileMarker === 0xffc1;
|
905
|
+
frame.progressive = fileMarker === 0xffc2;
|
882
906
|
frame.precision = data[offset++];
|
883
|
-
|
907
|
+
const sofScanLines = (0, _core_utils.readUint16)(data, offset);
|
908
|
+
offset += 2;
|
884
909
|
frame.scanLines = dnlScanLines || sofScanLines;
|
885
|
-
frame.samplesPerLine = readUint16();
|
910
|
+
frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);
|
911
|
+
offset += 2;
|
886
912
|
frame.components = [];
|
887
913
|
frame.componentIds = {};
|
888
914
|
var componentsCount = data[offset++],
|
@@ -905,8 +931,8 @@ var JpegImage = function JpegImageClosure() {
|
|
905
931
|
|
906
932
|
var qId = data[offset + 2];
|
907
933
|
l = frame.components.push({
|
908
|
-
h
|
909
|
-
v
|
934
|
+
h,
|
935
|
+
v,
|
910
936
|
quantizationId: qId,
|
911
937
|
quantizationTable: null
|
912
938
|
});
|
@@ -919,8 +945,9 @@ var JpegImage = function JpegImageClosure() {
|
|
919
945
|
prepareComponents(frame);
|
920
946
|
break;
|
921
947
|
|
922
|
-
case
|
923
|
-
|
948
|
+
case 0xffc4:
|
949
|
+
const huffmanLength = (0, _core_utils.readUint16)(data, offset);
|
950
|
+
offset += 2;
|
924
951
|
|
925
952
|
for (i = 2; i < huffmanLength;) {
|
926
953
|
var huffmanTableSpec = data[offset++];
|
@@ -943,14 +970,15 @@ var JpegImage = function JpegImageClosure() {
|
|
943
970
|
|
944
971
|
break;
|
945
972
|
|
946
|
-
case
|
947
|
-
|
948
|
-
resetInterval = readUint16();
|
973
|
+
case 0xffdd:
|
974
|
+
offset += 2;
|
975
|
+
resetInterval = (0, _core_utils.readUint16)(data, offset);
|
976
|
+
offset += 2;
|
949
977
|
break;
|
950
978
|
|
951
|
-
case
|
952
|
-
|
953
|
-
|
979
|
+
case 0xffda:
|
980
|
+
const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
|
981
|
+
offset += 2;
|
954
982
|
var selectorsCount = data[offset++];
|
955
983
|
var components = [],
|
956
984
|
component;
|
@@ -973,12 +1001,12 @@ var JpegImage = function JpegImageClosure() {
|
|
973
1001
|
offset += processed;
|
974
1002
|
} catch (ex) {
|
975
1003
|
if (ex instanceof DNLMarkerError) {
|
976
|
-
(0, _util.warn)(
|
1004
|
+
(0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);
|
977
1005
|
return this.parse(data, {
|
978
1006
|
dnlScanLines: ex.scanLines
|
979
1007
|
});
|
980
1008
|
} else if (ex instanceof EOIMarkerError) {
|
981
|
-
(0, _util.warn)(
|
1009
|
+
(0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);
|
982
1010
|
break markerLoop;
|
983
1011
|
}
|
984
1012
|
|
@@ -987,40 +1015,36 @@ var JpegImage = function JpegImageClosure() {
|
|
987
1015
|
|
988
1016
|
break;
|
989
1017
|
|
990
|
-
case
|
1018
|
+
case 0xffdc:
|
991
1019
|
offset += 4;
|
992
1020
|
break;
|
993
1021
|
|
994
|
-
case
|
995
|
-
if (data[offset] !==
|
1022
|
+
case 0xffff:
|
1023
|
+
if (data[offset] !== 0xff) {
|
996
1024
|
offset--;
|
997
1025
|
}
|
998
1026
|
|
999
1027
|
break;
|
1000
1028
|
|
1001
1029
|
default:
|
1002
|
-
|
1003
|
-
offset -= 3;
|
1004
|
-
break;
|
1005
|
-
}
|
1006
|
-
|
1007
|
-
var nextFileMarker = findNextFileMarker(data, offset - 2);
|
1030
|
+
const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
|
1008
1031
|
|
1009
1032
|
if (nextFileMarker && nextFileMarker.invalid) {
|
1010
|
-
(0, _util.warn)(
|
1033
|
+
(0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid);
|
1011
1034
|
offset = nextFileMarker.offset;
|
1012
1035
|
break;
|
1013
1036
|
}
|
1014
1037
|
|
1015
|
-
if (offset
|
1016
|
-
(0, _util.warn)(
|
1038
|
+
if (offset >= data.length - 1) {
|
1039
|
+
(0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9).");
|
1017
1040
|
break markerLoop;
|
1018
1041
|
}
|
1019
1042
|
|
1020
|
-
throw new JpegError(
|
1043
|
+
throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
|
1021
1044
|
}
|
1022
1045
|
|
1023
|
-
fileMarker = readUint16();
|
1046
|
+
fileMarker = (0, _core_utils.readUint16)(data, offset);
|
1047
|
+
offset += 2;
|
1024
1048
|
}
|
1025
1049
|
|
1026
1050
|
this.width = frame.samplesPerLine;
|
@@ -1049,8 +1073,8 @@ var JpegImage = function JpegImageClosure() {
|
|
1049
1073
|
this.numComponents = this.components.length;
|
1050
1074
|
return undefined;
|
1051
1075
|
},
|
1052
|
-
|
1053
|
-
|
1076
|
+
|
1077
|
+
_getLinearizedBlockData(width, height, isSourcePDF = false) {
|
1054
1078
|
var scaleX = this.width / width,
|
1055
1079
|
scaleY = this.height / height;
|
1056
1080
|
var component, componentScaleX, componentScaleY, blocksPerScanline;
|
@@ -1063,6 +1087,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1063
1087
|
var data = new Uint8ClampedArray(dataLength);
|
1064
1088
|
var xScaleBlockOffset = new Uint32Array(width);
|
1065
1089
|
var mask3LSB = 0xfffffff8;
|
1090
|
+
let lastComponentScaleX;
|
1066
1091
|
|
1067
1092
|
for (i = 0; i < numComponents; i++) {
|
1068
1093
|
component = this.components[i];
|
@@ -1072,9 +1097,13 @@ var JpegImage = function JpegImageClosure() {
|
|
1072
1097
|
output = component.output;
|
1073
1098
|
blocksPerScanline = component.blocksPerLine + 1 << 3;
|
1074
1099
|
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1100
|
+
if (componentScaleX !== lastComponentScaleX) {
|
1101
|
+
for (x = 0; x < width; x++) {
|
1102
|
+
j = 0 | x * componentScaleX;
|
1103
|
+
xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
|
1104
|
+
}
|
1105
|
+
|
1106
|
+
lastComponentScaleX = componentScaleX;
|
1078
1107
|
}
|
1079
1108
|
|
1080
1109
|
for (y = 0; y < height; y++) {
|
@@ -1088,7 +1117,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1088
1117
|
}
|
1089
1118
|
}
|
1090
1119
|
|
1091
|
-
|
1120
|
+
let transform = this._decodeTransform;
|
1092
1121
|
|
1093
1122
|
if (!isSourcePDF && numComponents === 4 && !transform) {
|
1094
1123
|
transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
|
@@ -1172,30 +1201,28 @@ var JpegImage = function JpegImageClosure() {
|
|
1172
1201
|
_convertCmykToRgb: function convertCmykToRgb(data) {
|
1173
1202
|
var c, m, y, k;
|
1174
1203
|
var offset = 0;
|
1175
|
-
var scale = 1 / 255;
|
1176
1204
|
|
1177
1205
|
for (var i = 0, length = data.length; i < length; i += 4) {
|
1178
|
-
c = data[i]
|
1179
|
-
m = data[i + 1]
|
1180
|
-
y = data[i + 2]
|
1181
|
-
k = data[i + 3]
|
1182
|
-
data[offset++] = 255 + c * (-
|
1183
|
-
data[offset++] = 255 + c * (
|
1184
|
-
data[offset++] = 255 + c * (0.
|
1206
|
+
c = data[i];
|
1207
|
+
m = data[i + 1];
|
1208
|
+
y = data[i + 2];
|
1209
|
+
k = data[i + 3];
|
1210
|
+
data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254);
|
1211
|
+
data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.00031891311758832814 * k + 0.7364883807733168);
|
1212
|
+
data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144);
|
1185
1213
|
}
|
1186
1214
|
|
1187
1215
|
return data.subarray(0, offset);
|
1188
1216
|
},
|
1189
|
-
getData: function getData(_ref3) {
|
1190
|
-
var width = _ref3.width,
|
1191
|
-
height = _ref3.height,
|
1192
|
-
_ref3$forceRGB = _ref3.forceRGB,
|
1193
|
-
forceRGB = _ref3$forceRGB === void 0 ? false : _ref3$forceRGB,
|
1194
|
-
_ref3$isSourcePDF = _ref3.isSourcePDF,
|
1195
|
-
isSourcePDF = _ref3$isSourcePDF === void 0 ? false : _ref3$isSourcePDF;
|
1196
1217
|
|
1218
|
+
getData({
|
1219
|
+
width,
|
1220
|
+
height,
|
1221
|
+
forceRGB = false,
|
1222
|
+
isSourcePDF = false
|
1223
|
+
}) {
|
1197
1224
|
if (this.numComponents > 4) {
|
1198
|
-
throw new JpegError(
|
1225
|
+
throw new JpegError("Unsupported color mode");
|
1199
1226
|
}
|
1200
1227
|
|
1201
1228
|
var data = this._getLinearizedBlockData(width, height, isSourcePDF);
|
@@ -1229,6 +1256,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1229
1256
|
|
1230
1257
|
return data;
|
1231
1258
|
}
|
1259
|
+
|
1232
1260
|
};
|
1233
1261
|
return JpegImage;
|
1234
1262
|
}();
|