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/jbig2.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,81 +19,99 @@
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.Jbig2Image = undefined;
27
+ exports.Jbig2Image = 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
- var _ccitt = require('./ccitt');
33
+ var _ccitt = require("./ccitt");
34
34
 
35
35
  var Jbig2Error = function Jbig2ErrorClosure() {
36
36
  function Jbig2Error(msg) {
37
37
  this.message = 'JBIG2 error: ' + msg;
38
38
  }
39
+
39
40
  Jbig2Error.prototype = new Error();
40
41
  Jbig2Error.prototype.name = 'Jbig2Error';
41
42
  Jbig2Error.constructor = Jbig2Error;
42
43
  return Jbig2Error;
43
44
  }();
45
+
44
46
  var Jbig2Image = function Jbig2ImageClosure() {
45
47
  function ContextCache() {}
48
+
46
49
  ContextCache.prototype = {
47
50
  getContexts: function getContexts(id) {
48
51
  if (id in this) {
49
52
  return this[id];
50
53
  }
54
+
51
55
  return this[id] = new Int8Array(1 << 16);
52
56
  }
53
57
  };
58
+
54
59
  function DecodingContext(data, start, end) {
55
60
  this.data = data;
56
61
  this.start = start;
57
62
  this.end = end;
58
63
  }
64
+
59
65
  DecodingContext.prototype = {
60
66
  get decoder() {
61
67
  var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);
62
68
  return (0, _util.shadow)(this, 'decoder', decoder);
63
69
  },
70
+
64
71
  get contextCache() {
65
72
  var cache = new ContextCache();
66
73
  return (0, _util.shadow)(this, 'contextCache', cache);
67
74
  }
75
+
68
76
  };
77
+
69
78
  function decodeInteger(contextCache, procedure, decoder) {
70
79
  var contexts = contextCache.getContexts(procedure);
71
80
  var prev = 1;
81
+
72
82
  function readBits(length) {
73
83
  var v = 0;
84
+
74
85
  for (var i = 0; i < length; i++) {
75
86
  var bit = decoder.readBit(contexts, prev);
76
87
  prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
77
88
  v = v << 1 | bit;
78
89
  }
90
+
79
91
  return v >>> 0;
80
92
  }
93
+
81
94
  var sign = readBits(1);
82
95
  var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
83
96
  return sign === 0 ? value : value > 0 ? -value : null;
84
97
  }
98
+
85
99
  function decodeIAID(contextCache, decoder, codeLength) {
86
100
  var contexts = contextCache.getContexts('IAID');
87
101
  var prev = 1;
102
+
88
103
  for (var i = 0; i < codeLength; i++) {
89
104
  var bit = decoder.readBit(contexts, prev);
90
105
  prev = prev << 1 | bit;
91
106
  }
107
+
92
108
  if (codeLength < 31) {
93
109
  return prev & (1 << codeLength) - 1;
94
110
  }
111
+
95
112
  return prev & 0x7FFFFFFF;
96
113
  }
