pdfjs-dist 2.0.489 → 2.2.228
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/CODE_OF_CONDUCT.md +15 -0
- package/bower.json +1 -1
- package/build/pdf.js +18515 -11402
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +48266 -37137
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/external/url/url-lib.js +627 -0
- package/image_decoders/pdf.image_decoders.js +11350 -0
- package/image_decoders/pdf.image_decoders.js.map +1 -0
- package/image_decoders/pdf.image_decoders.min.js +1 -0
- package/lib/core/annotation.js +587 -242
- package/lib/core/arithmetic_decoder.js +275 -245
- package/lib/core/bidi.js +65 -6
- package/lib/core/ccitt.js +173 -18
- package/lib/core/ccitt_stream.js +15 -6
- package/lib/core/cff_parser.js +433 -61
- package/lib/core/charsets.js +5 -4
- package/lib/core/chunked_stream.js +400 -152
- package/lib/core/cmap.js +326 -87
- package/lib/core/colorspace.js +874 -594
- package/lib/core/core_utils.js +147 -0
- package/lib/core/crypto.js +290 -45
- package/lib/core/document.js +560 -268
- package/lib/core/encodings.js +19 -10
- package/lib/core/evaluator.js +1005 -360
- package/lib/core/font_renderer.js +331 -97
- package/lib/core/fonts.js +812 -195
- package/lib/core/function.js +284 -71
- package/lib/core/glyphlist.js +4 -3
- package/lib/core/image.js +169 -62
- package/lib/core/image_utils.js +111 -0
- package/lib/core/jbig2.js +479 -66
- package/lib/core/jbig2_stream.js +19 -8
- package/lib/core/jpeg_stream.js +38 -13
- package/lib/core/jpg.js +253 -29
- package/lib/core/jpx.js +396 -6
- package/lib/core/jpx_stream.js +18 -6
- package/lib/core/metrics.js +15 -15
- package/lib/core/murmurhash3.js +56 -34
- package/lib/core/obj.js +1354 -488
- package/lib/core/operator_list.js +144 -31
- package/lib/core/parser.js +539 -191
- package/lib/core/pattern.js +148 -14
- package/lib/core/pdf_manager.js +323 -133
- package/lib/core/primitives.js +111 -24
- package/lib/core/ps_parser.js +134 -45
- package/lib/core/standard_fonts.js +17 -17
- package/lib/core/stream.js +313 -34
- package/lib/core/type1_parser.js +143 -13
- package/lib/core/unicode.js +32 -5
- package/lib/core/worker.js +217 -190
- package/lib/core/worker_stream.js +277 -0
- package/lib/display/annotation_layer.js +450 -133
- package/lib/display/api.js +1597 -784
- package/lib/display/api_compatibility.js +11 -13
- package/lib/display/canvas.js +360 -44
- package/lib/display/content_disposition.js +83 -32
- package/lib/display/display_utils.js +747 -0
- package/lib/display/fetch_stream.js +221 -90
- package/lib/display/font_loader.js +468 -236
- package/lib/display/metadata.js +38 -16
- package/lib/display/network.js +635 -428
- package/lib/display/network_utils.js +32 -19
- package/lib/display/node_stream.js +367 -175
- package/lib/display/pattern_helper.js +81 -31
- package/lib/display/svg.js +1235 -519
- package/lib/display/text_layer.js +153 -29
- package/lib/display/transport_stream.js +345 -94
- package/lib/display/webgl.js +64 -18
- package/lib/display/worker_options.js +5 -4
- package/lib/display/xml_parser.js +166 -53
- package/lib/examples/node/domstubs.js +60 -4
- package/lib/pdf.js +36 -14
- package/lib/pdf.worker.js +5 -3
- package/lib/shared/compatibility.js +158 -564
- package/lib/shared/global_scope.js +2 -2
- package/lib/shared/is_node.js +4 -4
- package/lib/shared/message_handler.js +521 -0
- package/lib/shared/streams_polyfill.js +21 -17
- package/lib/shared/url_polyfill.js +56 -0
- package/lib/shared/util.js +243 -710
- package/lib/test/unit/annotation_spec.js +870 -401
- package/lib/test/unit/api_spec.js +657 -345
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +54 -11
- package/lib/test/unit/clitests_helper.js +10 -8
- package/lib/test/unit/cmap_spec.js +95 -41
- package/lib/test/unit/colorspace_spec.js +115 -63
- package/lib/test/unit/core_utils_spec.js +191 -0
- package/lib/test/unit/crypto_spec.js +17 -5
- package/lib/test/unit/custom_spec.js +43 -55
- package/lib/test/unit/display_svg_spec.js +34 -18
- package/lib/test/unit/display_utils_spec.js +273 -0
- package/lib/test/unit/document_spec.js +8 -13
- package/lib/test/unit/encodings_spec.js +25 -45
- package/lib/test/unit/evaluator_spec.js +38 -15
- package/lib/test/unit/fetch_stream_spec.js +109 -0
- package/lib/test/unit/function_spec.js +17 -5
- package/lib/test/unit/jasmine-boot.js +33 -20
- package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
- package/lib/test/unit/metadata_spec.js +71 -11
- package/lib/test/unit/murmurhash3_spec.js +3 -3
- package/lib/test/unit/network_spec.js +19 -54
- package/lib/test/unit/network_utils_spec.js +91 -14
- package/lib/test/unit/node_stream_spec.js +56 -32
- package/lib/test/unit/parser_spec.js +162 -71
- package/lib/test/unit/pdf_find_controller_spec.js +230 -0
- package/lib/test/unit/pdf_find_utils_spec.js +63 -0
- package/lib/test/unit/pdf_history_spec.js +21 -9
- package/lib/test/unit/primitives_spec.js +53 -20
- package/lib/test/unit/stream_spec.js +12 -4
- package/lib/test/unit/test_utils.js +273 -56
- package/lib/test/unit/testreporter.js +21 -3
- package/lib/test/unit/type1_parser_spec.js +8 -6
- package/lib/test/unit/ui_utils_spec.js +454 -16
- package/lib/test/unit/unicode_spec.js +18 -15
- package/lib/test/unit/util_spec.js +87 -128
- package/lib/web/annotation_layer_builder.js +39 -22
- package/lib/web/app.js +1290 -588
- package/lib/web/app_options.js +100 -62
- package/lib/web/base_viewer.js +511 -182
- package/lib/web/chromecom.js +261 -117
- package/lib/web/debugger.js +166 -22
- package/lib/web/download_manager.js +32 -13
- package/lib/web/firefox_print_service.js +20 -10
- package/lib/web/firefoxcom.js +315 -80
- package/lib/web/genericcom.js +89 -30
- package/lib/web/genericl10n.js +142 -30
- package/lib/web/grab_to_pan.js +28 -4
- package/lib/web/interfaces.js +170 -47
- package/lib/web/overlay_manager.js +235 -85
- package/lib/web/password_prompt.js +22 -14
- package/lib/web/pdf_attachment_viewer.js +38 -18
- package/lib/web/pdf_cursor_tools.js +39 -16
- package/lib/web/pdf_document_properties.js +255 -136
- package/lib/web/pdf_find_bar.js +84 -40
- package/lib/web/pdf_find_controller.js +495 -184
- package/lib/web/pdf_find_utils.js +111 -0
- package/lib/web/pdf_history.js +190 -53
- package/lib/web/pdf_link_service.js +138 -77
- package/lib/web/pdf_outline_viewer.js +122 -46
- package/lib/web/pdf_page_view.js +191 -67
- package/lib/web/pdf_presentation_mode.js +99 -34
- package/lib/web/pdf_print_service.js +61 -13
- package/lib/web/pdf_rendering_queue.js +28 -9
- package/lib/web/pdf_sidebar.js +141 -81
- package/lib/web/pdf_sidebar_resizer.js +42 -16
- package/lib/web/pdf_single_page_viewer.js +74 -66
- package/lib/web/pdf_thumbnail_view.js +104 -33
- package/lib/web/pdf_thumbnail_viewer.js +66 -26
- package/lib/web/pdf_viewer.component.js +112 -32
- package/lib/web/pdf_viewer.js +91 -52
- package/lib/web/preferences.js +284 -89
- package/lib/web/secondary_toolbar.js +165 -40
- package/lib/web/text_layer_builder.js +134 -59
- package/lib/web/toolbar.js +78 -43
- package/lib/web/ui_utils.js +462 -136
- package/lib/web/view_history.js +215 -67
- package/lib/web/viewer_compatibility.js +4 -13
- package/package.json +5 -4
- package/web/pdf_viewer.css +79 -11
- package/web/pdf_viewer.js +6107 -3748
- package/web/pdf_viewer.js.map +1 -1
- package/lib/display/dom_utils.js +0 -309
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/test/unit/fonts_spec.js +0 -81
- package/lib/web/dom_events.js +0 -137
package/lib/core/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
|
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
|
-
|
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,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(
|
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(
|
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
|
1264
|
-
|
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
|
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
|
1696
|
+
var i,
|
1396
1697
|
ii = lines.length,
|
1397
|
-
line
|
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
|
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
|
1423
|
-
currentTemp
|
1424
|
-
line
|
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
|
1451
|
-
rangeLength
|
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
|
-
|
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(
|
1861
|
+
throw new Jbig2Error("standard table B.".concat(number, " does not exist"));
|
1524
1862
|
}
|
1863
|
+
|
1525
1864
|
var length = lines.length,
|
1526
|
-
i
|
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
|
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
|
1924
|
+
i,
|
1576
1925
|
ii = referredTo.length,
|
1577
|
-
table
|
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
|
1592
|
-
codeLength
|
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
|
1637
|
-
tableDeltaS
|
1638
|
-
tableDeltaT
|
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
|
1690
|
-
tableDeltaWidth
|
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
|
-
|
1716
|
-
|
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
|
1738
|
-
y
|
1739
|
-
row
|
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
|
1761
|
-
y
|
1762
|
-
row
|
1763
|
-
currentByte
|
1764
|
-
shift
|
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
|
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;
|