pdfjs-dist 2.2.228 → 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/README.md +4 -0
- package/bower.json +1 -1
- package/build/pdf.js +8816 -19300
- 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 +27185 -35746
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +22 -1
- package/es5/build/pdf.js +26665 -0
- package/es5/build/pdf.js.map +1 -0
- package/es5/build/pdf.min.js +22 -0
- package/{lib/shared/global_scope.js → es5/build/pdf.worker.entry.js} +5 -10
- package/es5/build/pdf.worker.js +61231 -0
- package/es5/build/pdf.worker.js.map +1 -0
- 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/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/pdf_viewer.css +406 -0
- package/es5/web/pdf_viewer.js +7886 -0
- package/es5/web/pdf_viewer.js.map +1 -0
- package/image_decoders/pdf.image_decoders.js +1498 -4832
- 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 +1144 -927
- 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 +747 -716
- package/lib/core/charsets.js +4 -4
- package/lib/core/chunked_stream.js +462 -553
- package/lib/core/cmap.js +231 -277
- package/lib/core/colorspace.js +715 -857
- package/lib/core/core_utils.js +57 -52
- package/lib/core/crypto.js +416 -437
- package/lib/core/document.js +629 -670
- package/lib/core/encodings.js +15 -15
- package/lib/core/evaluator.js +3229 -2800
- package/lib/core/font_renderer.js +135 -178
- package/lib/core/fonts.js +602 -534
- package/lib/core/function.js +355 -279
- package/lib/core/glyphlist.js +4527 -4526
- package/lib/core/image.js +442 -439
- package/lib/core/image_utils.js +221 -61
- package/lib/core/jbig2.js +325 -316
- package/lib/core/jbig2_stream.js +18 -17
- package/lib/core/jpeg_stream.js +21 -26
- package/lib/core/jpg.js +289 -233
- package/lib/core/jpx.js +161 -143
- 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 +1343 -1300
- package/lib/core/operator_list.js +90 -67
- package/lib/core/parser.js +990 -987
- package/lib/core/pattern.js +105 -77
- package/lib/core/pdf_manager.js +149 -316
- package/lib/core/primitives.js +156 -104
- package/lib/core/ps_parser.js +175 -214
- package/lib/core/standard_fonts.js +237 -236
- package/lib/core/stream.js +94 -74
- package/lib/core/type1_parser.js +89 -69
- package/lib/core/unicode.js +1654 -1654
- package/lib/core/worker.js +275 -290
- package/lib/core/worker_stream.js +101 -210
- package/lib/core/writer.js +242 -0
- package/lib/display/annotation_layer.js +772 -1041
- package/lib/display/annotation_storage.js +89 -0
- package/lib/display/api.js +1575 -1868
- package/lib/display/api_compatibility.js +12 -17
- package/lib/display/canvas.js +370 -222
- package/lib/display/content_disposition.js +40 -59
- package/lib/display/display_utils.js +341 -536
- package/lib/display/fetch_stream.js +188 -304
- package/lib/display/font_loader.js +282 -414
- package/lib/display/metadata.js +81 -99
- package/lib/display/network.js +362 -511
- package/lib/display/network_utils.js +25 -18
- package/lib/display/node_stream.js +283 -465
- package/lib/display/node_utils.js +87 -0
- package/lib/display/optional_content_config.js +184 -0
- package/lib/display/pattern_helper.js +93 -44
- package/lib/display/svg.js +1163 -1401
- package/lib/display/text_layer.js +154 -137
- package/lib/display/transport_stream.js +237 -375
- 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 +220 -58
- package/lib/pdf.worker.js +14 -6
- package/lib/shared/compatibility.js +3 -246
- package/lib/shared/is_node.js +7 -6
- package/lib/shared/message_handler.js +327 -332
- package/lib/shared/util.js +271 -306
- package/lib/test/unit/annotation_spec.js +1902 -763
- package/lib/test/unit/annotation_storage_spec.js +83 -0
- package/lib/test/unit/api_spec.js +790 -592
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +73 -72
- package/lib/test/unit/clitests_helper.js +7 -9
- package/lib/test/unit/cmap_spec.js +86 -88
- package/lib/test/unit/colorspace_spec.js +346 -154
- package/lib/test/unit/core_utils_spec.js +125 -105
- package/lib/test/unit/crypto_spec.js +232 -185
- package/lib/test/unit/custom_spec.js +150 -24
- package/lib/test/unit/display_svg_spec.js +34 -39
- package/lib/test/unit/display_utils_spec.js +139 -149
- package/lib/test/unit/document_spec.js +128 -17
- package/lib/test/unit/encodings_spec.js +12 -34
- package/lib/test/unit/evaluator_spec.js +112 -91
- package/lib/test/unit/fetch_stream_spec.js +31 -29
- 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 +173 -159
- package/lib/test/unit/metadata_spec.js +71 -71
- package/lib/test/unit/murmurhash3_spec.js +12 -12
- package/lib/test/unit/network_spec.js +13 -11
- package/lib/test/unit/network_utils_spec.js +158 -144
- package/lib/test/unit/node_stream_spec.js +76 -90
- package/lib/test/unit/parser_spec.js +108 -114
- 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 +337 -156
- package/lib/test/unit/stream_spec.js +16 -14
- package/lib/test/unit/test_utils.js +91 -304
- package/lib/test/unit/testreporter.js +33 -22
- package/lib/test/unit/type1_parser_spec.js +42 -42
- package/lib/test/unit/ui_utils_spec.js +299 -461
- package/lib/test/unit/unicode_spec.js +42 -42
- package/lib/test/unit/util_spec.js +129 -149
- package/lib/test/unit/writer_spec.js +84 -0
- package/lib/web/annotation_layer_builder.js +78 -111
- package/lib/web/app.js +1542 -1267
- package/lib/web/app_options.js +76 -91
- package/lib/web/base_tree_viewer.js +100 -0
- package/lib/web/base_viewer.js +869 -834
- package/lib/web/chromecom.js +165 -252
- package/lib/web/debugger.js +149 -205
- package/lib/web/download_manager.js +34 -58
- package/lib/web/firefox_print_service.js +62 -34
- package/lib/web/firefoxcom.js +206 -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 -254
- package/lib/web/overlay_manager.js +70 -246
- package/lib/web/password_prompt.js +38 -64
- package/lib/web/pdf_attachment_viewer.js +150 -126
- package/lib/web/pdf_cursor_tools.js +75 -102
- package/lib/web/pdf_document_properties.js +229 -383
- package/lib/web/pdf_find_bar.js +136 -170
- package/lib/web/pdf_find_controller.js +492 -548
- package/lib/web/pdf_find_utils.js +13 -13
- package/lib/web/pdf_history.js +397 -406
- package/lib/web/pdf_layer_viewer.js +208 -0
- package/lib/web/pdf_link_service.js +304 -348
- package/lib/web/pdf_outline_viewer.js +119 -212
- package/lib/web/pdf_page_view.js +474 -513
- package/lib/web/pdf_presentation_mode.js +308 -357
- package/lib/web/pdf_print_service.js +96 -110
- package/lib/web/pdf_rendering_queue.js +87 -108
- package/lib/web/pdf_sidebar.js +286 -302
- 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 +289 -297
- package/lib/web/pdf_thumbnail_viewer.js +202 -206
- package/lib/web/pdf_viewer.component.js +20 -21
- package/lib/web/pdf_viewer.js +55 -115
- package/lib/web/preferences.js +69 -273
- package/lib/web/secondary_toolbar.js +164 -196
- package/lib/web/text_layer_builder.js +284 -319
- package/lib/web/toolbar.js +217 -210
- package/lib/web/ui_utils.js +274 -421
- package/lib/web/view_history.js +52 -226
- package/lib/web/viewer_compatibility.js +21 -6
- package/package.json +4 -9
- 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 +29 -27
- package/web/pdf_viewer.js +3524 -4746
- package/web/pdf_viewer.js.map +1 -1
- package/webpack.js +6 -5
- package/external/streams/streams-lib.js +0 -3962
- package/external/url/url-lib.js +0 -627
- package/lib/shared/streams_polyfill.js +0 -43
- package/lib/shared/url_polyfill.js +0 -56
- package/web/images/texture.png +0 -0
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,43 +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
|
-
|
33
|
+
class JpegError extends _util.BaseException {
|
34
|
+
constructor(msg) {
|
35
|
+
super(`JPEG error: ${msg}`);
|
36
36
|
}
|
37
37
|
|
38
|
-
|
39
|
-
JpegError.prototype.name = 'JpegError';
|
40
|
-
JpegError.constructor = JpegError;
|
41
|
-
return JpegError;
|
42
|
-
}();
|
38
|
+
}
|
43
39
|
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
class DNLMarkerError extends _util.BaseException {
|
41
|
+
constructor(message, scanLines) {
|
42
|
+
super(message);
|
47
43
|
this.scanLines = scanLines;
|
48
44
|
}
|
49
45
|
|
50
|
-
|
51
|
-
DNLMarkerError.prototype.name = 'DNLMarkerError';
|
52
|
-
DNLMarkerError.constructor = DNLMarkerError;
|
53
|
-
return DNLMarkerError;
|
54
|
-
}();
|
55
|
-
|
56
|
-
var EOIMarkerError = function EOIMarkerErrorClosure() {
|
57
|
-
function EOIMarkerError(message) {
|
58
|
-
this.message = message;
|
59
|
-
}
|
46
|
+
}
|
60
47
|
|
61
|
-
|
62
|
-
EOIMarkerError.prototype.name = 'EOIMarkerError';
|
63
|
-
EOIMarkerError.constructor = EOIMarkerError;
|
64
|
-
return EOIMarkerError;
|
65
|
-
}();
|
48
|
+
class EOIMarkerError extends _util.BaseException {}
|
66
49
|
|
67
50
|
var JpegImage = function JpegImageClosure() {
|
68
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]);
|
@@ -75,13 +58,10 @@ var JpegImage = function JpegImageClosure() {
|
|
75
58
|
var dctSqrt2 = 5793;
|
76
59
|
var dctSqrt1d2 = 2896;
|
77
60
|
|
78
|
-
function JpegImage(
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
_ref$colorTransform = _ref.colorTransform,
|
83
|
-
colorTransform = _ref$colorTransform === void 0 ? -1 : _ref$colorTransform;
|
84
|
-
|
61
|
+
function JpegImage({
|
62
|
+
decodeTransform = null,
|
63
|
+
colorTransform = -1
|
64
|
+
} = {}) {
|
85
65
|
this._decodeTransform = decodeTransform;
|
86
66
|
this._colorTransform = colorTransform;
|
87
67
|
}
|
@@ -145,12 +125,11 @@ var JpegImage = function JpegImageClosure() {
|
|
145
125
|
return 64 * ((component.blocksPerLine + 1) * row + col);
|
146
126
|
}
|
147
127
|
|
148
|
-
function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
|
149
|
-
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) {
|
150
129
|
var mcusPerLine = frame.mcusPerLine;
|
151
130
|
var progressive = frame.progressive;
|
152
|
-
|
153
|
-
|
131
|
+
const startOffset = offset;
|
132
|
+
let bitsData = 0,
|
154
133
|
bitsCount = 0;
|
155
134
|
|
156
135
|
function readBit() {
|
@@ -161,22 +140,31 @@ var JpegImage = function JpegImageClosure() {
|
|
161
140
|
|
162
141
|
bitsData = data[offset++];
|
163
142
|
|
164
|
-
if (bitsData ===
|
143
|
+
if (bitsData === 0xff) {
|
165
144
|
var nextByte = data[offset++];
|
166
145
|
|
167
146
|
if (nextByte) {
|
168
|
-
if (nextByte ===
|
147
|
+
if (nextByte === 0xdc && parseDNLMarker) {
|
148
|
+
offset += 2;
|
149
|
+
const scanLines = (0, _core_utils.readUint16)(data, offset);
|
169
150
|
offset += 2;
|
170
|
-
var scanLines = data[offset++] << 8 | data[offset++];
|
171
151
|
|
172
152
|
if (scanLines > 0 && scanLines !== frame.scanLines) {
|
173
|
-
throw new DNLMarkerError(
|
153
|
+
throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
|
174
154
|
}
|
175
|
-
} else if (nextByte ===
|
176
|
-
|
155
|
+
} else if (nextByte === 0xd9) {
|
156
|
+
if (parseDNLMarker) {
|
157
|
+
const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
|
158
|
+
|
159
|
+
if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 10) {
|
160
|
+
throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
|
177
165
|
}
|
178
166
|
|
179
|
-
throw new JpegError(
|
167
|
+
throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
|
180
168
|
}
|
181
169
|
}
|
182
170
|
|
@@ -190,13 +178,15 @@ var JpegImage = function JpegImageClosure() {
|
|
190
178
|
while (true) {
|
191
179
|
node = node[readBit()];
|
192
180
|
|
193
|
-
|
194
|
-
|
195
|
-
|
181
|
+
switch (typeof node) {
|
182
|
+
case "number":
|
183
|
+
return node;
|
196
184
|
|
197
|
-
|
198
|
-
|
185
|
+
case "object":
|
186
|
+
continue;
|
199
187
|
}
|
188
|
+
|
189
|
+
throw new JpegError("invalid huffman sequence");
|
200
190
|
}
|
201
191
|
}
|
202
192
|
|
@@ -225,10 +215,10 @@ var JpegImage = function JpegImageClosure() {
|
|
225
215
|
return n + (-1 << length) + 1;
|
226
216
|
}
|
227
217
|
|
228
|
-
function decodeBaseline(component,
|
218
|
+
function decodeBaseline(component, blockOffset) {
|
229
219
|
var t = decodeHuffman(component.huffmanTableDC);
|
230
220
|
var diff = t === 0 ? 0 : receiveAndExtend(t);
|
231
|
-
component.blockData[
|
221
|
+
component.blockData[blockOffset] = component.pred += diff;
|
232
222
|
var k = 1;
|
233
223
|
|
234
224
|
while (k < 64) {
|
@@ -247,24 +237,24 @@ var JpegImage = function JpegImageClosure() {
|
|
247
237
|
|
248
238
|
k += r;
|
249
239
|
var z = dctZigZag[k];
|
250
|
-
component.blockData[
|
240
|
+
component.blockData[blockOffset + z] = receiveAndExtend(s);
|
251
241
|
k++;
|
252
242
|
}
|
253
243
|
}
|
254
244
|
|
255
|
-
function decodeDCFirst(component,
|
245
|
+
function decodeDCFirst(component, blockOffset) {
|
256
246
|
var t = decodeHuffman(component.huffmanTableDC);
|
257
247
|
var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
|
258
|
-
component.blockData[
|
248
|
+
component.blockData[blockOffset] = component.pred += diff;
|
259
249
|
}
|
260
250
|
|
261
|
-
function decodeDCSuccessive(component,
|
262
|
-
component.blockData[
|
251
|
+
function decodeDCSuccessive(component, blockOffset) {
|
252
|
+
component.blockData[blockOffset] |= readBit() << successive;
|
263
253
|
}
|
264
254
|
|
265
255
|
var eobrun = 0;
|
266
256
|
|
267
|
-
function decodeACFirst(component,
|
257
|
+
function decodeACFirst(component, blockOffset) {
|
268
258
|
if (eobrun > 0) {
|
269
259
|
eobrun--;
|
270
260
|
return;
|
@@ -290,7 +280,7 @@ var JpegImage = function JpegImageClosure() {
|
|
290
280
|
|
291
281
|
k += r;
|
292
282
|
var z = dctZigZag[k];
|
293
|
-
component.blockData[
|
283
|
+
component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
|
294
284
|
k++;
|
295
285
|
}
|
296
286
|
}
|
@@ -298,7 +288,7 @@ var JpegImage = function JpegImageClosure() {
|
|
298
288
|
var successiveACState = 0,
|
299
289
|
successiveACNextValue;
|
300
290
|
|
301
|
-
function decodeACSuccessive(component,
|
291
|
+
function decodeACSuccessive(component, blockOffset) {
|
302
292
|
var k = spectralStart;
|
303
293
|
var e = spectralEnd;
|
304
294
|
var r = 0;
|
@@ -306,8 +296,8 @@ var JpegImage = function JpegImageClosure() {
|
|
306
296
|
var rs;
|
307
297
|
|
308
298
|
while (k <= e) {
|
309
|
-
|
310
|
-
|
299
|
+
const offsetZ = blockOffset + dctZigZag[k];
|
300
|
+
const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
|
311
301
|
|
312
302
|
switch (successiveACState) {
|
313
303
|
case 0:
|
@@ -325,7 +315,7 @@ var JpegImage = function JpegImageClosure() {
|
|
325
315
|
}
|
326
316
|
} else {
|
327
317
|
if (s !== 1) {
|
328
|
-
throw new JpegError(
|
318
|
+
throw new JpegError("invalid ACn encoding");
|
329
319
|
}
|
330
320
|
|
331
321
|
successiveACNextValue = receiveAndExtend(s);
|
@@ -378,20 +368,22 @@ var JpegImage = function JpegImageClosure() {
|
|
378
368
|
}
|
379
369
|
}
|
380
370
|
|
371
|
+
let blockRow = 0;
|
372
|
+
|
381
373
|
function decodeMcu(component, decode, mcu, row, col) {
|
382
374
|
var mcuRow = mcu / mcusPerLine | 0;
|
383
375
|
var mcuCol = mcu % mcusPerLine;
|
384
|
-
|
376
|
+
blockRow = mcuRow * component.v + row;
|
385
377
|
var blockCol = mcuCol * component.h + col;
|
386
|
-
|
387
|
-
decode(component,
|
378
|
+
const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
|
379
|
+
decode(component, blockOffset);
|
388
380
|
}
|
389
381
|
|
390
382
|
function decodeBlock(component, decode, mcu) {
|
391
|
-
|
383
|
+
blockRow = mcu / component.blocksPerLine | 0;
|
392
384
|
var blockCol = mcu % component.blocksPerLine;
|
393
|
-
|
394
|
-
decode(component,
|
385
|
+
const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
|
386
|
+
decode(component, blockOffset);
|
395
387
|
}
|
396
388
|
|
397
389
|
var componentsLength = components.length;
|
@@ -420,68 +412,62 @@ var JpegImage = function JpegImageClosure() {
|
|
420
412
|
|
421
413
|
var h, v;
|
422
414
|
|
423
|
-
while (mcu
|
415
|
+
while (mcu <= mcuExpected) {
|
424
416
|
var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
|
425
417
|
|
426
|
-
|
427
|
-
|
428
|
-
|
418
|
+
if (mcuToRead > 0) {
|
419
|
+
for (i = 0; i < componentsLength; i++) {
|
420
|
+
components[i].pred = 0;
|
421
|
+
}
|
429
422
|
|
430
|
-
|
423
|
+
eobrun = 0;
|
431
424
|
|
432
|
-
|
433
|
-
|
425
|
+
if (componentsLength === 1) {
|
426
|
+
component = components[0];
|
434
427
|
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
428
|
+
for (n = 0; n < mcuToRead; n++) {
|
429
|
+
decodeBlock(component, decodeFn, mcu);
|
430
|
+
mcu++;
|
431
|
+
}
|
432
|
+
} else {
|
433
|
+
for (n = 0; n < mcuToRead; n++) {
|
434
|
+
for (i = 0; i < componentsLength; i++) {
|
435
|
+
component = components[i];
|
436
|
+
h = component.h;
|
437
|
+
v = component.v;
|
438
|
+
|
439
|
+
for (j = 0; j < v; j++) {
|
440
|
+
for (k = 0; k < h; k++) {
|
441
|
+
decodeMcu(component, decodeFn, mcu, j, k);
|
442
|
+
}
|
449
443
|
}
|
450
444
|
}
|
451
|
-
}
|
452
445
|
|
453
|
-
|
446
|
+
mcu++;
|
447
|
+
}
|
454
448
|
}
|
455
449
|
}
|
456
450
|
|
457
451
|
bitsCount = 0;
|
458
452
|
fileMarker = findNextFileMarker(data, offset);
|
459
453
|
|
460
|
-
if (fileMarker
|
461
|
-
|
462
|
-
offset = fileMarker.offset;
|
454
|
+
if (!fileMarker) {
|
455
|
+
break;
|
463
456
|
}
|
464
457
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
458
|
+
if (fileMarker.invalid) {
|
459
|
+
const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
|
460
|
+
(0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
|
461
|
+
offset = fileMarker.offset;
|
469
462
|
}
|
470
463
|
|
471
|
-
if (marker >=
|
464
|
+
if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
|
472
465
|
offset += 2;
|
473
466
|
} else {
|
474
467
|
break;
|
475
468
|
}
|
476
469
|
}
|
477
470
|
|
478
|
-
fileMarker = findNextFileMarker(data, offset);
|
479
|
-
|
480
|
-
if (fileMarker && fileMarker.invalid) {
|
481
|
-
(0, _util.warn)('decodeScan - unexpected Scan data, current marker is: ' + fileMarker.invalid);
|
482
|
-
offset = fileMarker.offset;
|
483
|
-
}
|
484
|
-
|
485
471
|
return offset - startOffset;
|
486
472
|
}
|
487
473
|
|
@@ -493,7 +479,7 @@ var JpegImage = function JpegImageClosure() {
|
|
493
479
|
var t;
|
494
480
|
|
495
481
|
if (!qt) {
|
496
|
-
throw new JpegError(
|
482
|
+
throw new JpegError("missing required Quantization Table.");
|
497
483
|
}
|
498
484
|
|
499
485
|
for (var row = 0; row < 64; row += 8) {
|
@@ -576,7 +562,15 @@ var JpegImage = function JpegImageClosure() {
|
|
576
562
|
|
577
563
|
if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
|
578
564
|
t = dctSqrt2 * p0 + 8192 >> 14;
|
579
|
-
|
565
|
+
|
566
|
+
if (t < -2040) {
|
567
|
+
t = 0;
|
568
|
+
} else if (t >= 2024) {
|
569
|
+
t = 255;
|
570
|
+
} else {
|
571
|
+
t = t + 2056 >> 4;
|
572
|
+
}
|
573
|
+
|
580
574
|
blockData[blockBufferOffset + col] = t;
|
581
575
|
blockData[blockBufferOffset + col + 8] = t;
|
582
576
|
blockData[blockBufferOffset + col + 16] = t;
|
@@ -623,14 +617,71 @@ var JpegImage = function JpegImageClosure() {
|
|
623
617
|
p5 = v2 - v5;
|
624
618
|
p3 = v3 + v4;
|
625
619
|
p4 = v3 - v4;
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
620
|
+
|
621
|
+
if (p0 < 16) {
|
622
|
+
p0 = 0;
|
623
|
+
} else if (p0 >= 4080) {
|
624
|
+
p0 = 255;
|
625
|
+
} else {
|
626
|
+
p0 >>= 4;
|
627
|
+
}
|
628
|
+
|
629
|
+
if (p1 < 16) {
|
630
|
+
p1 = 0;
|
631
|
+
} else if (p1 >= 4080) {
|
632
|
+
p1 = 255;
|
633
|
+
} else {
|
634
|
+
p1 >>= 4;
|
635
|
+
}
|
636
|
+
|
637
|
+
if (p2 < 16) {
|
638
|
+
p2 = 0;
|
639
|
+
} else if (p2 >= 4080) {
|
640
|
+
p2 = 255;
|
641
|
+
} else {
|
642
|
+
p2 >>= 4;
|
643
|
+
}
|
644
|
+
|
645
|
+
if (p3 < 16) {
|
646
|
+
p3 = 0;
|
647
|
+
} else if (p3 >= 4080) {
|
648
|
+
p3 = 255;
|
649
|
+
} else {
|
650
|
+
p3 >>= 4;
|
651
|
+
}
|
652
|
+
|
653
|
+
if (p4 < 16) {
|
654
|
+
p4 = 0;
|
655
|
+
} else if (p4 >= 4080) {
|
656
|
+
p4 = 255;
|
657
|
+
} else {
|
658
|
+
p4 >>= 4;
|
659
|
+
}
|
660
|
+
|
661
|
+
if (p5 < 16) {
|
662
|
+
p5 = 0;
|
663
|
+
} else if (p5 >= 4080) {
|
664
|
+
p5 = 255;
|
665
|
+
} else {
|
666
|
+
p5 >>= 4;
|
667
|
+
}
|
668
|
+
|
669
|
+
if (p6 < 16) {
|
670
|
+
p6 = 0;
|
671
|
+
} else if (p6 >= 4080) {
|
672
|
+
p6 = 255;
|
673
|
+
} else {
|
674
|
+
p6 >>= 4;
|
675
|
+
}
|
676
|
+
|
677
|
+
if (p7 < 16) {
|
678
|
+
p7 = 0;
|
679
|
+
} else if (p7 >= 4080) {
|
680
|
+
p7 = 255;
|
681
|
+
} else {
|
682
|
+
p7 >>= 4;
|
683
|
+
}
|
684
|
+
|
634
685
|
blockData[blockBufferOffset + col] = p0;
|
635
686
|
blockData[blockBufferOffset + col + 8] = p1;
|
636
687
|
blockData[blockBufferOffset + col + 16] = p2;
|
@@ -657,23 +708,17 @@ var JpegImage = function JpegImageClosure() {
|
|
657
708
|
return component.blockData;
|
658
709
|
}
|
659
710
|
|
660
|
-
function findNextFileMarker(data, currentPos) {
|
661
|
-
|
662
|
-
|
663
|
-
function peekUint16(pos) {
|
664
|
-
return data[pos] << 8 | data[pos + 1];
|
665
|
-
}
|
666
|
-
|
667
|
-
var maxPos = data.length - 1;
|
711
|
+
function findNextFileMarker(data, currentPos, startPos = currentPos) {
|
712
|
+
const maxPos = data.length - 1;
|
668
713
|
var newPos = startPos < currentPos ? startPos : currentPos;
|
669
714
|
|
670
715
|
if (currentPos >= maxPos) {
|
671
716
|
return null;
|
672
717
|
}
|
673
718
|
|
674
|
-
var currentMarker =
|
719
|
+
var currentMarker = (0, _core_utils.readUint16)(data, currentPos);
|
675
720
|
|
676
|
-
if (currentMarker >=
|
721
|
+
if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
|
677
722
|
return {
|
678
723
|
invalid: null,
|
679
724
|
marker: currentMarker,
|
@@ -681,14 +726,14 @@ var JpegImage = function JpegImageClosure() {
|
|
681
726
|
};
|
682
727
|
}
|
683
728
|
|
684
|
-
var newMarker =
|
729
|
+
var newMarker = (0, _core_utils.readUint16)(data, newPos);
|
685
730
|
|
686
|
-
while (!(newMarker >=
|
731
|
+
while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
|
687
732
|
if (++newPos >= maxPos) {
|
688
733
|
return null;
|
689
734
|
}
|
690
735
|
|
691
|
-
newMarker =
|
736
|
+
newMarker = (0, _core_utils.readUint16)(data, newPos);
|
692
737
|
}
|
693
738
|
|
694
739
|
return {
|
@@ -699,24 +744,17 @@ var JpegImage = function JpegImageClosure() {
|
|
699
744
|
}
|
700
745
|
|
701
746
|
JpegImage.prototype = {
|
702
|
-
parse
|
703
|
-
|
704
|
-
|
705
|
-
dnlScanLines = _ref2$dnlScanLines === void 0 ? null : _ref2$dnlScanLines;
|
706
|
-
|
707
|
-
function readUint16() {
|
708
|
-
var value = data[offset] << 8 | data[offset + 1];
|
709
|
-
offset += 2;
|
710
|
-
return value;
|
711
|
-
}
|
712
|
-
|
747
|
+
parse(data, {
|
748
|
+
dnlScanLines = null
|
749
|
+
} = {}) {
|
713
750
|
function readDataBlock() {
|
714
|
-
|
715
|
-
|
751
|
+
const length = (0, _core_utils.readUint16)(data, offset);
|
752
|
+
offset += 2;
|
753
|
+
let endOffset = offset + length - 2;
|
716
754
|
var fileMarker = findNextFileMarker(data, endOffset, offset);
|
717
755
|
|
718
756
|
if (fileMarker && fileMarker.invalid) {
|
719
|
-
(0, _util.warn)(
|
757
|
+
(0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
|
720
758
|
endOffset = fileMarker.offset;
|
721
759
|
}
|
722
760
|
|
@@ -749,43 +787,45 @@ var JpegImage = function JpegImageClosure() {
|
|
749
787
|
var jfif = null;
|
750
788
|
var adobe = null;
|
751
789
|
var frame, resetInterval;
|
752
|
-
|
790
|
+
let numSOSMarkers = 0;
|
753
791
|
var quantizationTables = [];
|
754
792
|
var huffmanTablesAC = [],
|
755
793
|
huffmanTablesDC = [];
|
756
|
-
|
794
|
+
let fileMarker = (0, _core_utils.readUint16)(data, offset);
|
795
|
+
offset += 2;
|
757
796
|
|
758
|
-
if (fileMarker !==
|
759
|
-
throw new JpegError(
|
797
|
+
if (fileMarker !== 0xffd8) {
|
798
|
+
throw new JpegError("SOI not found");
|
760
799
|
}
|
761
800
|
|
762
|
-
fileMarker = readUint16();
|
801
|
+
fileMarker = (0, _core_utils.readUint16)(data, offset);
|
802
|
+
offset += 2;
|
763
803
|
|
764
|
-
markerLoop: while (fileMarker !==
|
804
|
+
markerLoop: while (fileMarker !== 0xffd9) {
|
765
805
|
var i, j, l;
|
766
806
|
|
767
807
|
switch (fileMarker) {
|
768
|
-
case
|
769
|
-
case
|
770
|
-
case
|
771
|
-
case
|
772
|
-
case
|
773
|
-
case
|
774
|
-
case
|
775
|
-
case
|
776
|
-
case
|
777
|
-
case
|
778
|
-
case
|
779
|
-
case
|
780
|
-
case
|
781
|
-
case
|
782
|
-
case
|
783
|
-
case
|
784
|
-
case
|
808
|
+
case 0xffe0:
|
809
|
+
case 0xffe1:
|
810
|
+
case 0xffe2:
|
811
|
+
case 0xffe3:
|
812
|
+
case 0xffe4:
|
813
|
+
case 0xffe5:
|
814
|
+
case 0xffe6:
|
815
|
+
case 0xffe7:
|
816
|
+
case 0xffe8:
|
817
|
+
case 0xffe9:
|
818
|
+
case 0xffea:
|
819
|
+
case 0xffeb:
|
820
|
+
case 0xffec:
|
821
|
+
case 0xffed:
|
822
|
+
case 0xffee:
|
823
|
+
case 0xffef:
|
824
|
+
case 0xfffe:
|
785
825
|
var appData = readDataBlock();
|
786
826
|
|
787
|
-
if (fileMarker ===
|
788
|
-
if (appData[0] ===
|
827
|
+
if (fileMarker === 0xffe0) {
|
828
|
+
if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
|
789
829
|
jfif = {
|
790
830
|
version: {
|
791
831
|
major: appData[5],
|
@@ -801,8 +841,8 @@ var JpegImage = function JpegImageClosure() {
|
|
801
841
|
}
|
802
842
|
}
|
803
843
|
|
804
|
-
if (fileMarker ===
|
805
|
-
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] ===
|
844
|
+
if (fileMarker === 0xffee) {
|
845
|
+
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {
|
806
846
|
adobe = {
|
807
847
|
version: appData[5] << 8 | appData[6],
|
808
848
|
flags0: appData[7] << 8 | appData[8],
|
@@ -814,8 +854,9 @@ var JpegImage = function JpegImageClosure() {
|
|
814
854
|
|
815
855
|
break;
|
816
856
|
|
817
|
-
case
|
818
|
-
|
857
|
+
case 0xffdb:
|
858
|
+
const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);
|
859
|
+
offset += 2;
|
819
860
|
var quantizationTablesEnd = quantizationTablesLength + offset - 2;
|
820
861
|
var z;
|
821
862
|
|
@@ -831,10 +872,11 @@ var JpegImage = function JpegImageClosure() {
|
|
831
872
|
} else if (quantizationTableSpec >> 4 === 1) {
|
832
873
|
for (j = 0; j < 64; j++) {
|
833
874
|
z = dctZigZag[j];
|
834
|
-
tableData[z] = readUint16();
|
875
|
+
tableData[z] = (0, _core_utils.readUint16)(data, offset);
|
876
|
+
offset += 2;
|
835
877
|
}
|
836
878
|
} else {
|
837
|
-
throw new JpegError(
|
879
|
+
throw new JpegError("DQT - invalid table spec");
|
838
880
|
}
|
839
881
|
|
840
882
|
quantizationTables[quantizationTableSpec & 15] = tableData;
|
@@ -842,21 +884,23 @@ var JpegImage = function JpegImageClosure() {
|
|
842
884
|
|
843
885
|
break;
|
844
886
|
|
845
|
-
case
|
846
|
-
case
|
847
|
-
case
|
887
|
+
case 0xffc0:
|
888
|
+
case 0xffc1:
|
889
|
+
case 0xffc2:
|
848
890
|
if (frame) {
|
849
|
-
throw new JpegError(
|
891
|
+
throw new JpegError("Only single frame JPEGs supported");
|
850
892
|
}
|
851
893
|
|
852
|
-
|
894
|
+
offset += 2;
|
853
895
|
frame = {};
|
854
|
-
frame.extended = fileMarker ===
|
855
|
-
frame.progressive = fileMarker ===
|
896
|
+
frame.extended = fileMarker === 0xffc1;
|
897
|
+
frame.progressive = fileMarker === 0xffc2;
|
856
898
|
frame.precision = data[offset++];
|
857
|
-
|
899
|
+
const sofScanLines = (0, _core_utils.readUint16)(data, offset);
|
900
|
+
offset += 2;
|
858
901
|
frame.scanLines = dnlScanLines || sofScanLines;
|
859
|
-
frame.samplesPerLine = readUint16();
|
902
|
+
frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);
|
903
|
+
offset += 2;
|
860
904
|
frame.components = [];
|
861
905
|
frame.componentIds = {};
|
862
906
|
var componentsCount = data[offset++],
|
@@ -879,8 +923,8 @@ var JpegImage = function JpegImageClosure() {
|
|
879
923
|
|
880
924
|
var qId = data[offset + 2];
|
881
925
|
l = frame.components.push({
|
882
|
-
h
|
883
|
-
v
|
926
|
+
h,
|
927
|
+
v,
|
884
928
|
quantizationId: qId,
|
885
929
|
quantizationTable: null
|
886
930
|
});
|
@@ -893,8 +937,9 @@ var JpegImage = function JpegImageClosure() {
|
|
893
937
|
prepareComponents(frame);
|
894
938
|
break;
|
895
939
|
|
896
|
-
case
|
897
|
-
|
940
|
+
case 0xffc4:
|
941
|
+
const huffmanLength = (0, _core_utils.readUint16)(data, offset);
|
942
|
+
offset += 2;
|
898
943
|
|
899
944
|
for (i = 2; i < huffmanLength;) {
|
900
945
|
var huffmanTableSpec = data[offset++];
|
@@ -917,21 +962,24 @@ var JpegImage = function JpegImageClosure() {
|
|
917
962
|
|
918
963
|
break;
|
919
964
|
|
920
|
-
case
|
921
|
-
|
922
|
-
resetInterval = readUint16();
|
965
|
+
case 0xffdd:
|
966
|
+
offset += 2;
|
967
|
+
resetInterval = (0, _core_utils.readUint16)(data, offset);
|
968
|
+
offset += 2;
|
923
969
|
break;
|
924
970
|
|
925
|
-
case
|
926
|
-
|
927
|
-
|
971
|
+
case 0xffda:
|
972
|
+
const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
|
973
|
+
offset += 2;
|
928
974
|
var selectorsCount = data[offset++];
|
929
975
|
var components = [],
|
930
976
|
component;
|
931
977
|
|
932
978
|
for (i = 0; i < selectorsCount; i++) {
|
933
|
-
|
979
|
+
const index = data[offset++];
|
980
|
+
var componentIndex = frame.componentIds[index];
|
934
981
|
component = frame.components[componentIndex];
|
982
|
+
component.index = index;
|
935
983
|
var tableSpec = data[offset++];
|
936
984
|
component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
|
937
985
|
component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
|
@@ -947,12 +995,12 @@ var JpegImage = function JpegImageClosure() {
|
|
947
995
|
offset += processed;
|
948
996
|
} catch (ex) {
|
949
997
|
if (ex instanceof DNLMarkerError) {
|
950
|
-
(0, _util.warn)(
|
998
|
+
(0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);
|
951
999
|
return this.parse(data, {
|
952
1000
|
dnlScanLines: ex.scanLines
|
953
1001
|
});
|
954
1002
|
} else if (ex instanceof EOIMarkerError) {
|
955
|
-
(0, _util.warn)(
|
1003
|
+
(0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);
|
956
1004
|
break markerLoop;
|
957
1005
|
}
|
958
1006
|
|
@@ -961,35 +1009,36 @@ var JpegImage = function JpegImageClosure() {
|
|
961
1009
|
|
962
1010
|
break;
|
963
1011
|
|
964
|
-
case
|
1012
|
+
case 0xffdc:
|
965
1013
|
offset += 4;
|
966
1014
|
break;
|
967
1015
|
|
968
|
-
case
|
969
|
-
if (data[offset] !==
|
1016
|
+
case 0xffff:
|
1017
|
+
if (data[offset] !== 0xff) {
|
970
1018
|
offset--;
|
971
1019
|
}
|
972
1020
|
|
973
1021
|
break;
|
974
1022
|
|
975
1023
|
default:
|
976
|
-
|
977
|
-
offset -= 3;
|
978
|
-
break;
|
979
|
-
}
|
980
|
-
|
981
|
-
var nextFileMarker = findNextFileMarker(data, offset - 2);
|
1024
|
+
const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
|
982
1025
|
|
983
1026
|
if (nextFileMarker && nextFileMarker.invalid) {
|
984
|
-
(0, _util.warn)(
|
1027
|
+
(0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid);
|
985
1028
|
offset = nextFileMarker.offset;
|
986
1029
|
break;
|
987
1030
|
}
|
988
1031
|
|
989
|
-
|
1032
|
+
if (offset >= data.length - 1) {
|
1033
|
+
(0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9).");
|
1034
|
+
break markerLoop;
|
1035
|
+
}
|
1036
|
+
|
1037
|
+
throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
|
990
1038
|
}
|
991
1039
|
|
992
|
-
fileMarker = readUint16();
|
1040
|
+
fileMarker = (0, _core_utils.readUint16)(data, offset);
|
1041
|
+
offset += 2;
|
993
1042
|
}
|
994
1043
|
|
995
1044
|
this.width = frame.samplesPerLine;
|
@@ -1007,6 +1056,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1007
1056
|
}
|
1008
1057
|
|
1009
1058
|
this.components.push({
|
1059
|
+
index: component.index,
|
1010
1060
|
output: buildComponentData(frame, component),
|
1011
1061
|
scaleX: component.h / frame.maxH,
|
1012
1062
|
scaleY: component.v / frame.maxV,
|
@@ -1018,8 +1068,8 @@ var JpegImage = function JpegImageClosure() {
|
|
1018
1068
|
this.numComponents = this.components.length;
|
1019
1069
|
return undefined;
|
1020
1070
|
},
|
1021
|
-
|
1022
|
-
|
1071
|
+
|
1072
|
+
_getLinearizedBlockData(width, height, isSourcePDF = false) {
|
1023
1073
|
var scaleX = this.width / width,
|
1024
1074
|
scaleY = this.height / height;
|
1025
1075
|
var component, componentScaleX, componentScaleY, blocksPerScanline;
|
@@ -1032,6 +1082,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1032
1082
|
var data = new Uint8ClampedArray(dataLength);
|
1033
1083
|
var xScaleBlockOffset = new Uint32Array(width);
|
1034
1084
|
var mask3LSB = 0xfffffff8;
|
1085
|
+
let lastComponentScaleX;
|
1035
1086
|
|
1036
1087
|
for (i = 0; i < numComponents; i++) {
|
1037
1088
|
component = this.components[i];
|
@@ -1041,9 +1092,13 @@ var JpegImage = function JpegImageClosure() {
|
|
1041
1092
|
output = component.output;
|
1042
1093
|
blocksPerScanline = component.blocksPerLine + 1 << 3;
|
1043
1094
|
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1095
|
+
if (componentScaleX !== lastComponentScaleX) {
|
1096
|
+
for (x = 0; x < width; x++) {
|
1097
|
+
j = 0 | x * componentScaleX;
|
1098
|
+
xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
|
1099
|
+
}
|
1100
|
+
|
1101
|
+
lastComponentScaleX = componentScaleX;
|
1047
1102
|
}
|
1048
1103
|
|
1049
1104
|
for (y = 0; y < height; y++) {
|
@@ -1057,7 +1112,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1057
1112
|
}
|
1058
1113
|
}
|
1059
1114
|
|
1060
|
-
|
1115
|
+
let transform = this._decodeTransform;
|
1061
1116
|
|
1062
1117
|
if (!isSourcePDF && numComponents === 4 && !transform) {
|
1063
1118
|
transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
|
@@ -1082,6 +1137,8 @@ var JpegImage = function JpegImageClosure() {
|
|
1082
1137
|
if (this.numComponents === 3) {
|
1083
1138
|
if (this._colorTransform === 0) {
|
1084
1139
|
return false;
|
1140
|
+
} else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) {
|
1141
|
+
return false;
|
1085
1142
|
}
|
1086
1143
|
|
1087
1144
|
return true;
|
@@ -1141,30 +1198,28 @@ var JpegImage = function JpegImageClosure() {
|
|
1141
1198
|
_convertCmykToRgb: function convertCmykToRgb(data) {
|
1142
1199
|
var c, m, y, k;
|
1143
1200
|
var offset = 0;
|
1144
|
-
var scale = 1 / 255;
|
1145
1201
|
|
1146
1202
|
for (var i = 0, length = data.length; i < length; i += 4) {
|
1147
|
-
c = data[i]
|
1148
|
-
m = data[i + 1]
|
1149
|
-
y = data[i + 2]
|
1150
|
-
k = data[i + 3]
|
1151
|
-
data[offset++] = 255 + c * (-
|
1152
|
-
data[offset++] = 255 + c * (
|
1153
|
-
data[offset++] = 255 + c * (0.
|
1203
|
+
c = data[i];
|
1204
|
+
m = data[i + 1];
|
1205
|
+
y = data[i + 2];
|
1206
|
+
k = data[i + 3];
|
1207
|
+
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);
|
1208
|
+
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);
|
1209
|
+
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);
|
1154
1210
|
}
|
1155
1211
|
|
1156
1212
|
return data.subarray(0, offset);
|
1157
1213
|
},
|
1158
|
-
getData: function getData(_ref3) {
|
1159
|
-
var width = _ref3.width,
|
1160
|
-
height = _ref3.height,
|
1161
|
-
_ref3$forceRGB = _ref3.forceRGB,
|
1162
|
-
forceRGB = _ref3$forceRGB === void 0 ? false : _ref3$forceRGB,
|
1163
|
-
_ref3$isSourcePDF = _ref3.isSourcePDF,
|
1164
|
-
isSourcePDF = _ref3$isSourcePDF === void 0 ? false : _ref3$isSourcePDF;
|
1165
1214
|
|
1215
|
+
getData({
|
1216
|
+
width,
|
1217
|
+
height,
|
1218
|
+
forceRGB = false,
|
1219
|
+
isSourcePDF = false
|
1220
|
+
}) {
|
1166
1221
|
if (this.numComponents > 4) {
|
1167
|
-
throw new JpegError(
|
1222
|
+
throw new JpegError("Unsupported color mode");
|
1168
1223
|
}
|
1169
1224
|
|
1170
1225
|
var data = this._getLinearizedBlockData(width, height, isSourcePDF);
|
@@ -1198,6 +1253,7 @@ var JpegImage = function JpegImageClosure() {
|
|
1198
1253
|
|
1199
1254
|
return data;
|
1200
1255
|
}
|
1256
|
+
|
1201
1257
|
};
|
1202
1258
|
return JpegImage;
|
1203
1259
|
}();
|