From e7acffcef36eec7e77ade4f77e5e8ca0639c44d2 Mon Sep 17 00:00:00 2001 From: calixteman Date: Mon, 27 Jul 2026 20:33:07 +0200 Subject: [PATCH] Update qcms wrapper Few performance improvements have been made in the qcms wrapper, see: https://github.com/mozilla/pdf.js.qcms/commit/2ae4ee72334782928210ba4050e3e77d9b2d35be --- external/qcms/qcms.js | 45 +++++++++++----------- external/qcms/qcms_bg.wasm | Bin 88837 -> 96589 bytes external/qcms/qcms_utils.js | 74 +++++++++++++++++------------------- src/core/icc_colorspace.js | 42 ++++++++++---------- 4 files changed, 77 insertions(+), 84 deletions(-) diff --git a/external/qcms/qcms.js b/external/qcms/qcms.js index 9cd35a1ec..860ca5542 100644 --- a/external/qcms/qcms.js +++ b/external/qcms/qcms.js @@ -1,5 +1,5 @@ /* THIS FILE IS GENERATED - DO NOT EDIT */ -import { copy_result, copy_rgb, make_cssRGB } from './qcms_utils.js'; +import { copy_result } from './qcms_utils.js'; /** @@ -25,16 +25,20 @@ export const Intent = Object.freeze({ }); /** + * Converts `src` and hands the result to `copy_result`, laid out as RGB, or as + * RGBA with an opaque alpha when `add_alpha` is set. + * * # Safety * * This function is called directly from JavaScript. * @param {number} transformer * @param {Uint8Array} src + * @param {boolean} add_alpha */ -export function qcms_convert_array(transformer, src) { +export function qcms_convert_array(transformer, src, add_alpha) { const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; - wasm.qcms_convert_array(transformer, ptr0, len0); + wasm.qcms_convert_array(transformer, ptr0, len0, add_alpha); } /** @@ -46,10 +50,11 @@ export function qcms_convert_array(transformer, src) { * @param {number} src2 * @param {number} src3 * @param {number} src4 - * @param {boolean} css + * @returns {number} */ -export function qcms_convert_four(transformer, src1, src2, src3, src4, css) { - wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css); +export function qcms_convert_four(transformer, src1, src2, src3, src4) { + const ret = wasm.qcms_convert_four(transformer, src1, src2, src3, src4); + return ret >>> 0; } /** @@ -58,10 +63,11 @@ export function qcms_convert_four(transformer, src1, src2, src3, src4, css) { * This function is called directly from JavaScript. * @param {number} transformer * @param {number} src - * @param {boolean} css + * @returns {number} */ -export function qcms_convert_one(transformer, src, css) { - wasm.qcms_convert_one(transformer, src, css); +export function qcms_convert_one(transformer, src) { + const ret = wasm.qcms_convert_one(transformer, src); + return ret >>> 0; } /** @@ -72,10 +78,11 @@ export function qcms_convert_one(transformer, src, css) { * @param {number} src1 * @param {number} src2 * @param {number} src3 - * @param {boolean} css + * @returns {number} */ -export function qcms_convert_three(transformer, src1, src2, src3, css) { - wasm.qcms_convert_three(transformer, src1, src2, src3, css); +export function qcms_convert_three(transformer, src1, src2, src3) { + const ret = wasm.qcms_convert_three(transformer, src1, src2, src3); + return ret >>> 0; } /** @@ -106,18 +113,12 @@ export function qcms_transformer_from_memory(mem, in_type, intent) { function __wbg_get_imports() { const import0 = { __proto__: null, - __wbg___wbindgen_throw_6b64449b9b9ed33c: function(arg0, arg1) { + __wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }, __wbg_copy_result_0d15f3bf9d9012ae: function(arg0, arg1) { copy_result(arg0 >>> 0, arg1 >>> 0); }, - __wbg_copy_rgb_0106d9d9464fce43: function(arg0) { - copy_rgb(arg0 >>> 0); - }, - __wbg_make_cssRGB_8e24b34f71f5363e: function(arg0) { - make_cssRGB(arg0 >>> 0); - }, __wbindgen_init_externref_table: function() { const table = wasm.__wbindgen_externrefs; const offset = table.grow(4); @@ -135,8 +136,7 @@ function __wbg_get_imports() { } function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return decodeText(ptr, len); + return decodeText(ptr >>> 0, len); } let cachedUint8ArrayMemory0 = null; @@ -170,8 +170,9 @@ function decodeText(ptr, len) { let WASM_VECTOR_LEN = 0; -let wasmModule, wasm; +let wasmModule, wasmInstance, wasm; function __wbg_finalize_init(instance, module) { + wasmInstance = instance; wasm = instance.exports; wasmModule = module; cachedUint8ArrayMemory0 = null; diff --git a/external/qcms/qcms_bg.wasm b/external/qcms/qcms_bg.wasm index fccd641fef6ae956dc1d13c0c173a3f0be5303fa..ea1d07bc4439d034d5a188bb78ef317c33f56787 100644 GIT binary patch literal 96589 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 z∨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 Xs%4Od-I-+?)P|Q<*;OOE%=G^Ok}Q}V diff --git a/external/qcms/qcms_utils.js b/external/qcms/qcms_utils.js index 11d35351e..adbbaa832 100644 --- a/external/qcms/qcms_utils.js +++ b/external/qcms/qcms_utils.js @@ -13,22 +13,28 @@ * limitations under the License. */ +// Alpha lives in the high byte of a pixel on a little-endian host and in the +// low byte on a big-endian one. +const ALPHA_MASK = + new Uint8Array(new Uint32Array([1]).buffer)[0] === 1 ? 0xff000000 : 0x000000ff; +const RGB_MASK = ~ALPHA_MASK; + class QCMS { static #memoryArray = null; static _memory = null; - static _mustAddAlpha = false; - + // Where the next `qcms_convert_array` result should land. static _destBuffer = null; static _destOffset = 0; - static _destLength = 0; - - static _cssColor = ""; - - static _makeHexColor = null; + // Set when the destination is RGBA and its alpha channel already holds + // something worth keeping, which is the case whenever the image has an + // /SMask: `fillOpacity` has run by then. The Wasm side does not know about + // that, so it always fills alpha in, and the bytes are merged here instead of + // copied wholesale. + static _keepAlpha = false; static get _memoryArray() { const array = this.#memoryArray; @@ -42,43 +48,31 @@ class QCMS { function copy_result(ptr, len) { // This function is called from the wasm module (it's an external // "C" function). Its goal is to copy the result from the wasm memory - // to the destination buffer without any intermediate copies. - const { _mustAddAlpha, _destBuffer, _destOffset, _destLength, _memoryArray } = - QCMS; - if (len === _destLength) { + // to the destination buffer without any intermediate copies. The wasm side + // has already laid the result out the way the caller asked for it, so this is + // one bulk copy unless the destination's alpha has to survive. + const { _destBuffer, _destOffset, _keepAlpha, _memoryArray } = QCMS; + if (!_keepAlpha) { _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset); return; } - if (_mustAddAlpha) { - for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { - _destBuffer[j] = _memoryArray[i]; - _destBuffer[j + 1] = _memoryArray[i + 1]; - _destBuffer[j + 2] = _memoryArray[i + 2]; - _destBuffer[j + 3] = 255; - } - } else { - for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { - _destBuffer[j] = _memoryArray[i]; - _destBuffer[j + 1] = _memoryArray[i + 1]; - _destBuffer[j + 2] = _memoryArray[i + 2]; + const count = len >> 2; + const destStart = _destBuffer.byteOffset + _destOffset; + if (((destStart | ptr) & 3) === 0) { + // Both sides are pixel-aligned, so RGB can be merged a whole pixel at a + // time. `len` is a multiple of 4 here: the wasm side wrote RGBA. + const dest32 = new Uint32Array(_destBuffer.buffer, destStart, count); + const src32 = new Uint32Array(QCMS._memory.buffer, ptr, count); + for (let i = 0; i < count; i++) { + dest32[i] = (dest32[i] & ALPHA_MASK) | (src32[i] & RGB_MASK); } + return; + } + for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 4, j += 4) { + _destBuffer[j] = _memoryArray[i]; + _destBuffer[j + 1] = _memoryArray[i + 1]; + _destBuffer[j + 2] = _memoryArray[i + 2]; } } -function copy_rgb(ptr) { - const { _destBuffer, _destOffset, _memoryArray } = QCMS; - _destBuffer[_destOffset] = _memoryArray[ptr]; - _destBuffer[_destOffset + 1] = _memoryArray[ptr + 1]; - _destBuffer[_destOffset + 2] = _memoryArray[ptr + 2]; -} - -function make_cssRGB(ptr) { - const { _memoryArray } = QCMS; - QCMS._cssColor = QCMS._makeHexColor( - _memoryArray[ptr], - _memoryArray[ptr + 1], - _memoryArray[ptr + 2] - ); -} - -export { copy_result, copy_rgb, make_cssRGB, QCMS }; +export { copy_result, QCMS }; diff --git a/src/core/icc_colorspace.js b/src/core/icc_colorspace.js index 04ad9fc36..2104033ff 100644 --- a/src/core/icc_colorspace.js +++ b/src/core/icc_colorspace.js @@ -61,30 +61,28 @@ class IccColorSpace extends ColorSpace { switch (numComps) { case 1: inType = DataType.Gray8; - this.#convertPixel = (src, srcOffset, css) => - qcms_convert_one(this.#transformer, src[srcOffset] * 255, css); + this.#convertPixel = (src, srcOffset) => + qcms_convert_one(this.#transformer, src[srcOffset] * 255); break; case 3: inType = DataType.RGB8; - this.#convertPixel = (src, srcOffset, css) => + this.#convertPixel = (src, srcOffset) => qcms_convert_three( this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, - src[srcOffset + 2] * 255, - css + src[srcOffset + 2] * 255 ); break; case 4: inType = DataType.CMYK; - this.#convertPixel = (src, srcOffset, css) => + this.#convertPixel = (src, srcOffset) => qcms_convert_four( this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, - src[srcOffset + 3] * 255, - css + src[srcOffset + 3] * 255 ); break; default: @@ -105,16 +103,15 @@ class IccColorSpace extends ColorSpace { } getRgbHex(src, srcOffset) { - this.#convertPixel(src, srcOffset, /* css */ true); - return QCMS._cssColor; + const color = this.#convertPixel(src, srcOffset); + return Util.makeHexColor(color >> 16, (color >> 8) & 0xff, color & 0xff); } getRgbItem(src, srcOffset, dest, destOffset) { - QCMS._destBuffer = dest; - QCMS._destOffset = destOffset; - QCMS._destLength = 3; - this.#convertPixel(src, srcOffset, /* css */ false); - QCMS._destBuffer = null; + const color = this.#convertPixel(src, srcOffset); + dest[destOffset] = color >> 16; + dest[destOffset + 1] = (color >> 8) & 0xff; + dest[destOffset + 2] = color & 0xff; } getRgbItems(src, count, dest, destOffset, alpha01) { @@ -127,8 +124,10 @@ class IccColorSpace extends ColorSpace { } QCMS._destBuffer = dest; QCMS._destOffset = destOffset; - QCMS._destLength = count * (3 + alpha01); - qcms_convert_array(this.#transformer, scaled); + // `scaled` is freshly allocated, so unlike in getRgbBuffer it can never + // alias `dest`: an RGBA destination always has an alpha channel to keep. + QCMS._keepAlpha = alpha01 === 1; + qcms_convert_array(this.#transformer, scaled, alpha01 === 1); QCMS._destBuffer = null; } @@ -140,12 +139,12 @@ class IccColorSpace extends ColorSpace { src[i] *= scale; } } - QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer; QCMS._destBuffer = dest; QCMS._destOffset = destOffset; - QCMS._destLength = count * (3 + alpha01); - qcms_convert_array(this.#transformer, src); - QCMS._mustAddAlpha = false; + // The wasm side always fills alpha in, so say when the destination's own + // alpha must survive: an /SMask has been decoded into it by now. + QCMS._keepAlpha = alpha01 === 1 && dest.buffer !== src.buffer; + qcms_convert_array(this.#transformer, src, alpha01 === 1); QCMS._destBuffer = null; } @@ -172,7 +171,6 @@ class IccColorSpace extends ColorSpace { }); isUsable = !!this._module; QCMS._memory = this._module.memory; - QCMS._makeHexColor = Util.makeHexColor.bind(Util); } catch (e) { warn(`ICCBased color space: "${e}".`); }