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