114
+
97
115
  var SegmentTypes = ['SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'PatternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension'];
98
116
  var CodingTemplates = [[{
99
117
  x: -1,
@@ -294,6 +312,7 @@ var Jbig2Image = function Jbig2ImageClosure() {
294
312
  }];
295
313
  var ReusedContexts = [0x9B25, 0x0795, 0x00E5, 0x0195];
296
314
  var RefinementReusedContexts = [0x0020, 0x0008];
315
+
297
316
  function decodeBitmapTemplate0(width, height, decodingContext) {
298
317
  var decoder = decodingContext.decoder;
299
318
  var contexts = decodingContext.contextCache.getContexts('GB');
@@ -306,26 +325,32 @@ var Jbig2Image = function Jbig2ImageClosure() {
306
325
  row2,
307
326
  bitmap = [];
308
327
  var OLD_PIXEL_MASK = 0x7BF7;
328
+
309
329
  for (i = 0; i < height; i++) {
310
330
  row = bitmap[i] = new Uint8Array(width);
311
331
  row1 = i < 1 ? row : bitmap[i - 1];
312
332
  row2 = i < 2 ? row : bitmap[i - 2];
313
333
  contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;
334
+
314
335
  for (j = 0; j < width; j++) {
315
336
  row[j] = pixel = decoder.readBit(contexts, contextLabel);
316
337
  contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;
317
338
  }
318
339
  }
340
+
319
341
  return bitmap;
320
342
  }
343
+
321
344
  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
322
345
  if (mmr) {
323
346
  var input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
324
347
  return decodeMMRBitmap(input, width, height, false);
325
348
  }
349
+
326
350
  if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
327
351
  return decodeBitmapTemplate0(width, height, decodingContext);
328
352
  }
353
+
329
354
  var useskip = !!skip;
330
355
  var template = CodingTemplates[templateIndex].concat(at);
331
356
  template.sort(function (a, b) {
@@ -340,28 +365,33 @@ var Jbig2Image = function Jbig2ImageClosure() {
340
365
  maxX = 0,
341
366
  minY = 0;
342
367
  var c, k;
368
+
343
369
  for (k = 0; k < templateLength; k++) {
344
370
  templateX[k] = template[k].x;
345
371
  templateY[k] = template[k].y;
346
372
  minX = Math.min(minX, template[k].x);
347
373
  maxX = Math.max(maxX, template[k].x);
348
374
  minY = Math.min(minY, template[k].y);
375
+
349
376
  if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {
350
377
  reuseMask |= 1 << templateLength - 1 - k;
351
378
  } else {
352
379
  changingTemplateEntries.push(k);
353
380
  }
354
381
  }
382
+
355
383
  var changingEntriesLength = changingTemplateEntries.length;
356
384
  var changingTemplateX = new Int8Array(changingEntriesLength);
357
385
  var changingTemplateY = new Int8Array(changingEntriesLength);
358
386
  var changingTemplateBit = new Uint16Array(changingEntriesLength);
387
+
359
388
  for (c = 0; c < changingEntriesLength; c++) {
360
389
  k = changingTemplateEntries[c];
361
390
  changingTemplateX[c] = template[k].x;
362
391
  changingTemplateY[c] = template[k].y;
363
392
  changingTemplateBit[c] = 1 << templateLength - 1 - k;
364
393
  }
394
+
365
395
  var sbb_left = -minX;
366
396
  var sbb_top = -minY;
367
397
  var sbb_right = width - maxX;
@@ -377,28 +407,35 @@ var Jbig2Image = function Jbig2ImageClosure() {
377
407
  contextLabel = 0,
378
408
  bit,
379
409
  shift;
410
+
380
411
  for (var i = 0; i < height; i++) {
381
412
  if (prediction) {
382
413
  var sltp = decoder.readBit(contexts, pseudoPixelContext);
383
414
  ltp ^= sltp;
415
+
384
416
  if (ltp) {
385
417
  bitmap.push(row);
386
418
  continue;
387
419
  }
388
420
  }
421
+
389
422
  row = new Uint8Array(row);
390
423
  bitmap.push(row);
424
+
391
425
  for (j = 0; j < width; j++) {
392
426
  if (useskip && skip[i][j]) {
393
427
  row[j] = 0;
394
428
  continue;
395
429
  }
430
+
396
431
  if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
397
432
  contextLabel = contextLabel << 1 & reuseMask;
433
+
398
434
  for (k = 0; k < changingEntriesLength; k++) {
399
435
  i0 = i + changingTemplateY[k];
400
436
  j0 = j + changingTemplateX[k];
401
437
  bit = bitmap[i0][j0];
438
+
402
439
  if (bit) {
403
440
  bit = changingTemplateBit[k];
404
441
  contextLabel |= bit;
@@ -407,12 +444,16 @@ var Jbig2Image = function Jbig2ImageClosure() {
407
444
  } else {
408
445
  contextLabel = 0;
409
446
  shift = templateLength - 1;
447
+
410
448
  for (k = 0; k < templateLength; k++, shift--) {
411
449
  j0 = j + templateX[k];
450
+
412
451
  if (j0 >= 0 && j0 < width) {
413
452
  i0 = i + templateY[k];
453
+
414
454
  if (i0 >= 0) {
415
455
  bit = bitmap[i0][j0];
456
+
416
457
  if (bit) {
417
458
  contextLabel |= bit << shift;
418
459
  }
@@ -420,36 +461,47 @@ var Jbig2Image = function Jbig2ImageClosure() {
420
461
  }
421
462
  }
422
463
  }
464
+
423
465
  var pixel = decoder.readBit(contexts, contextLabel);
424
466
  row[j] = pixel;
425
467
  }
426
468
  }
469
+
427
470
  return bitmap;
428
471
  }
472
+
429
473
  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {
430
474
  var codingTemplate = RefinementTemplates[templateIndex].coding;
475
+
431
476
  if (templateIndex === 0) {
432
477
  codingTemplate = codingTemplate.concat([at[0]]);
433
478
  }
479
+
434
480
  var codingTemplateLength = codingTemplate.length;
435
481
  var codingTemplateX = new Int32Array(codingTemplateLength);
436
482
  var codingTemplateY = new Int32Array(codingTemplateLength);
437
483
  var k;
484
+
438
485
  for (k = 0; k < codingTemplateLength; k++) {
439
486
  codingTemplateX[k] = codingTemplate[k].x;
440
487
  codingTemplateY[k] = codingTemplate[k].y;
441
488
  }
489
+
442
490
  var referenceTemplate = RefinementTemplates[templateIndex].reference;
491
+
443
492
  if (templateIndex === 0) {
444
493
  referenceTemplate = referenceTemplate.concat([at[1]]);
445
494
  }
495
+
446
496
  var referenceTemplateLength = referenceTemplate.length;
447
497
  var referenceTemplateX = new Int32Array(referenceTemplateLength);
448
498
  var referenceTemplateY = new Int32Array(referenceTemplateLength);
499
+
449
500
  for (k = 0; k < referenceTemplateLength; k++) {
450
501
  referenceTemplateX[k] = referenceTemplate[k].x;
451
502
  referenceTemplateY[k] = referenceTemplate[k].y;
452
503
  }
504
+
453
505
  var referenceWidth = referenceBitmap[0].length;
454
506
  var referenceHeight = referenceBitmap.length;
455
507
  var pseudoPixelContext = RefinementReusedContexts[templateIndex];
@@ -457,75 +509,93 @@ var Jbig2Image = function Jbig2ImageClosure() {
457
509
  var decoder = decodingContext.decoder;
458
510
  var contexts = decodingContext.contextCache.getContexts('GR');
459
511
  var ltp = 0;
512
+
460
513
  for (var i = 0; i < height; i++) {
461
514
  if (prediction) {
462
515
  var sltp = decoder.readBit(contexts, pseudoPixelContext);
463
516
  ltp ^= sltp;
517
+
464
518
  if (ltp) {
465
519
  throw new Jbig2Error('prediction is not supported');
466
520
  }
467
521
  }
522
+
468
523
  var row = new Uint8Array(width);
469
524
  bitmap.push(row);
525
+
470
526
  for (var j = 0; j < width; j++) {
471
527
  var i0, j0;
472
528
  var contextLabel = 0;
529
+
473
530
  for (k = 0; k < codingTemplateLength; k++) {
474
531
  i0 = i + codingTemplateY[k];
475
532
  j0 = j + codingTemplateX[k];
533
+
476
534
  if (i0 < 0 || j0 < 0 || j0 >= width) {
477
535
  contextLabel <<= 1;
478
536
  } else {
479
537
  contextLabel = contextLabel << 1 | bitmap[i0][j0];
480
538
  }
481
539
  }
540
+
482
541
  for (k = 0; k < referenceTemplateLength; k++) {
483
542
  i0 = i + referenceTemplateY[k] - offsetY;
484
543
  j0 = j + referenceTemplateX[k] - offsetX;
544
+
485
545
  if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
486
546
  contextLabel <<= 1;
487
547
  } else {
488
548
  contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
489
549
  }
490
550
  }
551
+
491
552
  var pixel = decoder.readBit(contexts, contextLabel);
492
553
  row[j] = pixel;
493
554
  }
494
555
  }
556
+
495
557
  return bitmap;
496
558
  }
559
+
497
560
  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
498
561
  if (huffman && refinement) {
499
562
  throw new Jbig2Error('symbol refinement with Huffman is not supported');
500
563
  }
564
+
501
565
  var newSymbols = [];
502
566
  var currentHeight = 0;
503
567
  var symbolCodeLength = (0, _util.log2)(symbols.length + numberOfNewSymbols);
504
568
  var decoder = decodingContext.decoder;
505
569
  var contextCache = decodingContext.contextCache;
506
- var tableB1 = void 0,
507
- symbolWidths = void 0;
570
+ var tableB1, symbolWidths;
571
+
508
572
  if (huffman) {
509
573
  tableB1 = getStandardTable(1);
510
574
  symbolWidths = [];
511
575
  symbolCodeLength = Math.max(symbolCodeLength, 1);
512
576
  }
577
+
513
578
  while (newSymbols.length < numberOfNewSymbols) {
514
579
  var deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, 'IADH', decoder);
515
580
  currentHeight += deltaHeight;
516
581
  var currentWidth = 0,
517
582
  totalWidth = 0;
518
583
  var firstSymbol = huffman ? symbolWidths.length : 0;
584
+
519
585
  while (true) {
520
586
  var deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, 'IADW', decoder);
587
+
521
588
  if (deltaWidth === null) {
522
589
  break;
523
590
  }
591
+
524
592
  currentWidth += deltaWidth;
525
593
  totalWidth += currentWidth;
526
594
  var bitmap;
595
+
527
596
  if (refinement) {
528
597
  var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
598
+
529
599
  if (numberOfInstances > 1) {
530
600
  bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);
531
601
  } else {
@@ -535,6 +605,7 @@ var Jbig2Image = function Jbig2ImageClosure() {
535
605
  var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];
536
606
  bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);
537
607
  }
608
+
538
609
  newSymbols.push(bitmap);
539
610
  } else if (huffman) {
540
611
  symbolWidths.push(currentWidth);
@@ -543,10 +614,12 @@ var Jbig2Image = function Jbig2ImageClosure() {
543
614
  newSymbols.push(bitmap);
544
615
  }
545
616
  }
617
+
546
618
  if (huffman && !refinement) {
547
619
  var bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
548
620
  huffmanInput.byteAlign();
549
621
  var collectiveBitmap = void 0;
622
+
550
623
  if (bitmapSize === 0) {
551
624
  collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
552
625
  } else {
@@ -557,7 +630,9 @@ var Jbig2Image = function Jbig2ImageClosure() {
557
630
  huffmanInput.end = originalEnd;
558
631
  huffmanInput.position = bitmapEnd;
559
632
  }
633
+
560
634
  var numberOfSymbolsDecoded = symbolWidths.length;
635
+
561
636
  if (firstSymbol === numberOfSymbolsDecoded - 1) {
562
637
  newSymbols.push(collectiveBitmap);
563
638
  } else {
@@ -567,79 +642,100 @@ var Jbig2Image = function Jbig2ImageClosure() {
567
642
  xMax = void 0,
568
643
  bitmapWidth = void 0,
569
644
  symbolBitmap = void 0;
645
+
570
646
  for (_i = firstSymbol; _i < numberOfSymbolsDecoded; _i++) {
571
647
  bitmapWidth = symbolWidths[_i];
572
648
  xMax = xMin + bitmapWidth;
573
649
  symbolBitmap = [];
650
+
574
651
  for (y = 0; y < currentHeight; y++) {
575
652
  symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
576
653
  }
654
+
577
655
  newSymbols.push(symbolBitmap);
578
656
  xMin = xMax;
579
657
  }
580
658
  }
581
659
  }
582
660
  }
661
+
583
662
  var exportedSymbols = [];
584
663
  var flags = [],
585
664
  currentFlag = false;
586
665
  var totalSymbolsLength = symbols.length + numberOfNewSymbols;
666
+
587
667
  while (flags.length < totalSymbolsLength) {
588
668
  var runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, 'IAEX', decoder);
669
+
589
670
  while (runLength--) {
590
671
  flags.push(currentFlag);
591
672
  }
673
+
592
674
  currentFlag = !currentFlag;
593
675
  }
676
+
594
677
  for (var i = 0, ii = symbols.length; i < ii; i++) {
595
678
  if (flags[i]) {
596
679
  exportedSymbols.push(symbols[i]);
597
680
  }
598
681
  }
682
+
599
683
  for (var j = 0; j < numberOfNewSymbols; i++, j++) {
600
684
  if (flags[i]) {
601
685
  exportedSymbols.push(newSymbols[j]);
602
686
  }
603
687
  }
688
+
604
689
  return exportedSymbols;
605
690
  }
691
+
606
692
  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
607
693
  if (huffman && refinement) {
608
694
  throw new Jbig2Error('refinement with Huffman is not supported');
609
695
  }
696
+
610
697
  var bitmap = [];
611
698
  var i, row;
699
+
612
700
  for (i = 0; i < height; i++) {
613
701
  row = new Uint8Array(width);
702
+
614
703
  if (defaultPixelValue) {
615
704
  for (var j = 0; j < width; j++) {
616
705
  row[j] = defaultPixelValue;
617
706
  }
618
707
  }
708
+
619
709
  bitmap.push(row);
620
710
  }
711
+
621
712
  var decoder = decodingContext.decoder;
622
713
  var contextCache = decodingContext.contextCache;
623
714
  var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, 'IADT', decoder);
624
715
  var firstS = 0;
625
716
  i = 0;
717
+
626
718
  while (i < numberOfSymbolInstances) {
627
719
  var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, 'IADT', decoder);
628
720
  stripT += deltaT;
629
721
  var deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, 'IAFS', decoder);
630
722
  firstS += deltaFirstS;
631
723
  var currentS = firstS;
724
+
632
725
  do {
633
726
  var currentT = 0;
727
+
634
728
  if (stripSize > 1) {
635
729
  currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, 'IAIT', decoder);
636
730
  }
731
+
637
732
  var t = stripSize * stripT + currentT;
638
733
  var symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength);
639
734
  var applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, 'IARI', decoder));
640
735
  var symbolBitmap = inputSymbols[symbolId];
641
736
  var symbolWidth = symbolBitmap[0].length;
642
737
  var symbolHeight = symbolBitmap.length;
738
+
643
739
  if (applyRefinement) {
644
740
  var rdw = decodeInteger(contextCache, 'IARDW', decoder);
645
741
  var rdh = decodeInteger(contextCache, 'IARDH', decoder);
@@ -649,74 +745,99 @@ var Jbig2Image = function Jbig2ImageClosure() {
649
745
  symbolHeight += rdh;
650
746
  symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
651
747
  }
748
+
652
749
  var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
653
750
  var offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
654
751
  var s2, t2, symbolRow;
752
+
655
753
  if (transposed) {
656
754
  for (s2 = 0; s2 < symbolHeight; s2++) {
657
755
  row = bitmap[offsetS + s2];
756
+
658
757
  if (!row) {
659
758
  continue;
660
759
  }
760
+
661
761
  symbolRow = symbolBitmap[s2];
662
762
  var maxWidth = Math.min(width - offsetT, symbolWidth);
763
+
663
764
  switch (combinationOperator) {
664
765
  case 0:
665
766
  for (t2 = 0; t2 < maxWidth; t2++) {
666
767
  row[offsetT + t2] |= symbolRow[t2];
667
768
  }
769
+
668
770
  break;
771
+
669
772
  case 2:
670
773
  for (t2 = 0; t2 < maxWidth; t2++) {
671
774
  row[offsetT + t2] ^= symbolRow[t2];
672
775
  }
776
+
673
777
  break;
778
+
674
779
  default:
675
- throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
780
+ throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
676
781
  }
677
782
  }
783
+
678
784
  currentS += symbolHeight - 1;
679
785
  } else {
680
786
  for (t2 = 0; t2 < symbolHeight; t2++) {
681
787
  row = bitmap[offsetT + t2];
788
+
682
789
  if (!row) {
683
790
  continue;
684
791
  }
792
+
685
793
  symbolRow = symbolBitmap[t2];
794
+
686
795
  switch (combinationOperator) {
687
796
  case 0:
688
797
  for (s2 = 0; s2 < symbolWidth; s2++) {
689
798
  row[offsetS + s2] |= symbolRow[s2];
690
799
  }
800
+
691
801
  break;
802
+
692
803
  case 2:
693
804
  for (s2 = 0; s2 < symbolWidth; s2++) {
694
805
  row[offsetS + s2] ^= symbolRow[s2];
695
806
  }
807
+
696
808
  break;
809
+
697
810
  default:
698
- throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
811
+ throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
699
812
  }
700
813
  }
814
+
701
815
  currentS += symbolWidth - 1;
702
816
  }
817
+
703
818
  i++;
704
819
  var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, 'IADS', decoder);
820
+
705
821
  if (deltaS === null) {
706
822
  break;
707
823
  }
824
+
708
825
  currentS += deltaS + dsOffset;
709
826
  } while (true);
710
827
  }
