From 88c20516987a27ff339b2ede061d27afdc5ffd02 Mon Sep 17 00:00:00 2001 From: calixteman Date: Sun, 1 Feb 2026 17:24:38 +0100 Subject: [PATCH] Use the ccittfax decoder from pdfium The decoder is a dependency of the jbig2 one and is already included in pdf.js, so we just need to wire it up. It improves the performance of documents using ccittfax images. --- external/jbig2/jbig2.js | 2 +- external/jbig2/jbig2.wasm | Bin 105557 -> 109945 bytes src/core/ccitt.js | 29 +++-- src/core/ccitt_stream.js | 107 ++++++++++++++---- src/core/decode_stream.js | 4 +- .../{jbig2_wasm.js => jbig2_ccittFax_wasm.js} | 33 ++++-- src/core/jbig2_stream.js | 12 +- src/core/jpx_stream.js | 2 +- src/core/pdf_manager.js | 4 +- 9 files changed, 142 insertions(+), 51 deletions(-) rename src/core/{jbig2_wasm.js => jbig2_ccittFax_wasm.js} (79%) diff --git a/external/jbig2/jbig2.js b/external/jbig2/jbig2.js index 2e937eaf0..6b4ddb09e 100644 --- a/external/jbig2/jbig2.js +++ b/external/jbig2/jbig2.js @@ -1,3 +1,3 @@ /* THIS FILE IS GENERATED - DO NOT EDIT */ -async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["h"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("jbig2.wasm")}return new URL("jbig2.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["i"];_free=Module["_free"]=wasmExports["j"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["k"];__emscripten_timeout=wasmExports["l"];memory=wasmMemory=wasmExports["g"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={e:__abort_js,b:__emscripten_runtime_keepalive_clear,c:__setitimer_js,d:_emscripten_resize_heap,a:_proc_exit,f:_setImageData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["j"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("jbig2.wasm")}return new URL("jbig2.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _createImageData(size){Module.imageData=new Uint8Array(size)}var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,_ccitt_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["k"];_free=Module["_free"]=wasmExports["l"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["m"];_ccitt_decode=Module["_ccitt_decode"]=wasmExports["n"];__emscripten_timeout=wasmExports["o"];memory=wasmMemory=wasmExports["i"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={e:__abort_js,b:__emscripten_runtime_keepalive_clear,c:__setitimer_js,g:_createImageData,d:_emscripten_resize_heap,a:_proc_exit,h:_setImageData,f:_setLineData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} ;return moduleRtn}export default JBig2; diff --git a/external/jbig2/jbig2.wasm b/external/jbig2/jbig2.wasm index 04a4a374f9196c7525a2ab359d2283ddf0d6f88f..187ab6f038e6c8e145ef47407277d318c27dbb03 100644 GIT binary patch delta 22016 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 diff --git a/src/core/ccitt.js b/src/core/ccitt.js index 8a57a5dbe..c53dda449 100644 --- a/src/core/ccitt.js +++ b/src/core/ccitt.js @@ -465,20 +465,33 @@ const blackTable3 = [ * @param {Object} [options] - Decoding options. */ class CCITTFaxDecoder { - constructor(source, options = {}) { + constructor( + source, + options = { + K: 0, + EndOfLine: false, + EncodedByteAlign: false, + Columns: 1728, + Rows: 0, + EndOfBlock: true, + BlackIs1: false, + } + ) { if (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; - this.eoblock = options.EndOfBlock ?? true; - this.black = options.BlackIs1 || false; + ({ + K: this.encoding, + EndOfLine: this.eoline, + EncodedByteAlign: this.byteAlign, + Columns: this.columns, + Rows: this.rows, + EndOfBlock: this.eoblock, + BlackIs1: this.black, + } = options); this.codingLine = new Uint32Array(this.columns + 1); this.refLine = new Uint32Array(this.columns + 2); diff --git a/src/core/ccitt_stream.js b/src/core/ccitt_stream.js index ca173f460..40487726d 100644 --- a/src/core/ccitt_stream.js +++ b/src/core/ccitt_stream.js @@ -13,52 +13,115 @@ * limitations under the License. */ +import { shadow, warn } from "../shared/util.js"; import { CCITTFaxDecoder } from "./ccitt.js"; import { DecodeStream } from "./decode_stream.js"; import { Dict } from "./primitives.js"; +import { JBig2CCITTFaxWasmImage } from "./jbig2_ccittFax_wasm.js"; class CCITTFaxStream extends DecodeStream { constructor(str, maybeLength, params) { super(maybeLength); this.stream = str; + this.maybeLength = maybeLength; this.dict = str.dict; if (!(params instanceof Dict)) { params = Dict.empty; } - const source = { - next() { - return str.getByte(); - }, + this.params = { + K: params.get("K") || 0, + EndOfLine: !!params.get("EndOfLine"), + EncodedByteAlign: !!params.get("EncodedByteAlign"), + Columns: params.get("Columns") || 1728, + Rows: params.get("Rows") || 0, + EndOfBlock: !!(params.get("EndOfBlock") ?? true), + BlackIs1: !!params.get("BlackIs1"), }; - this.ccittFaxDecoder = new CCITTFaxDecoder(source, { - K: params.get("K"), - EndOfLine: params.get("EndOfLine"), - EncodedByteAlign: params.get("EncodedByteAlign"), - Columns: params.get("Columns"), - Rows: params.get("Rows"), - EndOfBlock: params.get("EndOfBlock"), - BlackIs1: params.get("BlackIs1"), - }); + } + + get bytes() { + // If `this.maybeLength` is null, we'll get the entire stream. + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } readBlock() { - while (!this.eof) { - const c = this.ccittFaxDecoder.readNextChar(); - if (c === -1) { - this.eof = true; - return; - } - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } + this.decodeImageFallback(); } get isImageStream() { return true; } + + get isAsyncDecoder() { + return true; + } + + async decodeImage(bytes, length, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + if (!bytes) { + bytes = this.stream.isAsync + ? (await this.stream.asyncGetBytes()) || this.bytes + : this.bytes; + } + + try { + this.buffer = await JBig2CCITTFaxWasmImage.decode( + bytes, + this.dict.get("W", "Width"), + this.dict.get("H", "Height"), + null, + this.params + ); + } catch { + warn("CCITTFaxStream: Falling back to JS CCITTFax decoder."); + return this.decodeImageFallback(bytes, length); + } + this.bufferLength = this.buffer.length; + this.eof = true; + + return this.buffer; + } + + decodeImageFallback(bytes, length) { + if (this.eof) { + return this.buffer; + } + const { params } = this; + if (!bytes) { + this.stream.reset(); + bytes = this.bytes; + } + let pos = 0; + const source = { + next() { + return bytes[pos++] ?? -1; + }, + }; + if (length && this.buffer.byteLength < length) { + this.buffer = new Uint8Array(length); + } + this.ccittFaxDecoder = new CCITTFaxDecoder(source, params); + let outPos = 0; + while (!this.eof) { + const c = this.ccittFaxDecoder.readNextChar(); + if (c === -1) { + this.eof = true; + break; + } + if (!length) { + this.ensureBuffer(outPos + 1); + } + this.buffer[outPos++] = c; + } + + this.bufferLength = this.buffer.length; + return this.buffer.subarray(0, length || this.bufferLength); + } } export { CCITTFaxStream }; diff --git a/src/core/decode_stream.js b/src/core/decode_stream.js index c76078f11..328735fb7 100644 --- a/src/core/decode_stream.js +++ b/src/core/decode_stream.js @@ -102,12 +102,12 @@ class DecodeStream extends BaseStream { async getImageData(length, decoderOptions) { if (!this.canAsyncDecodeImageFromBuffer) { if (this.isAsyncDecoder) { - return this.decodeImage(null, decoderOptions); + return this.decodeImage(null, length, decoderOptions); } return this.getBytes(length, decoderOptions); } const data = await this.stream.asyncGetBytes(); - return this.decodeImage(data, decoderOptions); + return this.decodeImage(data, length, decoderOptions); } reset() { diff --git a/src/core/jbig2_wasm.js b/src/core/jbig2_ccittFax_wasm.js similarity index 79% rename from src/core/jbig2_wasm.js rename to src/core/jbig2_ccittFax_wasm.js index 0d9d690f9..6a72f98f6 100644 --- a/src/core/jbig2_wasm.js +++ b/src/core/jbig2_ccittFax_wasm.js @@ -23,7 +23,7 @@ class JBig2Error extends BaseException { } } -class JBig2WasmImage { +class JBig2CCITTFaxWasmImage { static #buffer = null; static #handler = null; @@ -69,7 +69,7 @@ class JBig2WasmImage { } } - static async decode(bytes, width, height, globals) { + static async decode(bytes, width, height, globals, CCITTOptions) { if (!this.#modulePromise) { const { promise, resolve } = Promise.withResolvers(); const promises = [promise]; @@ -95,13 +95,28 @@ class JBig2WasmImage { const size = bytes.length; ptr = module._malloc(size); module.writeArrayToMemory(bytes, ptr); - const globalsSize = globals ? globals.length : 0; - if (globalsSize > 0) { - globalsPtr = module._malloc(globalsSize); - module.writeArrayToMemory(globals, globalsPtr); - } - module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize); + if (CCITTOptions) { + module._ccitt_decode( + ptr, + size, + width, + height, + CCITTOptions.K, + CCITTOptions.EndOfLine ? 1 : 0, + CCITTOptions.EncodedByteAlign ? 1 : 0, + CCITTOptions.BlackIs1 ? 1 : 0, + CCITTOptions.Columns, + CCITTOptions.Rows + ); + } else { + const globalsSize = globals ? globals.length : 0; + if (globalsSize > 0) { + globalsPtr = module._malloc(globalsSize); + module.writeArrayToMemory(globals, globalsPtr); + } + module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize); + } if (!module.imageData) { throw new JBig2Error("Unknown error"); } @@ -124,4 +139,4 @@ class JBig2WasmImage { } } -export { JBig2Error, JBig2WasmImage }; +export { JBig2CCITTFaxWasmImage, JBig2Error }; diff --git a/src/core/jbig2_stream.js b/src/core/jbig2_stream.js index c62c3580c..9f21ef1df 100644 --- a/src/core/jbig2_stream.js +++ b/src/core/jbig2_stream.js @@ -17,8 +17,8 @@ import { shadow, warn } from "../shared/util.js"; import { BaseStream } from "./base_stream.js"; import { DecodeStream } from "./decode_stream.js"; import { Dict } from "./primitives.js"; +import { JBig2CCITTFaxWasmImage } from "./jbig2_ccittFax_wasm.js"; import { Jbig2Image } from "./jbig2.js"; -import { JBig2WasmImage } from "./jbig2_wasm.js"; /** * For JBIG2's we use a library to decode these images and @@ -45,7 +45,7 @@ class Jbig2Stream extends DecodeStream { } readBlock() { - this.decodeImage(); + this.decodeImageFallback(); } get isAsyncDecoder() { @@ -56,7 +56,7 @@ class Jbig2Stream extends DecodeStream { return true; } - async decodeImage(bytes, _decoderOptions) { + async decodeImage(bytes, length, _decoderOptions) { if (this.eof) { return this.buffer; } @@ -69,7 +69,7 @@ class Jbig2Stream extends DecodeStream { globals = globalsStream.getBytes(); } } - this.buffer = await JBig2WasmImage.decode( + this.buffer = await JBig2CCITTFaxWasmImage.decode( bytes, this.dict.get("Width"), this.dict.get("Height"), @@ -77,7 +77,7 @@ class Jbig2Stream extends DecodeStream { ); } catch { warn("Jbig2Stream: Falling back to JS JBIG2 decoder."); - return this.decodeImageFallback(bytes); + return this.decodeImageFallback(bytes, length); } this.bufferLength = this.buffer.length; this.eof = true; @@ -85,7 +85,7 @@ class Jbig2Stream extends DecodeStream { return this.buffer; } - async decodeImageFallback(bytes) { + decodeImageFallback(bytes, _length) { if (this.eof) { return this.buffer; } diff --git a/src/core/jpx_stream.js b/src/core/jpx_stream.js index 54938eb74..15708f000 100644 --- a/src/core/jpx_stream.js +++ b/src/core/jpx_stream.js @@ -49,7 +49,7 @@ class JpxStream extends DecodeStream { return true; } - async decodeImage(bytes, decoderOptions) { + async decodeImage(bytes, _length, decoderOptions) { if (this.eof) { return this.buffer; } diff --git a/src/core/pdf_manager.js b/src/core/pdf_manager.js index 3c4255efb..83ea377bc 100644 --- a/src/core/pdf_manager.js +++ b/src/core/pdf_manager.js @@ -22,7 +22,7 @@ import { } from "../shared/util.js"; import { ChunkedStreamManager } from "./chunked_stream.js"; import { ImageResizer } from "./image_resizer.js"; -import { JBig2WasmImage } from "./jbig2_wasm.js"; +import { JBig2CCITTFaxWasmImage } from "./jbig2_ccittFax_wasm.js"; import { JpegStream } from "./jpeg_stream.js"; import { JpxImage } from "./jpx.js"; import { MissingDataException } from "./core_utils.js"; @@ -82,7 +82,7 @@ class BasePdfManager { JpxImage.setOptions(options); IccColorSpace.setOptions(options); CmykICCBasedCS.setOptions(options); - JBig2WasmImage.setOptions(options); + JBig2CCITTFaxWasmImage.setOptions(options); } get docId() {