| /** |
| * @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; |