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.

Files changed (169) hide show
  1. package/CODE_OF_CONDUCT.md +15 -0
  2. package/bower.json +1 -1
  3. package/build/pdf.js +18515 -11402
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +1 -1
  6. package/build/pdf.worker.js +48266 -37137
  7. package/build/pdf.worker.js.map +1 -1
  8. package/build/pdf.worker.min.js +1 -1
  9. package/external/url/url-lib.js +627 -0
  10. package/image_decoders/pdf.image_decoders.js +11350 -0
  11. package/image_decoders/pdf.image_decoders.js.map +1 -0
  12. package/image_decoders/pdf.image_decoders.min.js +1 -0
  13. package/lib/core/annotation.js +587 -242
  14. package/lib/core/arithmetic_decoder.js +275 -245
  15. package/lib/core/bidi.js +65 -6
  16. package/lib/core/ccitt.js +173 -18
  17. package/lib/core/ccitt_stream.js +15 -6
  18. package/lib/core/cff_parser.js +433 -61
  19. package/lib/core/charsets.js +5 -4
  20. package/lib/core/chunked_stream.js +400 -152
  21. package/lib/core/cmap.js +326 -87
  22. package/lib/core/colorspace.js +874 -594
  23. package/lib/core/core_utils.js +147 -0
  24. package/lib/core/crypto.js +290 -45
  25. package/lib/core/document.js +560 -268
  26. package/lib/core/encodings.js +19 -10
  27. package/lib/core/evaluator.js +1005 -360
  28. package/lib/core/font_renderer.js +331 -97
  29. package/lib/core/fonts.js +812 -195
  30. package/lib/core/function.js +284 -71
  31. package/lib/core/glyphlist.js +4 -3
  32. package/lib/core/image.js +169 -62
  33. package/lib/core/image_utils.js +111 -0
  34. package/lib/core/jbig2.js +479 -66
  35. package/lib/core/jbig2_stream.js +19 -8
  36. package/lib/core/jpeg_stream.js +38 -13
  37. package/lib/core/jpg.js +253 -29
  38. package/lib/core/jpx.js +396 -6
  39. package/lib/core/jpx_stream.js +18 -6
  40. package/lib/core/metrics.js +15 -15
  41. package/lib/core/murmurhash3.js +56 -34
  42. package/lib/core/obj.js +1354 -488
  43. package/lib/core/operator_list.js +144 -31
  44. package/lib/core/parser.js +539 -191
  45. package/lib/core/pattern.js +148 -14
  46. package/lib/core/pdf_manager.js +323 -133
  47. package/lib/core/primitives.js +111 -24
  48. package/lib/core/ps_parser.js +134 -45
  49. package/lib/core/standard_fonts.js +17 -17
  50. package/lib/core/stream.js +313 -34
  51. package/lib/core/type1_parser.js +143 -13
  52. package/lib/core/unicode.js +32 -5
  53. package/lib/core/worker.js +217 -190
  54. package/lib/core/worker_stream.js +277 -0
  55. package/lib/display/annotation_layer.js +450 -133
  56. package/lib/display/api.js +1597 -784
  57. package/lib/display/api_compatibility.js +11 -13
  58. package/lib/display/canvas.js +360 -44
  59. package/lib/display/content_disposition.js +83 -32
  60. package/lib/display/display_utils.js +747 -0
  61. package/lib/display/fetch_stream.js +221 -90
  62. package/lib/display/font_loader.js +468 -236
  63. package/lib/display/metadata.js +38 -16
  64. package/lib/display/network.js +635 -428
  65. package/lib/display/network_utils.js +32 -19
  66. package/lib/display/node_stream.js +367 -175
  67. package/lib/display/pattern_helper.js +81 -31
  68. package/lib/display/svg.js +1235 -519
  69. package/lib/display/text_layer.js +153 -29
  70. package/lib/display/transport_stream.js +345 -94
  71. package/lib/display/webgl.js +64 -18
  72. package/lib/display/worker_options.js +5 -4
  73. package/lib/display/xml_parser.js +166 -53
  74. package/lib/examples/node/domstubs.js +60 -4
  75. package/lib/pdf.js +36 -14
  76. package/lib/pdf.worker.js +5 -3
  77. package/lib/shared/compatibility.js +158 -564
  78. package/lib/shared/global_scope.js +2 -2
  79. package/lib/shared/is_node.js +4 -4
  80. package/lib/shared/message_handler.js +521 -0
  81. package/lib/shared/streams_polyfill.js +21 -17
  82. package/lib/shared/url_polyfill.js +56 -0
  83. package/lib/shared/util.js +243 -710
  84. package/lib/test/unit/annotation_spec.js +870 -401
  85. package/lib/test/unit/api_spec.js +657 -345
  86. package/lib/test/unit/bidi_spec.js +7 -7
  87. package/lib/test/unit/cff_parser_spec.js +54 -11
  88. package/lib/test/unit/clitests_helper.js +10 -8
  89. package/lib/test/unit/cmap_spec.js +95 -41
  90. package/lib/test/unit/colorspace_spec.js +115 -63
  91. package/lib/test/unit/core_utils_spec.js +191 -0
  92. package/lib/test/unit/crypto_spec.js +17 -5
  93. package/lib/test/unit/custom_spec.js +43 -55
  94. package/lib/test/unit/display_svg_spec.js +34 -18
  95. package/lib/test/unit/display_utils_spec.js +273 -0
  96. package/lib/test/unit/document_spec.js +8 -13
  97. package/lib/test/unit/encodings_spec.js +25 -45
  98. package/lib/test/unit/evaluator_spec.js +38 -15
  99. package/lib/test/unit/fetch_stream_spec.js +109 -0
  100. package/lib/test/unit/function_spec.js +17 -5
  101. package/lib/test/unit/jasmine-boot.js +33 -20
  102. package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
  103. package/lib/test/unit/metadata_spec.js +71 -11
  104. package/lib/test/unit/murmurhash3_spec.js +3 -3
  105. package/lib/test/unit/network_spec.js +19 -54
  106. package/lib/test/unit/network_utils_spec.js +91 -14
  107. package/lib/test/unit/node_stream_spec.js +56 -32
  108. package/lib/test/unit/parser_spec.js +162 -71
  109. package/lib/test/unit/pdf_find_controller_spec.js +230 -0
  110. package/lib/test/unit/pdf_find_utils_spec.js +63 -0
  111. package/lib/test/unit/pdf_history_spec.js +21 -9
  112. package/lib/test/unit/primitives_spec.js +53 -20
  113. package/lib/test/unit/stream_spec.js +12 -4
  114. package/lib/test/unit/test_utils.js +273 -56
  115. package/lib/test/unit/testreporter.js +21 -3
  116. package/lib/test/unit/type1_parser_spec.js +8 -6
  117. package/lib/test/unit/ui_utils_spec.js +454 -16
  118. package/lib/test/unit/unicode_spec.js +18 -15
  119. package/lib/test/unit/util_spec.js +87 -128
  120. package/lib/web/annotation_layer_builder.js +39 -22
  121. package/lib/web/app.js +1290 -588
  122. package/lib/web/app_options.js +100 -62
  123. package/lib/web/base_viewer.js +511 -182
  124. package/lib/web/chromecom.js +261 -117
  125. package/lib/web/debugger.js +166 -22
  126. package/lib/web/download_manager.js +32 -13
  127. package/lib/web/firefox_print_service.js +20 -10
  128. package/lib/web/firefoxcom.js +315 -80
  129. package/lib/web/genericcom.js +89 -30
  130. package/lib/web/genericl10n.js +142 -30
  131. package/lib/web/grab_to_pan.js +28 -4
  132. package/lib/web/interfaces.js +170 -47
  133. package/lib/web/overlay_manager.js +235 -85
  134. package/lib/web/password_prompt.js +22 -14
  135. package/lib/web/pdf_attachment_viewer.js +38 -18
  136. package/lib/web/pdf_cursor_tools.js +39 -16
  137. package/lib/web/pdf_document_properties.js +255 -136
  138. package/lib/web/pdf_find_bar.js +84 -40
  139. package/lib/web/pdf_find_controller.js +495 -184
  140. package/lib/web/pdf_find_utils.js +111 -0
  141. package/lib/web/pdf_history.js +190 -53
  142. package/lib/web/pdf_link_service.js +138 -77
  143. package/lib/web/pdf_outline_viewer.js +122 -46
  144. package/lib/web/pdf_page_view.js +191 -67
  145. package/lib/web/pdf_presentation_mode.js +99 -34
  146. package/lib/web/pdf_print_service.js +61 -13
  147. package/lib/web/pdf_rendering_queue.js +28 -9
  148. package/lib/web/pdf_sidebar.js +141 -81
  149. package/lib/web/pdf_sidebar_resizer.js +42 -16
  150. package/lib/web/pdf_single_page_viewer.js +74 -66
  151. package/lib/web/pdf_thumbnail_view.js +104 -33
  152. package/lib/web/pdf_thumbnail_viewer.js +66 -26
  153. package/lib/web/pdf_viewer.component.js +112 -32
  154. package/lib/web/pdf_viewer.js +91 -52
  155. package/lib/web/preferences.js +284 -89
  156. package/lib/web/secondary_toolbar.js +165 -40
  157. package/lib/web/text_layer_builder.js +134 -59
  158. package/lib/web/toolbar.js +78 -43
  159. package/lib/web/ui_utils.js +462 -136
  160. package/lib/web/view_history.js +215 -67
  161. package/lib/web/viewer_compatibility.js +4 -13
  162. package/package.json +5 -4
  163. package/web/pdf_viewer.css +79 -11
  164. package/web/pdf_viewer.js +6107 -3748
  165. package/web/pdf_viewer.js.map +1 -1
  166. package/lib/display/dom_utils.js +0 -309
  167. package/lib/test/unit/dom_utils_spec.js +0 -89
  168. package/lib/test/unit/fonts_spec.js +0 -81
  169. 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 2017 Mozilla Foundation
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
- 'use strict';
22
+ "use strict";
23
23
 
24
24
  Object.defineProperty(exports, "__esModule", {
25
25
  value: true
26
26
  });
27
- exports.JpxImage = undefined;
27
+ exports.JpxImage = void 0;
28
28
 
29
- var _util = require('../shared/util');
29
+ var _util = require("../shared/util");
30
30
 
31
- var _arithmetic_decoder = require('./arithmetic_decoder');
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('Unsupported progression order ' + progressionOrder);
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;