pdfjs-dist 2.0.943 → 2.1.266
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/bower.json +1 -1
- package/build/pdf.js +15329 -11095
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +12497 -4184
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/image_decoders/pdf.image_decoders.js +3438 -1209
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +1 -1
- package/lib/core/annotation.js +335 -109
- package/lib/core/arithmetic_decoder.js +274 -244
- package/lib/core/bidi.js +64 -5
- package/lib/core/ccitt.js +172 -17
- package/lib/core/ccitt_stream.js +14 -5
- package/lib/core/cff_parser.js +304 -28
- package/lib/core/charsets.js +4 -3
- package/lib/core/chunked_stream.js +379 -149
- package/lib/core/cmap.js +210 -40
- package/lib/core/colorspace.js +332 -187
- package/lib/core/crypto.js +289 -44
- package/lib/core/document.js +508 -249
- package/lib/core/encodings.js +18 -9
- package/lib/core/evaluator.js +657 -119
- package/lib/core/font_renderer.js +217 -34
- package/lib/core/fonts.js +632 -41
- package/lib/core/function.js +252 -26
- package/lib/core/glyphlist.js +2 -1
- package/lib/core/image.js +124 -27
- package/lib/core/jbig2.js +425 -65
- package/lib/core/jbig2_stream.js +18 -7
- package/lib/core/jpeg_stream.js +24 -8
- package/lib/core/jpg.js +208 -16
- package/lib/core/jpx.js +395 -5
- package/lib/core/jpx_stream.js +17 -5
- package/lib/core/metrics.js +3 -3
- package/lib/core/murmurhash3.js +23 -5
- package/lib/core/obj.js +625 -132
- package/lib/core/operator_list.js +104 -3
- package/lib/core/parser.js +262 -25
- package/lib/core/pattern.js +144 -12
- package/lib/core/pdf_manager.js +104 -70
- package/lib/core/primitives.js +74 -21
- package/lib/core/ps_parser.js +133 -44
- package/lib/core/standard_fonts.js +9 -9
- package/lib/core/stream.js +283 -31
- package/lib/core/type1_parser.js +138 -6
- package/lib/core/unicode.js +28 -1
- package/lib/core/worker.js +192 -57
- package/lib/display/annotation_layer.js +303 -123
- package/lib/display/api.js +1073 -574
- package/lib/display/api_compatibility.js +4 -1
- package/lib/display/canvas.js +314 -18
- package/lib/display/content_disposition.js +70 -23
- package/lib/display/dom_utils.js +112 -59
- package/lib/display/fetch_stream.js +95 -50
- package/lib/display/font_loader.js +250 -132
- package/lib/display/metadata.js +37 -15
- package/lib/display/network.js +123 -34
- package/lib/display/network_utils.js +23 -10
- package/lib/display/node_stream.js +162 -65
- package/lib/display/pattern_helper.js +57 -6
- package/lib/display/svg.js +194 -18
- package/lib/display/text_layer.js +128 -14
- package/lib/display/transport_stream.js +83 -27
- package/lib/display/webgl.js +63 -17
- package/lib/display/worker_options.js +4 -3
- package/lib/display/xml_parser.js +162 -52
- package/lib/examples/node/domstubs.js +56 -3
- package/lib/pdf.js +15 -2
- package/lib/pdf.worker.js +4 -2
- package/lib/shared/compatibility.js +129 -26
- package/lib/shared/global_scope.js +1 -1
- package/lib/shared/is_node.js +3 -3
- package/lib/shared/message_handler.js +103 -45
- package/lib/shared/streams_polyfill.js +20 -16
- package/lib/shared/url_polyfill.js +8 -2
- package/lib/shared/util.js +246 -84
- package/lib/test/unit/annotation_spec.js +99 -73
- package/lib/test/unit/api_spec.js +347 -113
- package/lib/test/unit/bidi_spec.js +6 -6
- package/lib/test/unit/cff_parser_spec.js +17 -5
- package/lib/test/unit/clitests_helper.js +7 -8
- package/lib/test/unit/cmap_spec.js +79 -25
- package/lib/test/unit/colorspace_spec.js +65 -18
- package/lib/test/unit/crypto_spec.js +16 -4
- package/lib/test/unit/custom_spec.js +40 -52
- package/lib/test/unit/display_svg_spec.js +32 -16
- package/lib/test/unit/document_spec.js +2 -2
- package/lib/test/unit/dom_utils_spec.js +8 -8
- package/lib/test/unit/encodings_spec.js +24 -44
- package/lib/test/unit/evaluator_spec.js +15 -8
- package/lib/test/unit/function_spec.js +16 -4
- package/lib/test/unit/jasmine-boot.js +29 -16
- package/lib/test/unit/message_handler_spec.js +19 -6
- package/lib/test/unit/metadata_spec.js +64 -11
- package/lib/test/unit/murmurhash3_spec.js +2 -2
- package/lib/test/unit/network_spec.js +19 -4
- package/lib/test/unit/network_utils_spec.js +6 -4
- package/lib/test/unit/node_stream_spec.js +50 -26
- package/lib/test/unit/parser_spec.js +13 -29
- package/lib/test/unit/pdf_find_controller_spec.js +144 -32
- package/lib/test/unit/pdf_find_utils_spec.js +10 -9
- package/lib/test/unit/pdf_history_spec.js +20 -8
- package/lib/test/unit/primitives_spec.js +23 -3
- package/lib/test/unit/stream_spec.js +8 -3
- package/lib/test/unit/test_utils.js +89 -26
- package/lib/test/unit/testreporter.js +19 -1
- package/lib/test/unit/type1_parser_spec.js +7 -5
- package/lib/test/unit/ui_utils_spec.js +162 -38
- package/lib/test/unit/unicode_spec.js +13 -10
- package/lib/test/unit/util_spec.js +89 -9
- package/lib/web/annotation_layer_builder.js +38 -21
- package/lib/web/app.js +610 -245
- package/lib/web/app_options.js +54 -34
- package/lib/web/base_viewer.js +359 -162
- package/lib/web/chromecom.js +159 -80
- package/lib/web/debugger.js +161 -17
- package/lib/web/download_manager.js +29 -11
- package/lib/web/firefox_print_service.js +16 -8
- package/lib/web/firefoxcom.js +127 -91
- package/lib/web/genericcom.js +50 -31
- package/lib/web/genericl10n.js +46 -34
- package/lib/web/grab_to_pan.js +25 -3
- package/lib/web/interfaces.js +108 -61
- package/lib/web/overlay_manager.js +67 -45
- package/lib/web/password_prompt.js +20 -12
- package/lib/web/pdf_attachment_viewer.js +37 -17
- package/lib/web/pdf_cursor_tools.js +38 -15
- package/lib/web/pdf_document_properties.js +65 -24
- package/lib/web/pdf_find_bar.js +48 -20
- package/lib/web/pdf_find_controller.js +290 -89
- package/lib/web/pdf_find_utils.js +19 -3
- package/lib/web/pdf_history.js +186 -49
- package/lib/web/pdf_link_service.js +127 -52
- package/lib/web/pdf_outline_viewer.js +71 -21
- package/lib/web/pdf_page_view.js +188 -63
- package/lib/web/pdf_presentation_mode.js +98 -33
- package/lib/web/pdf_print_service.js +54 -10
- package/lib/web/pdf_rendering_queue.js +26 -4
- package/lib/web/pdf_sidebar.js +116 -62
- package/lib/web/pdf_sidebar_resizer.js +41 -15
- package/lib/web/pdf_single_page_viewer.js +65 -68
- package/lib/web/pdf_thumbnail_view.js +102 -31
- package/lib/web/pdf_thumbnail_viewer.js +62 -22
- package/lib/web/pdf_viewer.component.js +111 -31
- package/lib/web/pdf_viewer.js +80 -60
- package/lib/web/preferences.js +61 -39
- package/lib/web/secondary_toolbar.js +101 -82
- package/lib/web/text_layer_builder.js +124 -69
- package/lib/web/toolbar.js +67 -27
- package/lib/web/ui_utils.js +284 -128
- package/lib/web/view_history.js +75 -51
- package/lib/web/viewer_compatibility.js +2 -1
- package/package.json +1 -1
- package/web/pdf_viewer.css +1 -1
- package/web/pdf_viewer.js +2200 -973
- package/web/pdf_viewer.js.map +1 -1
- package/lib/web/dom_events.js +0 -140
package/lib/core/jbig2.js
CHANGED
@@ -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
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
24
|
Object.defineProperty(exports, "__esModule", {
|
25
25
|
value: true
|
26
26
|
});
|
27
|
-
exports.Jbig2Image =
|
27
|
+
exports.Jbig2Image = void 0;
|
28
28
|
|
29
|
-
var _util = require(
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
var _arithmetic_decoder = require(
|
31
|
+
var _arithmetic_decoder = require("./arithmetic_decoder");
|
32
32
|
|
33
|
-
var _ccitt = require(
|
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
|
507
|
-
|
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(
|
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(
|
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
|
740
|
-
xMin
|
741
|
-
xMax
|
742
|
-
y
|
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
|
765
|
-
|
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
|
804
|
-
bitmap
|
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
|
-
|
817
|
-
|
818
|
-
|
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,93 +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(
|
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
|
+
|
1191
1398
|
function parseJbig2(data) {
|
1192
1399
|
var position = 0,
|
1193
1400
|
end = data.length;
|
1401
|
+
|
1194
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) {
|
1195
1403
|
throw new Jbig2Error('parseJbig2 - invalid header.');
|
1196
1404
|
}
|
1405
|
+
|
1197
1406
|
var header = Object.create(null);
|
1198
1407
|
position += 8;
|
1199
1408
|
var flags = data[position++];
|
1200
1409
|
header.randomAccess = !(flags & 1);
|
1410
|
+
|
1201
1411
|
if (!(flags & 2)) {
|
1202
1412
|
header.numberOfPages = (0, _util.readUint32)(data, position);
|
1203
1413
|
position += 4;
|
1204
1414
|
}
|
1415
|
+
|
1205
1416
|
var segments = readSegments(header, data, position, end);
|
1206
1417
|
var visitor = new SimpleSegmentVisitor();
|
1207
1418
|
processSegments(segments, visitor);
|
1208
1419
|
var _visitor$currentPageI = visitor.currentPageInfo,
|
1209
1420
|
width = _visitor$currentPageI.width,
|
1210
1421
|
height = _visitor$currentPageI.height;
|
1211
|
-
|
1212
1422
|
var bitPacked = visitor.buffer;
|
1213
1423
|
var imgData = new Uint8ClampedArray(width * height);
|
1214
1424
|
var q = 0,
|
1215
1425
|
k = 0;
|
1426
|
+
|
1216
1427
|
for (var i = 0; i < height; i++) {
|
1217
1428
|
var mask = 0,
|
1218
1429
|
buffer = void 0;
|
1430
|
+
|
1219
1431
|
for (var j = 0; j < width; j++) {
|
1220
1432
|
if (!mask) {
|
1221
1433
|
mask = 128;
|
1222
1434
|
buffer = bitPacked[k++];
|
1223
1435
|
}
|
1436
|
+
|
1224
1437
|
imgData[q++] = buffer & mask ? 0 : 255;
|
1225
1438
|
mask >>= 1;
|
1226
1439
|
}
|
1227
1440
|
}
|
1441
|
+
|
1228
1442
|
return {
|
1229
1443
|
imgData: imgData,
|
1230
1444
|
width: width,
|
1231
1445
|
height: height
|
1232
1446
|
};
|
1233
1447
|
}
|
1448
|
+
|
1234
1449
|
function SimpleSegmentVisitor() {}
|
1450
|
+
|
1235
1451
|
SimpleSegmentVisitor.prototype = {
|
1236
1452
|
onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
|
1237
1453
|
this.currentPageInfo = info;
|
1238
1454
|
var rowSize = info.width + 7 >> 3;
|
1239
1455
|
var buffer = new Uint8ClampedArray(rowSize * info.height);
|
1456
|
+
|
1240
1457
|
if (info.defaultPixelValue) {
|
1241
1458
|
for (var i = 0, ii = buffer.length; i < ii; i++) {
|
1242
1459
|
buffer[i] = 0xFF;
|
1243
1460
|
}
|
1244
1461
|
}
|
1462
|
+
|
1245
1463
|
this.buffer = buffer;
|
1246
1464
|
},
|
1247
1465
|
drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
|
@@ -1254,43 +1472,56 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1254
1472
|
var mask0 = 128 >> (regionInfo.x & 7);
|
1255
1473
|
var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
|
1256
1474
|
var i, j, mask, offset;
|
1475
|
+
|
1257
1476
|
switch (combinationOperator) {
|
1258
1477
|
case 0:
|
1259
1478
|
for (i = 0; i < height; i++) {
|
1260
1479
|
mask = mask0;
|
1261
1480
|
offset = offset0;
|
1481
|
+
|
1262
1482
|
for (j = 0; j < width; j++) {
|
1263
1483
|
if (bitmap[i][j]) {
|
1264
1484
|
buffer[offset] |= mask;
|
1265
1485
|
}
|
1486
|
+
|
1266
1487
|
mask >>= 1;
|
1488
|
+
|
1267
1489
|
if (!mask) {
|
1268
1490
|
mask = 128;
|
1269
1491
|
offset++;
|
1270
1492
|
}
|
1271
1493
|
}
|
1494
|
+
|
1272
1495
|
offset0 += rowSize;
|
1273
1496
|
}
|
1497
|
+
|
1274
1498
|
break;
|
1499
|
+
|
1275
1500
|
case 2:
|
1276
1501
|
for (i = 0; i < height; i++) {
|
1277
1502
|
mask = mask0;
|
1278
1503
|
offset = offset0;
|
1504
|
+
|
1279
1505
|
for (j = 0; j < width; j++) {
|
1280
1506
|
if (bitmap[i][j]) {
|
1281
1507
|
buffer[offset] ^= mask;
|
1282
1508
|
}
|
1509
|
+
|
1283
1510
|
mask >>= 1;
|
1511
|
+
|
1284
1512
|
if (!mask) {
|
1285
1513
|
mask = 128;
|
1286
1514
|
offset++;
|
1287
1515
|
}
|
1288
1516
|
}
|
1517
|
+
|
1289
1518
|
offset0 += rowSize;
|
1290
1519
|
}
|
1520
|
+
|
1291
1521
|
break;
|
1522
|
+
|
1292
1523
|
default:
|
1293
|
-
throw new Jbig2Error(
|
1524
|
+
throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
|
1294
1525
|
}
|
1295
1526
|
},
|
1296
1527
|
onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {
|
@@ -1303,43 +1534,53 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1303
1534
|
this.onImmediateGenericRegion.apply(this, arguments);
|
1304
1535
|
},
|
1305
1536
|
onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
|
1306
|
-
var huffmanTables
|
1307
|
-
|
1537
|
+
var huffmanTables, huffmanInput;
|
1538
|
+
|
1308
1539
|
if (dictionary.huffman) {
|
1309
1540
|
huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
|
1310
1541
|
huffmanInput = new Reader(data, start, end);
|
1311
1542
|
}
|
1543
|
+
|
1312
1544
|
var symbols = this.symbols;
|
1545
|
+
|
1313
1546
|
if (!symbols) {
|
1314
1547
|
this.symbols = symbols = {};
|
1315
1548
|
}
|
1549
|
+
|
1316
1550
|
var inputSymbols = [];
|
1551
|
+
|
1317
1552
|
for (var i = 0, ii = referredSegments.length; i < ii; i++) {
|
1318
1553
|
var referredSymbols = symbols[referredSegments[i]];
|
1554
|
+
|
1319
1555
|
if (referredSymbols) {
|
1320
1556
|
inputSymbols = inputSymbols.concat(referredSymbols);
|
1321
1557
|
}
|
1322
1558
|
}
|
1559
|
+
|
1323
1560
|
var decodingContext = new DecodingContext(data, start, end);
|
1324
1561
|
symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);
|
1325
1562
|
},
|
1326
1563
|
onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {
|
1327
1564
|
var regionInfo = region.info;
|
1328
|
-
var huffmanTables
|
1329
|
-
huffmanInput = void 0;
|
1565
|
+
var huffmanTables, huffmanInput;
|
1330
1566
|
var symbols = this.symbols;
|
1331
1567
|
var inputSymbols = [];
|
1568
|
+
|
1332
1569
|
for (var i = 0, ii = referredSegments.length; i < ii; i++) {
|
1333
1570
|
var referredSymbols = symbols[referredSegments[i]];
|
1571
|
+
|
1334
1572
|
if (referredSymbols) {
|
1335
1573
|
inputSymbols = inputSymbols.concat(referredSymbols);
|
1336
1574
|
}
|
1337
1575
|
}
|
1576
|
+
|
1338
1577
|
var symbolCodeLength = (0, _util.log2)(inputSymbols.length);
|
1578
|
+
|
1339
1579
|
if (region.huffman) {
|
1340
1580
|
huffmanInput = new Reader(data, start, end);
|
1341
1581
|
huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);
|
1342
1582
|
}
|
1583
|
+
|
1343
1584
|
var decodingContext = new DecodingContext(data, start, end);
|
1344
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);
|
1345
1586
|
this.drawBitmap(regionInfo, bitmap);
|
@@ -1349,9 +1590,11 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1349
1590
|
},
|
1350
1591
|
onPatternDictionary: function onPatternDictionary(dictionary, currentSegment, data, start, end) {
|
1351
1592
|
var patterns = this.patterns;
|
1593
|
+
|
1352
1594
|
if (!patterns) {
|
1353
1595
|
this.patterns = patterns = {};
|
1354
1596
|
}
|
1597
|
+
|
1355
1598
|
var decodingContext = new DecodingContext(data, start, end);
|
1356
1599
|
patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
|
1357
1600
|
},
|
@@ -1367,12 +1610,15 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1367
1610
|
},
|
1368
1611
|
onTables: function onTables(currentSegment, data, start, end) {
|
1369
1612
|
var customTables = this.customTables;
|
1613
|
+
|
1370
1614
|
if (!customTables) {
|
1371
1615
|
this.customTables = customTables = {};
|
1372
1616
|
}
|
1617
|
+
|
1373
1618
|
customTables[currentSegment] = decodeTablesSegment(data, start, end);
|
1374
1619
|
}
|
1375
1620
|
};
|
1621
|
+
|
1376
1622
|
function HuffmanLine(lineData) {
|
1377
1623
|
if (lineData.length === 2) {
|
1378
1624
|
this.isOOB = true;
|
@@ -1390,8 +1636,10 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1390
1636
|
this.isLowerRange = lineData[4] === 'lower';
|
1391
1637
|
}
|
1392
1638
|
}
|
1639
|
+
|
1393
1640
|
function HuffmanTreeNode(line) {
|
1394
1641
|
this.children = [];
|
1642
|
+
|
1395
1643
|
if (line) {
|
1396
1644
|
this.isLeaf = true;
|
1397
1645
|
this.rangeLength = line.rangeLength;
|
@@ -1402,16 +1650,20 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1402
1650
|
this.isLeaf = false;
|
1403
1651
|
}
|
1404
1652
|
}
|
1653
|
+
|
1405
1654
|
HuffmanTreeNode.prototype = {
|
1406
1655
|
buildTree: function buildTree(line, shift) {
|
1407
1656
|
var bit = line.prefixCode >> shift & 1;
|
1657
|
+
|
1408
1658
|
if (shift <= 0) {
|
1409
1659
|
this.children[bit] = new HuffmanTreeNode(line);
|
1410
1660
|
} else {
|
1411
1661
|
var node = this.children[bit];
|
1662
|
+
|
1412
1663
|
if (!node) {
|
1413
1664
|
this.children[bit] = node = new HuffmanTreeNode(null);
|
1414
1665
|
}
|
1666
|
+
|
1415
1667
|
node.buildTree(line, shift - 1);
|
1416
1668
|
}
|
1417
1669
|
},
|
@@ -1420,31 +1672,40 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1420
1672
|
if (this.isOOB) {
|
1421
1673
|
return null;
|
1422
1674
|
}
|
1675
|
+
|
1423
1676
|
var htOffset = reader.readBits(this.rangeLength);
|
1424
1677
|
return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
|
1425
1678
|
}
|
1679
|
+
|
1426
1680
|
var node = this.children[reader.readBit()];
|
1681
|
+
|
1427
1682
|
if (!node) {
|
1428
1683
|
throw new Jbig2Error('invalid Huffman data');
|
1429
1684
|
}
|
1685
|
+
|
1430
1686
|
return node.decodeNode(reader);
|
1431
1687
|
}
|
1432
1688
|
};
|
1689
|
+
|
1433
1690
|
function HuffmanTable(lines, prefixCodesDone) {
|
1434
1691
|
if (!prefixCodesDone) {
|
1435
1692
|
this.assignPrefixCodes(lines);
|
1436
1693
|
}
|
1694
|
+
|
1437
1695
|
this.rootNode = new HuffmanTreeNode(null);
|
1438
|
-
var i
|
1696
|
+
var i,
|
1439
1697
|
ii = lines.length,
|
1440
|
-
line
|
1698
|
+
line;
|
1699
|
+
|
1441
1700
|
for (i = 0; i < ii; i++) {
|
1442
1701
|
line = lines[i];
|
1702
|
+
|
1443
1703
|
if (line.prefixLength > 0) {
|
1444
1704
|
this.rootNode.buildTree(line, line.prefixLength - 1);
|
1445
1705
|
}
|
1446
1706
|
}
|
1447
1707
|
}
|
1708
|
+
|
1448
1709
|
HuffmanTable.prototype = {
|
1449
1710
|
decode: function decode(reader) {
|
1450
1711
|
return this.rootNode.decodeNode(reader);
|
@@ -1452,36 +1713,46 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1452
1713
|
assignPrefixCodes: function assignPrefixCodes(lines) {
|
1453
1714
|
var linesLength = lines.length,
|
1454
1715
|
prefixLengthMax = 0,
|
1455
|
-
i
|
1716
|
+
i;
|
1717
|
+
|
1456
1718
|
for (i = 0; i < linesLength; i++) {
|
1457
1719
|
prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
|
1458
1720
|
}
|
1721
|
+
|
1459
1722
|
var histogram = new Uint32Array(prefixLengthMax + 1);
|
1723
|
+
|
1460
1724
|
for (i = 0; i < linesLength; i++) {
|
1461
1725
|
histogram[lines[i].prefixLength]++;
|
1462
1726
|
}
|
1727
|
+
|
1463
1728
|
var currentLength = 1,
|
1464
1729
|
firstCode = 0,
|
1465
|
-
currentCode
|
1466
|
-
currentTemp
|
1467
|
-
line
|
1730
|
+
currentCode,
|
1731
|
+
currentTemp,
|
1732
|
+
line;
|
1468
1733
|
histogram[0] = 0;
|
1734
|
+
|
1469
1735
|
while (currentLength <= prefixLengthMax) {
|
1470
1736
|
firstCode = firstCode + histogram[currentLength - 1] << 1;
|
1471
1737
|
currentCode = firstCode;
|
1472
1738
|
currentTemp = 0;
|
1739
|
+
|
1473
1740
|
while (currentTemp < linesLength) {
|
1474
1741
|
line = lines[currentTemp];
|
1742
|
+
|
1475
1743
|
if (line.prefixLength === currentLength) {
|
1476
1744
|
line.prefixCode = currentCode;
|
1477
1745
|
currentCode++;
|
1478
1746
|
}
|
1747
|
+
|
1479
1748
|
currentTemp++;
|
1480
1749
|
}
|
1750
|
+
|
1481
1751
|
currentLength++;
|
1482
1752
|
}
|
1483
1753
|
}
|
1484
1754
|
};
|
1755
|
+
|
1485
1756
|
function decodeTablesSegment(data, start, end) {
|
1486
1757
|
var flags = data[start];
|
1487
1758
|
var lowestValue = (0, _util.readUint32)(data, start + 1) & 0xFFFFFFFF;
|
@@ -1490,90 +1761,118 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1490
1761
|
var prefixSizeBits = (flags >> 1 & 7) + 1;
|
1491
1762
|
var rangeSizeBits = (flags >> 4 & 7) + 1;
|
1492
1763
|
var lines = [];
|
1493
|
-
var prefixLength
|
1494
|
-
rangeLength
|
1764
|
+
var prefixLength,
|
1765
|
+
rangeLength,
|
1495
1766
|
currentRangeLow = lowestValue;
|
1767
|
+
|
1496
1768
|
do {
|
1497
1769
|
prefixLength = reader.readBits(prefixSizeBits);
|
1498
1770
|
rangeLength = reader.readBits(rangeSizeBits);
|
1499
1771
|
lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
|
1500
1772
|
currentRangeLow += 1 << rangeLength;
|
1501
1773
|
} while (currentRangeLow < highestValue);
|
1774
|
+
|
1502
1775
|
prefixLength = reader.readBits(prefixSizeBits);
|
1503
1776
|
lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, 'lower']));
|
1504
1777
|
prefixLength = reader.readBits(prefixSizeBits);
|
1505
1778
|
lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
|
1779
|
+
|
1506
1780
|
if (flags & 1) {
|
1507
1781
|
prefixLength = reader.readBits(prefixSizeBits);
|
1508
1782
|
lines.push(new HuffmanLine([prefixLength, 0]));
|
1509
1783
|
}
|
1784
|
+
|
1510
1785
|
return new HuffmanTable(lines, false);
|
1511
1786
|
}
|
1787
|
+
|
1512
1788
|
var standardTablesCache = {};
|
1789
|
+
|
1513
1790
|
function getStandardTable(number) {
|
1514
1791
|
var table = standardTablesCache[number];
|
1792
|
+
|
1515
1793
|
if (table) {
|
1516
1794
|
return table;
|
1517
1795
|
}
|
1518
|
-
|
1796
|
+
|
1797
|
+
var lines;
|
1798
|
+
|
1519
1799
|
switch (number) {
|
1520
1800
|
case 1:
|
1521
1801
|
lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
|
1522
1802
|
break;
|
1803
|
+
|
1523
1804
|
case 2:
|
1524
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]];
|
1525
1806
|
break;
|
1807
|
+
|
1526
1808
|
case 3:
|
1527
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]];
|
1528
1810
|
break;
|
1811
|
+
|
1529
1812
|
case 4:
|
1530
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]];
|
1531
1814
|
break;
|
1815
|
+
|
1532
1816
|
case 5:
|
1533
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]];
|
1534
1818
|
break;
|
1819
|
+
|
1535
1820
|
case 6:
|
1536
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]];
|
1537
1822
|
break;
|
1823
|
+
|
1538
1824
|
case 7:
|
1539
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]];
|
1540
1826
|
break;
|
1827
|
+
|
1541
1828
|
case 8:
|
1542
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]];
|
1543
1830
|
break;
|
1831
|
+
|
1544
1832
|
case 9:
|
1545
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]];
|
1546
1834
|
break;
|
1835
|
+
|
1547
1836
|
case 10:
|
1548
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]];
|
1549
1838
|
break;
|
1839
|
+
|
1550
1840
|
case 11:
|
1551
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]];
|
1552
1842
|
break;
|
1843
|
+
|
1553
1844
|
case 12:
|
1554
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]];
|
1555
1846
|
break;
|
1847
|
+
|
1556
1848
|
case 13:
|
1557
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]];
|
1558
1850
|
break;
|
1851
|
+
|
1559
1852
|
case 14:
|
1560
1853
|
lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
|
1561
1854
|
break;
|
1855
|
+
|
1562
1856
|
case 15:
|
1563
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]];
|
1564
1858
|
break;
|
1859
|
+
|
1565
1860
|
default:
|
1566
|
-
throw new Jbig2Error(
|
1861
|
+
throw new Jbig2Error("standard table B.".concat(number, " does not exist"));
|
1567
1862
|
}
|
1863
|
+
|
1568
1864
|
var length = lines.length,
|
1569
|
-
i
|
1865
|
+
i;
|
1866
|
+
|
1570
1867
|
for (i = 0; i < length; i++) {
|
1571
1868
|
lines[i] = new HuffmanLine(lines[i]);
|
1572
1869
|
}
|
1870
|
+
|
1573
1871
|
table = new HuffmanTable(lines, true);
|
1574
1872
|
standardTablesCache[number] = table;
|
1575
1873
|
return table;
|
1576
1874
|
}
|
1875
|
+
|
1577
1876
|
function Reader(data, start, end) {
|
1578
1877
|
this.data = data;
|
1579
1878
|
this.start = start;
|
@@ -1582,25 +1881,30 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1582
1881
|
this.shift = -1;
|
1583
1882
|
this.currentByte = 0;
|
1584
1883
|
}
|
1884
|
+
|
1585
1885
|
Reader.prototype = {
|
1586
1886
|
readBit: function readBit() {
|
1587
1887
|
if (this.shift < 0) {
|
1588
1888
|
if (this.position >= this.end) {
|
1589
1889
|
throw new Jbig2Error('end of data while reading bit');
|
1590
1890
|
}
|
1891
|
+
|
1591
1892
|
this.currentByte = this.data[this.position++];
|
1592
1893
|
this.shift = 7;
|
1593
1894
|
}
|
1895
|
+
|
1594
1896
|
var bit = this.currentByte >> this.shift & 1;
|
1595
1897
|
this.shift--;
|
1596
1898
|
return bit;
|
1597
1899
|
},
|
1598
1900
|
readBits: function readBits(numBits) {
|
1599
1901
|
var result = 0,
|
1600
|
-
i
|
1902
|
+
i;
|
1903
|
+
|
1601
1904
|
for (i = numBits - 1; i >= 0; i--) {
|
1602
1905
|
result |= this.readBit() << i;
|
1603
1906
|
}
|
1907
|
+
|
1604
1908
|
return result;
|
1605
1909
|
},
|
1606
1910
|
byteAlign: function byteAlign() {
|
@@ -1610,60 +1914,77 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1610
1914
|
if (this.position >= this.end) {
|
1611
1915
|
return -1;
|
1612
1916
|
}
|
1917
|
+
|
1613
1918
|
return this.data[this.position++];
|
1614
1919
|
}
|
1615
1920
|
};
|
1921
|
+
|
1616
1922
|
function getCustomHuffmanTable(index, referredTo, customTables) {
|
1617
1923
|
var currentIndex = 0,
|
1618
|
-
i
|
1924
|
+
i,
|
1619
1925
|
ii = referredTo.length,
|
1620
|
-
table
|
1926
|
+
table;
|
1927
|
+
|
1621
1928
|
for (i = 0; i < ii; i++) {
|
1622
1929
|
table = customTables[referredTo[i]];
|
1930
|
+
|
1623
1931
|
if (table) {
|
1624
1932
|
if (index === currentIndex) {
|
1625
1933
|
return table;
|
1626
1934
|
}
|
1935
|
+
|
1627
1936
|
currentIndex++;
|
1628
1937
|
}
|
1629
1938
|
}
|
1939
|
+
|
1630
1940
|
throw new Jbig2Error('can\'t find custom Huffman table');
|
1631
1941
|
}
|
1942
|
+
|
1632
1943
|
function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
|
1633
1944
|
var codes = [],
|
1634
|
-
i
|
1635
|
-
codeLength
|
1945
|
+
i,
|
1946
|
+
codeLength;
|
1947
|
+
|
1636
1948
|
for (i = 0; i <= 34; i++) {
|
1637
1949
|
codeLength = reader.readBits(4);
|
1638
1950
|
codes.push(new HuffmanLine([i, codeLength, 0, 0]));
|
1639
1951
|
}
|
1952
|
+
|
1640
1953
|
var runCodesTable = new HuffmanTable(codes, false);
|
1641
1954
|
codes.length = 0;
|
1955
|
+
|
1642
1956
|
for (i = 0; i < numberOfSymbols;) {
|
1643
1957
|
codeLength = runCodesTable.decode(reader);
|
1958
|
+
|
1644
1959
|
if (codeLength >= 32) {
|
1645
1960
|
var repeatedLength = void 0,
|
1646
1961
|
numberOfRepeats = void 0,
|
1647
1962
|
j = void 0;
|
1963
|
+
|
1648
1964
|
switch (codeLength) {
|
1649
1965
|
case 32:
|
1650
1966
|
if (i === 0) {
|
1651
1967
|
throw new Jbig2Error('no previous value in symbol ID table');
|
1652
1968
|
}
|
1969
|
+
|
1653
1970
|
numberOfRepeats = reader.readBits(2) + 3;
|
1654
1971
|
repeatedLength = codes[i - 1].prefixLength;
|
1655
1972
|
break;
|
1973
|
+
|
1656
1974
|
case 33:
|
1657
1975
|
numberOfRepeats = reader.readBits(3) + 3;
|
1658
1976
|
repeatedLength = 0;
|
1659
1977
|
break;
|
1978
|
+
|
1660
1979
|
case 34:
|
1661
1980
|
numberOfRepeats = reader.readBits(7) + 11;
|
1662
1981
|
repeatedLength = 0;
|
1663
1982
|
break;
|
1983
|
+
|
1664
1984
|
default:
|
1665
1985
|
throw new Jbig2Error('invalid code length in symbol ID table');
|
1666
1986
|
}
|
1987
|
+
|
1667
1988
|
for (j = 0; j < numberOfRepeats; j++) {
|
1668
1989
|
codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
|
1669
1990
|
i++;
|
@@ -1673,53 +1994,65 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1673
1994
|
i++;
|
1674
1995
|
}
|
1675
1996
|
}
|
1997
|
+
|
1676
1998
|
reader.byteAlign();
|
1677
1999
|
var symbolIDTable = new HuffmanTable(codes, false);
|
1678
2000
|
var customIndex = 0,
|
1679
|
-
tableFirstS
|
1680
|
-
tableDeltaS
|
1681
|
-
tableDeltaT
|
2001
|
+
tableFirstS,
|
2002
|
+
tableDeltaS,
|
2003
|
+
tableDeltaT;
|
2004
|
+
|
1682
2005
|
switch (textRegion.huffmanFS) {
|
1683
2006
|
case 0:
|
1684
2007
|
case 1:
|
1685
2008
|
tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
|
1686
2009
|
break;
|
2010
|
+
|
1687
2011
|
case 3:
|
1688
2012
|
tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1689
2013
|
customIndex++;
|
1690
2014
|
break;
|
2015
|
+
|
1691
2016
|
default:
|
1692
2017
|
throw new Jbig2Error('invalid Huffman FS selector');
|
1693
2018
|
}
|
2019
|
+
|
1694
2020
|
switch (textRegion.huffmanDS) {
|
1695
2021
|
case 0:
|
1696
2022
|
case 1:
|
1697
2023
|
case 2:
|
1698
2024
|
tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
|
1699
2025
|
break;
|
2026
|
+
|
1700
2027
|
case 3:
|
1701
2028
|
tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1702
2029
|
customIndex++;
|
1703
2030
|
break;
|
2031
|
+
|
1704
2032
|
default:
|
1705
2033
|
throw new Jbig2Error('invalid Huffman DS selector');
|
1706
2034
|
}
|
2035
|
+
|
1707
2036
|
switch (textRegion.huffmanDT) {
|
1708
2037
|
case 0:
|
1709
2038
|
case 1:
|
1710
2039
|
case 2:
|
1711
2040
|
tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
|
1712
2041
|
break;
|
2042
|
+
|
1713
2043
|
case 3:
|
1714
2044
|
tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1715
2045
|
customIndex++;
|
1716
2046
|
break;
|
2047
|
+
|
1717
2048
|
default:
|
1718
2049
|
throw new Jbig2Error('invalid Huffman DT selector');
|
1719
2050
|
}
|
2051
|
+
|
1720
2052
|
if (textRegion.refinement) {
|
1721
2053
|
throw new Jbig2Error('refinement with Huffman is not supported');
|
1722
2054
|
}
|
2055
|
+
|
1723
2056
|
return {
|
1724
2057
|
symbolIDTable: symbolIDTable,
|
1725
2058
|
tableFirstS: tableFirstS,
|
@@ -1727,47 +2060,57 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1727
2060
|
tableDeltaT: tableDeltaT
|
1728
2061
|
};
|
1729
2062
|
}
|
2063
|
+
|
1730
2064
|
function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
|
1731
2065
|
var customIndex = 0,
|
1732
|
-
tableDeltaHeight
|
1733
|
-
tableDeltaWidth
|
2066
|
+
tableDeltaHeight,
|
2067
|
+
tableDeltaWidth;
|
2068
|
+
|
1734
2069
|
switch (dictionary.huffmanDHSelector) {
|
1735
2070
|
case 0:
|
1736
2071
|
case 1:
|
1737
2072
|
tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
|
1738
2073
|
break;
|
2074
|
+
|
1739
2075
|
case 3:
|
1740
2076
|
tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1741
2077
|
customIndex++;
|
1742
2078
|
break;
|
2079
|
+
|
1743
2080
|
default:
|
1744
2081
|
throw new Jbig2Error('invalid Huffman DH selector');
|
1745
2082
|
}
|
2083
|
+
|
1746
2084
|
switch (dictionary.huffmanDWSelector) {
|
1747
2085
|
case 0:
|
1748
2086
|
case 1:
|
1749
2087
|
tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
|
1750
2088
|
break;
|
2089
|
+
|
1751
2090
|
case 3:
|
1752
2091
|
tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1753
2092
|
customIndex++;
|
1754
2093
|
break;
|
2094
|
+
|
1755
2095
|
default:
|
1756
2096
|
throw new Jbig2Error('invalid Huffman DW selector');
|
1757
2097
|
}
|
1758
|
-
|
1759
|
-
|
2098
|
+
|
2099
|
+
var tableBitmapSize, tableAggregateInstances;
|
2100
|
+
|
1760
2101
|
if (dictionary.bitmapSizeSelector) {
|
1761
2102
|
tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1762
2103
|
customIndex++;
|
1763
2104
|
} else {
|
1764
2105
|
tableBitmapSize = getStandardTable(1);
|
1765
2106
|
}
|
2107
|
+
|
1766
2108
|
if (dictionary.aggregationInstancesSelector) {
|
1767
2109
|
tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
|
1768
2110
|
} else {
|
1769
2111
|
tableAggregateInstances = getStandardTable(1);
|
1770
2112
|
}
|
2113
|
+
|
1771
2114
|
return {
|
1772
2115
|
tableDeltaHeight: tableDeltaHeight,
|
1773
2116
|
tableDeltaWidth: tableDeltaWidth,
|
@@ -1775,21 +2118,27 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1775
2118
|
tableAggregateInstances: tableAggregateInstances
|
1776
2119
|
};
|
1777
2120
|
}
|
2121
|
+
|
1778
2122
|
function readUncompressedBitmap(reader, width, height) {
|
1779
2123
|
var bitmap = [],
|
1780
|
-
x
|
1781
|
-
y
|
1782
|
-
row
|
2124
|
+
x,
|
2125
|
+
y,
|
2126
|
+
row;
|
2127
|
+
|
1783
2128
|
for (y = 0; y < height; y++) {
|
1784
2129
|
row = new Uint8Array(width);
|
1785
2130
|
bitmap.push(row);
|
2131
|
+
|
1786
2132
|
for (x = 0; x < width; x++) {
|
1787
2133
|
row[x] = reader.readBit();
|
1788
2134
|
}
|
2135
|
+
|
1789
2136
|
reader.byteAlign();
|
1790
2137
|
}
|
2138
|
+
|
1791
2139
|
return bitmap;
|
1792
2140
|
}
|
2141
|
+
|
1793
2142
|
function decodeMMRBitmap(input, width, height, endOfBlock) {
|
1794
2143
|
var params = {
|
1795
2144
|
K: -1,
|
@@ -1800,40 +2149,50 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1800
2149
|
};
|
1801
2150
|
var decoder = new _ccitt.CCITTFaxDecoder(input, params);
|
1802
2151
|
var bitmap = [],
|
1803
|
-
x
|
1804
|
-
y
|
1805
|
-
row
|
1806
|
-
currentByte
|
1807
|
-
shift
|
2152
|
+
x,
|
2153
|
+
y,
|
2154
|
+
row,
|
2155
|
+
currentByte,
|
2156
|
+
shift,
|
1808
2157
|
eof = false;
|
2158
|
+
|
1809
2159
|
for (y = 0; y < height; y++) {
|
1810
2160
|
row = new Uint8Array(width);
|
1811
2161
|
bitmap.push(row);
|
1812
2162
|
shift = -1;
|
2163
|
+
|
1813
2164
|
for (x = 0; x < width; x++) {
|
1814
2165
|
if (shift < 0) {
|
1815
2166
|
currentByte = decoder.readNextChar();
|
2167
|
+
|
1816
2168
|
if (currentByte === -1) {
|
1817
2169
|
currentByte = 0;
|
1818
2170
|
eof = true;
|
1819
2171
|
}
|
2172
|
+
|
1820
2173
|
shift = 7;
|
1821
2174
|
}
|
2175
|
+
|
1822
2176
|
row[x] = currentByte >> shift & 1;
|
1823
2177
|
shift--;
|
1824
2178
|
}
|
1825
2179
|
}
|
2180
|
+
|
1826
2181
|
if (endOfBlock && !eof) {
|
1827
2182
|
var lookForEOFLimit = 5;
|
2183
|
+
|
1828
2184
|
for (var i = 0; i < lookForEOFLimit; i++) {
|
1829
2185
|
if (decoder.readNextChar() === -1) {
|
1830
2186
|
break;
|
1831
2187
|
}
|
1832
2188
|
}
|
1833
2189
|
}
|
2190
|
+
|
1834
2191
|
return bitmap;
|
1835
2192
|
}
|
2193
|
+
|
1836
2194
|
function Jbig2Image() {}
|
2195
|
+
|
1837
2196
|
Jbig2Image.prototype = {
|
1838
2197
|
parseChunks: function parseChunks(chunks) {
|
1839
2198
|
return parseJbig2Chunks(chunks);
|
@@ -1851,4 +2210,5 @@ var Jbig2Image = function Jbig2ImageClosure() {
|
|
1851
2210
|
};
|
1852
2211
|
return Jbig2Image;
|
1853
2212
|
}();
|
2213
|
+
|
1854
2214
|
exports.Jbig2Image = Jbig2Image;
|