@alexislours/ltd-textures 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +55 -0
- package/build/ugc.wasm +0 -0
- package/dist/bridge.d.ts +24 -0
- package/dist/browser.d.ts +6 -0
- package/dist/browser.js +16 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-Q7WR2GWO.js +446 -0
- package/dist/chunk-Q7WR2GWO.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/threadPool.d.ts +15 -0
- package/dist/types.d.ts +18 -0
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +72 -0
- package/dist/worker.js.map +1 -0
- package/package.json +64 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @alexislours/ltd-textures
|
|
2
|
+
|
|
3
|
+
Tegra/Switch GPU texture toolkit in WebAssembly: block-linear (de)swizzle, BC1/BC3 transcode, sRGB/linear conversion, and image resize. No bundler assumptions, no Vite magic; you bring the wasm bytes and (optionally) a worker factory.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install @alexislours/ltd-textures
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Portable core. Supply the wasm bytes however your environment loads them:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { createUgcWasm } from '@alexislours/ltd-textures';
|
|
17
|
+
|
|
18
|
+
const wasm = await createUgcWasm({
|
|
19
|
+
wasm: fetch(new URL('@alexislours/ltd-textures/ugc.wasm', import.meta.url)),
|
|
20
|
+
});
|
|
21
|
+
const rgba = wasm.bc3Decode(blocks, width, height);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Multi-threaded BC encoding is opt-in via a worker factory. Without one, the
|
|
25
|
+
threaded methods transparently fall back to single-threaded encoding:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import UgcWorker from '@alexislours/ltd-textures/worker?worker'; // Vite example
|
|
29
|
+
|
|
30
|
+
const wasm = await createUgcWasm({
|
|
31
|
+
wasm: fetch(wasmUrl),
|
|
32
|
+
createWorker: () => new UgcWorker(),
|
|
33
|
+
});
|
|
34
|
+
await wasm.bc1EncodeThreaded(linRgba, srgbRgba, w, h, mode, threads);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
In a Vite/webpack browser app, the `./browser` entry resolves the bundled wasm for you:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { loadUgcWasm } from '@alexislours/ltd-textures/browser';
|
|
41
|
+
import UgcWorker from '@alexislours/ltd-textures/worker?worker'; // Vite example
|
|
42
|
+
|
|
43
|
+
const wasm = await loadUgcWasm({ createWorker: () => new UgcWorker() });
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Entry points
|
|
47
|
+
|
|
48
|
+
- `.` the portable `createUgcWasm` API plus `Bc1Mode`/`FitMode`/`Matte`.
|
|
49
|
+
- `./browser` convenience loader that fetches the shipped wasm via `import.meta.url`.
|
|
50
|
+
- `./worker` the BC-encode worker entry (instantiate as a module worker).
|
|
51
|
+
- `./ugc.wasm` the prebuilt binary asset.
|
|
52
|
+
|
|
53
|
+
## License
|
|
54
|
+
|
|
55
|
+
AGPL-3.0-or-later
|
package/build/ugc.wasm
ADDED
|
Binary file
|
package/dist/bridge.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Bc1Mode, FitMode, type Matte } from './types.js';
|
|
2
|
+
import { type CreateWorker } from './threadPool.js';
|
|
3
|
+
export interface UgcWasm {
|
|
4
|
+
bc1Decode(blocks: Uint8Array, w: number, h: number): Uint8Array;
|
|
5
|
+
bc3Decode(blocks: Uint8Array, w: number, h: number): Uint8Array;
|
|
6
|
+
bc1Encode(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number, mode: Bc1Mode): Uint8Array;
|
|
7
|
+
bc1EncodeRgbcx(linRgba: Float32Array, w: number, h: number): Uint8Array;
|
|
8
|
+
bc3Encode(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number): Uint8Array;
|
|
9
|
+
bc1EncodeThreaded(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number, mode: Bc1Mode, threads: number): Promise<Uint8Array>;
|
|
10
|
+
bc3EncodeThreaded(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number, threads: number): Promise<Uint8Array>;
|
|
11
|
+
deswizzle(swizzled: Uint8Array, width: number, height: number, bpe: number, blockHeight: number): Uint8Array;
|
|
12
|
+
swizzle(linear: Uint8Array, width: number, height: number, bpe: number, blockHeight: number, base: Uint8Array | null): Uint8Array;
|
|
13
|
+
srgbToLinearF32(rgba: Uint8Array): Float32Array;
|
|
14
|
+
linearF32ToU8(linear: Float32Array): Uint8Array;
|
|
15
|
+
linearU8ToSrgbU8InPlace(rgba: Uint8Array): void;
|
|
16
|
+
resize(rgba: Uint8Array, srcW: number, srcH: number, dstW: number, dstH: number, fit: FitMode, matte: Matte | null): Uint8Array;
|
|
17
|
+
terminateThreadPool(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export type WasmSource = ArrayBuffer | Uint8Array | Response | Promise<ArrayBuffer | Uint8Array | Response>;
|
|
20
|
+
export interface CreateUgcWasmOptions {
|
|
21
|
+
wasm: WasmSource;
|
|
22
|
+
createWorker?: CreateWorker;
|
|
23
|
+
}
|
|
24
|
+
export declare function createUgcWasm(options: CreateUgcWasmOptions): Promise<UgcWasm>;
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createUgcWasm
|
|
3
|
+
} from "./chunk-Q7WR2GWO.js";
|
|
4
|
+
|
|
5
|
+
// src/browser.ts
|
|
6
|
+
var WASM_URL = new URL("../build/ugc.wasm", import.meta.url);
|
|
7
|
+
function loadUgcWasm(options = {}) {
|
|
8
|
+
return createUgcWasm({
|
|
9
|
+
wasm: fetch(WASM_URL),
|
|
10
|
+
createWorker: options.createWorker
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
loadUgcWasm
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"sourcesContent":["import { createUgcWasm, type UgcWasm } from './bridge.js';\nimport type { CreateWorker } from './threadPool.js';\n\nexport interface BrowserLoadOptions {\n createWorker?: CreateWorker;\n}\n\nconst WASM_URL = new URL('../build/ugc.wasm', import.meta.url);\n\nexport function loadUgcWasm(options: BrowserLoadOptions = {}): Promise<UgcWasm> {\n return createUgcWasm({\n wasm: fetch(WASM_URL),\n createWorker: options.createWorker,\n });\n}\n"],"mappings":";;;;;AAOA,IAAM,WAAW,IAAI,IAAI,qBAAqB,YAAY,GAAG;AAEtD,SAAS,YAAY,UAA8B,CAAC,GAAqB;AAC9E,SAAO,cAAc;AAAA,IACnB,MAAM,MAAM,QAAQ;AAAA,IACpB,cAAc,QAAQ;AAAA,EACxB,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
// src/types.ts
|
|
2
|
+
var Bc1Mode = {
|
|
3
|
+
Auto: 0,
|
|
4
|
+
FourColor: 1,
|
|
5
|
+
ThreeColor: 2
|
|
6
|
+
};
|
|
7
|
+
var FitMode = {
|
|
8
|
+
Fill: 0,
|
|
9
|
+
Contain: 1,
|
|
10
|
+
Cover: 2
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// src/threadPool.ts
|
|
14
|
+
var WORKER_INIT_TIMEOUT_MS = 15e3;
|
|
15
|
+
function formatWorkerErrorEvent(e) {
|
|
16
|
+
const ev = e;
|
|
17
|
+
const parts = [];
|
|
18
|
+
if (ev.message) parts.push(ev.message);
|
|
19
|
+
if (ev.error) {
|
|
20
|
+
if (ev.error.message && ev.error.message !== ev.message) parts.push(ev.error.message);
|
|
21
|
+
if (ev.error.stack) parts.push(ev.error.stack);
|
|
22
|
+
}
|
|
23
|
+
if (ev.filename) parts.push(`at ${ev.filename}:${ev.lineno}:${ev.colno}`);
|
|
24
|
+
return parts.length > 0 ? parts.join(" | ") : "unknown worker error";
|
|
25
|
+
}
|
|
26
|
+
function wrapWorker(w) {
|
|
27
|
+
return {
|
|
28
|
+
postMessage: (msg, transfer) => w.postMessage(msg, transfer ?? []),
|
|
29
|
+
setMessageHandler: (cb) => {
|
|
30
|
+
w.onmessage = (e) => cb(e.data);
|
|
31
|
+
},
|
|
32
|
+
setErrorHandler: (cb) => {
|
|
33
|
+
w.onerror = (e) => cb(formatWorkerErrorEvent(e));
|
|
34
|
+
w.onmessageerror = () => cb("messageerror");
|
|
35
|
+
},
|
|
36
|
+
terminate: () => w.terminate()
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function createThreadPool(wasmBytes, createWorker) {
|
|
40
|
+
let pool = null;
|
|
41
|
+
let nextId = 1;
|
|
42
|
+
const pending = /* @__PURE__ */ new Map();
|
|
43
|
+
function rejectAllPending(err) {
|
|
44
|
+
for (const [id, cb] of pending) {
|
|
45
|
+
pending.delete(id);
|
|
46
|
+
cb.reject(err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function dispatchListener(msg) {
|
|
50
|
+
if (msg.type === "done") {
|
|
51
|
+
const cb = pending.get(msg.id);
|
|
52
|
+
if (cb) {
|
|
53
|
+
pending.delete(msg.id);
|
|
54
|
+
cb.resolve(new Uint8Array(msg.blocks));
|
|
55
|
+
}
|
|
56
|
+
} else if (msg.type === "error" && msg.id != null) {
|
|
57
|
+
const cb = pending.get(msg.id);
|
|
58
|
+
pending.delete(msg.id);
|
|
59
|
+
cb?.reject(new Error(msg.error));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function bootWorker() {
|
|
63
|
+
const handle = wrapWorker(createWorker());
|
|
64
|
+
try {
|
|
65
|
+
await new Promise((resolve, reject) => {
|
|
66
|
+
const timer = setTimeout(() => {
|
|
67
|
+
reject(new Error("Worker init timed out"));
|
|
68
|
+
}, WORKER_INIT_TIMEOUT_MS);
|
|
69
|
+
const finish = (fn) => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
fn();
|
|
72
|
+
};
|
|
73
|
+
handle.setMessageHandler((msg) => {
|
|
74
|
+
if (msg.type === "ready") {
|
|
75
|
+
finish(() => {
|
|
76
|
+
handle.setMessageHandler(dispatchListener);
|
|
77
|
+
handle.setErrorHandler((err) => rejectAllPending(new Error(`Worker error: ${err}`)));
|
|
78
|
+
resolve();
|
|
79
|
+
});
|
|
80
|
+
} else if (msg.type === "error") {
|
|
81
|
+
finish(() => reject(new Error(msg.error)));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
handle.setErrorHandler((err) => {
|
|
85
|
+
finish(() => reject(new Error(`Worker init error: ${err}`)));
|
|
86
|
+
});
|
|
87
|
+
handle.postMessage({ type: "init", wasmBytes });
|
|
88
|
+
});
|
|
89
|
+
} catch (e) {
|
|
90
|
+
handle.terminate();
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
return handle;
|
|
94
|
+
}
|
|
95
|
+
async function ensurePool(threads) {
|
|
96
|
+
if (pool && pool.length >= threads) return;
|
|
97
|
+
if (!pool) pool = [];
|
|
98
|
+
const need = threads - pool.length;
|
|
99
|
+
if (need <= 0) return;
|
|
100
|
+
const results = await Promise.allSettled(Array.from({ length: need }, () => bootWorker()));
|
|
101
|
+
const fulfilled = [];
|
|
102
|
+
let firstError = null;
|
|
103
|
+
for (const r of results) {
|
|
104
|
+
if (r.status === "fulfilled") fulfilled.push(r.value);
|
|
105
|
+
else if (firstError == null) firstError = r.reason;
|
|
106
|
+
}
|
|
107
|
+
if (firstError != null) {
|
|
108
|
+
for (const h of fulfilled) h.terminate();
|
|
109
|
+
throw firstError;
|
|
110
|
+
}
|
|
111
|
+
pool.push(...fulfilled);
|
|
112
|
+
}
|
|
113
|
+
function dispatchEncode(idx, op, linF, srgbU, w, h, mode, transfer) {
|
|
114
|
+
const id = nextId++;
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
pending.set(id, { resolve, reject });
|
|
117
|
+
pool[idx].postMessage({ type: "encode", id, op, linF, srgbU, w, h, mode }, transfer);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function partition(blocksY, threads) {
|
|
121
|
+
const base = Math.floor(blocksY / threads);
|
|
122
|
+
const extra = blocksY % threads;
|
|
123
|
+
const out = [];
|
|
124
|
+
for (let i = 0; i < threads; i++) {
|
|
125
|
+
const sz = base + (i < extra ? 1 : 0);
|
|
126
|
+
if (sz > 0) out.push(sz);
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
async function encodeThreaded(op, linRgba, srgbRgba, w, h, mode, threads, bytesPerBlock) {
|
|
131
|
+
if (w % 4 !== 0 || h % 4 !== 0) {
|
|
132
|
+
throw new Error(`encodeThreaded: width and height must be 4-aligned, got ${w}x${h}`);
|
|
133
|
+
}
|
|
134
|
+
await ensurePool(threads);
|
|
135
|
+
const blocksY = h / 4;
|
|
136
|
+
const blocksX = w / 4;
|
|
137
|
+
const sizes = partition(blocksY, threads);
|
|
138
|
+
const promises = [];
|
|
139
|
+
let yOff = 0;
|
|
140
|
+
for (let i = 0; i < sizes.length; i++) {
|
|
141
|
+
const sliceBlocksY = sizes[i];
|
|
142
|
+
const slicePxRows = sliceBlocksY * 4;
|
|
143
|
+
const elemStart = yOff * 4 * w * 4;
|
|
144
|
+
const elemEnd = (yOff + sliceBlocksY) * 4 * w * 4;
|
|
145
|
+
const byteStart = yOff * 4 * w * 4;
|
|
146
|
+
const byteEnd = (yOff + sliceBlocksY) * 4 * w * 4;
|
|
147
|
+
const linAB = new ArrayBuffer((elemEnd - elemStart) * 4);
|
|
148
|
+
const linF = new Float32Array(linAB);
|
|
149
|
+
linF.set(linRgba.subarray(elemStart, elemEnd));
|
|
150
|
+
const srgbAB = new ArrayBuffer(byteEnd - byteStart);
|
|
151
|
+
const srgbU = new Uint8Array(srgbAB);
|
|
152
|
+
srgbU.set(srgbRgba.subarray(byteStart, byteEnd));
|
|
153
|
+
promises.push(dispatchEncode(i, op, linF, srgbU, w, slicePxRows, mode, [linAB, srgbAB]));
|
|
154
|
+
yOff += sliceBlocksY;
|
|
155
|
+
}
|
|
156
|
+
const parts = await Promise.all(promises);
|
|
157
|
+
const total = blocksY * blocksX * bytesPerBlock;
|
|
158
|
+
const out = new Uint8Array(total);
|
|
159
|
+
let writeOff = 0;
|
|
160
|
+
for (const p of parts) {
|
|
161
|
+
out.set(p, writeOff);
|
|
162
|
+
writeOff += p.byteLength;
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
bc1Encode(linRgba, srgbRgba, w, h, mode, threads) {
|
|
168
|
+
return encodeThreaded("bc1", linRgba, srgbRgba, w, h, mode, threads, 8);
|
|
169
|
+
},
|
|
170
|
+
bc3Encode(linRgba, srgbRgba, w, h, threads) {
|
|
171
|
+
return encodeThreaded("bc3", linRgba, srgbRgba, w, h, 0, threads, 16);
|
|
172
|
+
},
|
|
173
|
+
async terminate() {
|
|
174
|
+
rejectAllPending(new Error("Thread pool terminated"));
|
|
175
|
+
if (!pool) return;
|
|
176
|
+
for (const w of pool) w.terminate();
|
|
177
|
+
pool = null;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/bridge.ts
|
|
183
|
+
function divRoundUp(n, d) {
|
|
184
|
+
return Math.floor((n + d - 1) / d);
|
|
185
|
+
}
|
|
186
|
+
function paddedSwizzleSize(width, height, bpe, blockHeight) {
|
|
187
|
+
const widthInGobs = divRoundUp(width * bpe, 64);
|
|
188
|
+
const paddedHeight = divRoundUp(height, 8 * blockHeight) * (8 * blockHeight);
|
|
189
|
+
return widthInGobs * paddedHeight * 64;
|
|
190
|
+
}
|
|
191
|
+
var importObject = {
|
|
192
|
+
env: {
|
|
193
|
+
abort() {
|
|
194
|
+
throw new Error("ugc.wasm aborted");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
async function toBytes(src) {
|
|
199
|
+
const s = await src;
|
|
200
|
+
if (s instanceof ArrayBuffer) return s;
|
|
201
|
+
if (typeof Response !== "undefined" && s instanceof Response) return await s.arrayBuffer();
|
|
202
|
+
if (s instanceof Uint8Array) {
|
|
203
|
+
return s.buffer.slice(s.byteOffset, s.byteOffset + s.byteLength);
|
|
204
|
+
}
|
|
205
|
+
throw new Error("createUgcWasm: unsupported wasm source");
|
|
206
|
+
}
|
|
207
|
+
function makeWasm(instance, pool) {
|
|
208
|
+
const exports = instance.exports;
|
|
209
|
+
const memory = exports.memory;
|
|
210
|
+
function u8(ptr, len) {
|
|
211
|
+
return new Uint8Array(memory.buffer, ptr, len);
|
|
212
|
+
}
|
|
213
|
+
function f32(ptr, len) {
|
|
214
|
+
return new Float32Array(memory.buffer, ptr, len);
|
|
215
|
+
}
|
|
216
|
+
function bc1Encode(linRgba, srgbRgba, w, h, mode) {
|
|
217
|
+
const m = exports.mark();
|
|
218
|
+
try {
|
|
219
|
+
const pixels = w * h;
|
|
220
|
+
const linLen = pixels * 16;
|
|
221
|
+
const srgbLen = pixels * 4;
|
|
222
|
+
const outLen = pixels / 16 * 8;
|
|
223
|
+
const linPtr = exports.alloc(linLen);
|
|
224
|
+
const srgbPtr = exports.alloc(srgbLen);
|
|
225
|
+
const outPtr = exports.alloc(outLen);
|
|
226
|
+
f32(linPtr, pixels * 4).set(linRgba);
|
|
227
|
+
u8(srgbPtr, srgbLen).set(srgbRgba);
|
|
228
|
+
exports.bc1Encode(linPtr, srgbPtr, outPtr, w, h, mode);
|
|
229
|
+
const out = new Uint8Array(outLen);
|
|
230
|
+
out.set(u8(outPtr, outLen));
|
|
231
|
+
return out;
|
|
232
|
+
} finally {
|
|
233
|
+
exports.release(m);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function bc3Encode(linRgba, srgbRgba, w, h) {
|
|
237
|
+
const m = exports.mark();
|
|
238
|
+
try {
|
|
239
|
+
const pixels = w * h;
|
|
240
|
+
const linLen = pixels * 16;
|
|
241
|
+
const srgbLen = pixels * 4;
|
|
242
|
+
const outLen = pixels / 16 * 16;
|
|
243
|
+
const linPtr = exports.alloc(linLen);
|
|
244
|
+
const srgbPtr = exports.alloc(srgbLen);
|
|
245
|
+
const outPtr = exports.alloc(outLen);
|
|
246
|
+
f32(linPtr, pixels * 4).set(linRgba);
|
|
247
|
+
u8(srgbPtr, srgbLen).set(srgbRgba);
|
|
248
|
+
exports.bc3Encode(linPtr, srgbPtr, outPtr, w, h);
|
|
249
|
+
const out = new Uint8Array(outLen);
|
|
250
|
+
out.set(u8(outPtr, outLen));
|
|
251
|
+
return out;
|
|
252
|
+
} finally {
|
|
253
|
+
exports.release(m);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
bc1Decode(blocks, w, h) {
|
|
258
|
+
const m = exports.mark();
|
|
259
|
+
try {
|
|
260
|
+
const inLen = blocks.byteLength;
|
|
261
|
+
const outLen = w * h * 4;
|
|
262
|
+
const inPtr = exports.alloc(inLen);
|
|
263
|
+
const outPtr = exports.alloc(outLen);
|
|
264
|
+
u8(inPtr, inLen).set(blocks);
|
|
265
|
+
exports.bc1Decode(inPtr, outPtr, w, h);
|
|
266
|
+
const out = new Uint8Array(outLen);
|
|
267
|
+
out.set(u8(outPtr, outLen));
|
|
268
|
+
return out;
|
|
269
|
+
} finally {
|
|
270
|
+
exports.release(m);
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
bc3Decode(blocks, w, h) {
|
|
274
|
+
const m = exports.mark();
|
|
275
|
+
try {
|
|
276
|
+
const inLen = blocks.byteLength;
|
|
277
|
+
const outLen = w * h * 4;
|
|
278
|
+
const inPtr = exports.alloc(inLen);
|
|
279
|
+
const outPtr = exports.alloc(outLen);
|
|
280
|
+
u8(inPtr, inLen).set(blocks);
|
|
281
|
+
exports.bc3Decode(inPtr, outPtr, w, h);
|
|
282
|
+
const out = new Uint8Array(outLen);
|
|
283
|
+
out.set(u8(outPtr, outLen));
|
|
284
|
+
return out;
|
|
285
|
+
} finally {
|
|
286
|
+
exports.release(m);
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
bc1Encode,
|
|
290
|
+
bc1EncodeRgbcx(linRgba, w, h) {
|
|
291
|
+
const m = exports.mark();
|
|
292
|
+
try {
|
|
293
|
+
const pixels = w * h;
|
|
294
|
+
const linLen = pixels * 16;
|
|
295
|
+
const outLen = pixels / 16 * 8;
|
|
296
|
+
const linPtr = exports.alloc(linLen);
|
|
297
|
+
const outPtr = exports.alloc(outLen);
|
|
298
|
+
f32(linPtr, pixels * 4).set(linRgba);
|
|
299
|
+
exports.bc1EncodeRgbcx(linPtr, outPtr, w, h);
|
|
300
|
+
const out = new Uint8Array(outLen);
|
|
301
|
+
out.set(u8(outPtr, outLen));
|
|
302
|
+
return out;
|
|
303
|
+
} finally {
|
|
304
|
+
exports.release(m);
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
bc3Encode,
|
|
308
|
+
bc1EncodeThreaded(linRgba, srgbRgba, w, h, mode, threads) {
|
|
309
|
+
if (pool) return pool.bc1Encode(linRgba, srgbRgba, w, h, mode, threads);
|
|
310
|
+
return Promise.resolve(bc1Encode(linRgba, srgbRgba, w, h, mode));
|
|
311
|
+
},
|
|
312
|
+
bc3EncodeThreaded(linRgba, srgbRgba, w, h, threads) {
|
|
313
|
+
if (pool) return pool.bc3Encode(linRgba, srgbRgba, w, h, threads);
|
|
314
|
+
return Promise.resolve(bc3Encode(linRgba, srgbRgba, w, h));
|
|
315
|
+
},
|
|
316
|
+
deswizzle(swizzled, width, height, bpe, blockHeight) {
|
|
317
|
+
const m = exports.mark();
|
|
318
|
+
try {
|
|
319
|
+
const inLen = swizzled.byteLength;
|
|
320
|
+
const outLen = width * height * bpe;
|
|
321
|
+
const inPtr = exports.alloc(inLen);
|
|
322
|
+
const outPtr = exports.alloc(outLen);
|
|
323
|
+
u8(inPtr, inLen).set(swizzled);
|
|
324
|
+
exports.deswizzleBlockLinear(inPtr, inLen, outPtr, width, height, bpe, blockHeight);
|
|
325
|
+
const out = new Uint8Array(outLen);
|
|
326
|
+
out.set(u8(outPtr, outLen));
|
|
327
|
+
return out;
|
|
328
|
+
} finally {
|
|
329
|
+
exports.release(m);
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
swizzle(linear, width, height, bpe, blockHeight, base) {
|
|
333
|
+
const m = exports.mark();
|
|
334
|
+
try {
|
|
335
|
+
const inLen = linear.byteLength;
|
|
336
|
+
const outLen = paddedSwizzleSize(width, height, bpe, blockHeight);
|
|
337
|
+
const useBase = base != null && base.byteLength === outLen;
|
|
338
|
+
const baseLen = useBase ? base.byteLength : 0;
|
|
339
|
+
const inPtr = exports.alloc(inLen);
|
|
340
|
+
const outPtr = exports.alloc(outLen);
|
|
341
|
+
const basePtr = useBase ? exports.alloc(baseLen) : 0;
|
|
342
|
+
u8(inPtr, inLen).set(linear);
|
|
343
|
+
if (useBase) u8(basePtr, baseLen).set(base);
|
|
344
|
+
exports.swizzleBlockLinear(
|
|
345
|
+
inPtr,
|
|
346
|
+
inLen,
|
|
347
|
+
outPtr,
|
|
348
|
+
outLen,
|
|
349
|
+
width,
|
|
350
|
+
height,
|
|
351
|
+
bpe,
|
|
352
|
+
blockHeight,
|
|
353
|
+
basePtr,
|
|
354
|
+
baseLen
|
|
355
|
+
);
|
|
356
|
+
const out = new Uint8Array(outLen);
|
|
357
|
+
out.set(u8(outPtr, outLen));
|
|
358
|
+
return out;
|
|
359
|
+
} finally {
|
|
360
|
+
exports.release(m);
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
srgbToLinearF32(rgba) {
|
|
364
|
+
const m = exports.mark();
|
|
365
|
+
try {
|
|
366
|
+
const pixels = rgba.byteLength / 4;
|
|
367
|
+
const inLen = rgba.byteLength;
|
|
368
|
+
const outLen = pixels * 16;
|
|
369
|
+
const inPtr = exports.alloc(inLen);
|
|
370
|
+
const outPtr = exports.alloc(outLen);
|
|
371
|
+
u8(inPtr, inLen).set(rgba);
|
|
372
|
+
exports.srgbU8ToLinearF32(inPtr, outPtr, pixels);
|
|
373
|
+
const out = new Float32Array(pixels * 4);
|
|
374
|
+
out.set(f32(outPtr, pixels * 4));
|
|
375
|
+
return out;
|
|
376
|
+
} finally {
|
|
377
|
+
exports.release(m);
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
linearF32ToU8(linear) {
|
|
381
|
+
const m = exports.mark();
|
|
382
|
+
try {
|
|
383
|
+
const count = linear.length;
|
|
384
|
+
const inLen = count * 4;
|
|
385
|
+
const outLen = count;
|
|
386
|
+
const inPtr = exports.alloc(inLen);
|
|
387
|
+
const outPtr = exports.alloc(outLen);
|
|
388
|
+
f32(inPtr, count).set(linear);
|
|
389
|
+
exports.linearF32ToLinearU8(inPtr, outPtr, count);
|
|
390
|
+
const out = new Uint8Array(outLen);
|
|
391
|
+
out.set(u8(outPtr, outLen));
|
|
392
|
+
return out;
|
|
393
|
+
} finally {
|
|
394
|
+
exports.release(m);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
linearU8ToSrgbU8InPlace(rgba) {
|
|
398
|
+
const m = exports.mark();
|
|
399
|
+
try {
|
|
400
|
+
const len = rgba.byteLength;
|
|
401
|
+
const ptr = exports.alloc(len);
|
|
402
|
+
u8(ptr, len).set(rgba);
|
|
403
|
+
exports.convertLinearU8ToSrgbU8(ptr, len);
|
|
404
|
+
rgba.set(u8(ptr, len));
|
|
405
|
+
} finally {
|
|
406
|
+
exports.release(m);
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
resize(rgba, srcW, srcH, dstW, dstH, fit, matte) {
|
|
410
|
+
const m = exports.mark();
|
|
411
|
+
try {
|
|
412
|
+
const inLen = srcW * srcH * 4;
|
|
413
|
+
const outLen = dstW * dstH * 4;
|
|
414
|
+
const inPtr = exports.alloc(inLen);
|
|
415
|
+
const outPtr = exports.alloc(outLen);
|
|
416
|
+
u8(inPtr, inLen).set(rgba);
|
|
417
|
+
const mr = matte ? matte.r : 0;
|
|
418
|
+
const mg = matte ? matte.g : 0;
|
|
419
|
+
const mb = matte ? matte.b : 0;
|
|
420
|
+
const ma = matte ? matte.a : 0;
|
|
421
|
+
exports.resizeRgba(inPtr, srcW, srcH, outPtr, dstW, dstH, fit, mr, mg, mb, ma);
|
|
422
|
+
const out = new Uint8Array(outLen);
|
|
423
|
+
out.set(u8(outPtr, outLen));
|
|
424
|
+
return out;
|
|
425
|
+
} finally {
|
|
426
|
+
exports.release(m);
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
async terminateThreadPool() {
|
|
430
|
+
if (pool) await pool.terminate();
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
async function createUgcWasm(options) {
|
|
435
|
+
const bytes = await toBytes(options.wasm);
|
|
436
|
+
const { instance } = await WebAssembly.instantiate(bytes, importObject);
|
|
437
|
+
const pool = options.createWorker ? createThreadPool(bytes, options.createWorker) : null;
|
|
438
|
+
return makeWasm(instance, pool);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
export {
|
|
442
|
+
Bc1Mode,
|
|
443
|
+
FitMode,
|
|
444
|
+
createUgcWasm
|
|
445
|
+
};
|
|
446
|
+
//# sourceMappingURL=chunk-Q7WR2GWO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/threadPool.ts","../src/bridge.ts"],"sourcesContent":["export const Bc1Mode = {\n Auto: 0,\n FourColor: 1,\n ThreeColor: 2,\n} as const;\nexport type Bc1Mode = (typeof Bc1Mode)[keyof typeof Bc1Mode];\n\nexport const FitMode = {\n Fill: 0,\n Contain: 1,\n Cover: 2,\n} as const;\nexport type FitMode = (typeof FitMode)[keyof typeof FitMode];\n\nexport type Matte = { r: number; g: number; b: number; a: number };\n","import { Bc1Mode } from './types.js';\n\nexport type WorkerLike = {\n postMessage(msg: unknown, transfer?: Transferable[]): void;\n onmessage: ((e: MessageEvent) => void) | null;\n onerror: ((e: ErrorEvent) => void) | null;\n onmessageerror?: ((e: MessageEvent) => void) | null;\n terminate(): void;\n};\n\nexport type CreateWorker = () => WorkerLike;\n\ntype WorkerHandle = {\n postMessage(msg: unknown, transfer?: Transferable[]): void;\n setMessageHandler(cb: (msg: WorkerMessage) => void): void;\n setErrorHandler(cb: (err: unknown) => void): void;\n terminate(): void;\n};\n\ntype WorkerMessage =\n | { type: 'ready' }\n | { type: 'done'; id: number; blocks: ArrayBuffer }\n | { type: 'error'; id?: number; error: string };\n\nexport type ThreadPool = {\n bc1Encode(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n mode: Bc1Mode,\n threads: number,\n ): Promise<Uint8Array>;\n bc3Encode(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n threads: number,\n ): Promise<Uint8Array>;\n terminate(): Promise<void>;\n};\n\nconst WORKER_INIT_TIMEOUT_MS = 15000;\n\nfunction formatWorkerErrorEvent(e: unknown): string {\n const ev = e as Partial<ErrorEvent> & { error?: { message?: string; stack?: string } };\n const parts: string[] = [];\n if (ev.message) parts.push(ev.message);\n if (ev.error) {\n if (ev.error.message && ev.error.message !== ev.message) parts.push(ev.error.message);\n if (ev.error.stack) parts.push(ev.error.stack);\n }\n if (ev.filename) parts.push(`at ${ev.filename}:${ev.lineno}:${ev.colno}`);\n return parts.length > 0 ? parts.join(' | ') : 'unknown worker error';\n}\n\nfunction wrapWorker(w: WorkerLike): WorkerHandle {\n return {\n postMessage: (msg, transfer) => w.postMessage(msg, transfer ?? []),\n setMessageHandler: (cb) => {\n w.onmessage = (e: MessageEvent) => cb(e.data as WorkerMessage);\n },\n setErrorHandler: (cb) => {\n w.onerror = (e: unknown) => cb(formatWorkerErrorEvent(e));\n w.onmessageerror = () => cb('messageerror');\n },\n terminate: () => w.terminate(),\n };\n}\n\nexport function createThreadPool(wasmBytes: ArrayBuffer, createWorker: CreateWorker): ThreadPool {\n let pool: WorkerHandle[] | null = null;\n let nextId = 1;\n type Pending = { resolve: (out: Uint8Array) => void; reject: (err: unknown) => void };\n const pending = new Map<number, Pending>();\n\n function rejectAllPending(err: unknown): void {\n for (const [id, cb] of pending) {\n pending.delete(id);\n cb.reject(err);\n }\n }\n\n function dispatchListener(msg: WorkerMessage): void {\n if (msg.type === 'done') {\n const cb = pending.get(msg.id);\n if (cb) {\n pending.delete(msg.id);\n cb.resolve(new Uint8Array(msg.blocks));\n }\n } else if (msg.type === 'error' && msg.id != null) {\n const cb = pending.get(msg.id);\n pending.delete(msg.id);\n cb?.reject(new Error(msg.error));\n }\n }\n\n async function bootWorker(): Promise<WorkerHandle> {\n const handle = wrapWorker(createWorker());\n try {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('Worker init timed out'));\n }, WORKER_INIT_TIMEOUT_MS);\n const finish = (fn: () => void): void => {\n clearTimeout(timer);\n fn();\n };\n handle.setMessageHandler((msg) => {\n if (msg.type === 'ready') {\n finish(() => {\n handle.setMessageHandler(dispatchListener);\n handle.setErrorHandler((err) => rejectAllPending(new Error(`Worker error: ${err}`)));\n resolve();\n });\n } else if (msg.type === 'error') {\n finish(() => reject(new Error(msg.error)));\n }\n });\n handle.setErrorHandler((err) => {\n finish(() => reject(new Error(`Worker init error: ${err}`)));\n });\n handle.postMessage({ type: 'init', wasmBytes });\n });\n } catch (e) {\n handle.terminate();\n throw e;\n }\n return handle;\n }\n\n async function ensurePool(threads: number): Promise<void> {\n if (pool && pool.length >= threads) return;\n if (!pool) pool = [];\n const need = threads - pool.length;\n if (need <= 0) return;\n const results = await Promise.allSettled(Array.from({ length: need }, () => bootWorker()));\n const fulfilled: WorkerHandle[] = [];\n let firstError: unknown = null;\n for (const r of results) {\n if (r.status === 'fulfilled') fulfilled.push(r.value);\n else if (firstError == null) firstError = r.reason;\n }\n if (firstError != null) {\n for (const h of fulfilled) h.terminate();\n throw firstError;\n }\n pool.push(...fulfilled);\n }\n\n function dispatchEncode(\n idx: number,\n op: 'bc1' | 'bc3',\n linF: Float32Array,\n srgbU: Uint8Array,\n w: number,\n h: number,\n mode: number,\n transfer: Transferable[],\n ): Promise<Uint8Array> {\n const id = nextId++;\n return new Promise<Uint8Array>((resolve, reject) => {\n pending.set(id, { resolve, reject });\n pool![idx].postMessage({ type: 'encode', id, op, linF, srgbU, w, h, mode }, transfer);\n });\n }\n\n function partition(blocksY: number, threads: number): number[] {\n const base = Math.floor(blocksY / threads);\n const extra = blocksY % threads;\n const out: number[] = [];\n for (let i = 0; i < threads; i++) {\n const sz = base + (i < extra ? 1 : 0);\n if (sz > 0) out.push(sz);\n }\n return out;\n }\n\n async function encodeThreaded(\n op: 'bc1' | 'bc3',\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n mode: number,\n threads: number,\n bytesPerBlock: number,\n ): Promise<Uint8Array> {\n if (w % 4 !== 0 || h % 4 !== 0) {\n throw new Error(`encodeThreaded: width and height must be 4-aligned, got ${w}x${h}`);\n }\n await ensurePool(threads);\n const blocksY = h / 4;\n const blocksX = w / 4;\n const sizes = partition(blocksY, threads);\n const promises: Promise<Uint8Array>[] = [];\n let yOff = 0;\n for (let i = 0; i < sizes.length; i++) {\n const sliceBlocksY = sizes[i];\n const slicePxRows = sliceBlocksY * 4;\n const elemStart = yOff * 4 * w * 4;\n const elemEnd = (yOff + sliceBlocksY) * 4 * w * 4;\n const byteStart = yOff * 4 * w * 4;\n const byteEnd = (yOff + sliceBlocksY) * 4 * w * 4;\n const linAB = new ArrayBuffer((elemEnd - elemStart) * 4);\n const linF = new Float32Array(linAB);\n linF.set(linRgba.subarray(elemStart, elemEnd));\n const srgbAB = new ArrayBuffer(byteEnd - byteStart);\n const srgbU = new Uint8Array(srgbAB);\n srgbU.set(srgbRgba.subarray(byteStart, byteEnd));\n promises.push(dispatchEncode(i, op, linF, srgbU, w, slicePxRows, mode, [linAB, srgbAB]));\n yOff += sliceBlocksY;\n }\n const parts = await Promise.all(promises);\n const total = blocksY * blocksX * bytesPerBlock;\n const out = new Uint8Array(total);\n let writeOff = 0;\n for (const p of parts) {\n out.set(p, writeOff);\n writeOff += p.byteLength;\n }\n return out;\n }\n\n return {\n bc1Encode(linRgba, srgbRgba, w, h, mode, threads) {\n return encodeThreaded('bc1', linRgba, srgbRgba, w, h, mode, threads, 8);\n },\n bc3Encode(linRgba, srgbRgba, w, h, threads) {\n return encodeThreaded('bc3', linRgba, srgbRgba, w, h, 0, threads, 16);\n },\n async terminate() {\n rejectAllPending(new Error('Thread pool terminated'));\n if (!pool) return;\n for (const w of pool) w.terminate();\n pool = null;\n },\n };\n}\n","import { Bc1Mode, FitMode, type Matte } from './types.js';\nimport { createThreadPool, type CreateWorker, type ThreadPool } from './threadPool.js';\n\ninterface UgcWasmExports {\n memory: WebAssembly.Memory;\n alloc(size: number): number;\n mark(): number;\n release(m: number): void;\n free(ptr: number): void;\n deswizzleBlockLinear(\n srcPtr: number,\n srcLen: number,\n dstPtr: number,\n width: number,\n height: number,\n bpe: number,\n blockHeight: number,\n ): void;\n swizzleBlockLinear(\n srcPtr: number,\n srcLen: number,\n dstPtr: number,\n dstLen: number,\n width: number,\n height: number,\n bpe: number,\n blockHeight: number,\n basePtr: number,\n baseLen: number,\n ): void;\n srgbU8ToLinearF32(srcPtr: number, dstPtr: number, pixelCount: number): void;\n linearF32ToLinearU8(srcPtr: number, dstPtr: number, count: number): void;\n convertLinearU8ToSrgbU8(rgbaPtr: number, byteLen: number): void;\n bc1Decode(blocksPtr: number, dstPtr: number, texW: number, texH: number): void;\n bc3Decode(blocksPtr: number, dstPtr: number, texW: number, texH: number): void;\n bc1Encode(\n linRgbaPtr: number,\n srgbRgbaPtr: number,\n dstPtr: number,\n texW: number,\n texH: number,\n bc1Mode: number,\n ): void;\n bc1EncodeRgbcx(linRgbaPtr: number, dstPtr: number, texW: number, texH: number): void;\n bc3Encode(\n linRgbaPtr: number,\n srgbRgbaPtr: number,\n dstPtr: number,\n texW: number,\n texH: number,\n ): void;\n resizeRgba(\n srcPtr: number,\n srcW: number,\n srcH: number,\n dstPtr: number,\n dstW: number,\n dstH: number,\n fitMode: number,\n matteR: number,\n matteG: number,\n matteB: number,\n matteA: number,\n ): void;\n}\n\nexport interface UgcWasm {\n bc1Decode(blocks: Uint8Array, w: number, h: number): Uint8Array;\n bc3Decode(blocks: Uint8Array, w: number, h: number): Uint8Array;\n bc1Encode(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n mode: Bc1Mode,\n ): Uint8Array;\n bc1EncodeRgbcx(linRgba: Float32Array, w: number, h: number): Uint8Array;\n bc3Encode(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number): Uint8Array;\n bc1EncodeThreaded(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n mode: Bc1Mode,\n threads: number,\n ): Promise<Uint8Array>;\n bc3EncodeThreaded(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n threads: number,\n ): Promise<Uint8Array>;\n deswizzle(\n swizzled: Uint8Array,\n width: number,\n height: number,\n bpe: number,\n blockHeight: number,\n ): Uint8Array;\n swizzle(\n linear: Uint8Array,\n width: number,\n height: number,\n bpe: number,\n blockHeight: number,\n base: Uint8Array | null,\n ): Uint8Array;\n srgbToLinearF32(rgba: Uint8Array): Float32Array;\n linearF32ToU8(linear: Float32Array): Uint8Array;\n linearU8ToSrgbU8InPlace(rgba: Uint8Array): void;\n resize(\n rgba: Uint8Array,\n srcW: number,\n srcH: number,\n dstW: number,\n dstH: number,\n fit: FitMode,\n matte: Matte | null,\n ): Uint8Array;\n terminateThreadPool(): Promise<void>;\n}\n\nexport type WasmSource =\n | ArrayBuffer\n | Uint8Array\n | Response\n | Promise<ArrayBuffer | Uint8Array | Response>;\n\nexport interface CreateUgcWasmOptions {\n wasm: WasmSource;\n createWorker?: CreateWorker;\n}\n\nfunction divRoundUp(n: number, d: number): number {\n return Math.floor((n + d - 1) / d);\n}\n\nfunction paddedSwizzleSize(\n width: number,\n height: number,\n bpe: number,\n blockHeight: number,\n): number {\n const widthInGobs = divRoundUp(width * bpe, 64);\n const paddedHeight = divRoundUp(height, 8 * blockHeight) * (8 * blockHeight);\n return widthInGobs * paddedHeight * 64;\n}\n\nconst importObject: WebAssembly.Imports = {\n env: {\n abort() {\n throw new Error('ugc.wasm aborted');\n },\n },\n};\n\nasync function toBytes(src: WasmSource): Promise<ArrayBuffer> {\n const s = await src;\n if (s instanceof ArrayBuffer) return s;\n if (typeof Response !== 'undefined' && s instanceof Response) return await s.arrayBuffer();\n if (s instanceof Uint8Array) {\n return s.buffer.slice(s.byteOffset, s.byteOffset + s.byteLength) as ArrayBuffer;\n }\n throw new Error('createUgcWasm: unsupported wasm source');\n}\n\nfunction makeWasm(instance: WebAssembly.Instance, pool: ThreadPool | null): UgcWasm {\n const exports = instance.exports as unknown as UgcWasmExports;\n const memory = exports.memory;\n\n function u8(ptr: number, len: number): Uint8Array {\n return new Uint8Array(memory.buffer, ptr, len);\n }\n function f32(ptr: number, len: number): Float32Array {\n return new Float32Array(memory.buffer, ptr, len);\n }\n\n function bc1Encode(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n mode: Bc1Mode,\n ): Uint8Array {\n const m = exports.mark();\n try {\n const pixels = w * h;\n const linLen = pixels * 16;\n const srgbLen = pixels * 4;\n const outLen = (pixels / 16) * 8;\n const linPtr = exports.alloc(linLen);\n const srgbPtr = exports.alloc(srgbLen);\n const outPtr = exports.alloc(outLen);\n f32(linPtr, pixels * 4).set(linRgba);\n u8(srgbPtr, srgbLen).set(srgbRgba);\n exports.bc1Encode(linPtr, srgbPtr, outPtr, w, h, mode);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n }\n\n function bc3Encode(\n linRgba: Float32Array,\n srgbRgba: Uint8Array,\n w: number,\n h: number,\n ): Uint8Array {\n const m = exports.mark();\n try {\n const pixels = w * h;\n const linLen = pixels * 16;\n const srgbLen = pixels * 4;\n const outLen = (pixels / 16) * 16;\n const linPtr = exports.alloc(linLen);\n const srgbPtr = exports.alloc(srgbLen);\n const outPtr = exports.alloc(outLen);\n f32(linPtr, pixels * 4).set(linRgba);\n u8(srgbPtr, srgbLen).set(srgbRgba);\n exports.bc3Encode(linPtr, srgbPtr, outPtr, w, h);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n }\n\n return {\n bc1Decode(blocks, w, h) {\n const m = exports.mark();\n try {\n const inLen = blocks.byteLength;\n const outLen = w * h * 4;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n u8(inPtr, inLen).set(blocks);\n exports.bc1Decode(inPtr, outPtr, w, h);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n bc3Decode(blocks, w, h) {\n const m = exports.mark();\n try {\n const inLen = blocks.byteLength;\n const outLen = w * h * 4;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n u8(inPtr, inLen).set(blocks);\n exports.bc3Decode(inPtr, outPtr, w, h);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n bc1Encode,\n bc1EncodeRgbcx(linRgba, w, h) {\n const m = exports.mark();\n try {\n const pixels = w * h;\n const linLen = pixels * 16;\n const outLen = (pixels / 16) * 8;\n const linPtr = exports.alloc(linLen);\n const outPtr = exports.alloc(outLen);\n f32(linPtr, pixels * 4).set(linRgba);\n exports.bc1EncodeRgbcx(linPtr, outPtr, w, h);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n bc3Encode,\n bc1EncodeThreaded(linRgba, srgbRgba, w, h, mode, threads) {\n if (pool) return pool.bc1Encode(linRgba, srgbRgba, w, h, mode, threads);\n return Promise.resolve(bc1Encode(linRgba, srgbRgba, w, h, mode));\n },\n bc3EncodeThreaded(linRgba, srgbRgba, w, h, threads) {\n if (pool) return pool.bc3Encode(linRgba, srgbRgba, w, h, threads);\n return Promise.resolve(bc3Encode(linRgba, srgbRgba, w, h));\n },\n deswizzle(swizzled, width, height, bpe, blockHeight) {\n const m = exports.mark();\n try {\n const inLen = swizzled.byteLength;\n const outLen = width * height * bpe;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n u8(inPtr, inLen).set(swizzled);\n exports.deswizzleBlockLinear(inPtr, inLen, outPtr, width, height, bpe, blockHeight);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n swizzle(linear, width, height, bpe, blockHeight, base) {\n const m = exports.mark();\n try {\n const inLen = linear.byteLength;\n const outLen = paddedSwizzleSize(width, height, bpe, blockHeight);\n const useBase = base != null && base.byteLength === outLen;\n const baseLen = useBase ? base!.byteLength : 0;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n const basePtr = useBase ? exports.alloc(baseLen) : 0;\n u8(inPtr, inLen).set(linear);\n if (useBase) u8(basePtr, baseLen).set(base!);\n exports.swizzleBlockLinear(\n inPtr,\n inLen,\n outPtr,\n outLen,\n width,\n height,\n bpe,\n blockHeight,\n basePtr,\n baseLen,\n );\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n srgbToLinearF32(rgba) {\n const m = exports.mark();\n try {\n const pixels = rgba.byteLength / 4;\n const inLen = rgba.byteLength;\n const outLen = pixels * 16;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n u8(inPtr, inLen).set(rgba);\n exports.srgbU8ToLinearF32(inPtr, outPtr, pixels);\n const out = new Float32Array(pixels * 4);\n out.set(f32(outPtr, pixels * 4));\n return out;\n } finally {\n exports.release(m);\n }\n },\n linearF32ToU8(linear) {\n const m = exports.mark();\n try {\n const count = linear.length;\n const inLen = count * 4;\n const outLen = count;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n f32(inPtr, count).set(linear);\n exports.linearF32ToLinearU8(inPtr, outPtr, count);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n linearU8ToSrgbU8InPlace(rgba) {\n const m = exports.mark();\n try {\n const len = rgba.byteLength;\n const ptr = exports.alloc(len);\n u8(ptr, len).set(rgba);\n exports.convertLinearU8ToSrgbU8(ptr, len);\n rgba.set(u8(ptr, len));\n } finally {\n exports.release(m);\n }\n },\n resize(rgba, srcW, srcH, dstW, dstH, fit, matte) {\n const m = exports.mark();\n try {\n const inLen = srcW * srcH * 4;\n const outLen = dstW * dstH * 4;\n const inPtr = exports.alloc(inLen);\n const outPtr = exports.alloc(outLen);\n u8(inPtr, inLen).set(rgba);\n const mr = matte ? matte.r : 0;\n const mg = matte ? matte.g : 0;\n const mb = matte ? matte.b : 0;\n const ma = matte ? matte.a : 0;\n exports.resizeRgba(inPtr, srcW, srcH, outPtr, dstW, dstH, fit, mr, mg, mb, ma);\n const out = new Uint8Array(outLen);\n out.set(u8(outPtr, outLen));\n return out;\n } finally {\n exports.release(m);\n }\n },\n async terminateThreadPool() {\n if (pool) await pool.terminate();\n },\n };\n}\n\nexport async function createUgcWasm(options: CreateUgcWasmOptions): Promise<UgcWasm> {\n const bytes = await toBytes(options.wasm);\n const { instance } = await WebAssembly.instantiate(bytes, importObject);\n const pool = options.createWorker ? createThreadPool(bytes, options.createWorker) : null;\n return makeWasm(instance, pool);\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Bc1Mode } from './types.js';
|
|
2
|
+
export type WorkerLike = {
|
|
3
|
+
postMessage(msg: unknown, transfer?: Transferable[]): void;
|
|
4
|
+
onmessage: ((e: MessageEvent) => void) | null;
|
|
5
|
+
onerror: ((e: ErrorEvent) => void) | null;
|
|
6
|
+
onmessageerror?: ((e: MessageEvent) => void) | null;
|
|
7
|
+
terminate(): void;
|
|
8
|
+
};
|
|
9
|
+
export type CreateWorker = () => WorkerLike;
|
|
10
|
+
export type ThreadPool = {
|
|
11
|
+
bc1Encode(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number, mode: Bc1Mode, threads: number): Promise<Uint8Array>;
|
|
12
|
+
bc3Encode(linRgba: Float32Array, srgbRgba: Uint8Array, w: number, h: number, threads: number): Promise<Uint8Array>;
|
|
13
|
+
terminate(): Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
export declare function createThreadPool(wasmBytes: ArrayBuffer, createWorker: CreateWorker): ThreadPool;
|