828
+
711
829
  return bitmap;
712
830
  }
831
+
713
832
  function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) {
714
833
  var at = [];
834
+
715
835
  if (!mmr) {
716
836
  at.push({
717
837
  x: -patternWidth,
718
838
  y: 0
719
839
  });
840
+
720
841
  if (template === 0) {
721
842
  at.push({
722
843
  x: -3,
@@ -732,58 +853,71 @@ var Jbig2Image = function Jbig2ImageClosure() {
732
853
  });
733
854
  }
734
855
  }
856
+
735
857
  var collectiveWidth = (maxPatternIndex + 1) * patternWidth;
736
858
  var collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext);
737
859
  var patterns = [],
738
860
  i = 0,
739
- patternBitmap = void 0,
740
- xMin = void 0,
741
- xMax = void 0,
742
- y = void 0;
861
+ patternBitmap,
862
+ xMin,
863
+ xMax,
864
+ y;
865
+
743
866
  while (i <= maxPatternIndex) {
744
867
  patternBitmap = [];
745
868
  xMin = patternWidth * i;
746
869
  xMax = xMin + patternWidth;
870
+
747
871
  for (y = 0; y < patternHeight; y++) {
748
872
  patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
749
873
  }
874
+
750
875
  patterns.push(patternBitmap);
751
876
  i++;
752
877
  }
878
+
753
879
  return patterns;
754
880
  }
