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/jpx.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,26 +19,28 @@
|
|
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.JpxImage =
|
27
|
+
exports.JpxImage = void 0;
|
28
28
|
|
29
|
-
var _util = require(
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
var _arithmetic_decoder = require(
|
31
|
+
var _arithmetic_decoder = require("./arithmetic_decoder");
|
32
32
|
|
33
33
|
var JpxError = function JpxErrorClosure() {
|
34
34
|
function JpxError(msg) {
|
35
35
|
this.message = 'JPX error: ' + msg;
|
36
36
|
}
|
37
|
+
|
37
38
|
JpxError.prototype = new Error();
|
38
39
|
JpxError.prototype.name = 'JpxError';
|
39
40
|
JpxError.constructor = JpxError;
|
40
41
|
return JpxError;
|
41
42
|
}();
|
43
|
+
|
42
44
|
var JpxImage = function JpxImageClosure() {
|
43
45
|
var SubbandsGainLog2 = {
|
44
46
|
'LL': 0,
|
@@ -46,49 +48,63 @@ var JpxImage = function JpxImageClosure() {
|
|
46
48
|
'HL': 1,
|
47
49
|
'HH': 2
|
48
50
|
};
|
51
|
+
|
49
52
|
function JpxImage() {
|
50
53
|
this.failOnCorruptedImage = false;
|
51
54
|
}
|
55
|
+
|
52
56
|
JpxImage.prototype = {
|
53
57
|
parse: function JpxImage_parse(data) {
|
54
58
|
var head = (0, _util.readUint16)(data, 0);
|
59
|
+
|
55
60
|
if (head === 0xFF4F) {
|
56
61
|
this.parseCodestream(data, 0, data.length);
|
57
62
|
return;
|
58
63
|
}
|
64
|
+
|
59
65
|
var position = 0,
|
60
66
|
length = data.length;
|
67
|
+
|
61
68
|
while (position < length) {
|
62
69
|
var headerSize = 8;
|
63
70
|
var lbox = (0, _util.readUint32)(data, position);
|
64
71
|
var tbox = (0, _util.readUint32)(data, position + 4);
|
65
72
|
position += headerSize;
|
73
|
+
|
66
74
|
if (lbox === 1) {
|
67
75
|
lbox = (0, _util.readUint32)(data, position) * 4294967296 + (0, _util.readUint32)(data, position + 4);
|
68
76
|
position += 8;
|
69
77
|
headerSize += 8;
|
70
78
|
}
|
79
|
+
|
71
80
|
if (lbox === 0) {
|
72
81
|
lbox = length - position + headerSize;
|
73
82
|
}
|
83
|
+
|
74
84
|
if (lbox < headerSize) {
|
75
85
|
throw new JpxError('Invalid box field size');
|
76
86
|
}
|
87
|
+
|
77
88
|
var dataLength = lbox - headerSize;
|
78
89
|
var jumpDataLength = true;
|
90
|
+
|
79
91
|
switch (tbox) {
|
80
92
|
case 0x6A703268:
|
81
93
|
jumpDataLength = false;
|
82
94
|
break;
|
95
|
+
|
83
96
|
case 0x636F6C72:
|
84
97
|
var method = data[position];
|
98
|
+
|
85
99
|
if (method === 1) {
|
86
100
|
var colorspace = (0, _util.readUint32)(data, position + 3);
|
101
|
+
|
87
102
|
switch (colorspace) {
|
88
103
|
case 16:
|
89
104
|
case 17:
|
90
105
|
case 18:
|
91
106
|
break;
|
107
|
+
|
92
108
|
default:
|
93
109
|
(0, _util.warn)('Unknown colorspace ' + colorspace);
|
94
110
|
break;
|
@@ -96,26 +112,33 @@ var JpxImage = function JpxImageClosure() {
|
|
96
112
|
} else if (method === 2) {
|
97
113
|
(0, _util.info)('ICC profile not supported');
|
98
114
|
}
|
115
|
+
|
99
116
|
break;
|
117
|
+
|
100
118
|
case 0x6A703263:
|
101
119
|
this.parseCodestream(data, position, position + dataLength);
|
102
120
|
break;
|
121
|
+
|
103
122
|
case 0x6A502020:
|
104
123
|
if ((0, _util.readUint32)(data, position) !== 0x0d0a870a) {
|
105
124
|
(0, _util.warn)('Invalid JP2 signature');
|
106
125
|
}
|
126
|
+
|
107
127
|
break;
|
128
|
+
|
108
129
|
case 0x6A501A1A:
|
109
130
|
case 0x66747970:
|
110
131
|
case 0x72726571:
|
111
132
|
case 0x72657320:
|
112
133
|
case 0x69686472:
|
113
134
|
break;
|
135
|
+
|
114
136
|
default:
|
115
137
|
var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF);
|
116
138
|
(0, _util.warn)('Unsupported header type ' + tbox + ' (' + headerType + ')');
|
117
139
|
break;
|
118
140
|
}
|
141
|
+
|
119
142
|
if (jumpDataLength) {
|
120
143
|
position += dataLength;
|
121
144
|
}
|
@@ -123,10 +146,12 @@ var JpxImage = function JpxImageClosure() {
|
|
123
146
|
},
|
124
147
|
parseImageProperties: function JpxImage_parseImageProperties(stream) {
|
125
148
|
var newByte = stream.getByte();
|
149
|
+
|
126
150
|
while (newByte >= 0) {
|
127
151
|
var oldByte = newByte;
|
128
152
|
newByte = stream.getByte();
|
129
153
|
var code = oldByte << 8 | newByte;
|
154
|
+
|
130
155
|
if (code === 0xFF51) {
|
131
156
|
stream.skip(4);
|
132
157
|
var Xsiz = stream.getInt32() >>> 0;
|
@@ -142,13 +167,16 @@ var JpxImage = function JpxImageClosure() {
|
|
142
167
|
return;
|
143
168
|
}
|
144
169
|
}
|
170
|
+
|
145
171
|
throw new JpxError('No size marker found in JPX stream');
|
146
172
|
},
|
147
173
|
parseCodestream: function JpxImage_parseCodestream(data, start, end) {
|
148
174
|
var context = {};
|
149
175
|
var doNotRecover = false;
|
176
|
+
|
150
177
|
try {
|
151
178
|
var position = start;
|
179
|
+
|
152
180
|
while (position + 1 < end) {
|
153
181
|
var code = (0, _util.readUint16)(data, position);
|
154
182
|
position += 2;
|
@@ -159,12 +187,15 @@ var JpxImage = function JpxImageClosure() {
|
|
159
187
|
spqcdSize,
|
160
188
|
scalarExpounded,
|
161
189
|
tile;
|
190
|
+
|
162
191
|
switch (code) {
|
163
192
|
case 0xFF4F:
|
164
193
|
context.mainHeader = true;
|
165
194
|
break;
|
195
|
+
|
166
196
|
case 0xFFD9:
|
167
197
|
break;
|
198
|
+
|
168
199
|
case 0xFF51:
|
169
200
|
length = (0, _util.readUint16)(data, position);
|
170
201
|
var siz = {};
|
@@ -180,6 +211,7 @@ var JpxImage = function JpxImageClosure() {
|
|
180
211
|
siz.Csiz = componentsCount;
|
181
212
|
var components = [];
|
182
213
|
j = position + 38;
|
214
|
+
|
183
215
|
for (var i = 0; i < componentsCount; i++) {
|
184
216
|
var component = {
|
185
217
|
precision: (data[j] & 0x7F) + 1,
|
@@ -191,39 +223,48 @@ var JpxImage = function JpxImageClosure() {
|
|
191
223
|
calculateComponentDimensions(component, siz);
|
192
224
|
components.push(component);
|
193
225
|
}
|
226
|
+
|
194
227
|
context.SIZ = siz;
|
195
228
|
context.components = components;
|
196
229
|
calculateTileGrids(context, components);
|
197
230
|
context.QCC = [];
|
198
231
|
context.COC = [];
|
199
232
|
break;
|
233
|
+
|
200
234
|
case 0xFF5C:
|
201
235
|
length = (0, _util.readUint16)(data, position);
|
202
236
|
var qcd = {};
|
203
237
|
j = position + 2;
|
204
238
|
sqcd = data[j++];
|
239
|
+
|
205
240
|
switch (sqcd & 0x1F) {
|
206
241
|
case 0:
|
207
242
|
spqcdSize = 8;
|
208
243
|
scalarExpounded = true;
|
209
244
|
break;
|
245
|
+
|
210
246
|
case 1:
|
211
247
|
spqcdSize = 16;
|
212
248
|
scalarExpounded = false;
|
213
249
|
break;
|
250
|
+
|
214
251
|
case 2:
|
215
252
|
spqcdSize = 16;
|
216
253
|
scalarExpounded = true;
|
217
254
|
break;
|
255
|
+
|
218
256
|
default:
|
219
257
|
throw new Error('Invalid SQcd value ' + sqcd);
|
220
258
|
}
|
259
|
+
|
221
260
|
qcd.noQuantization = spqcdSize === 8;
|
222
261
|
qcd.scalarExpounded = scalarExpounded;
|
223
262
|
qcd.guardBits = sqcd >> 5;
|
224
263
|
spqcds = [];
|
264
|
+
|
225
265
|
while (j < length + position) {
|
226
266
|
var spqcd = {};
|
267
|
+
|
227
268
|
if (spqcdSize === 8) {
|
228
269
|
spqcd.epsilon = data[j++] >> 3;
|
229
270
|
spqcd.mu = 0;
|
@@ -232,50 +273,64 @@ var JpxImage = function JpxImageClosure() {
|
|
232
273
|
spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
|
233
274
|
j += 2;
|
234
275
|
}
|
276
|
+
|
235
277
|
spqcds.push(spqcd);
|
236
278
|
}
|
279
|
+
|
237
280
|
qcd.SPqcds = spqcds;
|
281
|
+
|
238
282
|
if (context.mainHeader) {
|
239
283
|
context.QCD = qcd;
|
240
284
|
} else {
|
241
285
|
context.currentTile.QCD = qcd;
|
242
286
|
context.currentTile.QCC = [];
|
243
287
|
}
|
288
|
+
|
244
289
|
break;
|
290
|
+
|
245
291
|
case 0xFF5D:
|
246
292
|
length = (0, _util.readUint16)(data, position);
|
247
293
|
var qcc = {};
|
248
294
|
j = position + 2;
|
249
295
|
var cqcc;
|
296
|
+
|
250
297
|
if (context.SIZ.Csiz < 257) {
|
251
298
|
cqcc = data[j++];
|
252
299
|
} else {
|
253
300
|
cqcc = (0, _util.readUint16)(data, j);
|
254
301
|
j += 2;
|
255
302
|
}
|
303
|
+
|
256
304
|
sqcd = data[j++];
|
305
|
+
|
257
306
|
switch (sqcd & 0x1F) {
|
258
307
|
case 0:
|
259
308
|
spqcdSize = 8;
|
260
309
|
scalarExpounded = true;
|
261
310
|
break;
|
311
|
+
|
262
312
|
case 1:
|
263
313
|
spqcdSize = 16;
|
264
314
|
scalarExpounded = false;
|
265
315
|
break;
|
316
|
+
|
266
317
|
case 2:
|
267
318
|
spqcdSize = 16;
|
268
319
|
scalarExpounded = true;
|
269
320
|
break;
|
321
|
+
|
270
322
|
default:
|
271
323
|
throw new Error('Invalid SQcd value ' + sqcd);
|
272
324
|
}
|
325
|
+
|
273
326
|
qcc.noQuantization = spqcdSize === 8;
|
274
327
|
qcc.scalarExpounded = scalarExpounded;
|
275
328
|
qcc.guardBits = sqcd >> 5;
|
276
329
|
spqcds = [];
|
330
|
+
|
277
331
|
while (j < length + position) {
|
278
332
|
spqcd = {};
|
333
|
+
|
279
334
|
if (spqcdSize === 8) {
|
280
335
|
spqcd.epsilon = data[j++] >> 3;
|
281
336
|
spqcd.mu = 0;
|
@@ -284,15 +339,20 @@ var JpxImage = function JpxImageClosure() {
|
|
284
339
|
spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
|
285
340
|
j += 2;
|
286
341
|
}
|
342
|
+
|
287
343
|
spqcds.push(spqcd);
|
288
344
|
}
|
345
|
+
|
289
346
|
qcc.SPqcds = spqcds;
|
347
|
+
|
290
348
|
if (context.mainHeader) {
|
291
349
|
context.QCC[cqcc] = qcc;
|
292
350
|
} else {
|
293
351
|
context.currentTile.QCC[cqcc] = qcc;
|
294
352
|
}
|
353
|
+
|
295
354
|
break;
|
355
|
+
|
296
356
|
case 0xFF52:
|
297
357
|
length = (0, _util.readUint16)(data, position);
|
298
358
|
var cod = {};
|
@@ -316,8 +376,10 @@ var JpxImage = function JpxImageClosure() {
|
|
316
376
|
cod.predictableTermination = !!(blockStyle & 16);
|
317
377
|
cod.segmentationSymbolUsed = !!(blockStyle & 32);
|
318
378
|
cod.reversibleTransformation = data[j++];
|
379
|
+
|
319
380
|
if (cod.entropyCoderWithCustomPrecincts) {
|
320
381
|
var precinctsSizes = [];
|
382
|
+
|
321
383
|
while (j < length + position) {
|
322
384
|
var precinctsSize = data[j++];
|
323
385
|
precinctsSizes.push({
|
@@ -325,35 +387,46 @@ var JpxImage = function JpxImageClosure() {
|
|
325
387
|
PPy: precinctsSize >> 4
|
326
388
|
});
|
327
389
|
}
|
390
|
+
|
328
391
|
cod.precinctsSizes = precinctsSizes;
|
329
392
|
}
|
393
|
+
|
330
394
|
var unsupported = [];
|
395
|
+
|
331
396
|
if (cod.selectiveArithmeticCodingBypass) {
|
332
397
|
unsupported.push('selectiveArithmeticCodingBypass');
|
333
398
|
}
|
399
|
+
|
334
400
|
if (cod.resetContextProbabilities) {
|
335
401
|
unsupported.push('resetContextProbabilities');
|
336
402
|
}
|
403
|
+
|
337
404
|
if (cod.terminationOnEachCodingPass) {
|
338
405
|
unsupported.push('terminationOnEachCodingPass');
|
339
406
|
}
|
407
|
+
|
340
408
|
if (cod.verticallyStripe) {
|
341
409
|
unsupported.push('verticallyStripe');
|
342
410
|
}
|
411
|
+
|
343
412
|
if (cod.predictableTermination) {
|
344
413
|
unsupported.push('predictableTermination');
|
345
414
|
}
|
415
|
+
|
346
416
|
if (unsupported.length > 0) {
|
347
417
|
doNotRecover = true;
|
348
418
|
throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')');
|
349
419
|
}
|
420
|
+
|
350
421
|
if (context.mainHeader) {
|
351
422
|
context.COD = cod;
|
352
423
|
} else {
|
353
424
|
context.currentTile.COD = cod;
|
354
425
|
context.currentTile.COC = [];
|
355
426
|
}
|
427
|
+
|
356
428
|
break;
|
429
|
+
|
357
430
|
case 0xFF90:
|
358
431
|
length = (0, _util.readUint16)(data, position);
|
359
432
|
tile = {};
|
@@ -363,34 +436,43 @@ var JpxImage = function JpxImageClosure() {
|
|
363
436
|
tile.partIndex = data[position + 8];
|
364
437
|
tile.partsCount = data[position + 9];
|
365
438
|
context.mainHeader = false;
|
439
|
+
|
366
440
|
if (tile.partIndex === 0) {
|
367
441
|
tile.COD = context.COD;
|
368
442
|
tile.COC = context.COC.slice(0);
|
369
443
|
tile.QCD = context.QCD;
|
370
444
|
tile.QCC = context.QCC.slice(0);
|
371
445
|
}
|
446
|
+
|
372
447
|
context.currentTile = tile;
|
373
448
|
break;
|
449
|
+
|
374
450
|
case 0xFF93:
|
375
451
|
tile = context.currentTile;
|
452
|
+
|
376
453
|
if (tile.partIndex === 0) {
|
377
454
|
initializeTile(context, tile.index);
|
378
455
|
buildPackets(context);
|
379
456
|
}
|
457
|
+
|
380
458
|
length = tile.dataEnd - position;
|
381
459
|
parseTilePackets(context, data, position, length);
|
382
460
|
break;
|
461
|
+
|
383
462
|
case 0xFF55:
|
384
463
|
case 0xFF57:
|
385
464
|
case 0xFF58:
|
386
465
|
case 0xFF64:
|
387
466
|
length = (0, _util.readUint16)(data, position);
|
388
467
|
break;
|
468
|
+
|
389
469
|
case 0xFF53:
|
390
470
|
throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented');
|
471
|
+
|
391
472
|
default:
|
392
473
|
throw new Error('Unknown codestream code: ' + code.toString(16));
|
393
474
|
}
|
475
|
+
|
394
476
|
position += length;
|
395
477
|
}
|
396
478
|
} catch (e) {
|
@@ -400,12 +482,14 @@ var JpxImage = function JpxImageClosure() {
|
|
400
482
|
(0, _util.warn)('JPX: Trying to recover from: ' + e.message);
|
401
483
|
}
|
402
484
|
}
|
485
|
+
|
403
486
|
this.tiles = transformComponents(context);
|
404
487
|
this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
|
405
488
|
this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
|
406
489
|
this.componentsCount = context.SIZ.Csiz;
|
407
490
|
}
|
408
491
|
};
|
492
|
+
|
409
493
|
function calculateComponentDimensions(component, siz) {
|
410
494
|
component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
|
411
495
|
component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
|
@@ -414,12 +498,14 @@ var JpxImage = function JpxImageClosure() {
|
|
414
498
|
component.width = component.x1 - component.x0;
|
415
499
|
component.height = component.y1 - component.y0;
|
416
500
|
}
|
501
|
+
|
417
502
|
function calculateTileGrids(context, components) {
|
418
503
|
var siz = context.SIZ;
|
419
504
|
var tile,
|
420
505
|
tiles = [];
|
421
506
|
var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
|
422
507
|
var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
|
508
|
+
|
423
509
|
for (var q = 0; q < numYtiles; q++) {
|
424
510
|
for (var p = 0; p < numXtiles; p++) {
|
425
511
|
tile = {};
|
@@ -433,10 +519,13 @@ var JpxImage = function JpxImageClosure() {
|
|
433
519
|
tiles.push(tile);
|
434
520
|
}
|
435
521
|
}
|
522
|
+
|
436
523
|
context.tiles = tiles;
|
437
524
|
var componentsCount = siz.Csiz;
|
525
|
+
|
438
526
|
for (var i = 0, ii = componentsCount; i < ii; i++) {
|
439
527
|
var component = components[i];
|
528
|
+
|
440
529
|
for (var j = 0, jj = tiles.length; j < jj; j++) {
|
441
530
|
var tileComponent = {};
|
442
531
|
tile = tiles[j];
|
@@ -450,9 +539,11 @@ var JpxImage = function JpxImageClosure() {
|
|
450
539
|
}
|
451
540
|
}
|
452
541
|
}
|
542
|
+
|
453
543
|
function getBlocksDimensions(context, component, r) {
|
454
544
|
var codOrCoc = component.codingStyleParameters;
|
455
545
|
var result = {};
|
546
|
+
|
456
547
|
if (!codOrCoc.entropyCoderWithCustomPrecincts) {
|
457
548
|
result.PPx = 15;
|
458
549
|
result.PPy = 15;
|
@@ -460,10 +551,12 @@ var JpxImage = function JpxImageClosure() {
|
|
460
551
|
result.PPx = codOrCoc.precinctsSizes[r].PPx;
|
461
552
|
result.PPy = codOrCoc.precinctsSizes[r].PPy;
|
462
553
|
}
|
554
|
+
|
463
555
|
result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);
|
464
556
|
result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);
|
465
557
|
return result;
|
466
558
|
}
|
559
|
+
|
467
560
|
function buildPrecincts(context, resolution, dimensions) {
|
468
561
|
var precinctWidth = 1 << dimensions.PPx;
|
469
562
|
var precinctHeight = 1 << dimensions.PPy;
|
@@ -483,6 +576,7 @@ var JpxImage = function JpxImageClosure() {
|
|
483
576
|
precinctHeightInSubband: precinctHeightInSubband
|
484
577
|
};
|
485
578
|
}
|
579
|
+
|
486
580
|
function buildCodeblocks(context, subband, dimensions) {
|
487
581
|
var xcb_ = dimensions.xcb_;
|
488
582
|
var ycb_ = dimensions.ycb_;
|
@@ -496,6 +590,7 @@ var JpxImage = function JpxImageClosure() {
|
|
496
590
|
var codeblocks = [];
|
497
591
|
var precincts = [];
|
498
592
|
var i, j, codeblock, precinctNumber;
|
593
|
+
|
499
594
|
for (j = cby0; j < cby1; j++) {
|
500
595
|
for (i = cbx0; i < cbx1; i++) {
|
501
596
|
codeblock = {
|
@@ -516,17 +611,21 @@ var JpxImage = function JpxImageClosure() {
|
|
516
611
|
codeblock.precinctNumber = precinctNumber;
|
517
612
|
codeblock.subbandType = subband.type;
|
518
613
|
codeblock.Lblock = 3;
|
614
|
+
|
519
615
|
if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {
|
520
616
|
continue;
|
521
617
|
}
|
618
|
+
|
522
619
|
codeblocks.push(codeblock);
|
523
620
|
var precinct = precincts[precinctNumber];
|
621
|
+
|
524
622
|
if (precinct !== undefined) {
|
525
623
|
if (i < precinct.cbxMin) {
|
526
624
|
precinct.cbxMin = i;
|
527
625
|
} else if (i > precinct.cbxMax) {
|
528
626
|
precinct.cbxMax = i;
|
529
627
|
}
|
628
|
+
|
530
629
|
if (j < precinct.cbyMin) {
|
531
630
|
precinct.cbxMin = j;
|
532
631
|
} else if (j > precinct.cbyMax) {
|
@@ -540,9 +639,11 @@ var JpxImage = function JpxImageClosure() {
|
|
540
639
|
cbyMax: j
|
541
640
|
};
|
542
641
|
}
|
642
|
+
|
543
643
|
codeblock.precinct = precinct;
|
544
644
|
}
|
545
645
|
}
|
646
|
+
|
546
647
|
subband.codeblockParameters = {
|
547
648
|
codeblockWidth: xcb_,
|
548
649
|
codeblockHeight: ycb_,
|
@@ -552,25 +653,32 @@ var JpxImage = function JpxImageClosure() {
|
|
552
653
|
subband.codeblocks = codeblocks;
|
553
654
|
subband.precincts = precincts;
|
554
655
|
}
|
656
|
+
|
555
657
|
function createPacket(resolution, precinctNumber, layerNumber) {
|
556
658
|
var precinctCodeblocks = [];
|
557
659
|
var subbands = resolution.subbands;
|
660
|
+
|
558
661
|
for (var i = 0, ii = subbands.length; i < ii; i++) {
|
559
662
|
var subband = subbands[i];
|
560
663
|
var codeblocks = subband.codeblocks;
|
664
|
+
|
561
665
|
for (var j = 0, jj = codeblocks.length; j < jj; j++) {
|
562
666
|
var codeblock = codeblocks[j];
|
667
|
+
|
563
668
|
if (codeblock.precinctNumber !== precinctNumber) {
|
564
669
|
continue;
|
565
670
|
}
|
671
|
+
|
566
672
|
precinctCodeblocks.push(codeblock);
|
567
673
|
}
|
568
674
|
}
|
675
|
+
|
569
676
|
return {
|
570
677
|
layerNumber: layerNumber,
|
571
678
|
codeblocks: precinctCodeblocks
|
572
679
|
};
|
573
680
|
}
|
681
|
+
|
574
682
|
function LayerResolutionComponentPositionIterator(context) {
|
575
683
|
var siz = context.SIZ;
|
576
684
|
var tileIndex = context.currentTile.index;
|
@@ -578,37 +686,48 @@ var JpxImage = function JpxImageClosure() {
|
|
578
686
|
var layersCount = tile.codingStyleDefaultParameters.layersCount;
|
579
687
|
var componentsCount = siz.Csiz;
|
580
688
|
var maxDecompositionLevelsCount = 0;
|
689
|
+
|
581
690
|
for (var q = 0; q < componentsCount; q++) {
|
582
691
|
maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
|
583
692
|
}
|
693
|
+
|
584
694
|
var l = 0,
|
585
695
|
r = 0,
|
586
696
|
i = 0,
|
587
697
|
k = 0;
|
698
|
+
|
588
699
|
this.nextPacket = function JpxImage_nextPacket() {
|
589
700
|
for (; l < layersCount; l++) {
|
590
701
|
for (; r <= maxDecompositionLevelsCount; r++) {
|
591
702
|
for (; i < componentsCount; i++) {
|
592
703
|
var component = tile.components[i];
|
704
|
+
|
593
705
|
if (r > component.codingStyleParameters.decompositionLevelsCount) {
|
594
706
|
continue;
|
595
707
|
}
|
708
|
+
|
596
709
|
var resolution = component.resolutions[r];
|
597
710
|
var numprecincts = resolution.precinctParameters.numprecincts;
|
711
|
+
|
598
712
|
for (; k < numprecincts;) {
|
599
713
|
var packet = createPacket(resolution, k, l);
|
600
714
|
k++;
|
601
715
|
return packet;
|
602
716
|
}
|
717
|
+
|
603
718
|
k = 0;
|
604
719
|
}
|
720
|
+
|
605
721
|
i = 0;
|
606
722
|
}
|
723
|
+
|
607
724
|
r = 0;
|
608
725
|
}
|
726
|
+
|
609
727
|
throw new JpxError('Out of packets');
|
610
728
|
};
|
611
729
|
}
|
730
|
+
|
612
731
|
function ResolutionLayerComponentPositionIterator(context) {
|
613
732
|
var siz = context.SIZ;
|
614
733
|
var tileIndex = context.currentTile.index;
|
@@ -616,37 +735,48 @@ var JpxImage = function JpxImageClosure() {
|
|
616
735
|
var layersCount = tile.codingStyleDefaultParameters.layersCount;
|
617
736
|
var componentsCount = siz.Csiz;
|
618
737
|
var maxDecompositionLevelsCount = 0;
|
738
|
+
|
619
739
|
for (var q = 0; q < componentsCount; q++) {
|
620
740
|
maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
|
621
741
|
}
|
742
|
+
|
622
743
|
var r = 0,
|
623
744
|
l = 0,
|
624
745
|
i = 0,
|
625
746
|
k = 0;
|
747
|
+
|
626
748
|
this.nextPacket = function JpxImage_nextPacket() {
|
627
749
|
for (; r <= maxDecompositionLevelsCount; r++) {
|
628
750
|
for (; l < layersCount; l++) {
|
629
751
|
for (; i < componentsCount; i++) {
|
630
752
|
var component = tile.components[i];
|
753
|
+
|
631
754
|
if (r > component.codingStyleParameters.decompositionLevelsCount) {
|
632
755
|
continue;
|
633
756
|
}
|
757
|
+
|
634
758
|
var resolution = component.resolutions[r];
|
635
759
|
var numprecincts = resolution.precinctParameters.numprecincts;
|
760
|
+
|
636
761
|
for (; k < numprecincts;) {
|
637
762
|
var packet = createPacket(resolution, k, l);
|
638
763
|
k++;
|
639
764
|
return packet;
|
640
765
|
}
|
766
|
+
|
641
767
|
k = 0;
|
642
768
|
}
|
769
|
+
|
643
770
|
i = 0;
|
644
771
|
}
|
772
|
+
|
645
773
|
l = 0;
|
646
774
|
}
|
775
|
+
|
647
776
|
throw new JpxError('Out of packets');
|
648
777
|
};
|
649
778
|
}
|
779
|
+
|
650
780
|
function ResolutionPositionComponentLayerIterator(context) {
|
651
781
|
var siz = context.SIZ;
|
652
782
|
var tileIndex = context.currentTile.index;
|
@@ -655,52 +785,69 @@ var JpxImage = function JpxImageClosure() {
|
|
655
785
|
var componentsCount = siz.Csiz;
|
656
786
|
var l, r, c, p;
|
657
787
|
var maxDecompositionLevelsCount = 0;
|
788
|
+
|
658
789
|
for (c = 0; c < componentsCount; c++) {
|
659
790
|
var component = tile.components[c];
|
660
791
|
maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);
|
661
792
|
}
|
793
|
+
|
662
794
|
var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);
|
795
|
+
|
663
796
|
for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
|
664
797
|
var maxNumPrecincts = 0;
|
798
|
+
|
665
799
|
for (c = 0; c < componentsCount; ++c) {
|
666
800
|
var resolutions = tile.components[c].resolutions;
|
801
|
+
|
667
802
|
if (r < resolutions.length) {
|
668
803
|
maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);
|
669
804
|
}
|
670
805
|
}
|
806
|
+
|
671
807
|
maxNumPrecinctsInLevel[r] = maxNumPrecincts;
|
672
808
|
}
|
809
|
+
|
673
810
|
l = 0;
|
674
811
|
r = 0;
|
675
812
|
c = 0;
|
676
813
|
p = 0;
|
814
|
+
|
677
815
|
this.nextPacket = function JpxImage_nextPacket() {
|
678
816
|
for (; r <= maxDecompositionLevelsCount; r++) {
|
679
817
|
for (; p < maxNumPrecinctsInLevel[r]; p++) {
|
680
818
|
for (; c < componentsCount; c++) {
|
681
819
|
var component = tile.components[c];
|
820
|
+
|
682
821
|
if (r > component.codingStyleParameters.decompositionLevelsCount) {
|
683
822
|
continue;
|
684
823
|
}
|
824
|
+
|
685
825
|
var resolution = component.resolutions[r];
|
686
826
|
var numprecincts = resolution.precinctParameters.numprecincts;
|
827
|
+
|
687
828
|
if (p >= numprecincts) {
|
688
829
|
continue;
|
689
830
|
}
|
831
|
+
|
690
832
|
for (; l < layersCount;) {
|
691
833
|
var packet = createPacket(resolution, p, l);
|
692
834
|
l++;
|
693
835
|
return packet;
|
694
836
|
}
|
837
|
+
|
695
838
|
l = 0;
|
696
839
|
}
|
840
|
+
|
697
841
|
c = 0;
|
698
842
|
}
|
843
|
+
|
699
844
|
p = 0;
|
700
845
|
}
|
846
|
+
|
701
847
|
throw new JpxError('Out of packets');
|
702
848
|
};
|
703
849
|
}
|
850
|
+
|
704
851
|
function PositionComponentResolutionLayerIterator(context) {
|
705
852
|
var siz = context.SIZ;
|
706
853
|
var tileIndex = context.currentTile.index;
|
@@ -714,35 +861,45 @@ var JpxImage = function JpxImageClosure() {
|
|
714
861
|
c = 0,
|
715
862
|
px = 0,
|
716
863
|
py = 0;
|
864
|
+
|
717
865
|
this.nextPacket = function JpxImage_nextPacket() {
|
718
866
|
for (; py < precinctsIterationSizes.maxNumHigh; py++) {
|
719
867
|
for (; px < precinctsIterationSizes.maxNumWide; px++) {
|
720
868
|
for (; c < componentsCount; c++) {
|
721
869
|
var component = tile.components[c];
|
722
870
|
var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
|
871
|
+
|
723
872
|
for (; r <= decompositionLevelsCount; r++) {
|
724
873
|
var resolution = component.resolutions[r];
|
725
874
|
var sizeInImageScale = precinctsSizes.components[c].resolutions[r];
|
726
875
|
var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
|
876
|
+
|
727
877
|
if (k === null) {
|
728
878
|
continue;
|
729
879
|
}
|
880
|
+
|
730
881
|
for (; l < layersCount;) {
|
731
882
|
var packet = createPacket(resolution, k, l);
|
732
883
|
l++;
|
733
884
|
return packet;
|
734
885
|
}
|
886
|
+
|
735
887
|
l = 0;
|
736
888
|
}
|
889
|
+
|
737
890
|
r = 0;
|
738
891
|
}
|
892
|
+
|
739
893
|
c = 0;
|
740
894
|
}
|
895
|
+
|
741
896
|
px = 0;
|
742
897
|
}
|
898
|
+
|
743
899
|
throw new JpxError('Out of packets');
|
744
900
|
};
|
745
901
|
}
|
902
|
+
|
746
903
|
function ComponentPositionResolutionLayerIterator(context) {
|
747
904
|
var siz = context.SIZ;
|
748
905
|
var tileIndex = context.currentTile.index;
|
@@ -755,45 +912,58 @@ var JpxImage = function JpxImageClosure() {
|
|
755
912
|
c = 0,
|
756
913
|
px = 0,
|
757
914
|
py = 0;
|
915
|
+
|
758
916
|
this.nextPacket = function JpxImage_nextPacket() {
|
759
917
|
for (; c < componentsCount; ++c) {
|
760
918
|
var component = tile.components[c];
|
761
919
|
var precinctsIterationSizes = precinctsSizes.components[c];
|
762
920
|
var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
|
921
|
+
|
763
922
|
for (; py < precinctsIterationSizes.maxNumHigh; py++) {
|
764
923
|
for (; px < precinctsIterationSizes.maxNumWide; px++) {
|
765
924
|
for (; r <= decompositionLevelsCount; r++) {
|
766
925
|
var resolution = component.resolutions[r];
|
767
926
|
var sizeInImageScale = precinctsIterationSizes.resolutions[r];
|
768
927
|
var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
|
928
|
+
|
769
929
|
if (k === null) {
|
770
930
|
continue;
|
771
931
|
}
|
932
|
+
|
772
933
|
for (; l < layersCount;) {
|
773
934
|
var packet = createPacket(resolution, k, l);
|
774
935
|
l++;
|
775
936
|
return packet;
|
776
937
|
}
|
938
|
+
|
777
939
|
l = 0;
|
778
940
|
}
|
941
|
+
|
779
942
|
r = 0;
|
780
943
|
}
|
944
|
+
|
781
945
|
px = 0;
|
782
946
|
}
|
947
|
+
|
783
948
|
py = 0;
|
784
949
|
}
|
950
|
+
|
785
951
|
throw new JpxError('Out of packets');
|
786
952
|
};
|
787
953
|
}
|
954
|
+
|
788
955
|
function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
|
789
956
|
var posX = pxIndex * precinctIterationSizes.minWidth;
|
790
957
|
var posY = pyIndex * precinctIterationSizes.minHeight;
|
958
|
+
|
791
959
|
if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {
|
792
960
|
return null;
|
793
961
|
}
|
962
|
+
|
794
963
|
var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;
|
795
964
|
return posX / sizeInImageScale.height + startPrecinctRowIndex;
|
796
965
|
}
|
966
|
+
|
797
967
|
function getPrecinctSizesInImageScale(tile) {
|
798
968
|
var componentsCount = tile.components.length;
|
799
969
|
var minWidth = Number.MAX_VALUE;
|
@@ -801,6 +971,7 @@ var JpxImage = function JpxImageClosure() {
|
|
801
971
|
var maxNumWide = 0;
|
802
972
|
var maxNumHigh = 0;
|
803
973
|
var sizePerComponent = new Array(componentsCount);
|
974
|
+
|
804
975
|
for (var c = 0; c < componentsCount; c++) {
|
805
976
|
var component = tile.components[c];
|
806
977
|
var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
|
@@ -810,6 +981,7 @@ var JpxImage = function JpxImageClosure() {
|
|
810
981
|
var maxNumWideCurrentComponent = 0;
|
811
982
|
var maxNumHighCurrentComponent = 0;
|
812
983
|
var scale = 1;
|
984
|
+
|
813
985
|
for (var r = decompositionLevelsCount; r >= 0; --r) {
|
814
986
|
var resolution = component.resolutions[r];
|
815
987
|
var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;
|
@@ -824,6 +996,7 @@ var JpxImage = function JpxImageClosure() {
|
|
824
996
|
};
|
825
997
|
scale <<= 1;
|
826
998
|
}
|
999
|
+
|
827
1000
|
minWidth = Math.min(minWidth, minWidthCurrentComponent);
|
828
1001
|
minHeight = Math.min(minHeight, minHeightCurrentComponent);
|
829
1002
|
maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
|
@@ -836,6 +1009,7 @@ var JpxImage = function JpxImageClosure() {
|
|
836
1009
|
maxNumHigh: maxNumHighCurrentComponent
|
837
1010
|
};
|
838
1011
|
}
|
1012
|
+
|
839
1013
|
return {
|
840
1014
|
components: sizePerComponent,
|
841
1015
|
minWidth: minWidth,
|
@@ -844,16 +1018,19 @@ var JpxImage = function JpxImageClosure() {
|
|
844
1018
|
maxNumHigh: maxNumHigh
|
845
1019
|
};
|
846
1020
|
}
|
1021
|
+
|
847
1022
|
function buildPackets(context) {
|
848
1023
|
var siz = context.SIZ;
|
849
1024
|
var tileIndex = context.currentTile.index;
|
850
1025
|
var tile = context.tiles[tileIndex];
|
851
1026
|
var componentsCount = siz.Csiz;
|
1027
|
+
|
852
1028
|
for (var c = 0; c < componentsCount; c++) {
|
853
1029
|
var component = tile.components[c];
|
854
1030
|
var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
|
855
1031
|
var resolutions = [];
|
856
1032
|
var subbands = [];
|
1033
|
+
|
857
1034
|
for (var r = 0; r <= decompositionLevelsCount; r++) {
|
858
1035
|
var blocksDimensions = getBlocksDimensions(context, component, r);
|
859
1036
|
var resolution = {};
|
@@ -866,6 +1043,7 @@ var JpxImage = function JpxImageClosure() {
|
|
866
1043
|
buildPrecincts(context, resolution, blocksDimensions);
|
867
1044
|
resolutions.push(resolution);
|
868
1045
|
var subband;
|
1046
|
+
|
869
1047
|
if (r === 0) {
|
870
1048
|
subband = {};
|
871
1049
|
subband.type = 'LL';
|
@@ -913,39 +1091,50 @@ var JpxImage = function JpxImageClosure() {
|
|
913
1091
|
resolution.subbands = resolutionSubbands;
|
914
1092
|
}
|
915
1093
|
}
|
1094
|
+
|
916
1095
|
component.resolutions = resolutions;
|
917
1096
|
component.subbands = subbands;
|
918
1097
|
}
|
1098
|
+
|
919
1099
|
var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
|
1100
|
+
|
920
1101
|
switch (progressionOrder) {
|
921
1102
|
case 0:
|
922
1103
|
tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);
|
923
1104
|
break;
|
1105
|
+
|
924
1106
|
case 1:
|
925
1107
|
tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);
|
926
1108
|
break;
|
1109
|
+
|
927
1110
|
case 2:
|
928
1111
|
tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);
|
929
1112
|
break;
|
1113
|
+
|
930
1114
|
case 3:
|
931
1115
|
tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);
|
932
1116
|
break;
|
1117
|
+
|
933
1118
|
case 4:
|
934
1119
|
tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);
|
935
1120
|
break;
|
1121
|
+
|
936
1122
|
default:
|
937
|
-
throw new JpxError(
|
1123
|
+
throw new JpxError("Unsupported progression order ".concat(progressionOrder));
|
938
1124
|
}
|
939
1125
|
}
|
1126
|
+
|
940
1127
|
function parseTilePackets(context, data, offset, dataLength) {
|
941
1128
|
var position = 0;
|
942
1129
|
var buffer,
|
943
1130
|
bufferSize = 0,
|
944
1131
|
skipNextBit = false;
|
1132
|
+
|
945
1133
|
function readBits(count) {
|
946
1134
|
while (bufferSize < count) {
|
947
1135
|
var b = data[offset + position];
|
948
1136
|
position++;
|
1137
|
+
|
949
1138
|
if (skipNextBit) {
|
950
1139
|
buffer = buffer << 7 | b;
|
951
1140
|
bufferSize += 7;
|
@@ -954,13 +1143,16 @@ var JpxImage = function JpxImageClosure() {
|
|
954
1143
|
buffer = buffer << 8 | b;
|
955
1144
|
bufferSize += 8;
|
956
1145
|
}
|
1146
|
+
|
957
1147
|
if (b === 0xFF) {
|
958
1148
|
skipNextBit = true;
|
959
1149
|
}
|
960
1150
|
}
|
1151
|
+
|
961
1152
|
bufferSize -= count;
|
962
1153
|
return buffer >>> bufferSize & (1 << count) - 1;
|
963
1154
|
}
|
1155
|
+
|
964
1156
|
function skipMarkerIfEqual(value) {
|
965
1157
|
if (data[offset + position - 1] === 0xFF && data[offset + position] === value) {
|
966
1158
|
skipBytes(1);
|
@@ -969,53 +1161,71 @@ var JpxImage = function JpxImageClosure() {
|
|
969
1161
|
skipBytes(2);
|
970
1162
|
return true;
|
971
1163
|
}
|
1164
|
+
|
972
1165
|
return false;
|
973
1166
|
}
|
1167
|
+
|
974
1168
|
function skipBytes(count) {
|
975
1169
|
position += count;
|
976
1170
|
}
|
1171
|
+
|
977
1172
|
function alignToByte() {
|
978
1173
|
bufferSize = 0;
|
1174
|
+
|
979
1175
|
if (skipNextBit) {
|
980
1176
|
position++;
|
981
1177
|
skipNextBit = false;
|
982
1178
|
}
|
983
1179
|
}
|
1180
|
+
|
984
1181
|
function readCodingpasses() {
|
985
1182
|
if (readBits(1) === 0) {
|
986
1183
|
return 1;
|
987
1184
|
}
|
1185
|
+
|
988
1186
|
if (readBits(1) === 0) {
|
989
1187
|
return 2;
|
990
1188
|
}
|
1189
|
+
|
991
1190
|
var value = readBits(2);
|
1191
|
+
|
992
1192
|
if (value < 3) {
|
993
1193
|
return value + 3;
|
994
1194
|
}
|
1195
|
+
|
995
1196
|
value = readBits(5);
|
1197
|
+
|
996
1198
|
if (value < 31) {
|
997
1199
|
return value + 6;
|
998
1200
|
}
|
1201
|
+
|
999
1202
|
value = readBits(7);
|
1000
1203
|
return value + 37;
|
1001
1204
|
}
|
1205
|
+
|
1002
1206
|
var tileIndex = context.currentTile.index;
|
1003
1207
|
var tile = context.tiles[tileIndex];
|
1004
1208
|
var sopMarkerUsed = context.COD.sopMarkerUsed;
|
1005
1209
|
var ephMarkerUsed = context.COD.ephMarkerUsed;
|
1006
1210
|
var packetsIterator = tile.packetsIterator;
|
1211
|
+
|
1007
1212
|
while (position < dataLength) {
|
1008
1213
|
alignToByte();
|
1214
|
+
|
1009
1215
|
if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
|
1010
1216
|
skipBytes(4);
|
1011
1217
|
}
|
1218
|
+
|
1012
1219
|
var packet = packetsIterator.nextPacket();
|
1220
|
+
|
1013
1221
|
if (!readBits(1)) {
|
1014
1222
|
continue;
|
1015
1223
|
}
|
1224
|
+
|
1016
1225
|
var layerNumber = packet.layerNumber;
|
1017
1226
|
var queue = [],
|
1018
1227
|
codeblock;
|
1228
|
+
|
1019
1229
|
for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
|
1020
1230
|
codeblock = packet.codeblocks[i];
|
1021
1231
|
var precinct = codeblock.precinct;
|
@@ -1024,11 +1234,13 @@ var JpxImage = function JpxImageClosure() {
|
|
1024
1234
|
var codeblockIncluded = false;
|
1025
1235
|
var firstTimeInclusion = false;
|
1026
1236
|
var valueReady;
|
1237
|
+
|
1027
1238
|
if (codeblock['included'] !== undefined) {
|
1028
1239
|
codeblockIncluded = !!readBits(1);
|
1029
1240
|
} else {
|
1030
1241
|
precinct = codeblock.precinct;
|
1031
1242
|
var inclusionTree, zeroBitPlanesTree;
|
1243
|
+
|
1032
1244
|
if (precinct['inclusionTree'] !== undefined) {
|
1033
1245
|
inclusionTree = precinct.inclusionTree;
|
1034
1246
|
} else {
|
@@ -1039,10 +1251,12 @@ var JpxImage = function JpxImageClosure() {
|
|
1039
1251
|
precinct.inclusionTree = inclusionTree;
|
1040
1252
|
precinct.zeroBitPlanesTree = zeroBitPlanesTree;
|
1041
1253
|
}
|
1254
|
+
|
1042
1255
|
if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
|
1043
1256
|
while (true) {
|
1044
1257
|
if (readBits(1)) {
|
1045
1258
|
valueReady = !inclusionTree.nextLevel();
|
1259
|
+
|
1046
1260
|
if (valueReady) {
|
1047
1261
|
codeblock.included = true;
|
1048
1262
|
codeblockIncluded = firstTimeInclusion = true;
|
@@ -1055,15 +1269,19 @@ var JpxImage = function JpxImageClosure() {
|
|
1055
1269
|
}
|
1056
1270
|
}
|
1057
1271
|
}
|
1272
|
+
|
1058
1273
|
if (!codeblockIncluded) {
|
1059
1274
|
continue;
|
1060
1275
|
}
|
1276
|
+
|
1061
1277
|
if (firstTimeInclusion) {
|
1062
1278
|
zeroBitPlanesTree = precinct.zeroBitPlanesTree;
|
1063
1279
|
zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
|
1280
|
+
|
1064
1281
|
while (true) {
|
1065
1282
|
if (readBits(1)) {
|
1066
1283
|
valueReady = !zeroBitPlanesTree.nextLevel();
|
1284
|
+
|
1067
1285
|
if (valueReady) {
|
1068
1286
|
break;
|
1069
1287
|
}
|
@@ -1071,12 +1289,16 @@ var JpxImage = function JpxImageClosure() {
|
|
1071
1289
|
zeroBitPlanesTree.incrementValue();
|
1072
1290
|
}
|
1073
1291
|
}
|
1292
|
+
|
1074
1293
|
codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
|
1075
1294
|
}
|
1295
|
+
|
1076
1296
|
var codingpasses = readCodingpasses();
|
1297
|
+
|
1077
1298
|
while (readBits(1)) {
|
1078
1299
|
codeblock.Lblock++;
|
1079
1300
|
}
|
1301
|
+
|
1080
1302
|
var codingpassesLog2 = (0, _util.log2)(codingpasses);
|
1081
1303
|
var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
|
1082
1304
|
var codedDataLength = readBits(bits);
|
@@ -1086,16 +1308,21 @@ var JpxImage = function JpxImageClosure() {
|
|
1086
1308
|
dataLength: codedDataLength
|
1087
1309
|
});
|
1088
1310
|
}
|
1311
|
+
|
1089
1312
|
alignToByte();
|
1313
|
+
|
1090
1314
|
if (ephMarkerUsed) {
|
1091
1315
|
skipMarkerIfEqual(0x92);
|
1092
1316
|
}
|
1317
|
+
|
1093
1318
|
while (queue.length > 0) {
|
1094
1319
|
var packetItem = queue.shift();
|
1095
1320
|
codeblock = packetItem.codeblock;
|
1321
|
+
|
1096
1322
|
if (codeblock['data'] === undefined) {
|
1097
1323
|
codeblock.data = [];
|
1098
1324
|
}
|
1325
|
+
|
1099
1326
|
codeblock.data.push({
|
1100
1327
|
data: data,
|
1101
1328
|
start: offset + position,
|
@@ -1105,8 +1332,10 @@ var JpxImage = function JpxImageClosure() {
|
|
1105
1332
|
position += packetItem.dataLength;
|
1106
1333
|
}
|
1107
1334
|
}
|
1335
|
+
|
1108
1336
|
return position;
|
1109
1337
|
}
|
1338
|
+
|
1110
1339
|
function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {
|
1111
1340
|
var x0 = subband.tbx0;
|
1112
1341
|
var y0 = subband.tby0;
|
@@ -1114,16 +1343,20 @@ var JpxImage = function JpxImageClosure() {
|
|
1114
1343
|
var codeblocks = subband.codeblocks;
|
1115
1344
|
var right = subband.type.charAt(0) === 'H' ? 1 : 0;
|
1116
1345
|
var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;
|
1346
|
+
|
1117
1347
|
for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
|
1118
1348
|
var codeblock = codeblocks[i];
|
1119
1349
|
var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
|
1120
1350
|
var blockHeight = codeblock.tby1_ - codeblock.tby0_;
|
1351
|
+
|
1121
1352
|
if (blockWidth === 0 || blockHeight === 0) {
|
1122
1353
|
continue;
|
1123
1354
|
}
|
1355
|
+
|
1124
1356
|
if (codeblock['data'] === undefined) {
|
1125
1357
|
continue;
|
1126
1358
|
}
|
1359
|
+
|
1127
1360
|
var bitModel, currentCodingpassType;
|
1128
1361
|
bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);
|
1129
1362
|
currentCodingpassType = 2;
|
@@ -1131,38 +1364,49 @@ var JpxImage = function JpxImageClosure() {
|
|
1131
1364
|
totalLength = 0,
|
1132
1365
|
codingpasses = 0;
|
1133
1366
|
var j, jj, dataItem;
|
1367
|
+
|
1134
1368
|
for (j = 0, jj = data.length; j < jj; j++) {
|
1135
1369
|
dataItem = data[j];
|
1136
1370
|
totalLength += dataItem.end - dataItem.start;
|
1137
1371
|
codingpasses += dataItem.codingpasses;
|
1138
1372
|
}
|
1373
|
+
|
1139
1374
|
var encodedData = new Uint8Array(totalLength);
|
1140
1375
|
var position = 0;
|
1376
|
+
|
1141
1377
|
for (j = 0, jj = data.length; j < jj; j++) {
|
1142
1378
|
dataItem = data[j];
|
1143
1379
|
var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
|
1144
1380
|
encodedData.set(chunk, position);
|
1145
1381
|
position += chunk.length;
|
1146
1382
|
}
|
1383
|
+
|
1147
1384
|
var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);
|
1148
1385
|
bitModel.setDecoder(decoder);
|
1386
|
+
|
1149
1387
|
for (j = 0; j < codingpasses; j++) {
|
1150
1388
|
switch (currentCodingpassType) {
|
1151
1389
|
case 0:
|
1152
1390
|
bitModel.runSignificancePropagationPass();
|
1153
1391
|
break;
|
1392
|
+
|
1154
1393
|
case 1:
|
1155
1394
|
bitModel.runMagnitudeRefinementPass();
|
1156
1395
|
break;
|
1396
|
+
|
1157
1397
|
case 2:
|
1158
1398
|
bitModel.runCleanupPass();
|
1399
|
+
|
1159
1400
|
if (segmentationSymbolUsed) {
|
1160
1401
|
bitModel.checkSegmentationSymbol();
|
1161
1402
|
}
|
1403
|
+
|
1162
1404
|
break;
|
1163
1405
|
}
|
1406
|
+
|
1164
1407
|
currentCodingpassType = (currentCodingpassType + 1) % 3;
|
1165
1408
|
}
|
1409
|
+
|
1166
1410
|
var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;
|
1167
1411
|
var sign = bitModel.coefficentsSign;
|
1168
1412
|
var magnitude = bitModel.coefficentsMagnitude;
|
@@ -1171,31 +1415,40 @@ var JpxImage = function JpxImageClosure() {
|
|
1171
1415
|
var k, n, nb;
|
1172
1416
|
position = 0;
|
1173
1417
|
var interleave = subband.type !== 'LL';
|
1418
|
+
|
1174
1419
|
for (j = 0; j < blockHeight; j++) {
|
1175
1420
|
var row = offset / width | 0;
|
1176
1421
|
var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
|
1422
|
+
|
1177
1423
|
for (k = 0; k < blockWidth; k++) {
|
1178
1424
|
n = magnitude[position];
|
1425
|
+
|
1179
1426
|
if (n !== 0) {
|
1180
1427
|
n = (n + magnitudeCorrection) * delta;
|
1428
|
+
|
1181
1429
|
if (sign[position] !== 0) {
|
1182
1430
|
n = -n;
|
1183
1431
|
}
|
1432
|
+
|
1184
1433
|
nb = bitsDecoded[position];
|
1185
1434
|
var pos = interleave ? levelOffset + (offset << 1) : offset;
|
1435
|
+
|
1186
1436
|
if (reversible && nb >= mb) {
|
1187
1437
|
coefficients[pos] = n;
|
1188
1438
|
} else {
|
1189
1439
|
coefficients[pos] = n * (1 << mb - nb);
|
1190
1440
|
}
|
1191
1441
|
}
|
1442
|
+
|
1192
1443
|
offset++;
|
1193
1444
|
position++;
|
1194
1445
|
}
|
1446
|
+
|
1195
1447
|
offset += width - blockWidth;
|
1196
1448
|
}
|
1197
1449
|
}
|
1198
1450
|
}
|
1451
|
+
|
1199
1452
|
function transformTile(context, tile, c) {
|
1200
1453
|
var component = tile.components[c];
|
1201
1454
|
var codingStyleParameters = component.codingStyleParameters;
|
@@ -1210,13 +1463,16 @@ var JpxImage = function JpxImageClosure() {
|
|
1210
1463
|
var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();
|
1211
1464
|
var subbandCoefficients = [];
|
1212
1465
|
var b = 0;
|
1466
|
+
|
1213
1467
|
for (var i = 0; i <= decompositionLevelsCount; i++) {
|
1214
1468
|
var resolution = component.resolutions[i];
|
1215
1469
|
var width = resolution.trx1 - resolution.trx0;
|
1216
1470
|
var height = resolution.try1 - resolution.try0;
|
1217
1471
|
var coefficients = new Float32Array(width * height);
|
1472
|
+
|
1218
1473
|
for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
|
1219
1474
|
var mu, epsilon;
|
1475
|
+
|
1220
1476
|
if (!scalarExpounded) {
|
1221
1477
|
mu = spqcds[0].mu;
|
1222
1478
|
epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
|
@@ -1225,18 +1481,21 @@ var JpxImage = function JpxImageClosure() {
|
|
1225
1481
|
epsilon = spqcds[b].epsilon;
|
1226
1482
|
b++;
|
1227
1483
|
}
|
1484
|
+
|
1228
1485
|
var subband = resolution.subbands[j];
|
1229
1486
|
var gainLog2 = SubbandsGainLog2[subband.type];
|
1230
1487
|
var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048);
|
1231
1488
|
var mb = guardBits + epsilon - 1;
|
1232
1489
|
copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);
|
1233
1490
|
}
|
1491
|
+
|
1234
1492
|
subbandCoefficients.push({
|
1235
1493
|
width: width,
|
1236
1494
|
height: height,
|
1237
1495
|
items: coefficients
|
1238
1496
|
});
|
1239
1497
|
}
|
1498
|
+
|
1240
1499
|
var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);
|
1241
1500
|
return {
|
1242
1501
|
left: component.tcx0,
|
@@ -1246,18 +1505,22 @@ var JpxImage = function JpxImageClosure() {
|
|
1246
1505
|
items: result.items
|
1247
1506
|
};
|
1248
1507
|
}
|
1508
|
+
|
1249
1509
|
function transformComponents(context) {
|
1250
1510
|
var siz = context.SIZ;
|
1251
1511
|
var components = context.components;
|
1252
1512
|
var componentsCount = siz.Csiz;
|
1253
1513
|
var resultImages = [];
|
1514
|
+
|
1254
1515
|
for (var i = 0, ii = context.tiles.length; i < ii; i++) {
|
1255
1516
|
var tile = context.tiles[i];
|
1256
1517
|
var transformedTiles = [];
|
1257
1518
|
var c;
|
1519
|
+
|
1258
1520
|
for (c = 0; c < componentsCount; c++) {
|
1259
1521
|
transformedTiles[c] = transformTile(context, tile, c);
|
1260
1522
|
}
|
1523
|
+
|
1261
1524
|
var tile0 = transformedTiles[0];
|
1262
1525
|
var out = new Uint8ClampedArray(tile0.items.length * componentsCount);
|
1263
1526
|
var result = {
|
@@ -1274,6 +1537,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1274
1537
|
y0,
|
1275
1538
|
y1,
|
1276
1539
|
y2;
|
1540
|
+
|
1277
1541
|
if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
|
1278
1542
|
var fourComponents = componentsCount === 4;
|
1279
1543
|
var y0items = transformedTiles[0].items;
|
@@ -1285,6 +1549,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1285
1549
|
var component0 = tile.components[0];
|
1286
1550
|
var alpha01 = componentsCount - 3;
|
1287
1551
|
jj = y0items.length;
|
1552
|
+
|
1288
1553
|
if (!component0.codingStyleParameters.reversibleTransformation) {
|
1289
1554
|
for (j = 0; j < jj; j++, pos += alpha01) {
|
1290
1555
|
y0 = y0items[j] + offset;
|
@@ -1305,6 +1570,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1305
1570
|
out[pos++] = g + y1 >> shift;
|
1306
1571
|
}
|
1307
1572
|
}
|
1573
|
+
|
1308
1574
|
if (fourComponents) {
|
1309
1575
|
for (j = 0, pos = 3; j < jj; j++, pos += 4) {
|
1310
1576
|
out[pos] = y3items[j] + offset >> shift;
|
@@ -1315,20 +1581,25 @@ var JpxImage = function JpxImageClosure() {
|
|
1315
1581
|
var items = transformedTiles[c].items;
|
1316
1582
|
shift = components[c].precision - 8;
|
1317
1583
|
offset = (128 << shift) + 0.5;
|
1584
|
+
|
1318
1585
|
for (pos = c, j = 0, jj = items.length; j < jj; j++) {
|
1319
1586
|
out[pos] = items[j] + offset >> shift;
|
1320
1587
|
pos += componentsCount;
|
1321
1588
|
}
|
1322
1589
|
}
|
1323
1590
|
}
|
1591
|
+
|
1324
1592
|
resultImages.push(result);
|
1325
1593
|
}
|
1594
|
+
|
1326
1595
|
return resultImages;
|
1327
1596
|
}
|
1597
|
+
|
1328
1598
|
function initializeTile(context, tileIndex) {
|
1329
1599
|
var siz = context.SIZ;
|
1330
1600
|
var componentsCount = siz.Csiz;
|
1331
1601
|
var tile = context.tiles[tileIndex];
|
1602
|
+
|
1332
1603
|
for (var c = 0; c < componentsCount; c++) {
|
1333
1604
|
var component = tile.components[c];
|
1334
1605
|
var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;
|
@@ -1336,12 +1607,15 @@ var JpxImage = function JpxImageClosure() {
|
|
1336
1607
|
var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;
|
1337
1608
|
component.codingStyleParameters = codOrCoc;
|
1338
1609
|
}
|
1610
|
+
|
1339
1611
|
tile.codingStyleDefaultParameters = context.currentTile.COD;
|
1340
1612
|
}
|
1613
|
+
|
1341
1614
|
var TagTree = function TagTreeClosure() {
|
1342
1615
|
function TagTree(width, height) {
|
1343
1616
|
var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
|
1344
1617
|
this.levels = [];
|
1618
|
+
|
1345
1619
|
for (var i = 0; i < levelsLength; i++) {
|
1346
1620
|
var level = {
|
1347
1621
|
width: width,
|
@@ -1353,23 +1627,28 @@ var JpxImage = function JpxImageClosure() {
|
|
1353
1627
|
height = Math.ceil(height / 2);
|
1354
1628
|
}
|
1355
1629
|
}
|
1630
|
+
|
1356
1631
|
TagTree.prototype = {
|
1357
1632
|
reset: function TagTree_reset(i, j) {
|
1358
1633
|
var currentLevel = 0,
|
1359
1634
|
value = 0,
|
1360
1635
|
level;
|
1636
|
+
|
1361
1637
|
while (currentLevel < this.levels.length) {
|
1362
1638
|
level = this.levels[currentLevel];
|
1363
1639
|
var index = i + j * level.width;
|
1640
|
+
|
1364
1641
|
if (level.items[index] !== undefined) {
|
1365
1642
|
value = level.items[index];
|
1366
1643
|
break;
|
1367
1644
|
}
|
1645
|
+
|
1368
1646
|
level.index = index;
|
1369
1647
|
i >>= 1;
|
1370
1648
|
j >>= 1;
|
1371
1649
|
currentLevel++;
|
1372
1650
|
}
|
1651
|
+
|
1373
1652
|
currentLevel--;
|
1374
1653
|
level = this.levels[currentLevel];
|
1375
1654
|
level.items[level.index] = value;
|
@@ -1385,10 +1664,12 @@ var JpxImage = function JpxImageClosure() {
|
|
1385
1664
|
var level = this.levels[currentLevel];
|
1386
1665
|
var value = level.items[level.index];
|
1387
1666
|
currentLevel--;
|
1667
|
+
|
1388
1668
|
if (currentLevel < 0) {
|
1389
1669
|
this.value = value;
|
1390
1670
|
return false;
|
1391
1671
|
}
|
1672
|
+
|
1392
1673
|
this.currentLevel = currentLevel;
|
1393
1674
|
level = this.levels[currentLevel];
|
1394
1675
|
level.items[level.index] = value;
|
@@ -1397,15 +1678,19 @@ var JpxImage = function JpxImageClosure() {
|
|
1397
1678
|
};
|
1398
1679
|
return TagTree;
|
1399
1680
|
}();
|
1681
|
+
|
1400
1682
|
var InclusionTree = function InclusionTreeClosure() {
|
1401
1683
|
function InclusionTree(width, height, defaultValue) {
|
1402
1684
|
var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
|
1403
1685
|
this.levels = [];
|
1686
|
+
|
1404
1687
|
for (var i = 0; i < levelsLength; i++) {
|
1405
1688
|
var items = new Uint8Array(width * height);
|
1689
|
+
|
1406
1690
|
for (var j = 0, jj = items.length; j < jj; j++) {
|
1407
1691
|
items[j] = defaultValue;
|
1408
1692
|
}
|
1693
|
+
|
1409
1694
|
var level = {
|
1410
1695
|
width: width,
|
1411
1696
|
height: height,
|
@@ -1416,26 +1701,32 @@ var JpxImage = function JpxImageClosure() {
|
|
1416
1701
|
height = Math.ceil(height / 2);
|
1417
1702
|
}
|
1418
1703
|
}
|
1704
|
+
|
1419
1705
|
InclusionTree.prototype = {
|
1420
1706
|
reset: function InclusionTree_reset(i, j, stopValue) {
|
1421
1707
|
var currentLevel = 0;
|
1708
|
+
|
1422
1709
|
while (currentLevel < this.levels.length) {
|
1423
1710
|
var level = this.levels[currentLevel];
|
1424
1711
|
var index = i + j * level.width;
|
1425
1712
|
level.index = index;
|
1426
1713
|
var value = level.items[index];
|
1714
|
+
|
1427
1715
|
if (value === 0xFF) {
|
1428
1716
|
break;
|
1429
1717
|
}
|
1718
|
+
|
1430
1719
|
if (value > stopValue) {
|
1431
1720
|
this.currentLevel = currentLevel;
|
1432
1721
|
this.propagateValues();
|
1433
1722
|
return false;
|
1434
1723
|
}
|
1724
|
+
|
1435
1725
|
i >>= 1;
|
1436
1726
|
j >>= 1;
|
1437
1727
|
currentLevel++;
|
1438
1728
|
}
|
1729
|
+
|
1439
1730
|
this.currentLevel = currentLevel - 1;
|
1440
1731
|
return true;
|
1441
1732
|
},
|
@@ -1448,6 +1739,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1448
1739
|
var levelIndex = this.currentLevel;
|
1449
1740
|
var level = this.levels[levelIndex];
|
1450
1741
|
var currentValue = level.items[level.index];
|
1742
|
+
|
1451
1743
|
while (--levelIndex >= 0) {
|
1452
1744
|
level = this.levels[levelIndex];
|
1453
1745
|
level.items[level.index] = currentValue;
|
@@ -1459,9 +1751,11 @@ var JpxImage = function JpxImageClosure() {
|
|
1459
1751
|
var value = level.items[level.index];
|
1460
1752
|
level.items[level.index] = 0xFF;
|
1461
1753
|
currentLevel--;
|
1754
|
+
|
1462
1755
|
if (currentLevel < 0) {
|
1463
1756
|
return false;
|
1464
1757
|
}
|
1758
|
+
|
1465
1759
|
this.currentLevel = currentLevel;
|
1466
1760
|
level = this.levels[currentLevel];
|
1467
1761
|
level.items[level.index] = value;
|
@@ -1470,12 +1764,14 @@ var JpxImage = function JpxImageClosure() {
|
|
1470
1764
|
};
|
1471
1765
|
return InclusionTree;
|
1472
1766
|
}();
|
1767
|
+
|
1473
1768
|
var BitModel = function BitModelClosure() {
|
1474
1769
|
var UNIFORM_CONTEXT = 17;
|
1475
1770
|
var RUNLENGTH_CONTEXT = 18;
|
1476
1771
|
var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);
|
1477
1772
|
var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);
|
1478
1773
|
var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);
|
1774
|
+
|
1479
1775
|
function BitModel(width, height, subband, zeroBitPlanes, mb) {
|
1480
1776
|
this.width = width;
|
1481
1777
|
this.height = height;
|
@@ -1486,14 +1782,17 @@ var JpxImage = function JpxImageClosure() {
|
|
1486
1782
|
this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount);
|
1487
1783
|
this.processingFlags = new Uint8Array(coefficientCount);
|
1488
1784
|
var bitsDecoded = new Uint8Array(coefficientCount);
|
1785
|
+
|
1489
1786
|
if (zeroBitPlanes !== 0) {
|
1490
1787
|
for (var i = 0; i < coefficientCount; i++) {
|
1491
1788
|
bitsDecoded[i] = zeroBitPlanes;
|
1492
1789
|
}
|
1493
1790
|
}
|
1791
|
+
|
1494
1792
|
this.bitsDecoded = bitsDecoded;
|
1495
1793
|
this.reset();
|
1496
1794
|
}
|
1795
|
+
|
1497
1796
|
BitModel.prototype = {
|
1498
1797
|
setDecoder: function BitModel_setDecoder(decoder) {
|
1499
1798
|
this.decoder = decoder;
|
@@ -1511,32 +1810,43 @@ var JpxImage = function JpxImageClosure() {
|
|
1511
1810
|
var left = column > 0;
|
1512
1811
|
var right = column + 1 < width;
|
1513
1812
|
var i;
|
1813
|
+
|
1514
1814
|
if (row > 0) {
|
1515
1815
|
i = index - width;
|
1816
|
+
|
1516
1817
|
if (left) {
|
1517
1818
|
neighborsSignificance[i - 1] += 0x10;
|
1518
1819
|
}
|
1820
|
+
|
1519
1821
|
if (right) {
|
1520
1822
|
neighborsSignificance[i + 1] += 0x10;
|
1521
1823
|
}
|
1824
|
+
|
1522
1825
|
neighborsSignificance[i] += 0x04;
|
1523
1826
|
}
|
1827
|
+
|
1524
1828
|
if (row + 1 < height) {
|
1525
1829
|
i = index + width;
|
1830
|
+
|
1526
1831
|
if (left) {
|
1527
1832
|
neighborsSignificance[i - 1] += 0x10;
|
1528
1833
|
}
|
1834
|
+
|
1529
1835
|
if (right) {
|
1530
1836
|
neighborsSignificance[i + 1] += 0x10;
|
1531
1837
|
}
|
1838
|
+
|
1532
1839
|
neighborsSignificance[i] += 0x04;
|
1533
1840
|
}
|
1841
|
+
|
1534
1842
|
if (left) {
|
1535
1843
|
neighborsSignificance[index - 1] += 0x01;
|
1536
1844
|
}
|
1845
|
+
|
1537
1846
|
if (right) {
|
1538
1847
|
neighborsSignificance[index + 1] += 0x01;
|
1539
1848
|
}
|
1849
|
+
|
1540
1850
|
neighborsSignificance[index] |= 0x80;
|
1541
1851
|
},
|
1542
1852
|
runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {
|
@@ -1553,20 +1863,27 @@ var JpxImage = function JpxImageClosure() {
|
|
1553
1863
|
var processedInverseMask = ~1;
|
1554
1864
|
var processedMask = 1;
|
1555
1865
|
var firstMagnitudeBitMask = 2;
|
1866
|
+
|
1556
1867
|
for (var i0 = 0; i0 < height; i0 += 4) {
|
1557
1868
|
for (var j = 0; j < width; j++) {
|
1558
1869
|
var index = i0 * width + j;
|
1870
|
+
|
1559
1871
|
for (var i1 = 0; i1 < 4; i1++, index += width) {
|
1560
1872
|
var i = i0 + i1;
|
1873
|
+
|
1561
1874
|
if (i >= height) {
|
1562
1875
|
break;
|
1563
1876
|
}
|
1877
|
+
|
1564
1878
|
processingFlags[index] &= processedInverseMask;
|
1879
|
+
|
1565
1880
|
if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {
|
1566
1881
|
continue;
|
1567
1882
|
}
|
1883
|
+
|
1568
1884
|
var contextLabel = labels[neighborsSignificance[index]];
|
1569
1885
|
var decision = decoder.readBit(contexts, contextLabel);
|
1886
|
+
|
1570
1887
|
if (decision) {
|
1571
1888
|
var sign = this.decodeSignBit(i, j, index);
|
1572
1889
|
coefficentsSign[index] = sign;
|
@@ -1574,6 +1891,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1574
1891
|
this.setNeighborsSignificance(i, j, index);
|
1575
1892
|
processingFlags[index] |= firstMagnitudeBitMask;
|
1576
1893
|
}
|
1894
|
+
|
1577
1895
|
bitsDecoded[index]++;
|
1578
1896
|
processingFlags[index] |= processedMask;
|
1579
1897
|
}
|
@@ -1588,8 +1906,10 @@ var JpxImage = function JpxImageClosure() {
|
|
1588
1906
|
var contribution, sign0, sign1, significance1;
|
1589
1907
|
var contextLabel, decoded;
|
1590
1908
|
significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;
|
1909
|
+
|
1591
1910
|
if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
|
1592
1911
|
sign1 = coefficentsSign[index + 1];
|
1912
|
+
|
1593
1913
|
if (significance1) {
|
1594
1914
|
sign0 = coefficentsSign[index - 1];
|
1595
1915
|
contribution = 1 - sign1 - sign0;
|
@@ -1602,10 +1922,13 @@ var JpxImage = function JpxImageClosure() {
|
|
1602
1922
|
} else {
|
1603
1923
|
contribution = 0;
|
1604
1924
|
}
|
1925
|
+
|
1605
1926
|
var horizontalContribution = 3 * contribution;
|
1606
1927
|
significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;
|
1928
|
+
|
1607
1929
|
if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
|
1608
1930
|
sign1 = coefficentsSign[index + width];
|
1931
|
+
|
1609
1932
|
if (significance1) {
|
1610
1933
|
sign0 = coefficentsSign[index - width];
|
1611
1934
|
contribution = 1 - sign1 - sign0 + horizontalContribution;
|
@@ -1618,6 +1941,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1618
1941
|
} else {
|
1619
1942
|
contribution = horizontalContribution;
|
1620
1943
|
}
|
1944
|
+
|
1621
1945
|
if (contribution >= 0) {
|
1622
1946
|
contextLabel = 9 + contribution;
|
1623
1947
|
decoded = this.decoder.readBit(this.contexts, contextLabel);
|
@@ -1625,6 +1949,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1625
1949
|
contextLabel = 9 - contribution;
|
1626
1950
|
decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
|
1627
1951
|
}
|
1952
|
+
|
1628
1953
|
return decoded;
|
1629
1954
|
},
|
1630
1955
|
runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {
|
@@ -1640,19 +1965,24 @@ var JpxImage = function JpxImageClosure() {
|
|
1640
1965
|
var firstMagnitudeBitMask = 2;
|
1641
1966
|
var length = width * height;
|
1642
1967
|
var width4 = width * 4;
|
1968
|
+
|
1643
1969
|
for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
|
1644
1970
|
indexNext = Math.min(length, index0 + width4);
|
1971
|
+
|
1645
1972
|
for (var j = 0; j < width; j++) {
|
1646
1973
|
for (var index = index0 + j; index < indexNext; index += width) {
|
1647
1974
|
if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
|
1648
1975
|
continue;
|
1649
1976
|
}
|
1977
|
+
|
1650
1978
|
var contextLabel = 16;
|
1979
|
+
|
1651
1980
|
if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
|
1652
1981
|
processingFlags[index] ^= firstMagnitudeBitMask;
|
1653
1982
|
var significance = neighborsSignificance[index] & 127;
|
1654
1983
|
contextLabel = significance === 0 ? 15 : 14;
|
1655
1984
|
}
|
1985
|
+
|
1656
1986
|
var bit = decoder.readBit(contexts, contextLabel);
|
1657
1987
|
coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;
|
1658
1988
|
bitsDecoded[index]++;
|
@@ -1678,10 +2008,12 @@ var JpxImage = function JpxImageClosure() {
|
|
1678
2008
|
var twoRowsDown = width * 2;
|
1679
2009
|
var threeRowsDown = width * 3;
|
1680
2010
|
var iNext;
|
2011
|
+
|
1681
2012
|
for (var i0 = 0; i0 < height; i0 = iNext) {
|
1682
2013
|
iNext = Math.min(i0 + 4, height);
|
1683
2014
|
var indexBase = i0 * width;
|
1684
2015
|
var checkAllEmpty = i0 + 3 < height;
|
2016
|
+
|
1685
2017
|
for (var j = 0; j < width; j++) {
|
1686
2018
|
var index0 = indexBase + j;
|
1687
2019
|
var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;
|
@@ -1689,8 +2021,10 @@ var JpxImage = function JpxImageClosure() {
|
|
1689
2021
|
index = index0;
|
1690
2022
|
var i = i0,
|
1691
2023
|
sign;
|
2024
|
+
|
1692
2025
|
if (allEmpty) {
|
1693
2026
|
var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);
|
2027
|
+
|
1694
2028
|
if (!hasSignificantCoefficent) {
|
1695
2029
|
bitsDecoded[index0]++;
|
1696
2030
|
bitsDecoded[index0 + oneRowDown]++;
|
@@ -1698,28 +2032,36 @@ var JpxImage = function JpxImageClosure() {
|
|
1698
2032
|
bitsDecoded[index0 + threeRowsDown]++;
|
1699
2033
|
continue;
|
1700
2034
|
}
|
2035
|
+
|
1701
2036
|
i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);
|
2037
|
+
|
1702
2038
|
if (i1 !== 0) {
|
1703
2039
|
i = i0 + i1;
|
1704
2040
|
index += i1 * width;
|
1705
2041
|
}
|
2042
|
+
|
1706
2043
|
sign = this.decodeSignBit(i, j, index);
|
1707
2044
|
coefficentsSign[index] = sign;
|
1708
2045
|
coefficentsMagnitude[index] = 1;
|
1709
2046
|
this.setNeighborsSignificance(i, j, index);
|
1710
2047
|
processingFlags[index] |= firstMagnitudeBitMask;
|
1711
2048
|
index = index0;
|
2049
|
+
|
1712
2050
|
for (var i2 = i0; i2 <= i; i2++, index += width) {
|
1713
2051
|
bitsDecoded[index]++;
|
1714
2052
|
}
|
2053
|
+
|
1715
2054
|
i1++;
|
1716
2055
|
}
|
2056
|
+
|
1717
2057
|
for (i = i0 + i1; i < iNext; i++, index += width) {
|
1718
2058
|
if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
|
1719
2059
|
continue;
|
1720
2060
|
}
|
2061
|
+
|
1721
2062
|
var contextLabel = labels[neighborsSignificance[index]];
|
1722
2063
|
var decision = decoder.readBit(contexts, contextLabel);
|
2064
|
+
|
1723
2065
|
if (decision === 1) {
|
1724
2066
|
sign = this.decodeSignBit(i, j, index);
|
1725
2067
|
coefficentsSign[index] = sign;
|
@@ -1727,6 +2069,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1727
2069
|
this.setNeighborsSignificance(i, j, index);
|
1728
2070
|
processingFlags[index] |= firstMagnitudeBitMask;
|
1729
2071
|
}
|
2072
|
+
|
1730
2073
|
bitsDecoded[index]++;
|
1731
2074
|
}
|
1732
2075
|
}
|
@@ -1736,6 +2079,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1736
2079
|
var decoder = this.decoder;
|
1737
2080
|
var contexts = this.contexts;
|
1738
2081
|
var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);
|
2082
|
+
|
1739
2083
|
if (symbol !== 0xA) {
|
1740
2084
|
throw new JpxError('Invalid segmentation symbol');
|
1741
2085
|
}
|
@@ -1743,15 +2087,20 @@ var JpxImage = function JpxImageClosure() {
|
|
1743
2087
|
};
|
1744
2088
|
return BitModel;
|
1745
2089
|
}();
|
2090
|
+
|
1746
2091
|
var Transform = function TransformClosure() {
|
1747
2092
|
function Transform() {}
|
2093
|
+
|
1748
2094
|
Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {
|
1749
2095
|
var ll = subbands[0];
|
2096
|
+
|
1750
2097
|
for (var i = 1, ii = subbands.length; i < ii; i++) {
|
1751
2098
|
ll = this.iterate(ll, subbands[i], u0, v0);
|
1752
2099
|
}
|
2100
|
+
|
1753
2101
|
return ll;
|
1754
2102
|
};
|
2103
|
+
|
1755
2104
|
Transform.prototype.extend = function extend(buffer, offset, size) {
|
1756
2105
|
var i1 = offset - 1,
|
1757
2106
|
j1 = offset + 1;
|
@@ -1766,6 +2115,7 @@ var JpxImage = function JpxImageClosure() {
|
|
1766
2115
|
buffer[i1] = buffer[j1];
|
1767
2116
|
buffer[j2] = buffer[i2];
|
1768
2117
|
};
|
2118
|
+
|
1769
2119
|
Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {
|
1770
2120
|
var llWidth = ll.width,
|
1771
2121
|
llHeight = ll.height,
|
@@ -1774,15 +2124,19 @@ var JpxImage = function JpxImageClosure() {
|
|
1774
2124
|
var height = hl_lh_hh.height;
|
1775
2125
|
var items = hl_lh_hh.items;
|
1776
2126
|
var i, j, k, l, u, v;
|
2127
|
+
|
1777
2128
|
for (k = 0, i = 0; i < llHeight; i++) {
|
1778
2129
|
l = i * 2 * width;
|
2130
|
+
|
1779
2131
|
for (j = 0; j < llWidth; j++, k++, l += 2) {
|
1780
2132
|
items[l] = llItems[k];
|
1781
2133
|
}
|
1782
2134
|
}
|
2135
|
+
|
1783
2136
|
llItems = ll.items = null;
|
1784
2137
|
var bufferPadding = 4;
|
1785
2138
|
var rowBuffer = new Float32Array(width + 2 * bufferPadding);
|
2139
|
+
|
1786
2140
|
if (width === 1) {
|
1787
2141
|
if ((u0 & 1) !== 0) {
|
1788
2142
|
for (v = 0, k = 0; v < height; v++, k += width) {
|
@@ -1797,14 +2151,18 @@ var JpxImage = function JpxImageClosure() {
|
|
1797
2151
|
items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);
|
1798
2152
|
}
|
1799
2153
|
}
|
2154
|
+
|
1800
2155
|
var numBuffers = 16;
|
1801
2156
|
var colBuffers = [];
|
2157
|
+
|
1802
2158
|
for (i = 0; i < numBuffers; i++) {
|
1803
2159
|
colBuffers.push(new Float32Array(height + 2 * bufferPadding));
|
1804
2160
|
}
|
2161
|
+
|
1805
2162
|
var b,
|
1806
2163
|
currentBuffer = 0;
|
1807
2164
|
ll = bufferPadding + height;
|
2165
|
+
|
1808
2166
|
if (height === 1) {
|
1809
2167
|
if ((v0 & 1) !== 0) {
|
1810
2168
|
for (u = 0; u < width; u++) {
|
@@ -1815,19 +2173,24 @@ var JpxImage = function JpxImageClosure() {
|
|
1815
2173
|
for (u = 0; u < width; u++) {
|
1816
2174
|
if (currentBuffer === 0) {
|
1817
2175
|
numBuffers = Math.min(width - u, numBuffers);
|
2176
|
+
|
1818
2177
|
for (k = u, l = bufferPadding; l < ll; k += width, l++) {
|
1819
2178
|
for (b = 0; b < numBuffers; b++) {
|
1820
2179
|
colBuffers[b][l] = items[k + b];
|
1821
2180
|
}
|
1822
2181
|
}
|
2182
|
+
|
1823
2183
|
currentBuffer = numBuffers;
|
1824
2184
|
}
|
2185
|
+
|
1825
2186
|
currentBuffer--;
|
1826
2187
|
var buffer = colBuffers[currentBuffer];
|
1827
2188
|
this.extend(buffer, bufferPadding, height);
|
1828
2189
|
this.filter(buffer, bufferPadding, height);
|
2190
|
+
|
1829
2191
|
if (currentBuffer === 0) {
|
1830
2192
|
k = u - numBuffers + 1;
|
2193
|
+
|
1831
2194
|
for (l = bufferPadding; l < ll; k += width, l++) {
|
1832
2195
|
for (b = 0; b < numBuffers; b++) {
|
1833
2196
|
items[k + b] = colBuffers[b][l];
|
@@ -1836,19 +2199,24 @@ var JpxImage = function JpxImageClosure() {
|
|
1836
2199
|
}
|
1837
2200
|
}
|
1838
2201
|
}
|
2202
|
+
|
1839
2203
|
return {
|
1840
2204
|
width: width,
|
1841
2205
|
height: height,
|
1842
2206
|
items: items
|
1843
2207
|
};
|
1844
2208
|
};
|
2209
|
+
|
1845
2210
|
return Transform;
|
1846
2211
|
}();
|
2212
|
+
|
1847
2213
|
var IrreversibleTransform = function IrreversibleTransformClosure() {
|
1848
2214
|
function IrreversibleTransform() {
|
1849
2215
|
Transform.call(this);
|
1850
2216
|
}
|
2217
|
+
|
1851
2218
|
IrreversibleTransform.prototype = Object.create(Transform.prototype);
|
2219
|
+
|
1852
2220
|
IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {
|
1853
2221
|
var len = length >> 1;
|
1854
2222
|
offset = offset | 0;
|
@@ -1860,14 +2228,18 @@ var JpxImage = function JpxImageClosure() {
|
|
1860
2228
|
var K = 1.230174104914001;
|
1861
2229
|
var K_ = 1 / K;
|
1862
2230
|
j = offset - 3;
|
2231
|
+
|
1863
2232
|
for (n = len + 4; n--; j += 2) {
|
1864
2233
|
x[j] *= K_;
|
1865
2234
|
}
|
2235
|
+
|
1866
2236
|
j = offset - 2;
|
1867
2237
|
current = delta * x[j - 1];
|
2238
|
+
|
1868
2239
|
for (n = len + 3; n--; j += 2) {
|
1869
2240
|
next = delta * x[j + 1];
|
1870
2241
|
x[j] = K * x[j] - current - next;
|
2242
|
+
|
1871
2243
|
if (n--) {
|
1872
2244
|
j += 2;
|
1873
2245
|
current = delta * x[j + 1];
|
@@ -1876,11 +2248,14 @@ var JpxImage = function JpxImageClosure() {
|
|
1876
2248
|
break;
|
1877
2249
|
}
|
1878
2250
|
}
|
2251
|
+
|
1879
2252
|
j = offset - 1;
|
1880
2253
|
current = gamma * x[j - 1];
|
2254
|
+
|
1881
2255
|
for (n = len + 2; n--; j += 2) {
|
1882
2256
|
next = gamma * x[j + 1];
|
1883
2257
|
x[j] -= current + next;
|
2258
|
+
|
1884
2259
|
if (n--) {
|
1885
2260
|
j += 2;
|
1886
2261
|
current = gamma * x[j + 1];
|
@@ -1889,11 +2264,14 @@ var JpxImage = function JpxImageClosure() {
|
|
1889
2264
|
break;
|
1890
2265
|
}
|
1891
2266
|
}
|
2267
|
+
|
1892
2268
|
j = offset;
|
1893
2269
|
current = beta * x[j - 1];
|
2270
|
+
|
1894
2271
|
for (n = len + 1; n--; j += 2) {
|
1895
2272
|
next = beta * x[j + 1];
|
1896
2273
|
x[j] -= current + next;
|
2274
|
+
|
1897
2275
|
if (n--) {
|
1898
2276
|
j += 2;
|
1899
2277
|
current = beta * x[j + 1];
|
@@ -1902,12 +2280,15 @@ var JpxImage = function JpxImageClosure() {
|
|
1902
2280
|
break;
|
1903
2281
|
}
|
1904
2282
|
}
|
2283
|
+
|
1905
2284
|
if (len !== 0) {
|
1906
2285
|
j = offset + 1;
|
1907
2286
|
current = alpha * x[j - 1];
|
2287
|
+
|
1908
2288
|
for (n = len; n--; j += 2) {
|
1909
2289
|
next = alpha * x[j + 1];
|
1910
2290
|
x[j] -= current + next;
|
2291
|
+
|
1911
2292
|
if (n--) {
|
1912
2293
|
j += 2;
|
1913
2294
|
current = alpha * x[j + 1];
|
@@ -1918,26 +2299,35 @@ var JpxImage = function JpxImageClosure() {
|
|
1918
2299
|
}
|
1919
2300
|
}
|
1920
2301
|
};
|
2302
|
+
|
1921
2303
|
return IrreversibleTransform;
|
1922
2304
|
}();
|
2305
|
+
|
1923
2306
|
var ReversibleTransform = function ReversibleTransformClosure() {
|
1924
2307
|
function ReversibleTransform() {
|
1925
2308
|
Transform.call(this);
|
1926
2309
|
}
|
2310
|
+
|
1927
2311
|
ReversibleTransform.prototype = Object.create(Transform.prototype);
|
2312
|
+
|
1928
2313
|
ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {
|
1929
2314
|
var len = length >> 1;
|
1930
2315
|
offset = offset | 0;
|
1931
2316
|
var j, n;
|
2317
|
+
|
1932
2318
|
for (j = offset, n = len + 1; n--; j += 2) {
|
1933
2319
|
x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;
|
1934
2320
|
}
|
2321
|
+
|
1935
2322
|
for (j = offset + 1, n = len; n--; j += 2) {
|
1936
2323
|
x[j] += x[j - 1] + x[j + 1] >> 1;
|
1937
2324
|
}
|
1938
2325
|
};
|
2326
|
+
|
1939
2327
|
return ReversibleTransform;
|
1940
2328
|
}();
|
2329
|
+
|
1941
2330
|
return JpxImage;
|
1942
2331
|
}();
|
2332
|
+
|
1943
2333
|
exports.JpxImage = JpxImage;
|