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