881
+
755
882
  function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) {
756
883
  var skip = null;
884
+
757
885
  if (enableSkip) {
758
886
  throw new Jbig2Error('skip is not supported');
759
887
  }
888
+
760
889
  if (combinationOperator !== 0) {
761
890
  throw new Jbig2Error('operator ' + combinationOperator + ' is not supported in halftone region');
762
891
  }
892
+
763
893
  var regionBitmap = [];
764
- var i = void 0,
765
- j = void 0,
766
- row = void 0;
894
+ var i, j, row;
895
+
767
896
  for (i = 0; i < regionHeight; i++) {
768
897
  row = new Uint8Array(regionWidth);
898
+
769
899
  if (defaultPixelValue) {
770
900
  for (j = 0; j < regionWidth; j++) {
771
901
  row[j] = defaultPixelValue;
772
902
  }
773
903
  }
904
+
774
905
  regionBitmap.push(row);
775
906
  }
907
+
776
908
  var numberOfPatterns = patterns.length;
777
909
  var pattern0 = patterns[0];
778
910
  var patternWidth = pattern0[0].length,
779
911
  patternHeight = pattern0.length;
780
912
  var bitsPerValue = (0, _util.log2)(numberOfPatterns);
781
913
  var at = [];
914
+
782
915
  if (!mmr) {
783
916
  at.push({
784
917
  x: template <= 1 ? 3 : 2,
785
918
  y: -1
786
919
  });
920
+
787
921
  if (template === 0) {
788
922
  at.push({
789
923
  x: -3,
@@ -799,44 +933,46 @@ var Jbig2Image = function Jbig2ImageClosure() {
799
933
  });
800
934
  }
801
935
  }
936
+
802
937
  var grayScaleBitPlanes = [],
803
- mmrInput = void 0,
804
- bitmap = void 0;
938
+ mmrInput,
939
+ bitmap;
940
+
805
941
  if (mmr) {
806
942
  mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
807
943
  }
944
+
808
945
  for (i = bitsPerValue - 1; i >= 0; i--) {
809
946
  if (mmr) {
810
947
  bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
811
948
  } else {
812
949
  bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
813
950
  }
951
+
814
952
  grayScaleBitPlanes[i] = bitmap;
815
953
  }
816
- var mg = void 0,
817
- ng = void 0,
818
- bit = void 0,
819
- patternIndex = void 0,
820
- patternBitmap = void 0,
821
- x = void 0,
822
- y = void 0,
823
- patternRow = void 0,
824
- regionRow = void 0;
954
+
955
+ var mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;
956
+
825
957
  for (mg = 0; mg < gridHeight; mg++) {
826
958
  for (ng = 0; ng < gridWidth; ng++) {
827
959
  bit = 0;
828
960
  patternIndex = 0;
961
+
829
962
  for (j = bitsPerValue - 1; j >= 0; j--) {
830
963
  bit = grayScaleBitPlanes[j][mg][ng] ^ bit;
831
964
  patternIndex |= bit << j;
832
965
  }
966
+
833
967
  patternBitmap = patterns[patternIndex];
834
968
  x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
835
969
  y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;
970
+
836
971
  if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
837
972
  for (i = 0; i < patternHeight; i++) {
838
973
  regionRow = regionBitmap[y + i];
839
974
  patternRow = patternBitmap[i];
975
+
840
976
  for (j = 0; j < patternWidth; j++) {
841
977
  regionRow[x + j] |= patternRow[j];
842
978
  }
@@ -844,15 +980,20 @@ var Jbig2Image = function Jbig2ImageClosure() {
844
980
  } else {
845
981
  var regionX = void 0,
846
982
  regionY = void 0;
983
+
847
984
  for (i = 0; i < patternHeight; i++) {
848
985
  regionY = y + i;
986
+
849
987
  if (regionY < 0 || regionY >= regionHeight) {
850
988
  continue;
851
989
  }
990
+
852
991
  regionRow = regionBitmap[regionY];
853
992
  patternRow = patternBitmap[i];
993
+
854
994
  for (j = 0; j < patternWidth; j++) {
855
995
  regionX = x + j;
996
+
856
997
  if (regionX >= 0 && regionX < regionWidth) {
857
998
  regionRow[regionX] |= patternRow[j];
858
999
  }
@@ -861,16 +1002,20 @@ var Jbig2Image = function Jbig2ImageClosure() {
861
1002
  }
862
1003
  }
863
1004
  }
1005
+
864
1006
  return regionBitmap;
865
1007
  }
1008
+
866
1009
  function readSegmentHeader(data, start) {
867
1010
  var segmentHeader = {};
868
1011
  segmentHeader.number = (0, _util.readUint32)(data, start);
869
1012
  var flags = data[start + 4];
870
1013
  var segmentType = flags & 0x3F;
1014
+
871
1015
  if (!SegmentTypes[segmentType]) {
872
1016
  throw new Jbig2Error('invalid segment type: ' + segmentType);
873
1017
  }
1018
+
874
1019
  segmentHeader.type = segmentType;
875
1020
  segmentHeader.typeName = SegmentTypes[segmentType];
876
1021
  segmentHeader.deferredNonRetain = !!(flags & 0x80);
@@ -879,35 +1024,43 @@ var Jbig2Image = function Jbig2ImageClosure() {
879
1024
  var referredToCount = referredFlags >> 5 & 7;
880
1025
  var retainBits = [referredFlags & 31];
881
1026
  var position = start + 6;
1027
+
882
1028
  if (referredFlags === 7) {
883
1029
  referredToCount = (0, _util.readUint32)(data, position - 1) & 0x1FFFFFFF;
884
1030
  position += 3;
885
1031
  var bytes = referredToCount + 7 >> 3;
886
1032
  retainBits[0] = data[position++];
1033
+
887
1034
  while (--bytes > 0) {
888
1035
  retainBits.push(data[position++]);
889
1036
  }
890
1037
  } else if (referredFlags === 5 || referredFlags === 6) {
891
1038
  throw new Jbig2Error('invalid referred-to flags');
892
1039
  }
1040
+
893
1041
  segmentHeader.retainBits = retainBits;
894
1042
  var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4;
895
1043
  var referredTo = [];
896
1044
  var i, ii;
1045
+
897
1046
  for (i = 0; i < referredToCount; i++) {
898
1047
  var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? (0, _util.readUint16)(data, position) : (0, _util.readUint32)(data, position);
899
1048
  referredTo.push(number);
900
1049
  position += referredToSegmentNumberSize;
901
1050
  }
1051
+
902
1052
  segmentHeader.referredTo = referredTo;
1053
+
903
1054
  if (!pageAssociationFieldSize) {
904
1055
  segmentHeader.pageAssociation = data[position++];
905
1056
  } else {
906
1057
  segmentHeader.pageAssociation = (0, _util.readUint32)(data, position);
907
1058
  position += 4;
908
1059
  }
1060
+
909
1061
  segmentHeader.length = (0, _util.readUint32)(data, position);
910
1062
  position += 4;
1063
+
911
1064
  if (segmentHeader.length === 0xFFFFFFFF) {
912
1065
  if (segmentType === 38) {
913
1066
  var genericRegionInfo = readRegionSegmentInformation(data, position);
@@ -915,24 +1068,30 @@ var Jbig2Image = function Jbig2ImageClosure() {
915
1068
  var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
916
1069
  var searchPatternLength = 6;
917
1070
  var searchPattern = new Uint8Array(searchPatternLength);
1071
+
918
1072
  if (!genericRegionMmr) {
919
1073
  searchPattern[0] = 0xFF;
920
1074
  searchPattern[1] = 0xAC;
921
1075
  }
1076
+
922
1077
  searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF;
923
1078
  searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF;
924
1079
  searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF;
925
1080
  searchPattern[5] = genericRegionInfo.height & 0xFF;
1081
+
926
1082
  for (i = position, ii = data.length; i < ii; i++) {
927
1083
  var j = 0;
1084
+
928
1085
  while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
929
1086
  j++;
930
1087
  }
1088
+
931
1089
  if (j === searchPatternLength) {
932
1090
  segmentHeader.length = i + searchPatternLength;
933
1091
  break;
934
1092
  }
935
1093
  }
1094
+
936
1095
  if (segmentHeader.length === 0xFFFFFFFF) {
937
1096
  throw new Jbig2Error('segment end was not found');
938
1097
  }
@@ -940,12 +1099,15 @@ var Jbig2Image = function Jbig2ImageClosure() {
940
1099
  throw new Jbig2Error('invalid unknown segment length');
941
1100
  }
942
1101
  }
1102
+
943
1103
  segmentHeader.headerEnd = position;
944
1104
  return segmentHeader;
945
1105
  }
1106
+
946
1107
  function readSegments(header, data, start, end) {
947
1108
  var segments = [];
948
1109
  var position = start;
1110
+
949
1111
  while (position < end) {
950
1112
  var segmentHeader = readSegmentHeader(data, position);
951
1113
  position = segmentHeader.headerEnd;
@@ -953,16 +1115,20 @@ var Jbig2Image = function Jbig2ImageClosure() {
953
1115
  header: segmentHeader,
954
1116
  data: data
955
1117
  };
1118
+
956
1119
  if (!header.randomAccess) {
957
1120
  segment.start = position;
958
1121
  position += segmentHeader.length;
959
1122
  segment.end = position;
960
1123
  }
1124
+
961
1125
  segments.push(segment);
1126
+
962
1127
  if (segmentHeader.type === 51) {
963
1128
  break;
964
1129
  }
965
1130
  }
1131
+
966
1132
  if (header.randomAccess) {
967
1133
  for (var i = 0, ii = segments.length; i < ii; i++) {
968
1134
  segments[i].start = position;
@@ -970,8 +1136,10 @@ var Jbig2Image = function Jbig2ImageClosure() {
970
1136
  segments[i].end = position;
971
1137
  }
972
1138
  }
1139
+
973
1140
  return segments;
974
1141
  }
1142
+
975
1143
  function readRegionSegmentInformation(data, start) {
976
1144
  return {
977
1145
  width: (0, _util.readUint32)(data, start),
@@ -981,13 +1149,16 @@ var Jbig2Image = function Jbig2ImageClosure() {
981
1149
  combinationOperator: data[start + 16] & 7
982
1150
  };
983
1151
  }
1152
+
984
1153
  var RegionSegmentInformationFieldLength = 17;
1154
+
985
1155
  function processSegment(segment, visitor) {
986
1156
  var header = segment.header;
987
1157
  var data = segment.data,
988
1158
  position = segment.start,
989
1159
  end = segment.end;
990
1160
  var args, at, i, atLength;
1161
+
991
1162
  switch (header.type) {
992
1163
  case 0:
993
1164
  var dictionary = {};
@@ -1003,9 +1174,11 @@ var Jbig2Image = function Jbig2ImageClosure() {
1003
1174
  dictionary.template = dictionaryFlags >> 10 & 3;
1004
1175
  dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
1005
1176
  position += 2;
1177
+
1006
1178
  if (!dictionary.huffman) {
1007
1179
  atLength = dictionary.template === 0 ? 4 : 1;
1008
1180
  at = [];
1181
+
1009
1182
  for (i = 0; i < atLength; i++) {
1010
1183
  at.push({
1011
1184
  x: (0, _util.readInt8)(data, position),
@@ -1013,10 +1186,13 @@ var Jbig2Image = function Jbig2ImageClosure() {
1013
1186
  });
1014
1187
  position += 2;
1015
1188
  }
1189
+
1016
1190
  dictionary.at = at;
1017
1191
  }
1192
+
1018
1193
  if (dictionary.refinement && !dictionary.refinementTemplate) {
1019
1194
  at = [];
1195
+
1020
1196
  for (i = 0; i < 2; i++) {
1021
1197
  at.push({
1022
1198
  x: (0, _util.readInt8)(data, position),
@@ -1024,14 +1200,17 @@ var Jbig2Image = function Jbig2ImageClosure() {
1024
1200
  });
1025
1201
  position += 2;
1026
1202
  }
1203
+
1027
1204
  dictionary.refinementAt = at;
1028
1205
  }
1206
+
1029
1207
  dictionary.numberOfExportedSymbols = (0, _util.readUint32)(data, position);
1030
1208
  position += 4;
1031
1209
  dictionary.numberOfNewSymbols = (0, _util.readUint32)(data, position);
1032
1210
  position += 4;
1033
1211
  args = [dictionary, header.number, header.referredTo, data, position, end];
1034
1212
  break;
1213
+
1035
1214
  case 6:
1036
1215
  case 7:
1037
1216
  var textRegion = {};
@@ -1049,6 +1228,7 @@ var Jbig2Image = function Jbig2ImageClosure() {
1049
1228
  textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
1050
1229
  textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
1051
1230
  textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;
1231
+
1052
1232
  if (textRegion.huffman) {
1053
1233
  var textRegionHuffmanFlags = (0, _util.readUint16)(data, position);
1054
1234
  position += 2;
@@ -1061,8 +1241,10 @@ var Jbig2Image = function Jbig2ImageClosure() {
1061
1241
  textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
1062
1242
  textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
1063
1243
  }
1244
+
1064
1245
  if (textRegion.refinement && !textRegion.refinementTemplate) {
1065
1246
  at = [];
1247
+
1066
1248
  for (i = 0; i < 2; i++) {
1067
1249
  at.push({
1068
1250
  x: (0, _util.readInt8)(data, position),
@@ -1070,12 +1252,15 @@ var Jbig2Image = function Jbig2ImageClosure() {
1070
1252
  });
1071
1253
  position += 2;
1072
1254
  }
1255
+
1073
1256
  textRegion.refinementAt = at;
1074
1257
  }
1258
+
1075
1259
  textRegion.numberOfSymbolInstances = (0, _util.readUint32)(data, position);
1076
1260
  position += 4;
1077
1261
  args = [textRegion, header.referredTo, data, position, end];
1078
1262
  break;
1263
+
1079
1264
  case 16:
1080
1265
  var patternDictionary = {};
1081
1266
  var patternDictionaryFlags = data[position++];
@@ -1087,6 +1272,7 @@ var Jbig2Image = function Jbig2ImageClosure() {
1087
1272
  position += 4;
1088
1273
  args = [patternDictionary, header.number, data, position, end];
1089
1274
  break;
1275
+
1090
1276
  case 22:
1091
1277
  case 23:
1092
1278
  var halftoneRegion = {};
@@ -1112,6 +1298,7 @@ var Jbig2Image = function Jbig2ImageClosure() {
1112
1298
  position += 2;
1113
1299
  args = [halftoneRegion, header.referredTo, data, position, end];
1114
1300
  break;
1301
+
1115
1302
  case 38:
1116
1303
  case 39:
1117
1304
  var genericRegion = {};
@@ -1121,9 +1308,11 @@ var Jbig2Image = function Jbig2ImageClosure() {
1121
1308
  genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
1122
1309
  genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
1123
1310
  genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
1311
+
1124
1312
  if (!genericRegion.mmr) {
1125
1313
  atLength = genericRegion.template === 0 ? 4 : 1;
1126
1314
  at = [];
1315
+
1127
1316
  for (i = 0; i < atLength; i++) {
1128
1317
  at.push({
1129
1318
  x: (0, _util.readInt8)(data, position),
@@ -1131,10 +1320,13 @@ var Jbig2Image = function Jbig2ImageClosure() {
1131
1320
  });
1132
1321
  position += 2;
1133
1322
  }
1323
+
1134
1324
  genericRegion.at = at;
1135
1325
  }
1326
+
1136
1327
  args = [genericRegion, data, position, end];
1137
1328
  break;
1329
+
1138
1330
  case 48:
1139
1331
  var pageInfo = {
1140
1332
  width: (0, _util.readUint32)(data, position),
@@ -1142,9 +1334,11 @@ var Jbig2Image = function Jbig2ImageClosure() {
1142
1334
  resolutionX: (0, _util.readUint32)(data, position + 8),
1143
1335
  resolutionY: (0, _util.readUint32)(data, position + 12)
1144
1336
  };
1337
+
1145
1338
  if (pageInfo.height === 0xFFFFFFFF) {
1146
1339
  delete pageInfo.height;
1147
1340
  }
1341
+
1148
1342
  var pageSegmentFlags = data[position + 16];
1149
1343
  (0, _util.readUint16)(data, position + 17);
1150
1344
  pageInfo.lossless = !!(pageSegmentFlags & 1);
@@ -1155,50 +1349,117 @@ var Jbig2Image = function Jbig2ImageClosure() {
1155
1349
  pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
1156
1350
  args = [pageInfo];
1157
1351
  break;
1352
+
1158
1353
  case 49:
1159
1354
  break;
1355
+
1160
1356
  case 50:
1161
1357
  break;
1358
+
1162
1359
  case 51:
1163
1360
  break;
1361
+
1164
1362
  case 53:
1165
1363
  args = [header.number, data, position, end];
1166
1364
  break;
1365
+
1167
1366
  case 62:
1168
1367
  break;
1368
+
1169
1369
  default:
1170
- throw new Jbig2Error('segment type ' + header.typeName + '(' + header.type + ')' + ' is not implemented');
1370
+ throw new Jbig2Error("segment type ".concat(header.typeName, "(").concat(header.type, ")") + ' is not implemented');
1171
1371
  }
1372
+
1172
1373
  var callbackName = 'on' + header.typeName;
1374
+
1173
1375
  if (callbackName in visitor) {
1174
1376
  visitor[callbackName].apply(visitor, args);
1175
1377
  }
1176
1378
  }
1379
+
1177
1380
  function processSegments(segments, visitor) {
1178
1381
  for (var i = 0, ii = segments.length; i < ii; i++) {
1179
1382
  processSegment(segments[i], visitor);
1180
1383
  }
1181
1384
  }
1385
+
1182
1386
  function parseJbig2Chunks(chunks) {
1183
1387
  var visitor = new SimpleSegmentVisitor();
1388
+
1184
1389
  for (var i = 0, ii = chunks.length; i < ii; i++) {
1185
1390
  var chunk = chunks[i];
1186
1391
  var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
1187
1392
  processSegments(segments, visitor);
1188
1393
  }
1394
+
1189
1395
  return visitor.buffer;
1190
1396
  }
1397
+
1398
+ function parseJbig2(data) {
1399
+ var position = 0,
1400
+ end = data.length;
1401
+
1402
+ if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
1403
+ throw new Jbig2Error('parseJbig2 - invalid header.');
1404
+ }
1405
+
1406
+ var header = Object.create(null);
1407
+ position += 8;
1408
+ var flags = data[position++];
1409
+ header.randomAccess = !(flags & 1);
1410
+
1411
+ if (!(flags & 2)) {
1412
+ header.numberOfPages = (0, _util.readUint32)(data, position);
1413
+ position += 4;
1414
+ }
1415
+
1416
+ var segments = readSegments(header, data, position, end);
1417
+ var visitor = new SimpleSegmentVisitor();
1418
+ processSegments(segments, visitor);
1419
+ var _visitor$currentPageI = visitor.currentPageInfo,
1420
+ width = _visitor$currentPageI.width,
1421
+ height = _visitor$currentPageI.height;
1422
+ var bitPacked = visitor.buffer;
1423
+ var imgData = new Uint8ClampedArray(width * height);
1424
+ var q = 0,
1425
+ k = 0;
1426
+
1427
+ for (var i = 0; i < height; i++) {
1428
+ var mask = 0,
1429
+ buffer = void 0;
1430
+
1431
+ for (var j = 0; j < width; j++) {
1432
+ if (!mask) {
1433
+ mask = 128;
1434
+ buffer = bitPacked[k++];
1435
+ }
1436
+
1437
+ imgData[q++] = buffer & mask ? 0 : 255;
1438
+ mask >>= 1;
1439
+ }
1440
+ }
1441
+
1442
+ return {
1443
+ imgData: imgData,
1444
+ width: width,
1445
+ height: height
1446
+ };
1447
+ }
1448
+
1191
1449
  function SimpleSegmentVisitor() {}
1450
+
1192
1451
  SimpleSegmentVisitor.prototype = {
1193
1452
  onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
1194
1453
  this.currentPageInfo = info;
1195
1454
  var rowSize = info.width + 7 >> 3;
1196
1455
  var buffer = new Uint8ClampedArray(rowSize * info.height);
1456
+
1197
1457
  if (info.defaultPixelValue) {
1198
1458
  for (var i = 0, ii = buffer.length; i < ii; i++) {
1199
1459
  buffer[i] = 0xFF;
1200
1460
  }
1201
1461
  }
1462
+
1202
1463
  this.buffer = buffer;
1203
1464
  },
1204
1465
  drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
@@ -1211,43 +1472,56 @@ var Jbig2Image = function Jbig2ImageClosure() {
1211
1472
  var mask0 = 128 >> (regionInfo.x & 7);
1212
1473
  var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
1213
1474
  var i, j, mask, offset;
1475
+
1214
1476
  switch (combinationOperator) {
1215
1477
  case 0:
1216
1478
  for (i = 0; i < height; i++) {
1217
1479
  mask = mask0;
1218
1480
  offset = offset0;
1481
+
1219
1482
  for (j = 0; j < width; j++) {
1220
1483
  if (bitmap[i][j]) {
1221
1484
  buffer[offset] |= mask;
1222
1485
  }
1486
+
1223
1487
  mask >>= 1;
1488
+
1224
1489
  if (!mask) {
1225
1490
  mask = 128;
1226
1491
  offset++;
1227
1492
  }
1228
1493
  }
1494
+
1229
1495
  offset0 += rowSize;
1230
1496
  }
1497
+
1231
1498
  break;
1499
+
1232
1500
  case 2:
1233
1501
  for (i = 0; i < height; i++) {
1234
1502
  mask = mask0;
1235
1503
  offset = offset0;
1504
+
1236
1505
  for (j = 0; j < width; j++) {
1237
1506
  if (bitmap[i][j]) {
1238
1507
  buffer[offset] ^= mask;
1239
1508
  }
1509
+
1240
1510
  mask >>= 1;
1511
+
1241
1512
  if (!mask) {
1242
1513
  mask = 128;
1243
1514
  offset++;
1244
1515
  }
1245
1516
  }
1517
+
1246
1518
  offset0 += rowSize;
1247
1519
  }
1520
+
1248
1521
  break;
1522
+
1249
1523
  default:
1250
- throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
1524
+ throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
1251
1525
  }
1252
1526
  },
1253
1527
  onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {
@@ -1260,43 +1534,53 @@ var Jbig2Image = function Jbig2ImageClosure() {
1260
1534
  this.onImmediateGenericRegion.apply(this, arguments);
1261
1535
  },
1262
1536
  onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
1263
- var huffmanTables = void 0,
1264
- huffmanInput = void 0;
1537
+ var huffmanTables, huffmanInput;
1538
+
1265
1539
  if (dictionary.huffman) {
1266
1540
  huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
1267
1541
  huffmanInput = new Reader(data, start, end);
1268
1542
  }
1543
+
1269
1544
  var symbols = this.symbols;
1545
+
1270
1546
  if (!symbols) {
1271
1547
  this.symbols = symbols = {};
1272
1548
  }
1549
+
1273
1550
  var inputSymbols = [];
1551
+
1274
1552
  for (var i = 0, ii = referredSegments.length; i < ii; i++) {
1275
1553
  var referredSymbols = symbols[referredSegments[i]];
1554
+
1276
1555
  if (referredSymbols) {
1277
1556
  inputSymbols = inputSymbols.concat(referredSymbols);
1278
1557
  }
1279
1558
  }
1559
+
1280
1560
  var decodingContext = new DecodingContext(data, start, end);
1281
1561
  symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);
1282
1562
  },
1283
1563
  onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {
1284
1564
  var regionInfo = region.info;
1285
- var huffmanTables = void 0,
1286
- huffmanInput = void 0;
1565
+ var huffmanTables, huffmanInput;
1287
1566
  var symbols = this.symbols;
1288
1567
  var inputSymbols = [];
1568
+
1289
1569
  for (var i = 0, ii = referredSegments.length; i < ii; i++) {
1290
1570
  var referredSymbols = symbols[referredSegments[i]];
1571
+
1291
1572
  if (referredSymbols) {
1292
1573
  inputSymbols = inputSymbols.concat(referredSymbols);
1293
1574
  }
1294
1575
  }
1576
+
1295
1577
  var symbolCodeLength = (0, _util.log2)(inputSymbols.length);
1578
+
1296
1579
  if (region.huffman) {
1297
1580
  huffmanInput = new Reader(data, start, end);
1298
1581
  huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);
1299
1582
  }
1583
+
1300
1584
  var decodingContext = new DecodingContext(data, start, end);
1301
1585
  var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
1302
1586
  this.drawBitmap(regionInfo, bitmap);
@@ -1306,9 +1590,11 @@ var Jbig2Image = function Jbig2ImageClosure() {
1306
1590
  },
1307
1591
  onPatternDictionary: function onPatternDictionary(dictionary, currentSegment, data, start, end) {
1308
1592
  var patterns = this.patterns;
1593
+
1309
1594
  if (!patterns) {
1310
1595
  this.patterns = patterns = {};
1311
1596
  }
1597
+
1312
1598
  var decodingContext = new DecodingContext(data, start, end);
1313
1599
  patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
1314
1600
  },
@@ -1324,12 +1610,15 @@ var Jbig2Image = function Jbig2ImageClosure() {
1324
1610
  },
1325
1611
  onTables: function onTables(currentSegment, data, start, end) {
1326
1612
  var customTables = this.customTables;
1613
+
1327
1614
  if (!customTables) {
1328
1615
  this.customTables = customTables = {};
1329
1616
  }
1617
+
1330
1618
  customTables[currentSegment] = decodeTablesSegment(data, start, end);
1331
1619
  }
1332
1620
  };
1621
+
1333
1622
  function HuffmanLine(lineData) {
1334
1623
  if (lineData.length === 2) {
1335
1624
  this.isOOB = true;
@@ -1347,8 +1636,10 @@ var Jbig2Image = function Jbig2ImageClosure() {
1347
1636
  this.isLowerRange = lineData[4] === 'lower';
1348
1637
  }
1349
1638
  }
1639
+
1350
1640
  function HuffmanTreeNode(line) {
1351
1641
  this.children = [];
1642
+
1352
1643
  if (line) {
1353
1644
  this.isLeaf = true;
1354
1645
  this.rangeLength = line.rangeLength;
@@ -1359,16 +1650,20 @@ var Jbig2Image = function Jbig2ImageClosure() {
1359
1650
  this.isLeaf = false;
1360
1651
  }
1361
1652
  }
1653
+
1362
1654
  HuffmanTreeNode.prototype = {
1363
1655
  buildTree: function buildTree(line, shift) {
1364
1656
  var bit = line.prefixCode >> shift & 1;
1657
+
1365
1658
  if (shift <= 0) {
1366
1659
  this.children[bit] = new HuffmanTreeNode(line);
1367
1660
  } else {
1368
1661
  var node = this.children[bit];
1662
+
1369
1663
  if (!node) {
1370
1664
  this.children[bit] = node = new HuffmanTreeNode(null);
1371
1665
  }
1666
+
1372
1667
  node.buildTree(line, shift - 1);
1373
1668
  }
1374
1669
  },
@@ -1377,31 +1672,40 @@ var Jbig2Image = function Jbig2ImageClosure() {
1377
1672
  if (this.isOOB) {
1378
1673
  return null;
1379
1674
  }
1675
+
1380
1676
  var htOffset = reader.readBits(this.rangeLength);
1381
1677
  return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
1382
1678
  }
1679
+
1383
1680
  var node = this.children[reader.readBit()];
1681
+
1384
1682
  if (!node) {
1385
1683
  throw new Jbig2Error('invalid Huffman data');
1386
1684
  }
1685
+
1387
1686
  return node.decodeNode(reader);
1388
1687
  }
1389
1688
  };
1689
+
1390
1690
  function HuffmanTable(lines, prefixCodesDone) {
1391
1691
  if (!prefixCodesDone) {
1392
1692
  this.assignPrefixCodes(lines);
1393
1693
  }
1694
+
1394
1695
  this.rootNode = new HuffmanTreeNode(null);
1395
- var i = void 0,
1696
+ var i,
1396
1697
  ii = lines.length,
1397
- line = void 0;
1698
+ line;
1699
+
1398
1700
  for (i = 0; i < ii; i++) {
1399
1701
  line = lines[i];
1702
+
1400
1703
  if (line.prefixLength > 0) {
1401
1704
  this.rootNode.buildTree(line, line.prefixLength - 1);
1402
1705
  }
1403
1706
  }
1404
1707
  }
1708
+
1405
1709
  HuffmanTable.prototype = {
1406
1710
  decode: function decode(reader) {
1407
1711
  return this.rootNode.decodeNode(reader);
@@ -1409,36 +1713,46 @@ var Jbig2Image = function Jbig2ImageClosure() {
1409
1713
  assignPrefixCodes: function assignPrefixCodes(lines) {
1410
1714
  var linesLength = lines.length,
1411
1715
  prefixLengthMax = 0,
1412
- i = void 0;
1716
+ i;
1717
+
1413
1718
  for (i = 0; i < linesLength; i++) {
1414
1719
  prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
1415
1720
  }
1721
+
1416
1722
  var histogram = new Uint32Array(prefixLengthMax + 1);
1723
+
1417
1724
  for (i = 0; i < linesLength; i++) {
1418
1725
  histogram[lines[i].prefixLength]++;
1419
1726
  }
1727
+
1420
1728
  var currentLength = 1,
1421
1729
  firstCode = 0,
1422
- currentCode = void 0,
1423
- currentTemp = void 0,
1424
- line = void 0;
1730
+ currentCode,
1731
+ currentTemp,
1732
+ line;
1425
1733
  histogram[0] = 0;
1734
+
1426
1735
  while (currentLength <= prefixLengthMax) {
1427
1736
  firstCode = firstCode + histogram[currentLength - 1] << 1;
1428
1737
  currentCode = firstCode;
1429
1738
  currentTemp = 0;
1739
+
1430
1740
  while (currentTemp < linesLength) {
1431
1741
  line = lines[currentTemp];
1742
+
1432
1743
  if (line.prefixLength === currentLength) {
1433
1744
  line.prefixCode = currentCode;
1434
1745
  currentCode++;
1435
1746
  }
1747
+
1436
1748
  currentTemp++;
1437
1749
  }
1750
+
1438
1751
  currentLength++;
1439
1752
  }
1440
1753
  }
1441
1754
  };
1755
+
1442
1756
  function decodeTablesSegment(data, start, end) {
1443
1757
  var flags = data[start];
1444
1758
  var lowestValue = (0, _util.readUint32)(data, start + 1) & 0xFFFFFFFF;
@@ -1447,90 +1761,118 @@ var Jbig2Image = function Jbig2ImageClosure() {
1447
1761
  var prefixSizeBits = (flags >> 1 & 7) + 1;
1448
1762
  var rangeSizeBits = (flags >> 4 & 7) + 1;
1449
1763
  var lines = [];
1450
- var prefixLength = void 0,
1451
- rangeLength = void 0,
1764
+ var prefixLength,
1765
+ rangeLength,
1452
1766
  currentRangeLow = lowestValue;
1767
+
1453
1768
  do {
1454
1769
  prefixLength = reader.readBits(prefixSizeBits);
1455
1770
  rangeLength = reader.readBits(rangeSizeBits);
1456
1771
  lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
1457
1772
  currentRangeLow += 1 << rangeLength;
1458
1773
  } while (currentRangeLow < highestValue);
1774
+
1459
1775
  prefixLength = reader.readBits(prefixSizeBits);
1460
1776
  lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, 'lower']));
1461
1777
  prefixLength = reader.readBits(prefixSizeBits);
1462
1778
  lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
1779
+
1463
1780
  if (flags & 1) {
1464
1781
  prefixLength = reader.readBits(prefixSizeBits);
1465
1782
  lines.push(new HuffmanLine([prefixLength, 0]));
1466
1783
  }
1784
+
1467
1785
  return new HuffmanTable(lines, false);
1468
1786
  }
1787
+
1469
1788
  var standardTablesCache = {};
1789
+
1470
1790
  function getStandardTable(number) {
1471
1791
  var table = standardTablesCache[number];
1792
+
1472
1793
  if (table) {
1473
1794
  return table;
1474
1795
  }
1475
- var lines = void 0;
1796
+
1797
+ var lines;
1798
+
1476
1799
  switch (number) {
1477
1800
  case 1:
1478
1801
  lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
1479
1802
  break;
1803
+
1480
1804
  case 2:
1481
1805
  lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [75, 6, 32, 0x3E], [6, 0x3F]];
1482
1806
  break;
1807
+
1483
1808
  case 3:
1484
1809
  lines = [[-256, 8, 8, 0xFE], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [-257, 8, 32, 0xFF, 'lower'], [75, 7, 32, 0x7E], [6, 0x3E]];
1485
1810
  break;
1811
+
1486
1812
  case 4:
1487
1813
  lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [76, 5, 32, 0x1F]];
1488
1814
  break;
1815
+
1489
1816
  case 5:
1490
1817
  lines = [[-255, 7, 8, 0x7E], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [-256, 7, 32, 0x7F, 'lower'], [76, 6, 32, 0x3E]];
1491
1818
  break;
1819
+
1492
1820
  case 6:
1493
1821
  lines = [[-2048, 5, 10, 0x1C], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xA], [-128, 5, 6, 0x1D], [-64, 5, 5, 0x1E], [-32, 4, 5, 0xB], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xC], [1024, 4, 10, 0xD], [-2049, 6, 32, 0x3E, 'lower'], [2048, 6, 32, 0x3F]];
1494
1822
  break;
1823
+
1495
1824
  case 7:
1496
1825
  lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1A], [-64, 5, 5, 0x1B], [-32, 4, 5, 0xA], [0, 4, 5, 0xB], [32, 5, 5, 0x1C], [64, 5, 6, 0x1D], [128, 4, 7, 0xC], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1E, 'lower'], [2048, 5, 32, 0x1F]];
1497
1826
  break;
1827
+
1498
1828
  case 8:
1499
1829
  lines = [[-15, 8, 3, 0xFC], [-7, 9, 1, 0x1FC], [-5, 8, 1, 0xFD], [-3, 9, 0, 0x1FD], [-2, 7, 0, 0x7C], [-1, 4, 0, 0xA], [0, 2, 1, 0x0], [2, 5, 0, 0x1A], [3, 6, 0, 0x3A], [4, 3, 4, 0x4], [20, 6, 1, 0x3B], [22, 4, 4, 0xB], [38, 4, 5, 0xC], [70, 5, 6, 0x1B], [134, 5, 7, 0x1C], [262, 6, 7, 0x3C], [390, 7, 8, 0x7D], [646, 6, 10, 0x3D], [-16, 9, 32, 0x1FE, 'lower'], [1670, 9, 32, 0x1FF], [2, 0x1]];
1500
1830
  break;
1831
+
1501
1832
  case 9:
1502
1833
  lines = [[-31, 8, 4, 0xFC], [-15, 9, 2, 0x1FC], [-11, 8, 2, 0xFD], [-7, 9, 1, 0x1FD], [-5, 7, 1, 0x7C], [-3, 4, 1, 0xA], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1A], [5, 6, 1, 0x3A], [7, 3, 5, 0x4], [39, 6, 2, 0x3B], [43, 4, 5, 0xB], [75, 4, 6, 0xC], [139, 5, 7, 0x1B], [267, 5, 8, 0x1C], [523, 6, 8, 0x3C], [779, 7, 9, 0x7D], [1291, 6, 11, 0x3D], [-32, 9, 32, 0x1FE, 'lower'], [3339, 9, 32, 0x1FF], [2, 0x0]];
1503
1834
  break;
1835
+
1504
1836
  case 10:
1505
1837
  lines = [[-21, 7, 4, 0x7A], [-5, 8, 0, 0xFC], [-4, 7, 0, 0x7B], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7C], [5, 8, 0, 0xFD], [6, 2, 6, 0x1], [70, 5, 5, 0x1A], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3A], [582, 6, 9, 0x3B], [1094, 6, 10, 0x3C], [2118, 7, 11, 0x7D], [-22, 8, 32, 0xFE, 'lower'], [4166, 8, 32, 0xFF], [2, 0x2]];
1506
1838
  break;
1839
+
1507
1840
  case 11:
1508
1841
  lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xC], [5, 4, 1, 0xD], [7, 5, 1, 0x1C], [9, 5, 2, 0x1D], [13, 6, 2, 0x3C], [17, 7, 2, 0x7A], [21, 7, 3, 0x7B], [29, 7, 4, 0x7C], [45, 7, 5, 0x7D], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
1509
1842
  break;
1843
+
1510
1844
  case 12:
1511
1845
  lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1C], [6, 5, 1, 0x1D], [8, 6, 1, 0x3C], [10, 7, 0, 0x7A], [11, 7, 1, 0x7B], [13, 7, 2, 0x7C], [17, 7, 3, 0x7D], [25, 7, 4, 0x7E], [41, 8, 5, 0xFE], [73, 8, 32, 0xFF]];
1512
1846
  break;
1847
+
1513
1848
  case 13:
1514
1849
  lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xC], [4, 5, 0, 0x1C], [5, 4, 1, 0xD], [7, 3, 3, 0x5], [15, 6, 1, 0x3A], [17, 6, 2, 0x3B], [21, 6, 3, 0x3C], [29, 6, 4, 0x3D], [45, 6, 5, 0x3E], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
1515
1850
  break;
1851
+
1516
1852
  case 14:
1517
1853
  lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
1518
1854
  break;
1855
+
1519
1856
  case 15:
1520
1857
  lines = [[-24, 7, 4, 0x7C], [-8, 6, 2, 0x3C], [-4, 5, 1, 0x1C], [-2, 4, 0, 0xC], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xD], [3, 5, 1, 0x1D], [5, 6, 2, 0x3D], [9, 7, 4, 0x7D], [-25, 7, 32, 0x7E, 'lower'], [25, 7, 32, 0x7F]];
1521
1858
  break;
1859
+
1522
1860
  default:
1523
- throw new Jbig2Error('standard table B.' + number + ' does not exist');
1861
+ throw new Jbig2Error("standard table B.".concat(number, " does not exist"));
1524
1862
  }
1863
+
1525
1864
  var length = lines.length,
1526
- i = void 0;
1865
+ i;
1866
+
1527
1867
  for (i = 0; i < length; i++) {
1528
1868
  lines[i] = new HuffmanLine(lines[i]);
1529
1869
  }
1870
+
1530
1871
  table = new HuffmanTable(lines, true);
1531
1872
  standardTablesCache[number] = table;
1532
1873
  return table;
1533
1874
  }
1875
+
1534
1876
  function Reader(data, start, end) {
1535
1877
  this.data = data;
1536
1878
  this.start = start;
@@ -1539,25 +1881,30 @@ var Jbig2Image = function Jbig2ImageClosure() {
1539
1881
  this.shift = -1;
1540
1882
  this.currentByte = 0;
1541
1883
  }
1884
+
1542
1885
  Reader.prototype = {
1543
1886
  readBit: function readBit() {
1544
1887
  if (this.shift < 0) {
1545
1888
  if (this.position >= this.end) {
1546
1889
  throw new Jbig2Error('end of data while reading bit');
1547
1890
  }
1891
+
1548
1892
  this.currentByte = this.data[this.position++];
1549
1893
  this.shift = 7;
1550
1894
  }
1895
+
1551
1896
  var bit = this.currentByte >> this.shift & 1;
1552
1897
  this.shift--;
1553
1898
  return bit;
1554
1899
  },
1555
1900
  readBits: function readBits(numBits) {
1556
1901
  var result = 0,
1557
- i = void 0;
1902
+ i;
1903
+
1558
1904
  for (i = numBits - 1; i >= 0; i--) {
1559
1905
  result |= this.readBit() << i;
1560
1906
  }
1907
+
1561
1908
  return result;
1562
1909
  },
1563
1910
  byteAlign: function byteAlign() {
@@ -1567,60 +1914,77 @@ var Jbig2Image = function Jbig2ImageClosure() {
1567
1914
  if (this.position >= this.end) {
1568
1915
  return -1;
1569
1916
  }
1917
+
1570
1918
  return this.data[this.position++];
1571
1919
  }
1572
1920
  };
1921
+
1573
1922
  function getCustomHuffmanTable(index, referredTo, customTables) {
1574
1923
  var currentIndex = 0,
1575
- i = void 0,
1924
+ i,
1576
1925
  ii = referredTo.length,
1577
- table = void 0;
1926
+ table;
1927
+
1578
1928
  for (i = 0; i < ii; i++) {
1579
1929
  table = customTables[referredTo[i]];
1930
+
1580
1931
  if (table) {
1581
1932
  if (index === currentIndex) {
1582
1933
  return table;
1583
1934
  }
1935
+
1584
1936
  currentIndex++;
1585
1937
  }
1586
1938
  }
1939
+
1587
1940
  throw new Jbig2Error('can\'t find custom Huffman table');
1588
1941
  }
1942
+
1589
1943
  function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
1590
1944
  var codes = [],
1591
- i = void 0,
1592
- codeLength = void 0;
1945
+ i,
1946
+ codeLength;
1947
+
1593
1948
  for (i = 0; i <= 34; i++) {
1594
1949
  codeLength = reader.readBits(4);
1595
1950
  codes.push(new HuffmanLine([i, codeLength, 0, 0]));
1596
1951
  }
1952
+
1597
1953
  var runCodesTable = new HuffmanTable(codes, false);
1598
1954
  codes.length = 0;
1955
+
1599
1956
  for (i = 0; i < numberOfSymbols;) {
1600
1957
  codeLength = runCodesTable.decode(reader);
1958
+
1601
1959
  if (codeLength >= 32) {
1602
1960
  var repeatedLength = void 0,
1603
1961
  numberOfRepeats = void 0,
1604
1962
  j = void 0;
1963
+
1605
1964
  switch (codeLength) {
1606
1965
  case 32:
1607
1966
  if (i === 0) {
1608
1967
  throw new Jbig2Error('no previous value in symbol ID table');
1609
1968
  }
1969
+
1610
1970
  numberOfRepeats = reader.readBits(2) + 3;
1611
1971
  repeatedLength = codes[i - 1].prefixLength;
1612
1972
  break;
1973
+
1613
1974
  case 33:
1614
1975
  numberOfRepeats = reader.readBits(3) + 3;
1615
1976
  repeatedLength = 0;
1616
1977
  break;
1978
+
1617
1979
  case 34:
1618
1980
  numberOfRepeats = reader.readBits(7) + 11;
1619
1981
  repeatedLength = 0;
1620
1982
  break;
1983
+
1621
1984
  default:
1622
1985
  throw new Jbig2Error('invalid code length in symbol ID table');
1623
1986
  }
1987
+
1624
1988
  for (j = 0; j < numberOfRepeats; j++) {
1625
1989
  codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
1626
1990
  i++;
@@ -1630,53 +1994,65 @@ var Jbig2Image = function Jbig2ImageClosure() {
1630
1994
  i++;
1631
1995
  }
1632
1996
  }
1997
+
1633
1998
  reader.byteAlign();
1634
1999
  var symbolIDTable = new HuffmanTable(codes, false);
1635
2000
  var customIndex = 0,
1636
- tableFirstS = void 0,
1637
- tableDeltaS = void 0,
1638
- tableDeltaT = void 0;
2001
+ tableFirstS,
2002
+ tableDeltaS,
2003
+ tableDeltaT;
2004
+
1639
2005
  switch (textRegion.huffmanFS) {
1640
2006
  case 0:
1641
2007
  case 1:
1642
2008
  tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
1643
2009
  break;
2010
+
1644
2011
  case 3:
1645
2012
  tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
1646
2013
  customIndex++;
1647
2014
  break;
2015
+
1648
2016
  default:
1649
2017
  throw new Jbig2Error('invalid Huffman FS selector');
1650
2018
  }
2019
+
1651
2020
  switch (textRegion.huffmanDS) {
1652
2021
  case 0:
1653
2022
  case 1:
1654
2023
  case 2:
1655
2024
  tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
1656
2025
  break;
2026
+
1657
2027
  case 3:
1658
2028
  tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
1659
2029
  customIndex++;
1660
2030
  break;
2031
+
1661
2032
  default:
1662
2033
  throw new Jbig2Error('invalid Huffman DS selector');
1663
2034
  }
2035
+
1664
2036
  switch (textRegion.huffmanDT) {
1665
2037
  case 0:
1666
2038
  case 1:
1667
2039
  case 2:
1668
2040
  tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
1669
2041
  break;
2042
+
1670
2043
  case 3:
1671
2044
  tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
1672
2045
  customIndex++;
1673
2046
  break;
2047
+
1674
2048
  default:
1675
2049
  throw new Jbig2Error('invalid Huffman DT selector');
1676
2050
  }
2051
+
1677
2052
  if (textRegion.refinement) {
1678
2053
  throw new Jbig2Error('refinement with Huffman is not supported');
1679
2054
  }
2055
+
1680
2056
  return {
1681
2057
  symbolIDTable: symbolIDTable,
1682
2058
  tableFirstS: tableFirstS,
@@ -1684,47 +2060,57 @@ var Jbig2Image = function Jbig2ImageClosure() {
1684
2060
  tableDeltaT: tableDeltaT
1685
2061
  };
1686
2062
  }
2063
+
1687
2064
  function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
1688
2065
  var customIndex = 0,
1689
- tableDeltaHeight = void 0,
1690
- tableDeltaWidth = void 0;
2066
+ tableDeltaHeight,
2067
+ tableDeltaWidth;
2068
+
1691
2069
  switch (dictionary.huffmanDHSelector) {
1692
2070
  case 0:
1693
2071
  case 1:
1694
2072
  tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
1695
2073
  break;
2074
+
1696
2075
  case 3:
1697
2076
  tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
1698
2077
  customIndex++;
1699
2078
  break;
2079
+
1700
2080
  default:
1701
2081
  throw new Jbig2Error('invalid Huffman DH selector');
1702
2082
  }
2083
+
1703
2084
  switch (dictionary.huffmanDWSelector) {
1704
2085
  case 0:
1705
2086
  case 1:
1706
2087
  tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
1707
2088
  break;
2089
+
1708
2090
  case 3:
1709
2091
  tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
1710
2092
  customIndex++;
1711
2093
  break;
2094
+
1712
2095
  default:
1713
2096
  throw new Jbig2Error('invalid Huffman DW selector');
1714
2097
  }
1715
- var tableBitmapSize = void 0,
1716
- tableAggregateInstances = void 0;
2098
+
2099
+ var tableBitmapSize, tableAggregateInstances;
2100
+
1717
2101
  if (dictionary.bitmapSizeSelector) {
1718
2102
  tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
1719
2103
  customIndex++;
1720
2104
  } else {
1721
2105
  tableBitmapSize = getStandardTable(1);
1722
2106
  }
2107
+
1723
2108
  if (dictionary.aggregationInstancesSelector) {
1724
2109
  tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
1725
2110
  } else {
1726
2111
  tableAggregateInstances = getStandardTable(1);
1727
2112
  }
2113
+
1728
2114
  return {
1729
2115
  tableDeltaHeight: tableDeltaHeight,
1730
2116
  tableDeltaWidth: tableDeltaWidth,
@@ -1732,21 +2118,27 @@ var Jbig2Image = function Jbig2ImageClosure() {
1732
2118
  tableAggregateInstances: tableAggregateInstances
1733
2119
  };
1734
2120
  }
2121
+
1735
2122
  function readUncompressedBitmap(reader, width, height) {
1736
2123
  var bitmap = [],
1737
- x = void 0,
1738
- y = void 0,
1739
- row = void 0;
2124
+ x,
2125
+ y,
2126
+ row;
2127
+
1740
2128
  for (y = 0; y < height; y++) {
1741
2129
  row = new Uint8Array(width);
1742
2130
  bitmap.push(row);
2131
+
1743
2132
  for (x = 0; x < width; x++) {
1744
2133
  row[x] = reader.readBit();
1745
2134
  }
2135
+
1746
2136
  reader.byteAlign();
1747
2137
  }
2138
+
1748
2139
  return bitmap;
1749
2140
  }
2141
+
1750
2142
  function decodeMMRBitmap(input, width, height, endOfBlock) {
1751
2143
  var params = {
1752
2144
  K: -1,
@@ -1757,45 +2149,66 @@ var Jbig2Image = function Jbig2ImageClosure() {
1757
2149
  };
1758
2150
  var decoder = new _ccitt.CCITTFaxDecoder(input, params);
1759
2151
  var bitmap = [],
1760
- x = void 0,
1761
- y = void 0,
1762
- row = void 0,
1763
- currentByte = void 0,
1764
- shift = void 0,
2152
+ x,
2153
+ y,
2154
+ row,
2155
+ currentByte,
2156
+ shift,
1765
2157
  eof = false;
2158
+
1766
2159
  for (y = 0; y < height; y++) {
1767
2160
  row = new Uint8Array(width);
1768
2161
  bitmap.push(row);
1769
2162
  shift = -1;
2163
+
1770
2164
  for (x = 0; x < width; x++) {
1771
2165
  if (shift < 0) {
1772
2166
  currentByte = decoder.readNextChar();
2167
+
1773
2168
  if (currentByte === -1) {
1774
2169
  currentByte = 0;
1775
2170
  eof = true;
1776
2171
  }
2172
+
1777
2173
  shift = 7;
1778
2174
  }
2175
+
1779
2176
  row[x] = currentByte >> shift & 1;
1780
2177
  shift--;
1781
2178
  }
1782
2179
  }
2180
+
1783
2181
  if (endOfBlock && !eof) {
1784
2182
  var lookForEOFLimit = 5;
2183
+
1785
2184
  for (var i = 0; i < lookForEOFLimit; i++) {
1786
2185
  if (decoder.readNextChar() === -1) {
1787
2186
  break;
1788
2187
  }
1789
2188
  }
1790
2189
  }
2190
+
1791
2191
  return bitmap;
1792
2192
  }
2193
+
1793
2194
  function Jbig2Image() {}
2195
+
1794
2196
  Jbig2Image.prototype = {
1795
- parseChunks: function Jbig2Image_parseChunks(chunks) {
2197
+ parseChunks: function parseChunks(chunks) {
1796
2198
  return parseJbig2Chunks(chunks);
2199
+ },
2200
+ parse: function parse(data) {
2201
+ var _parseJbig = parseJbig2(data),
2202
+ imgData = _parseJbig.imgData,
2203
+ width = _parseJbig.width,
2204
+ height = _parseJbig.height;
2205
+
2206
+ this.width = width;
2207
+ this.height = height;
2208
+ return imgData;
1797
2209
  }
1798
2210
  };
1799
2211
  return Jbig2Image;
1800
2212
  }();
2213
+
1801
2214
  exports.Jbig2Image = Jbig2Image;