Skip to content

Commit f148106

Browse files
authored
Merge pull request #19957 from calixteman/rm_qcms_subarray
Remove all the useless subarrays when using qcms.
2 parents 72faeea + 782e883 commit f148106

File tree

4 files changed

+82
-36
lines changed

4 files changed

+82
-36
lines changed

external/qcms/qcms.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* THIS FILE IS GENERATED - DO NOT EDIT */
2-
import { copy_result, copy_rgb } from './qcms_utils.js';
2+
import { copy_result, copy_rgb, make_cssRGB } from './qcms_utils.js';
33

44
let wasm;
55

@@ -48,9 +48,10 @@ export function qcms_convert_array(transformer, src) {
4848
* This function is called directly from JavaScript.
4949
* @param {number} transformer
5050
* @param {number} src
51+
* @param {boolean} css
5152
*/
52-
export function qcms_convert_one(transformer, src) {
53-
wasm.qcms_convert_one(transformer, src);
53+
export function qcms_convert_one(transformer, src, css) {
54+
wasm.qcms_convert_one(transformer, src, css);
5455
}
5556

5657
/**
@@ -61,9 +62,10 @@ export function qcms_convert_one(transformer, src) {
6162
* @param {number} src1
6263
* @param {number} src2
6364
* @param {number} src3
65+
* @param {boolean} css
6466
*/
65-
export function qcms_convert_three(transformer, src1, src2, src3) {
66-
wasm.qcms_convert_three(transformer, src1, src2, src3);
67+
export function qcms_convert_three(transformer, src1, src2, src3, css) {
68+
wasm.qcms_convert_three(transformer, src1, src2, src3, css);
6769
}
6870

6971
/**
@@ -75,9 +77,10 @@ export function qcms_convert_three(transformer, src1, src2, src3) {
7577
* @param {number} src2
7678
* @param {number} src3
7779
* @param {number} src4
80+
* @param {boolean} css
7881
*/
79-
export function qcms_convert_four(transformer, src1, src2, src3, src4) {
80-
wasm.qcms_convert_four(transformer, src1, src2, src3, src4);
82+
export function qcms_convert_four(transformer, src1, src2, src3, src4, css) {
83+
wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css);
8184
}
8285

8386
/**
@@ -167,6 +170,9 @@ function __wbg_get_imports() {
167170
imports.wbg.__wbg_copyrgb_d60ce17bb05d9b67 = function(arg0) {
168171
copy_rgb(arg0 >>> 0);
169172
};
173+
imports.wbg.__wbg_makecssRGB_893bf0cd9fdb302d = function(arg0) {
174+
make_cssRGB(arg0 >>> 0);
175+
};
170176
imports.wbg.__wbindgen_init_externref_table = function() {
171177
const table = wasm.__wbindgen_export_0;
172178
const offset = table.grow(4);

external/qcms/qcms_bg.wasm

-12.2 KB
Binary file not shown.

external/qcms/qcms_utils.js

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,71 @@
1414
*/
1515

1616
class QCMS {
17-
static _module = null;
17+
static #memoryArray = null;
18+
19+
static _memory = null;
1820

1921
static _mustAddAlpha = false;
2022

2123
static _destBuffer = null;
24+
25+
static _destOffset = 0;
26+
27+
static _destLength = 0;
28+
29+
static _cssColor = "";
30+
31+
static _makeHexColor = null;
32+
33+
static get _memoryArray() {
34+
const array = this.#memoryArray;
35+
if (array?.byteLength) {
36+
return array;
37+
}
38+
return (this.#memoryArray = new Uint8Array(this._memory.buffer));
39+
}
2240
}
2341

2442
function copy_result(ptr, len) {
2543
// This function is called from the wasm module (it's an external
2644
// "C" function). Its goal is to copy the result from the wasm memory
2745
// to the destination buffer without any intermediate copies.
28-
const { _module, _mustAddAlpha, _destBuffer } = QCMS;
29-
const result = new Uint8Array(_module.memory.buffer, ptr, len);
30-
if (result.length === _destBuffer.length) {
31-
_destBuffer.set(result);
46+
const { _mustAddAlpha, _destBuffer, _destOffset, _destLength, _memoryArray } =
47+
QCMS;
48+
if (len === _destLength) {
49+
_destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset);
3250
return;
3351
}
3452
if (_mustAddAlpha) {
35-
for (let i = 0, j = 0, ii = result.length; i < ii; i += 3, j += 4) {
36-
_destBuffer[j] = result[i];
37-
_destBuffer[j + 1] = result[i + 1];
38-
_destBuffer[j + 2] = result[i + 2];
53+
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
54+
_destBuffer[j] = _memoryArray[i];
55+
_destBuffer[j + 1] = _memoryArray[i + 1];
56+
_destBuffer[j + 2] = _memoryArray[i + 2];
3957
_destBuffer[j + 3] = 255;
4058
}
4159
} else {
42-
for (let i = 0, j = 0, ii = result.length; i < ii; i += 3, j += 4) {
43-
_destBuffer[j] = result[i];
44-
_destBuffer[j + 1] = result[i + 1];
45-
_destBuffer[j + 2] = result[i + 2];
60+
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
61+
_destBuffer[j] = _memoryArray[i];
62+
_destBuffer[j + 1] = _memoryArray[i + 1];
63+
_destBuffer[j + 2] = _memoryArray[i + 2];
4664
}
4765
}
4866
}
4967

5068
function copy_rgb(ptr) {
51-
QCMS._destBuffer.set(new Uint8Array(QCMS._module.memory.buffer, ptr, 3));
69+
const { _destBuffer, _destOffset, _memoryArray } = QCMS;
70+
_destBuffer[_destOffset] = _memoryArray[ptr];
71+
_destBuffer[_destOffset + 1] = _memoryArray[ptr + 1];
72+
_destBuffer[_destOffset + 2] = _memoryArray[ptr + 2];
73+
}
74+
75+
function make_cssRGB(ptr) {
76+
const { _memoryArray } = QCMS;
77+
QCMS._cssColor = QCMS._makeHexColor(
78+
_memoryArray[ptr],
79+
_memoryArray[ptr + 1],
80+
_memoryArray[ptr + 2]
81+
);
5282
}
5383

54-
export { copy_result, copy_rgb, QCMS };
84+
export { copy_result, copy_rgb, make_cssRGB, QCMS };

src/core/icc_colorspace.js

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
qcms_drop_transformer,
2525
qcms_transformer_from_memory,
2626
} from "../../external/qcms/qcms.js";
27-
import { shadow, warn } from "../shared/util.js";
27+
import { shadow, Util, warn } from "../shared/util.js";
2828
import { ColorSpace } from "./colorspace.js";
2929
import { QCMS } from "../../external/qcms/qcms_utils.js";
3030

@@ -63,28 +63,30 @@ class IccColorSpace extends ColorSpace {
6363
switch (numComps) {
6464
case 1:
6565
inType = DataType.Gray8;
66-
this.#convertPixel = (src, srcOffset) =>
67-
qcms_convert_one(this.#transformer, src[srcOffset] * 255);
66+
this.#convertPixel = (src, srcOffset, css) =>
67+
qcms_convert_one(this.#transformer, src[srcOffset] * 255, css);
6868
break;
6969
case 3:
7070
inType = DataType.RGB8;
71-
this.#convertPixel = (src, srcOffset) =>
71+
this.#convertPixel = (src, srcOffset, css) =>
7272
qcms_convert_three(
7373
this.#transformer,
7474
src[srcOffset] * 255,
7575
src[srcOffset + 1] * 255,
76-
src[srcOffset + 2] * 255
76+
src[srcOffset + 2] * 255,
77+
css
7778
);
7879
break;
7980
case 4:
8081
inType = DataType.CMYK;
81-
this.#convertPixel = (src, srcOffset) =>
82+
this.#convertPixel = (src, srcOffset, css) =>
8283
qcms_convert_four(
8384
this.#transformer,
8485
src[srcOffset] * 255,
8586
src[srcOffset + 1] * 255,
8687
src[srcOffset + 2] * 255,
87-
src[srcOffset + 3] * 255
88+
src[srcOffset + 3] * 255,
89+
css
8890
);
8991
break;
9092
default:
@@ -101,9 +103,16 @@ class IccColorSpace extends ColorSpace {
101103
IccColorSpace.#finalizer.register(this, this.#transformer);
102104
}
103105

106+
getRgbHex(src, srcOffset) {
107+
this.#convertPixel(src, srcOffset, /* css */ true);
108+
return QCMS._cssColor;
109+
}
110+
104111
getRgbItem(src, srcOffset, dest, destOffset) {
105-
QCMS._destBuffer = dest.subarray(destOffset, destOffset + 3);
106-
this.#convertPixel(src, srcOffset);
112+
QCMS._destBuffer = dest;
113+
QCMS._destOffset = destOffset;
114+
QCMS._destLength = 3;
115+
this.#convertPixel(src, srcOffset, /* css */ false);
107116
QCMS._destBuffer = null;
108117
}
109118

@@ -116,10 +125,9 @@ class IccColorSpace extends ColorSpace {
116125
}
117126
}
118127
QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer;
119-
QCMS._destBuffer = dest.subarray(
120-
destOffset,
121-
destOffset + count * (3 + alpha01)
122-
);
128+
QCMS._destBuffer = dest;
129+
QCMS._destOffset = destOffset;
130+
QCMS._destLength = count * (3 + alpha01);
123131
qcms_convert_array(this.#transformer, src);
124132
QCMS._mustAddAlpha = false;
125133
QCMS._destBuffer = null;
@@ -143,10 +151,12 @@ class IccColorSpace extends ColorSpace {
143151
if (this.#useWasm) {
144152
if (this.#wasmUrl) {
145153
try {
146-
this._module = QCMS._module = initSync({
154+
this._module = initSync({
147155
module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`),
148156
});
149157
isUsable = !!this._module;
158+
QCMS._memory = this._module.memory;
159+
QCMS._makeHexColor = Util.makeHexColor;
150160
} catch (e) {
151161
warn(`ICCBased color space: "${e}".`);
152162
}

0 commit comments

Comments
 (0)