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/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 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,36 +19,51 @@
|
|
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.JpegImage =
|
27
|
+
exports.JpegImage = void 0;
|
28
28
|
|
29
|
-
var
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
|
31
|
+
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
32
32
|
|
33
33
|
var JpegError = function JpegErrorClosure() {
|
34
34
|
function JpegError(msg) {
|
35
35
|
this.message = 'JPEG error: ' + msg;
|
36
36
|
}
|
37
|
+
|
37
38
|
JpegError.prototype = new Error();
|
38
39
|
JpegError.prototype.name = 'JpegError';
|
39
40
|
JpegError.constructor = JpegError;
|
40
41
|
return JpegError;
|
41
42
|
}();
|
43
|
+
|
42
44
|
var DNLMarkerError = function DNLMarkerErrorClosure() {
|
43
45
|
function DNLMarkerError(message, scanLines) {
|
44
46
|
this.message = message;
|
45
47
|
this.scanLines = scanLines;
|
46
48
|
}
|
49
|
+
|
47
50
|
DNLMarkerError.prototype = new Error();
|
48
51
|
DNLMarkerError.prototype.name = 'DNLMarkerError';
|
49
52
|
DNLMarkerError.constructor = DNLMarkerError;
|
50
53
|
return DNLMarkerError;
|
51
54
|
}();
|
55
|
+
|
56
|
+
var EOIMarkerError = function EOIMarkerErrorClosure() {
|
57
|
+
function EOIMarkerError(message) {
|
58
|
+
this.message = message;
|
59
|
+
}
|
60
|
+
|
61
|
+
EOIMarkerError.prototype = new Error();
|
62
|
+
EOIMarkerError.prototype.name = 'EOIMarkerError';
|
63
|
+
EOIMarkerError.constructor = EOIMarkerError;
|
64
|
+
return EOIMarkerError;
|
65
|
+
}();
|
66
|
+
|
52
67
|
var JpegImage = function JpegImageClosure() {
|
53
68
|
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]);
|
54
69
|
var dctCos1 = 4017;
|
@@ -59,34 +74,48 @@ var JpegImage = function JpegImageClosure() {
|
|
59
74
|
var dctSin6 = 3784;
|
60
75
|
var dctSqrt2 = 5793;
|
61
76
|
var dctSqrt1d2 = 2896;
|
77
|
+
|
62
78
|
function JpegImage() {
|
63
|
-
|
64
|
-
|
79
|
+
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
80
|
+
_ref$decodeTransform = _ref.decodeTransform,
|
81
|
+
decodeTransform = _ref$decodeTransform === void 0 ? null : _ref$decodeTransform,
|
82
|
+
_ref$colorTransform = _ref.colorTransform,
|
83
|
+
colorTransform = _ref$colorTransform === void 0 ? -1 : _ref$colorTransform;
|
84
|
+
|
85
|
+
this._decodeTransform = decodeTransform;
|
86
|
+
this._colorTransform = colorTransform;
|
65
87
|
}
|
88
|
+
|
66
89
|
function buildHuffmanTable(codeLengths, values) {
|
67
90
|
var k = 0,
|
68
91
|
code = [],
|
69
92
|
i,
|
70
93
|
j,
|
71
94
|
length = 16;
|
95
|
+
|
72
96
|
while (length > 0 && !codeLengths[length - 1]) {
|
73
97
|
length--;
|
74
98
|
}
|
99
|
+
|
75
100
|
code.push({
|
76
101
|
children: [],
|
77
102
|
index: 0
|
78
103
|
});
|
79
104
|
var p = code[0],
|
80
105
|
q;
|
106
|
+
|
81
107
|
for (i = 0; i < length; i++) {
|
82
108
|
for (j = 0; j < codeLengths[i]; j++) {
|
83
109
|
p = code.pop();
|
84
110
|
p.children[p.index] = values[k];
|
111
|
+
|
85
112
|
while (p.index > 0) {
|
86
113
|
p = code.pop();
|
87
114
|
}
|
115
|
+
|
88
116
|
p.index++;
|
89
117
|
code.push(p);
|
118
|
+
|
90
119
|
while (code.length <= i) {
|
91
120
|
code.push(q = {
|
92
121
|
children: [],
|
@@ -95,8 +124,10 @@ var JpegImage = function JpegImageClosure() {
|
|
95
124
|
p.children[p.index] = q.children;
|
96
125
|
p = q;
|
97
126
|
}
|
127
|
+
|
98
128
|
k++;
|
99
129
|
}
|
130
|
+
|
100
131
|
if (i + 1 < length) {
|
101
132
|
code.push(q = {
|
102
133
|
children: [],
|
@@ -106,143 +137,184 @@ var JpegImage = function JpegImageClosure() {
|
|
106
137
|
p = q;
|
107
138
|
}
|
108
139
|
}
|
140
|
+
|
109
141
|
return code[0].children;
|
110
142
|
}
|
143
|
+
|
111
144
|
function getBlockBufferOffset(component, row, col) {
|
112
145
|
return 64 * ((component.blocksPerLine + 1) * row + col);
|
113
146
|
}
|
147
|
+
|
114
148
|
function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
|
115
149
|
var parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
|
116
|
-
|
117
150
|
var mcusPerLine = frame.mcusPerLine;
|
118
151
|
var progressive = frame.progressive;
|
119
152
|
var startOffset = offset,
|
120
153
|
bitsData = 0,
|
121
154
|
bitsCount = 0;
|
155
|
+
|
122
156
|
function readBit() {
|
123
157
|
if (bitsCount > 0) {
|
124
158
|
bitsCount--;
|
125
159
|
return bitsData >> bitsCount & 1;
|
126
160
|
}
|
161
|
+
|
127
162
|
bitsData = data[offset++];
|
163
|
+
|
128
164
|
if (bitsData === 0xFF) {
|
129
165
|
var nextByte = data[offset++];
|
166
|
+
|
130
167
|
if (nextByte) {
|
131
168
|
if (nextByte === 0xDC && parseDNLMarker) {
|
132
169
|
offset += 2;
|
133
170
|
var scanLines = data[offset++] << 8 | data[offset++];
|
171
|
+
|
134
172
|
if (scanLines > 0 && scanLines !== frame.scanLines) {
|
135
173
|
throw new DNLMarkerError('Found DNL marker (0xFFDC) while parsing scan data', scanLines);
|
136
174
|
}
|
175
|
+
} else if (nextByte === 0xD9) {
|
176
|
+
throw new EOIMarkerError('Found EOI marker (0xFFD9) while parsing scan data');
|
137
177
|
}
|
138
|
-
|
178
|
+
|
179
|
+
throw new JpegError("unexpected marker ".concat((bitsData << 8 | nextByte).toString(16)));
|
139
180
|
}
|
140
181
|
}
|
182
|
+
|
141
183
|
bitsCount = 7;
|
142
184
|
return bitsData >>> 7;
|
143
185
|
}
|
186
|
+
|
144
187
|
function decodeHuffman(tree) {
|
145
188
|
var node = tree;
|
189
|
+
|
146
190
|
while (true) {
|
147
191
|
node = node[readBit()];
|
192
|
+
|
148
193
|
if (typeof node === 'number') {
|
149
194
|
return node;
|
150
195
|
}
|
151
|
-
|
196
|
+
|
197
|
+
if (_typeof(node) !== 'object') {
|
152
198
|
throw new JpegError('invalid huffman sequence');
|
153
199
|
}
|
154
200
|
}
|
155
201
|
}
|
202
|
+
|
156
203
|
function receive(length) {
|
157
204
|
var n = 0;
|
205
|
+
|
158
206
|
while (length > 0) {
|
159
207
|
n = n << 1 | readBit();
|
160
208
|
length--;
|
161
209
|
}
|
210
|
+
|
162
211
|
return n;
|
163
212
|
}
|
213
|
+
|
164
214
|
function receiveAndExtend(length) {
|
165
215
|
if (length === 1) {
|
166
216
|
return readBit() === 1 ? 1 : -1;
|
167
217
|
}
|
218
|
+
|
168
219
|
var n = receive(length);
|
220
|
+
|
169
221
|
if (n >= 1 << length - 1) {
|
170
222
|
return n;
|
171
223
|
}
|
224
|
+
|
172
225
|
return n + (-1 << length) + 1;
|
173
226
|
}
|
227
|
+
|
174
228
|
function decodeBaseline(component, offset) {
|
175
229
|
var t = decodeHuffman(component.huffmanTableDC);
|
176
230
|
var diff = t === 0 ? 0 : receiveAndExtend(t);
|
177
231
|
component.blockData[offset] = component.pred += diff;
|
178
232
|
var k = 1;
|
233
|
+
|
179
234
|
while (k < 64) {
|
180
235
|
var rs = decodeHuffman(component.huffmanTableAC);
|
181
236
|
var s = rs & 15,
|
182
237
|
r = rs >> 4;
|
238
|
+
|
183
239
|
if (s === 0) {
|
184
240
|
if (r < 15) {
|
185
241
|
break;
|
186
242
|
}
|
243
|
+
|
187
244
|
k += 16;
|
188
245
|
continue;
|
189
246
|
}
|
247
|
+
|
190
248
|
k += r;
|
191
249
|
var z = dctZigZag[k];
|
192
250
|
component.blockData[offset + z] = receiveAndExtend(s);
|
193
251
|
k++;
|
194
252
|
}
|
195
253
|
}
|
254
|
+
|
196
255
|
function decodeDCFirst(component, offset) {
|
197
256
|
var t = decodeHuffman(component.huffmanTableDC);
|
198
257
|
var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
|
199
258
|
component.blockData[offset] = component.pred += diff;
|
200
259
|
}
|
260
|
+
|
201
261
|
function decodeDCSuccessive(component, offset) {
|
202
262
|
component.blockData[offset] |= readBit() << successive;
|
203
263
|
}
|
264
|
+
|
204
265
|
var eobrun = 0;
|
266
|
+
|
205
267
|
function decodeACFirst(component, offset) {
|
206
268
|
if (eobrun > 0) {
|
207
269
|
eobrun--;
|
208
270
|
return;
|
209
271
|
}
|
272
|
+
|
210
273
|
var k = spectralStart,
|
211
274
|
e = spectralEnd;
|
275
|
+
|
212
276
|
while (k <= e) {
|
213
277
|
var rs = decodeHuffman(component.huffmanTableAC);
|
214
278
|
var s = rs & 15,
|
215
279
|
r = rs >> 4;
|
280
|
+
|
216
281
|
if (s === 0) {
|
217
282
|
if (r < 15) {
|
218
283
|
eobrun = receive(r) + (1 << r) - 1;
|
219
284
|
break;
|
220
285
|
}
|
286
|
+
|
221
287
|
k += 16;
|
222
288
|
continue;
|
223
289
|
}
|
290
|
+
|
224
291
|
k += r;
|
225
292
|
var z = dctZigZag[k];
|
226
293
|
component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
|
227
294
|
k++;
|
228
295
|
}
|
229
296
|
}
|
297
|
+
|
230
298
|
var successiveACState = 0,
|
231
299
|
successiveACNextValue;
|
300
|
+
|
232
301
|
function decodeACSuccessive(component, offset) {
|
233
302
|
var k = spectralStart;
|
234
303
|
var e = spectralEnd;
|
235
304
|
var r = 0;
|
236
305
|
var s;
|
237
306
|
var rs;
|
307
|
+
|
238
308
|
while (k <= e) {
|
239
309
|
var offsetZ = offset + dctZigZag[k];
|
240
310
|
var sign = component.blockData[offsetZ] < 0 ? -1 : 1;
|
311
|
+
|
241
312
|
switch (successiveACState) {
|
242
313
|
case 0:
|
243
314
|
rs = decodeHuffman(component.huffmanTableAC);
|
244
315
|
s = rs & 15;
|
245
316
|
r = rs >> 4;
|
317
|
+
|
246
318
|
if (s === 0) {
|
247
319
|
if (r < 15) {
|
248
320
|
eobrun = receive(r) + (1 << r);
|
@@ -255,21 +327,27 @@ var JpegImage = function JpegImageClosure() {
|
|
255
327
|
if (s !== 1) {
|
256
328
|
throw new JpegError('invalid ACn encoding');
|
257
329
|
}
|
330
|
+
|
258
331
|
successiveACNextValue = receiveAndExtend(s);
|
259
332
|
successiveACState = r ? 2 : 3;
|
260
333
|
}
|
334
|
+
|
261
335
|
continue;
|
336
|
+
|
262
337
|
case 1:
|
263
338
|
case 2:
|
264
339
|
if (component.blockData[offsetZ]) {
|
265
340
|
component.blockData[offsetZ] += sign * (readBit() << successive);
|
266
341
|
} else {
|
267
342
|
r--;
|
343
|
+
|
268
344
|
if (r === 0) {
|
269
345
|
successiveACState = successiveACState === 2 ? 3 : 0;
|
270
346
|
}
|
271
347
|
}
|
348
|
+
|
272
349
|
break;
|
350
|
+
|
273
351
|
case 3:
|
274
352
|
if (component.blockData[offsetZ]) {
|
275
353
|
component.blockData[offsetZ] += sign * (readBit() << successive);
|
@@ -277,22 +355,29 @@ var JpegImage = function JpegImageClosure() {
|
|
277
355
|
component.blockData[offsetZ] = successiveACNextValue << successive;
|
278
356
|
successiveACState = 0;
|
279
357
|
}
|
358
|
+
|
280
359
|
break;
|
360
|
+
|
281
361
|
case 4:
|
282
362
|
if (component.blockData[offsetZ]) {
|
283
363
|
component.blockData[offsetZ] += sign * (readBit() << successive);
|
284
364
|
}
|
365
|
+
|
285
366
|
break;
|
286
367
|
}
|
368
|
+
|
287
369
|
k++;
|
288
370
|
}
|
371
|
+
|
289
372
|
if (successiveACState === 4) {
|
290
373
|
eobrun--;
|
374
|
+
|
291
375
|
if (eobrun === 0) {
|
292
376
|
successiveACState = 0;
|
293
377
|
}
|
294
378
|
}
|
295
379
|
}
|
380
|
+
|
296
381
|
function decodeMcu(component, decode, mcu, row, col) {
|
297
382
|
var mcuRow = mcu / mcusPerLine | 0;
|
298
383
|
var mcuCol = mcu % mcusPerLine;
|
@@ -301,15 +386,18 @@ var JpegImage = function JpegImageClosure() {
|
|
301
386
|
var offset = getBlockBufferOffset(component, blockRow, blockCol);
|
302
387
|
decode(component, offset);
|
303
388
|
}
|
389
|
+
|
304
390
|
function decodeBlock(component, decode, mcu) {
|
305
391
|
var blockRow = mcu / component.blocksPerLine | 0;
|
306
392
|
var blockCol = mcu % component.blocksPerLine;
|
307
393
|
var offset = getBlockBufferOffset(component, blockRow, blockCol);
|
308
394
|
decode(component, offset);
|
309
395
|
}
|
396
|
+
|
310
397
|
var componentsLength = components.length;
|
311
398
|
var component, i, j, k, n;
|
312
399
|
var decodeFn;
|
400
|
+
|
313
401
|
if (progressive) {
|
314
402
|
if (spectralStart === 0) {
|
315
403
|
decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
|
@@ -319,23 +407,31 @@ var JpegImage = function JpegImageClosure() {
|
|
319
407
|
} else {
|
320
408
|
decodeFn = decodeBaseline;
|
321
409
|
}
|
410
|
+
|
322
411
|
var mcu = 0,
|
323
412
|
fileMarker;
|
324
413
|
var mcuExpected;
|
414
|
+
|
325
415
|
if (componentsLength === 1) {
|
326
416
|
mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
|
327
417
|
} else {
|
328
418
|
mcuExpected = mcusPerLine * frame.mcusPerColumn;
|
329
419
|
}
|
420
|
+
|
330
421
|
var h, v;
|
422
|
+
|
331
423
|
while (mcu < mcuExpected) {
|
332
424
|
var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
|
425
|
+
|
333
426
|
for (i = 0; i < componentsLength; i++) {
|
334
427
|
components[i].pred = 0;
|
335
428
|
}
|
429
|
+
|
336
430
|
eobrun = 0;
|
431
|
+
|
337
432
|
if (componentsLength === 1) {
|
338
433
|
component = components[0];
|
434
|
+
|
339
435
|
for (n = 0; n < mcuToRead; n++) {
|
340
436
|
decodeBlock(component, decodeFn, mcu);
|
341
437
|
mcu++;
|
@@ -346,47 +442,60 @@ var JpegImage = function JpegImageClosure() {
|
|
346
442
|
component = components[i];
|
347
443
|
h = component.h;
|
348
444
|
v = component.v;
|
445
|
+
|
349
446
|
for (j = 0; j < v; j++) {
|
350
447
|
for (k = 0; k < h; k++) {
|
351
448
|
decodeMcu(component, decodeFn, mcu, j, k);
|
352
449
|
}
|
353
450
|
}
|
354
451
|
}
|
452
|
+
|
355
453
|
mcu++;
|
356
454
|
}
|
357
455
|
}
|
456
|
+
|
358
457
|
bitsCount = 0;
|
359
458
|
fileMarker = findNextFileMarker(data, offset);
|
459
|
+
|
360
460
|
if (fileMarker && fileMarker.invalid) {
|
361
461
|
(0, _util.warn)('decodeScan - unexpected MCU data, current marker is: ' + fileMarker.invalid);
|
362
462
|
offset = fileMarker.offset;
|
363
463
|
}
|
464
|
+
|
364
465
|
var marker = fileMarker && fileMarker.marker;
|
466
|
+
|
365
467
|
if (!marker || marker <= 0xFF00) {
|
366
468
|
throw new JpegError('marker was not found');
|
367
469
|
}
|
470
|
+
|
368
471
|
if (marker >= 0xFFD0 && marker <= 0xFFD7) {
|
369
472
|
offset += 2;
|
370
473
|
} else {
|
371
474
|
break;
|
372
475
|
}
|
373
476
|
}
|
477
|
+
|
374
478
|
fileMarker = findNextFileMarker(data, offset);
|
479
|
+
|
375
480
|
if (fileMarker && fileMarker.invalid) {
|
376
481
|
(0, _util.warn)('decodeScan - unexpected Scan data, current marker is: ' + fileMarker.invalid);
|
377
482
|
offset = fileMarker.offset;
|
378
483
|
}
|
484
|
+
|
379
485
|
return offset - startOffset;
|
380
486
|
}
|
487
|
+
|
381
488
|
function quantizeAndInverse(component, blockBufferOffset, p) {
|
382
489
|
var qt = component.quantizationTable,
|
383
490
|
blockData = component.blockData;
|
384
491
|
var v0, v1, v2, v3, v4, v5, v6, v7;
|
385
492
|
var p0, p1, p2, p3, p4, p5, p6, p7;
|
386
493
|
var t;
|
494
|
+
|
387
495
|
if (!qt) {
|
388
496
|
throw new JpegError('missing required Quantization Table.');
|
389
497
|
}
|
498
|
+
|
390
499
|
for (var row = 0; row < 64; row += 8) {
|
391
500
|
p0 = blockData[blockBufferOffset + row];
|
392
501
|
p1 = blockData[blockBufferOffset + row + 1];
|
@@ -397,6 +506,7 @@ var JpegImage = function JpegImageClosure() {
|
|
397
506
|
p6 = blockData[blockBufferOffset + row + 6];
|
398
507
|
p7 = blockData[blockBufferOffset + row + 7];
|
399
508
|
p0 *= qt[row];
|
509
|
+
|
400
510
|
if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
|
401
511
|
t = dctSqrt2 * p0 + 512 >> 10;
|
402
512
|
p[row] = t;
|
@@ -409,6 +519,7 @@ var JpegImage = function JpegImageClosure() {
|
|
409
519
|
p[row + 7] = t;
|
410
520
|
continue;
|
411
521
|
}
|
522
|
+
|
412
523
|
p1 *= qt[row + 1];
|
413
524
|
p2 *= qt[row + 2];
|
414
525
|
p3 *= qt[row + 3];
|
@@ -452,6 +563,7 @@ var JpegImage = function JpegImageClosure() {
|
|
452
563
|
p[row + 3] = v3 + v4;
|
453
564
|
p[row + 4] = v3 - v4;
|
454
565
|
}
|
566
|
+
|
455
567
|
for (var col = 0; col < 8; ++col) {
|
456
568
|
p0 = p[col];
|
457
569
|
p1 = p[col + 8];
|
@@ -461,6 +573,7 @@ var JpegImage = function JpegImageClosure() {
|
|
461
573
|
p5 = p[col + 40];
|
462
574
|
p6 = p[col + 48];
|
463
575
|
p7 = p[col + 56];
|
576
|
+
|
464
577
|
if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
|
465
578
|
t = dctSqrt2 * p0 + 8192 >> 14;
|
466
579
|
t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;
|
@@ -474,6 +587,7 @@ var JpegImage = function JpegImageClosure() {
|
|
474
587
|
blockData[blockBufferOffset + col + 56] = t;
|
475
588
|
continue;
|
476
589
|
}
|
590
|
+
|
477
591
|
v0 = dctSqrt2 * p0 + 2048 >> 12;
|
478
592
|
v1 = dctSqrt2 * p4 + 2048 >> 12;
|
479
593
|
v2 = p2;
|
@@ -527,30 +641,38 @@ var JpegImage = function JpegImageClosure() {
|
|
527
641
|
blockData[blockBufferOffset + col + 56] = p7;
|
528
642
|
}
|
529
643
|
}
|
644
|
+
|
530
645
|
function buildComponentData(frame, component) {
|
531
646
|
var blocksPerLine = component.blocksPerLine;
|
532
647
|
var blocksPerColumn = component.blocksPerColumn;
|
533
648
|
var computationBuffer = new Int16Array(64);
|
649
|
+
|
534
650
|
for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
|
535
651
|
for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
|
536
652
|
var offset = getBlockBufferOffset(component, blockRow, blockCol);
|
537
653
|
quantizeAndInverse(component, offset, computationBuffer);
|
538
654
|
}
|
539
655
|
}
|
656
|
+
|
540
657
|
return component.blockData;
|
541
658
|
}
|
659
|
+
|
542
660
|
function findNextFileMarker(data, currentPos) {
|
543
661
|
var startPos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : currentPos;
|
544
662
|
|
545
663
|
function peekUint16(pos) {
|
546
664
|
return data[pos] << 8 | data[pos + 1];
|
547
665
|
}
|
666
|
+
|
548
667
|
var maxPos = data.length - 1;
|
549
668
|
var newPos = startPos < currentPos ? startPos : currentPos;
|
669
|
+
|
550
670
|
if (currentPos >= maxPos) {
|
551
671
|
return null;
|
552
672
|
}
|
673
|
+
|
553
674
|
var currentMarker = peekUint16(currentPos);
|
675
|
+
|
554
676
|
if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {
|
555
677
|
return {
|
556
678
|
invalid: null,
|
@@ -558,45 +680,55 @@ var JpegImage = function JpegImageClosure() {
|
|
558
680
|
offset: currentPos
|
559
681
|
};
|
560
682
|
}
|
683
|
+
|
561
684
|
var newMarker = peekUint16(newPos);
|
685
|
+
|
562
686
|
while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {
|
563
687
|
if (++newPos >= maxPos) {
|
564
688
|
return null;
|
565
689
|
}
|
690
|
+
|
566
691
|
newMarker = peekUint16(newPos);
|
567
692
|
}
|
693
|
+
|
568
694
|
return {
|
569
695
|
invalid: currentMarker.toString(16),
|
570
696
|
marker: newMarker,
|
571
697
|
offset: newPos
|
572
698
|
};
|
573
699
|
}
|
700
|
+
|
574
701
|
JpegImage.prototype = {
|
575
702
|
parse: function parse(data) {
|
576
|
-
var
|
577
|
-
|
578
|
-
dnlScanLines =
|
703
|
+
var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
704
|
+
_ref2$dnlScanLines = _ref2.dnlScanLines,
|
705
|
+
dnlScanLines = _ref2$dnlScanLines === void 0 ? null : _ref2$dnlScanLines;
|
579
706
|
|
580
707
|
function readUint16() {
|
581
708
|
var value = data[offset] << 8 | data[offset + 1];
|
582
709
|
offset += 2;
|
583
710
|
return value;
|
584
711
|
}
|
712
|
+
|
585
713
|
function readDataBlock() {
|
586
714
|
var length = readUint16();
|
587
715
|
var endOffset = offset + length - 2;
|
588
716
|
var fileMarker = findNextFileMarker(data, endOffset, offset);
|
717
|
+
|
589
718
|
if (fileMarker && fileMarker.invalid) {
|
590
719
|
(0, _util.warn)('readDataBlock - incorrect length, current marker is: ' + fileMarker.invalid);
|
591
720
|
endOffset = fileMarker.offset;
|
592
721
|
}
|
722
|
+
|
593
723
|
var array = data.subarray(offset, endOffset);
|
594
724
|
offset += array.length;
|
595
725
|
return array;
|
596
726
|
}
|
727
|
+
|
597
728
|
function prepareComponents(frame) {
|
598
729
|
var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
|
599
730
|
var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
|
731
|
+
|
600
732
|
for (var i = 0; i < frame.components.length; i++) {
|
601
733
|
component = frame.components[i];
|
602
734
|
var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
|
@@ -608,9 +740,11 @@ var JpegImage = function JpegImageClosure() {
|
|
608
740
|
component.blocksPerLine = blocksPerLine;
|
609
741
|
component.blocksPerColumn = blocksPerColumn;
|
610
742
|
}
|
743
|
+
|
611
744
|
frame.mcusPerLine = mcusPerLine;
|
612
745
|
frame.mcusPerColumn = mcusPerColumn;
|
613
746
|
}
|
747
|
+
|
614
748
|
var offset = 0;
|
615
749
|
var jfif = null;
|
616
750
|
var adobe = null;
|
@@ -620,12 +754,16 @@ var JpegImage = function JpegImageClosure() {
|
|
620
754
|
var huffmanTablesAC = [],
|
621
755
|
huffmanTablesDC = [];
|
622
756
|
var fileMarker = readUint16();
|
757
|
+
|
623
758
|
if (fileMarker !== 0xFFD8) {
|
624
759
|
throw new JpegError('SOI not found');
|
625
760
|
}
|
761
|
+
|
626
762
|
fileMarker = readUint16();
|
627
|
-
|
763
|
+
|
764
|
+
markerLoop: while (fileMarker !== 0xFFD9) {
|
628
765
|
var i, j, l;
|
766
|
+
|
629
767
|
switch (fileMarker) {
|
630
768
|
case 0xFFE0:
|
631
769
|
case 0xFFE1:
|
@@ -645,6 +783,7 @@ var JpegImage = function JpegImageClosure() {
|
|
645
783
|
case 0xFFEF:
|
646
784
|
case 0xFFFE:
|
647
785
|
var appData = readDataBlock();
|
786
|
+
|
648
787
|
if (fileMarker === 0xFFE0) {
|
649
788
|
if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
|
650
789
|
jfif = {
|
@@ -661,6 +800,7 @@ var JpegImage = function JpegImageClosure() {
|
|
661
800
|
};
|
662
801
|
}
|
663
802
|
}
|
803
|
+
|
664
804
|
if (fileMarker === 0xFFEE) {
|
665
805
|
if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {
|
666
806
|
adobe = {
|
@@ -671,14 +811,18 @@ var JpegImage = function JpegImageClosure() {
|
|
671
811
|
};
|
672
812
|
}
|
673
813
|
}
|
814
|
+
|
674
815
|
break;
|
816
|
+
|
675
817
|
case 0xFFDB:
|
676
818
|
var quantizationTablesLength = readUint16();
|
677
819
|
var quantizationTablesEnd = quantizationTablesLength + offset - 2;
|
678
820
|
var z;
|
821
|
+
|
679
822
|
while (offset < quantizationTablesEnd) {
|
680
823
|
var quantizationTableSpec = data[offset++];
|
681
824
|
var tableData = new Uint16Array(64);
|
825
|
+
|
682
826
|
if (quantizationTableSpec >> 4 === 0) {
|
683
827
|
for (j = 0; j < 64; j++) {
|
684
828
|
z = dctZigZag[j];
|
@@ -692,15 +836,19 @@ var JpegImage = function JpegImageClosure() {
|
|
692
836
|
} else {
|
693
837
|
throw new JpegError('DQT - invalid table spec');
|
694
838
|
}
|
839
|
+
|
695
840
|
quantizationTables[quantizationTableSpec & 15] = tableData;
|
696
841
|
}
|
842
|
+
|
697
843
|
break;
|
844
|
+
|
698
845
|
case 0xFFC0:
|
699
846
|
case 0xFFC1:
|
700
847
|
case 0xFFC2:
|
701
848
|
if (frame) {
|
702
849
|
throw new JpegError('Only single frame JPEGs supported');
|
703
850
|
}
|
851
|
+
|
704
852
|
readUint16();
|
705
853
|
frame = {};
|
706
854
|
frame.extended = fileMarker === 0xFFC1;
|
@@ -715,16 +863,20 @@ var JpegImage = function JpegImageClosure() {
|
|
715
863
|
componentId;
|
716
864
|
var maxH = 0,
|
717
865
|
maxV = 0;
|
866
|
+
|
718
867
|
for (i = 0; i < componentsCount; i++) {
|
719
868
|
componentId = data[offset];
|
720
869
|
var h = data[offset + 1] >> 4;
|
721
870
|
var v = data[offset + 1] & 15;
|
871
|
+
|
722
872
|
if (maxH < h) {
|
723
873
|
maxH = h;
|
724
874
|
}
|
875
|
+
|
725
876
|
if (maxV < v) {
|
726
877
|
maxV = v;
|
727
878
|
}
|
879
|
+
|
728
880
|
var qId = data[offset + 2];
|
729
881
|
l = frame.components.push({
|
730
882
|
h: h,
|
@@ -735,37 +887,48 @@ var JpegImage = function JpegImageClosure() {
|
|
735
887
|
frame.componentIds[componentId] = l - 1;
|
736
888
|
offset += 3;
|
737
889
|
}
|
890
|
+
|
738
891
|
frame.maxH = maxH;
|
739
892
|
frame.maxV = maxV;
|
740
893
|
prepareComponents(frame);
|
741
894
|
break;
|
895
|
+
|
742
896
|
case 0xFFC4:
|
743
897
|
var huffmanLength = readUint16();
|
898
|
+
|
744
899
|
for (i = 2; i < huffmanLength;) {
|
745
900
|
var huffmanTableSpec = data[offset++];
|
746
901
|
var codeLengths = new Uint8Array(16);
|
747
902
|
var codeLengthSum = 0;
|
903
|
+
|
748
904
|
for (j = 0; j < 16; j++, offset++) {
|
749
905
|
codeLengthSum += codeLengths[j] = data[offset];
|
750
906
|
}
|
907
|
+
|
751
908
|
var huffmanValues = new Uint8Array(codeLengthSum);
|
909
|
+
|
752
910
|
for (j = 0; j < codeLengthSum; j++, offset++) {
|
753
911
|
huffmanValues[j] = data[offset];
|
754
912
|
}
|
913
|
+
|
755
914
|
i += 17 + codeLengthSum;
|
756
915
|
(huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
|
757
916
|
}
|
917
|
+
|
758
918
|
break;
|
919
|
+
|
759
920
|
case 0xFFDD:
|
760
921
|
readUint16();
|
761
922
|
resetInterval = readUint16();
|
762
923
|
break;
|
924
|
+
|
763
925
|
case 0xFFDA:
|
764
926
|
var parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
|
765
927
|
readUint16();
|
766
928
|
var selectorsCount = data[offset++];
|
767
929
|
var components = [],
|
768
930
|
component;
|
931
|
+
|
769
932
|
for (i = 0; i < selectorsCount; i++) {
|
770
933
|
var componentIndex = frame.componentIds[data[offset++]];
|
771
934
|
component = frame.components[componentIndex];
|
@@ -774,54 +937,75 @@ var JpegImage = function JpegImageClosure() {
|
|
774
937
|
component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
|
775
938
|
components.push(component);
|
776
939
|
}
|
940
|
+
|
777
941
|
var spectralStart = data[offset++];
|
778
942
|
var spectralEnd = data[offset++];
|
779
943
|
var successiveApproximation = data[offset++];
|
944
|
+
|
780
945
|
try {
|
781
946
|
var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
|
782
947
|
offset += processed;
|
783
948
|
} catch (ex) {
|
784
949
|
if (ex instanceof DNLMarkerError) {
|
785
|
-
(0, _util.warn)(
|
786
|
-
return this.parse(data, {
|
950
|
+
(0, _util.warn)("".concat(ex.message, " -- attempting to re-parse the JPEG image."));
|
951
|
+
return this.parse(data, {
|
952
|
+
dnlScanLines: ex.scanLines
|
953
|
+
});
|
954
|
+
} else if (ex instanceof EOIMarkerError) {
|
955
|
+
(0, _util.warn)("".concat(ex.message, " -- ignoring the rest of the image data."));
|
956
|
+
break markerLoop;
|
787
957
|
}
|
958
|
+
|
788
959
|
throw ex;
|
789
960
|
}
|
961
|
+
|
790
962
|
break;
|
963
|
+
|
791
964
|
case 0xFFDC:
|
792
965
|
offset += 4;
|
793
966
|
break;
|
967
|
+
|
794
968
|
case 0xFFFF:
|
795
969
|
if (data[offset] !== 0xFF) {
|
796
970
|
offset--;
|
797
971
|
}
|
972
|
+
|
798
973
|
break;
|
974
|
+
|
799
975
|
default:
|
800
976
|
if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
|
801
977
|
offset -= 3;
|
802
978
|
break;
|
803
979
|
}
|
980
|
+
|
804
981
|
var nextFileMarker = findNextFileMarker(data, offset - 2);
|
982
|
+
|
805
983
|
if (nextFileMarker && nextFileMarker.invalid) {
|
806
984
|
(0, _util.warn)('JpegImage.parse - unexpected data, current marker is: ' + nextFileMarker.invalid);
|
807
985
|
offset = nextFileMarker.offset;
|
808
986
|
break;
|
809
987
|
}
|
988
|
+
|
810
989
|
throw new JpegError('unknown marker ' + fileMarker.toString(16));
|
811
990
|
}
|
991
|
+
|
812
992
|
fileMarker = readUint16();
|
813
993
|
}
|
994
|
+
|
814
995
|
this.width = frame.samplesPerLine;
|
815
996
|
this.height = frame.scanLines;
|
816
997
|
this.jfif = jfif;
|
817
998
|
this.adobe = adobe;
|
818
999
|
this.components = [];
|
1000
|
+
|
819
1001
|
for (i = 0; i < frame.components.length; i++) {
|
820
1002
|
component = frame.components[i];
|
821
1003
|
var quantizationTable = quantizationTables[component.quantizationId];
|
1004
|
+
|
822
1005
|
if (quantizationTable) {
|
823
1006
|
component.quantizationTable = quantizationTable;
|
824
1007
|
}
|
1008
|
+
|
825
1009
|
this.components.push({
|
826
1010
|
output: buildComponentData(frame, component),
|
827
1011
|
scaleX: component.h / frame.maxH,
|
@@ -830,10 +1014,12 @@ var JpegImage = function JpegImageClosure() {
|
|
830
1014
|
blocksPerColumn: component.blocksPerColumn
|
831
1015
|
});
|
832
1016
|
}
|
1017
|
+
|
833
1018
|
this.numComponents = this.components.length;
|
1019
|
+
return undefined;
|
834
1020
|
},
|
835
|
-
|
836
|
-
|
1021
|
+
_getLinearizedBlockData: function _getLinearizedBlockData(width, height) {
|
1022
|
+
var isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
837
1023
|
var scaleX = this.width / width,
|
838
1024
|
scaleY = this.height / height;
|
839
1025
|
var component, componentScaleX, componentScaleY, blocksPerScanline;
|
@@ -846,6 +1032,7 @@ var JpegImage = function JpegImageClosure() {
|
|
846
1032
|
var data = new Uint8ClampedArray(dataLength);
|
847
1033
|
var xScaleBlockOffset = new Uint32Array(width);
|
848
1034
|
var mask3LSB = 0xfffffff8;
|
1035
|
+
|
849
1036
|
for (i = 0; i < numComponents; i++) {
|
850
1037
|
component = this.components[i];
|
851
1038
|
componentScaleX = component.scaleX * scaleX;
|
@@ -853,20 +1040,29 @@ var JpegImage = function JpegImageClosure() {
|
|
853
1040
|
offset = i;
|
854
1041
|
output = component.output;
|
855
1042
|
blocksPerScanline = component.blocksPerLine + 1 << 3;
|
1043
|
+
|
856
1044
|
for (x = 0; x < width; x++) {
|
857
1045
|
j = 0 | x * componentScaleX;
|
858
1046
|
xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
|
859
1047
|
}
|
1048
|
+
|
860
1049
|
for (y = 0; y < height; y++) {
|
861
1050
|
j = 0 | y * componentScaleY;
|
862
1051
|
index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
|
1052
|
+
|
863
1053
|
for (x = 0; x < width; x++) {
|
864
1054
|
data[offset] = output[index + xScaleBlockOffset[x]];
|
865
1055
|
offset += numComponents;
|
866
1056
|
}
|
867
1057
|
}
|
868
1058
|
}
|
869
|
-
|
1059
|
+
|
1060
|
+
var transform = this._decodeTransform;
|
1061
|
+
|
1062
|
+
if (!isSourcePDF && numComponents === 4 && !transform) {
|
1063
|
+
transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
|
1064
|
+
}
|
1065
|
+
|
870
1066
|
if (transform) {
|
871
1067
|
for (i = 0; i < dataLength;) {
|
872
1068
|
for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
|
@@ -874,26 +1070,33 @@ var JpegImage = function JpegImageClosure() {
|
|
874
1070
|
}
|
875
1071
|
}
|
876
1072
|
}
|
1073
|
+
|
877
1074
|
return data;
|
878
1075
|
},
|
879
|
-
|
1076
|
+
|
1077
|
+
get _isColorConversionNeeded() {
|
880
1078
|
if (this.adobe) {
|
881
1079
|
return !!this.adobe.transformCode;
|
882
1080
|
}
|
1081
|
+
|
883
1082
|
if (this.numComponents === 3) {
|
884
|
-
if (this.
|
1083
|
+
if (this._colorTransform === 0) {
|
885
1084
|
return false;
|
886
1085
|
}
|
1086
|
+
|
887
1087
|
return true;
|
888
1088
|
}
|
889
|
-
|
1089
|
+
|
1090
|
+
if (this._colorTransform === 1) {
|
890
1091
|
return true;
|
891
1092
|
}
|
1093
|
+
|
892
1094
|
return false;
|
893
1095
|
},
|
894
1096
|
|
895
1097
|
_convertYccToRgb: function convertYccToRgb(data) {
|
896
1098
|
var Y, Cb, Cr;
|
1099
|
+
|
897
1100
|
for (var i = 0, length = data.length; i < length; i += 3) {
|
898
1101
|
Y = data[i];
|
899
1102
|
Cb = data[i + 1];
|
@@ -902,11 +1105,13 @@ var JpegImage = function JpegImageClosure() {
|
|
902
1105
|
data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
|
903
1106
|
data[i + 2] = Y - 226.816 + 1.772 * Cb;
|
904
1107
|
}
|
1108
|
+
|
905
1109
|
return data;
|
906
1110
|
},
|
907
1111
|
_convertYcckToRgb: function convertYcckToRgb(data) {
|
908
1112
|
var Y, Cb, Cr, k;
|
909
1113
|
var offset = 0;
|
1114
|
+
|
910
1115
|
for (var i = 0, length = data.length; i < length; i += 4) {
|
911
1116
|
Y = data[i];
|
912
1117
|
Cb = data[i + 1];
|
@@ -916,10 +1121,12 @@ var JpegImage = function JpegImageClosure() {
|
|
916
1121
|
data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
|
917
1122
|
data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
|
918
1123
|
}
|
1124
|
+
|
919
1125
|
return data.subarray(0, offset);
|
920
1126
|
},
|
921
1127
|
_convertYcckToCmyk: function convertYcckToCmyk(data) {
|
922
1128
|
var Y, Cb, Cr;
|
1129
|
+
|
923
1130
|
for (var i = 0, length = data.length; i < length; i += 4) {
|
924
1131
|
Y = data[i];
|
925
1132
|
Cb = data[i + 1];
|
@@ -928,12 +1135,14 @@ var JpegImage = function JpegImageClosure() {
|
|
928
1135
|
data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
|
929
1136
|
data[i + 2] = 481.816 - Y - 1.772 * Cb;
|
930
1137
|
}
|
1138
|
+
|
931
1139
|
return data;
|
932
1140
|
},
|
933
1141
|
_convertCmykToRgb: function convertCmykToRgb(data) {
|
934
1142
|
var c, m, y, k;
|
935
1143
|
var offset = 0;
|
936
1144
|
var scale = 1 / 255;
|
1145
|
+
|
937
1146
|
for (var i = 0, length = data.length; i < length; i += 4) {
|
938
1147
|
c = data[i] * scale;
|
939
1148
|
m = data[i + 1] * scale;
|
@@ -943,39 +1152,54 @@ var JpegImage = function JpegImageClosure() {
|
|
943
1152
|
data[offset++] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) - k * (20.737325471181034 * k + 187.80453709719578);
|
944
1153
|
data[offset++] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 193.58209356861505) - k * (22.33816807309886 * k + 180.12613974708367);
|
945
1154
|
}
|
1155
|
+
|
946
1156
|
return data.subarray(0, offset);
|
947
1157
|
},
|
948
|
-
getData: function getData(
|
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
|
+
|
949
1166
|
if (this.numComponents > 4) {
|
950
1167
|
throw new JpegError('Unsupported color mode');
|
951
1168
|
}
|
952
|
-
|
953
|
-
|
1169
|
+
|
1170
|
+
var data = this._getLinearizedBlockData(width, height, isSourcePDF);
|
1171
|
+
|
1172
|
+
if (this.numComponents === 1 && forceRGB) {
|
954
1173
|
var dataLength = data.length;
|
955
1174
|
var rgbData = new Uint8ClampedArray(dataLength * 3);
|
956
1175
|
var offset = 0;
|
1176
|
+
|
957
1177
|
for (var i = 0; i < dataLength; i++) {
|
958
1178
|
var grayColor = data[i];
|
959
1179
|
rgbData[offset++] = grayColor;
|
960
1180
|
rgbData[offset++] = grayColor;
|
961
1181
|
rgbData[offset++] = grayColor;
|
962
1182
|
}
|
1183
|
+
|
963
1184
|
return rgbData;
|
964
|
-
} else if (this.numComponents === 3 && this._isColorConversionNeeded
|
1185
|
+
} else if (this.numComponents === 3 && this._isColorConversionNeeded) {
|
965
1186
|
return this._convertYccToRgb(data);
|
966
1187
|
} else if (this.numComponents === 4) {
|
967
|
-
if (this._isColorConversionNeeded
|
968
|
-
if (
|
1188
|
+
if (this._isColorConversionNeeded) {
|
1189
|
+
if (forceRGB) {
|
969
1190
|
return this._convertYcckToRgb(data);
|
970
1191
|
}
|
1192
|
+
|
971
1193
|
return this._convertYcckToCmyk(data);
|
972
|
-
} else if (
|
1194
|
+
} else if (forceRGB) {
|
973
1195
|
return this._convertCmykToRgb(data);
|
974
1196
|
}
|
975
1197
|
}
|
1198
|
+
|
976
1199
|
return data;
|
977
1200
|
}
|
978
1201
|
};
|
979
1202
|
return JpegImage;
|
980
1203
|
}();
|
1204
|
+
|
981
1205
|
exports.JpegImage = JpegImage;
|