| /** | |
| * @licstart The following is the entire license notice for the | |
| * Javascript code in this page | |
| * | |
| * Copyright 2020 Mozilla Foundation | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| * @licend The above is the entire license notice for the | |
| * Javascript code in this page | |
| */ | |
| "use strict"; | |
| Object.defineProperty(exports, "__esModule", { | |
| value: true | |
| }); | |
| exports.CCITTFaxDecoder = void 0; | |
| var _util = require("../shared/util.js"); | |
| const CCITTFaxDecoder = function CCITTFaxDecoder() { | |
| const ccittEOL = -2; | |
| const ccittEOF = -1; | |
| const twoDimPass = 0; | |
| const twoDimHoriz = 1; | |
| const twoDimVert0 = 2; | |
| const twoDimVertR1 = 3; | |
| const twoDimVertL1 = 4; | |
| const twoDimVertR2 = 5; | |
| const twoDimVertL2 = 6; | |
| const twoDimVertR3 = 7; | |
| const twoDimVertL3 = 8; | |
| const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; | |
| const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; | |
| const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; | |
| const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; | |
| const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; | |
| const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; | |
| function CCITTFaxDecoder(source, options = {}) { | |
| if (!source || typeof source.next !== "function") { | |
| throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); | |
| } | |
| this.source = source; | |
| this.eof = false; | |
| this.encoding = options.K || 0; | |
| this.eoline = options.EndOfLine || false; | |
| this.byteAlign = options.EncodedByteAlign || false; | |
| this.columns = options.Columns || 1728; | |
| this.rows = options.Rows || 0; | |
| let eoblock = options.EndOfBlock; | |
| if (eoblock === null || eoblock === undefined) { | |
| eoblock = true; | |
| } | |
| this.eoblock = eoblock; | |
| this.black = options.BlackIs1 || false; | |
| this.codingLine = new Uint32Array(this.columns + 1); | |
| this.refLine = new Uint32Array(this.columns + 2); | |
| this.codingLine[0] = this.columns; | |
| this.codingPos = 0; | |
| this.row = 0; | |
| this.nextLine2D = this.encoding < 0; | |
| this.inputBits = 0; | |
| this.inputBuf = 0; | |
| this.outputBits = 0; | |
| this.rowsDone = false; | |
| let code1; | |
| while ((code1 = this._lookBits(12)) === 0) { | |
| this._eatBits(1); | |
| } | |
| if (code1 === 1) { | |
| this._eatBits(12); | |
| } | |
| if (this.encoding > 0) { | |
| this.nextLine2D = !this._lookBits(1); | |
| this._eatBits(1); | |
| } | |
| } | |
| CCITTFaxDecoder.prototype = { | |
| readNextChar() { | |
| if (this.eof) { | |
| return -1; | |
| } | |
| const refLine = this.refLine; | |
| const codingLine = this.codingLine; | |
| const columns = this.columns; | |
| let refPos, blackPixels, bits, i; | |
| if (this.outputBits === 0) { | |
| if (this.rowsDone) { | |
| this.eof = true; | |
| } | |
| if (this.eof) { | |
| return -1; | |
| } | |
| this.err = false; | |
| let code1, code2, code3; | |
| if (this.nextLine2D) { | |
| for (i = 0; codingLine[i] < columns; ++i) { | |
| refLine[i] = codingLine[i]; | |
| } | |
| refLine[i++] = columns; | |
| refLine[i] = columns; | |
| codingLine[0] = 0; | |
| this.codingPos = 0; | |
| refPos = 0; | |
| blackPixels = 0; | |
| while (codingLine[this.codingPos] < columns) { | |
| code1 = this._getTwoDimCode(); | |
| switch (code1) { | |
| case twoDimPass: | |
| this._addPixels(refLine[refPos + 1], blackPixels); | |
| if (refLine[refPos + 1] < columns) { | |
| refPos += 2; | |
| } | |
| break; | |
| case twoDimHoriz: | |
| code1 = code2 = 0; | |
| if (blackPixels) { | |
| do { | |
| code1 += code3 = this._getBlackCode(); | |
| } while (code3 >= 64); | |
| do { | |
| code2 += code3 = this._getWhiteCode(); | |
| } while (code3 >= 64); | |
| } else { | |
| do { | |
| code1 += code3 = this._getWhiteCode(); | |
| } while (code3 >= 64); | |
| do { | |
| code2 += code3 = this._getBlackCode(); | |
| } while (code3 >= 64); | |
| } | |
| this._addPixels(codingLine[this.codingPos] + code1, blackPixels); | |
| if (codingLine[this.codingPos] < columns) { | |
| this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); | |
| } | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| break; | |
| case twoDimVertR3: | |
| this._addPixels(refLine[refPos] + 3, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| ++refPos; | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVertR2: | |
| this._addPixels(refLine[refPos] + 2, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| ++refPos; | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVertR1: | |
| this._addPixels(refLine[refPos] + 1, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| ++refPos; | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVert0: | |
| this._addPixels(refLine[refPos], blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| ++refPos; | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVertL3: | |
| this._addPixelsNeg(refLine[refPos] - 3, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| if (refPos > 0) { | |
| --refPos; | |
| } else { | |
| ++refPos; | |
| } | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVertL2: | |
| this._addPixelsNeg(refLine[refPos] - 2, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| if (refPos > 0) { | |
| --refPos; | |
| } else { | |
| ++refPos; | |
| } | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case twoDimVertL1: | |
| this._addPixelsNeg(refLine[refPos] - 1, blackPixels); | |
| blackPixels ^= 1; | |
| if (codingLine[this.codingPos] < columns) { | |
| if (refPos > 0) { | |
| --refPos; | |
| } else { | |
| ++refPos; | |
| } | |
| while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { | |
| refPos += 2; | |
| } | |
| } | |
| break; | |
| case ccittEOF: | |
| this._addPixels(columns, 0); | |
| this.eof = true; | |
| break; | |
| default: | |
| (0, _util.info)("bad 2d code"); | |
| this._addPixels(columns, 0); | |
| this.err = true; | |
| } | |
| } | |
| } else { | |
| codingLine[0] = 0; | |
| this.codingPos = 0; | |
| blackPixels = 0; | |
| while (codingLine[this.codingPos] < columns) { | |
| code1 = 0; | |
| if (blackPixels) { | |
| do { | |
| code1 += code3 = this._getBlackCode(); | |
| } while (code3 >= 64); | |
| } else { | |
| do { | |
| code1 += code3 = this._getWhiteCode(); | |
| } while (code3 >= 64); | |
| } | |
| this._addPixels(codingLine[this.codingPos] + code1, blackPixels); | |
| blackPixels ^= 1; | |
| } | |
| } | |
| let gotEOL = false; | |
| if (this.byteAlign) { | |
| this.inputBits &= ~7; | |
| } | |
| if (!this.eoblock && this.row === this.rows - 1) { | |
| this.rowsDone = true; | |
| } else { | |
| code1 = this._lookBits(12); | |
| if (this.eoline) { | |
| while (code1 !== ccittEOF && code1 !== 1) { | |
| this._eatBits(1); | |
| code1 = this._lookBits(12); | |
| } | |
| } else { | |
| while (code1 === 0) { | |
| this._eatBits(1); | |
| code1 = this._lookBits(12); | |
| } | |
| } | |
| if (code1 === 1) { | |
| this._eatBits(12); | |
| gotEOL = true; | |
| } else if (code1 === ccittEOF) { | |
| this.eof = true; | |
| } | |
| } | |
| if (!this.eof && this.encoding > 0 && !this.rowsDone) { | |
| this.nextLine2D = !this._lookBits(1); | |
| this._eatBits(1); | |
| } | |
| if (this.eoblock && gotEOL && this.byteAlign) { | |
| code1 = this._lookBits(12); | |
| if (code1 === 1) { | |
| this._eatBits(12); | |
| if (this.encoding > 0) { | |
| this._lookBits(1); | |
| this._eatBits(1); | |
| } | |
| if (this.encoding >= 0) { | |
| for (i = 0; i < 4; ++i) { | |
| code1 = this._lookBits(12); | |
| if (code1 !== 1) { | |
| (0, _util.info)("bad rtc code: " + code1); | |
| } | |
| this._eatBits(12); | |
| if (this.encoding > 0) { | |
| this._lookBits(1); | |
| this._eatBits(1); | |
| } | |
| } | |
| } | |
| this.eof = true; | |
| } | |
| } else if (this.err && this.eoline) { | |
| while (true) { | |
| code1 = this._lookBits(13); | |
| if (code1 === ccittEOF) { | |
| this.eof = true; | |
| return -1; | |
| } | |
| if (code1 >> 1 === 1) { | |
| break; | |
| } | |
| this._eatBits(1); | |
| } | |
| this._eatBits(12); | |
| if (this.encoding > 0) { | |
| this._eatBits(1); | |
| this.nextLine2D = !(code1 & 1); | |
| } | |
| } | |
| if (codingLine[0] > 0) { | |
| this.outputBits = codingLine[this.codingPos = 0]; | |
| } else { | |
| this.outputBits = codingLine[this.codingPos = 1]; | |
| } | |
| this.row++; | |
| } | |
| let c; | |
| if (this.outputBits >= 8) { | |
| c = this.codingPos & 1 ? 0 : 0xff; | |
| this.outputBits -= 8; | |
| if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { | |
| this.codingPos++; | |
| this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; | |
| } | |
| } else { | |
| bits = 8; | |
| c = 0; | |
| do { | |
| if (this.outputBits > bits) { | |
| c <<= bits; | |
| if (!(this.codingPos & 1)) { | |
| c |= 0xff >> 8 - bits; | |
| } | |
| this.outputBits -= bits; | |
| bits = 0; | |
| } else { | |
| c <<= this.outputBits; | |
| if (!(this.codingPos & 1)) { | |
| c |= 0xff >> 8 - this.outputBits; | |
| } | |
| bits -= this.outputBits; | |
| this.outputBits = 0; | |
| if (codingLine[this.codingPos] < columns) { | |
| this.codingPos++; | |
| this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; | |
| } else if (bits > 0) { | |
| c <<= bits; | |
| bits = 0; | |
| } | |
| } | |
| } while (bits); | |
| } | |
| if (this.black) { | |
| c ^= 0xff; | |
| } | |
| return c; | |
| }, | |
| _addPixels(a1, blackPixels) { | |
| const codingLine = this.codingLine; | |
| let codingPos = this.codingPos; | |
| if (a1 > codingLine[codingPos]) { | |
| if (a1 > this.columns) { | |
| (0, _util.info)("row is wrong length"); | |
| this.err = true; | |
| a1 = this.columns; | |
| } | |
| if (codingPos & 1 ^ blackPixels) { | |
| ++codingPos; | |
| } | |
| codingLine[codingPos] = a1; | |
| } | |
| this.codingPos = codingPos; | |
| }, | |
| _addPixelsNeg(a1, blackPixels) { | |
| const codingLine = this.codingLine; | |
| let codingPos = this.codingPos; | |
| if (a1 > codingLine[codingPos]) { | |
| if (a1 > this.columns) { | |
| (0, _util.info)("row is wrong length"); | |
| this.err = true; | |
| a1 = this.columns; | |
| } | |
| if (codingPos & 1 ^ blackPixels) { | |
| ++codingPos; | |
| } | |
| codingLine[codingPos] = a1; | |
| } else if (a1 < codingLine[codingPos]) { | |
| if (a1 < 0) { | |
| (0, _util.info)("invalid code"); | |
| this.err = true; | |
| a1 = 0; | |
| } | |
| while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { | |
| --codingPos; | |
| } | |
| codingLine[codingPos] = a1; | |
| } | |
| this.codingPos = codingPos; | |
| }, | |
| _findTableCode(start, end, table, limit) { | |
| const limitValue = limit || 0; | |
| for (let i = start; i <= end; ++i) { | |
| let code = this._lookBits(i); | |
| if (code === ccittEOF) { | |
| return [true, 1, false]; | |
| } | |
| if (i < end) { | |
| code <<= end - i; | |
| } | |
| if (!limitValue || code >= limitValue) { | |
| const p = table[code - limitValue]; | |
| if (p[0] === i) { | |
| this._eatBits(i); | |
| return [true, p[1], true]; | |
| } | |
| } | |
| } | |
| return [false, 0, false]; | |
| }, | |
| _getTwoDimCode() { | |
| let code = 0; | |
| let p; | |
| if (this.eoblock) { | |
| code = this._lookBits(7); | |
| p = twoDimTable[code]; | |
| if (p && p[0] > 0) { | |
| this._eatBits(p[0]); | |
| return p[1]; | |
| } | |
| } else { | |
| const result = this._findTableCode(1, 7, twoDimTable); | |
| if (result[0] && result[2]) { | |
| return result[1]; | |
| } | |
| } | |
| (0, _util.info)("Bad two dim code"); | |
| return ccittEOF; | |
| }, | |
| _getWhiteCode() { | |
| let code = 0; | |
| let p; | |
| if (this.eoblock) { | |
| code = this._lookBits(12); | |
| if (code === ccittEOF) { | |
| return 1; | |
| } | |
| if (code >> 5 === 0) { | |
| p = whiteTable1[code]; | |
| } else { | |
| p = whiteTable2[code >> 3]; | |
| } | |
| if (p[0] > 0) { | |
| this._eatBits(p[0]); | |
| return p[1]; | |
| } | |
| } else { | |
| let result = this._findTableCode(1, 9, whiteTable2); | |
| if (result[0]) { | |
| return result[1]; | |
| } | |
| result = this._findTableCode(11, 12, whiteTable1); | |
| if (result[0]) { | |
| return result[1]; | |
| } | |
| } | |
| (0, _util.info)("bad white code"); | |
| this._eatBits(1); | |
| return 1; | |
| }, | |
| _getBlackCode() { | |
| let code, p; | |
| if (this.eoblock) { | |
| code = this._lookBits(13); | |
| if (code === ccittEOF) { | |
| return 1; | |
| } | |
| if (code >> 7 === 0) { | |
| p = blackTable1[code]; | |
| } else if (code >> 9 === 0 && code >> 7 !== 0) { | |
| p = blackTable2[(code >> 1) - 64]; | |
| } else { | |
| p = blackTable3[code >> 7]; | |
| } | |
| if (p[0] > 0) { | |
| this._eatBits(p[0]); | |
| return p[1]; | |
| } | |
| } else { | |
| let result = this._findTableCode(2, 6, blackTable3); | |
| if (result[0]) { | |
| return result[1]; | |
| } | |
| result = this._findTableCode(7, 12, blackTable2, 64); | |
| if (result[0]) { | |
| return result[1]; | |
| } | |
| result = this._findTableCode(10, 13, blackTable1); | |
| if (result[0]) { | |
| return result[1]; | |
| } | |
| } | |
| (0, _util.info)("bad black code"); | |
| this._eatBits(1); | |
| return 1; | |
| }, | |
| _lookBits(n) { | |
| let c; | |
| while (this.inputBits < n) { | |
| if ((c = this.source.next()) === -1) { | |
| if (this.inputBits === 0) { | |
| return ccittEOF; | |
| } | |
| return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; | |
| } | |
| this.inputBuf = this.inputBuf << 8 | c; | |
| this.inputBits += 8; | |
| } | |
| return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; | |
| }, | |
| _eatBits(n) { | |
| if ((this.inputBits -= n) < 0) { | |
| this.inputBits = 0; | |
| } | |
| } | |
| }; | |
| return CCITTFaxDecoder; | |
| }(); | |
| exports.CCITTFaxDecoder = CCITTFaxDecoder; |