@swf2es/native 0.0.0-stage → 0.1.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 +202 -0
- package/LICENSE.third-party +313 -0
- package/README.md +489 -2
- package/dist/atf/binary.d.ts +2 -0
- package/dist/atf/binary.d.ts.map +1 -0
- package/dist/atf/binary.js +4 -0
- package/dist/atf/binary.js.map +1 -0
- package/dist/atf/index.d.ts +27 -0
- package/dist/atf/index.d.ts.map +1 -0
- package/dist/atf/index.js +158 -0
- package/dist/atf/index.js.map +1 -0
- package/dist/atf/jxr.d.ts +22 -0
- package/dist/atf/jxr.d.ts.map +1 -0
- package/dist/atf/jxr.js +60 -0
- package/dist/atf/jxr.js.map +1 -0
- package/dist/atf/parse.d.ts +65 -0
- package/dist/atf/parse.d.ts.map +1 -0
- package/dist/atf/parse.js +204 -0
- package/dist/atf/parse.js.map +1 -0
- package/dist/audio/binary.d.ts +2 -0
- package/dist/audio/binary.d.ts.map +1 -0
- package/dist/audio/binary.js +4 -0
- package/dist/audio/binary.js.map +1 -0
- package/dist/audio/index.d.ts +21 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +73 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/base64.d.ts +3 -0
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +10 -0
- package/dist/base64.js.map +1 -0
- package/dist/compress/binary.d.ts +2 -0
- package/dist/compress/binary.d.ts.map +1 -0
- package/dist/compress/binary.js +4 -0
- package/dist/compress/binary.js.map +1 -0
- package/dist/compress/index.d.ts +59 -0
- package/dist/compress/index.d.ts.map +1 -0
- package/dist/compress/index.js +146 -0
- package/dist/compress/index.js.map +1 -0
- package/dist/instance.d.ts +25 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +50 -0
- package/dist/instance.js.map +1 -0
- package/dist/mp3/binary.d.ts +2 -0
- package/dist/mp3/binary.d.ts.map +1 -0
- package/dist/mp3/binary.js +4 -0
- package/dist/mp3/binary.js.map +1 -0
- package/dist/mp3/index.d.ts +20 -0
- package/dist/mp3/index.d.ts.map +1 -0
- package/dist/mp3/index.js +49 -0
- package/dist/mp3/index.js.map +1 -0
- package/dist/render/binary.d.ts +2 -0
- package/dist/render/binary.d.ts.map +1 -0
- package/dist/render/binary.js +4 -0
- package/dist/render/binary.js.map +1 -0
- package/dist/render/bitmap-kernel.d.ts +118 -0
- package/dist/render/bitmap-kernel.d.ts.map +1 -0
- package/dist/render/bitmap-kernel.js +592 -0
- package/dist/render/bitmap-kernel.js.map +1 -0
- package/dist/render/draw-kernel.d.ts +79 -0
- package/dist/render/draw-kernel.d.ts.map +1 -0
- package/dist/render/draw-kernel.js +205 -0
- package/dist/render/draw-kernel.js.map +1 -0
- package/dist/render/dxt-encoder.d.ts +19 -0
- package/dist/render/dxt-encoder.d.ts.map +1 -0
- package/dist/render/dxt-encoder.js +95 -0
- package/dist/render/dxt-encoder.js.map +1 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/lines.d.ts +55 -0
- package/dist/render/lines.d.ts.map +1 -0
- package/dist/render/lines.js +123 -0
- package/dist/render/lines.js.map +1 -0
- package/dist/render/module.d.ts +11 -0
- package/dist/render/module.d.ts.map +1 -0
- package/dist/render/module.js +27 -0
- package/dist/render/module.js.map +1 -0
- package/dist/render/pixel-ops.d.ts +77 -0
- package/dist/render/pixel-ops.d.ts.map +1 -0
- package/dist/render/pixel-ops.js +236 -0
- package/dist/render/pixel-ops.js.map +1 -0
- package/dist/render/tessellator.d.ts +90 -0
- package/dist/render/tessellator.d.ts.map +1 -0
- package/dist/render/tessellator.js +251 -0
- package/dist/render/tessellator.js.map +1 -0
- package/package.json +53 -3
- package/src/atf/index.ts +212 -0
- package/src/atf/jxr.ts +83 -0
- package/src/atf/parse.ts +263 -0
- package/src/audio/index.ts +93 -0
- package/src/base64.ts +10 -0
- package/src/compress/index.ts +225 -0
- package/src/instance.ts +53 -0
- package/src/mp3/index.ts +71 -0
- package/src/render/bitmap-kernel.ts +856 -0
- package/src/render/draw-kernel.ts +268 -0
- package/src/render/dxt-encoder.ts +121 -0
- package/src/render/index.ts +37 -0
- package/src/render/lines.ts +161 -0
- package/src/render/module.ts +30 -0
- package/src/render/pixel-ops.ts +356 -0
- package/src/render/tessellator.ts +367 -0
- package/src/webassembly.d.ts +22 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
// BitmapData's pixel operations in the render module (pixels.zig), over a
|
|
2
|
+
// store's pixels a band of rows at a time, so that the scratch stays near
|
|
3
|
+
// BAND_BYTES whatever the bitmap's size. Each band is copied in, worked on
|
|
4
|
+
// and copied back before the next, which reads what the bands before it
|
|
5
|
+
// wrote, as the one loop over the rows did: where the source is the
|
|
6
|
+
// destination and a band's rows of the two overlap, they are copied in as
|
|
7
|
+
// one block, so that a pixel reads what the pixels before it wrote.
|
|
8
|
+
// A band that traps is copied back never, and `Progress` lets the call made
|
|
9
|
+
// again in a new instance (BitmapKernel) take up at that band.
|
|
10
|
+
|
|
11
|
+
/** What pixels.zig's wrapper (bitmap.zig) exports for these. */
|
|
12
|
+
export interface PixelExports {
|
|
13
|
+
memory: WebAssembly.Memory;
|
|
14
|
+
resetArena(bytes: number): number;
|
|
15
|
+
channelPixels(params: number): number;
|
|
16
|
+
mergePixels(params: number): number;
|
|
17
|
+
palettePixels(params: number): number;
|
|
18
|
+
matrixPixels(params: number): number;
|
|
19
|
+
transformPixels(params: number): number;
|
|
20
|
+
noisePixels(params: number): number;
|
|
21
|
+
perlinPixels(params: number): number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The rows of a band's work: about this much of the pixels it copies in. */
|
|
25
|
+
const BAND_BYTES = 1 << 20;
|
|
26
|
+
/** The params' room at the input's start, before tables and blocks. */
|
|
27
|
+
const HEAD = 256;
|
|
28
|
+
/** paletteMap's four tables of 256 entries, after the params. */
|
|
29
|
+
const TABLES = 4096;
|
|
30
|
+
|
|
31
|
+
/** A rect of a store's pixels. */
|
|
32
|
+
export interface PixelRegion {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** How far a call got: the next band to do, and noise's generator. */
|
|
40
|
+
export interface Progress {
|
|
41
|
+
row: number;
|
|
42
|
+
state: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Which copy, and what it writes into the params after pixels.zig's Rows. */
|
|
46
|
+
export type CopyOp =
|
|
47
|
+
| { op: "channel"; from: number; to: number }
|
|
48
|
+
| { op: "merge"; muls: readonly [number, number, number, number] }
|
|
49
|
+
| { op: "palette"; tables: readonly [Uint32Array, Uint32Array, Uint32Array, Uint32Array] }
|
|
50
|
+
| {
|
|
51
|
+
op: "matrix";
|
|
52
|
+
matrix: readonly number[];
|
|
53
|
+
near: PixelRegion | null;
|
|
54
|
+
empty: number;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* `region` of `into` (`intoWidth` wide) made by the copy `op` of the rows of
|
|
59
|
+
* `from` (`fromWidth` wide) starting at (sx, sy), band by band; false where
|
|
60
|
+
* the module refused a band.
|
|
61
|
+
*/
|
|
62
|
+
export function copyRows(
|
|
63
|
+
wasm: PixelExports,
|
|
64
|
+
into: Uint32Array,
|
|
65
|
+
intoWidth: number,
|
|
66
|
+
from: Uint32Array,
|
|
67
|
+
fromWidth: number,
|
|
68
|
+
region: PixelRegion,
|
|
69
|
+
sx: number,
|
|
70
|
+
sy: number,
|
|
71
|
+
transparent: boolean,
|
|
72
|
+
op: CopyOp,
|
|
73
|
+
progress: Progress,
|
|
74
|
+
): boolean {
|
|
75
|
+
const { x: dx, y: dy, width: w, height: h } = region;
|
|
76
|
+
const same = into === from;
|
|
77
|
+
// A band's blocks: where the source is the destination, both in one block as wide as their union.
|
|
78
|
+
const wide = same ? w + Math.abs(sx - dx) : w;
|
|
79
|
+
const band = Math.max(1, Math.floor(BAND_BYTES / (wide * 8)));
|
|
80
|
+
for (; progress.row < h; progress.row += band) {
|
|
81
|
+
const r0 = progress.row;
|
|
82
|
+
const rows = Math.min(band, h - r0);
|
|
83
|
+
const dy0 = dy + r0;
|
|
84
|
+
const sy0 = sy + r0;
|
|
85
|
+
const joined = same && dy0 < sy0 + rows && sy0 < dy0 + rows;
|
|
86
|
+
const ux = joined ? Math.min(dx, sx) : 0;
|
|
87
|
+
const uy = joined ? Math.min(dy0, sy0) : 0;
|
|
88
|
+
const uw = joined ? Math.max(dx, sx) + w - ux : w;
|
|
89
|
+
const uh = joined ? Math.max(dy0, sy0) + rows - uy : rows;
|
|
90
|
+
const blocks = joined ? uw * uh : 2 * rows * w;
|
|
91
|
+
const at = wasm.resetArena(HEAD + TABLES + blocks * 4);
|
|
92
|
+
if (!at) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const memory = new Uint32Array(wasm.memory.buffer);
|
|
97
|
+
const base = (at + HEAD + TABLES) >> 2;
|
|
98
|
+
let dst: number;
|
|
99
|
+
let src: number;
|
|
100
|
+
let stride: number;
|
|
101
|
+
if (joined) {
|
|
102
|
+
for (let row = 0; row < uh; row++) {
|
|
103
|
+
const start = (uy + row) * intoWidth + ux;
|
|
104
|
+
memory.set(into.subarray(start, start + uw), base + row * uw);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
dst = base + (dy0 - uy) * uw + (dx - ux);
|
|
108
|
+
src = base + (sy0 - uy) * uw + (sx - ux);
|
|
109
|
+
stride = uw;
|
|
110
|
+
} else {
|
|
111
|
+
dst = base;
|
|
112
|
+
src = base + rows * w;
|
|
113
|
+
stride = w;
|
|
114
|
+
// paletteMap's and a colour matrix's pixels are the source's alone: the destination's are not read.
|
|
115
|
+
const reads = op.op === "channel" || op.op === "merge";
|
|
116
|
+
for (let row = 0; row < rows; row++) {
|
|
117
|
+
if (reads) {
|
|
118
|
+
const to = (dy0 + row) * intoWidth + dx;
|
|
119
|
+
memory.set(into.subarray(to, to + w), dst + row * w);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const fromAt = (sy0 + row) * fromWidth + sx;
|
|
123
|
+
memory.set(from.subarray(fromAt, fromAt + w), src + row * w);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const params = new DataView(wasm.memory.buffer, at, HEAD);
|
|
128
|
+
const words = [w, rows, dst * 4, stride, src * 4, stride, Number(transparent), 0];
|
|
129
|
+
for (let k = 0; k < 8; k++) {
|
|
130
|
+
params.setUint32(k * 4, words[k], true);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let ok = 0;
|
|
134
|
+
switch (op.op) {
|
|
135
|
+
case "channel":
|
|
136
|
+
params.setInt32(32, op.from, true);
|
|
137
|
+
params.setUint32(36, op.to, true);
|
|
138
|
+
ok = wasm.channelPixels(at);
|
|
139
|
+
break;
|
|
140
|
+
case "merge":
|
|
141
|
+
for (let k = 0; k < 4; k++) {
|
|
142
|
+
params.setUint32(32 + k * 4, op.muls[k] >>> 0, true);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
ok = wasm.mergePixels(at);
|
|
146
|
+
break;
|
|
147
|
+
case "palette": {
|
|
148
|
+
params.setUint32(32, at + HEAD, true);
|
|
149
|
+
params.setUint32(36, 0, true);
|
|
150
|
+
const tables = new Uint32Array(wasm.memory.buffer, at + HEAD, 1024);
|
|
151
|
+
for (let k = 0; k < 4; k++) {
|
|
152
|
+
tables.set(op.tables[k], k * 256);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
ok = wasm.palettePixels(at);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case "matrix": {
|
|
159
|
+
const near = op.near;
|
|
160
|
+
params.setInt32(32, sx, true);
|
|
161
|
+
params.setInt32(36, sy0, true);
|
|
162
|
+
params.setInt32(40, near?.x ?? 0, true);
|
|
163
|
+
params.setInt32(44, near?.y ?? 0, true);
|
|
164
|
+
params.setUint32(48, near?.width ?? 0, true);
|
|
165
|
+
params.setUint32(52, near?.height ?? 0, true);
|
|
166
|
+
params.setUint32(56, op.empty >>> 0, true);
|
|
167
|
+
params.setUint32(60, 0, true);
|
|
168
|
+
for (let k = 0; k < 20; k++) {
|
|
169
|
+
params.setFloat64(64 + k * 8, op.matrix[k], true);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
ok = wasm.matrixPixels(at);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (!ok) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Read again: the call may have grown the memory.
|
|
182
|
+
const out = new Uint32Array(wasm.memory.buffer);
|
|
183
|
+
for (let row = 0; row < rows; row++) {
|
|
184
|
+
const to = (dy0 + row) * intoWidth + dx;
|
|
185
|
+
into.set(out.subarray(dst + row * stride, dst + row * stride + w), to);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* colorTransform over `region` of `pixels` (`width` wide), in place, band by
|
|
194
|
+
* band: each channel's multiplier in 256ths and offset, red, green, blue,
|
|
195
|
+
* alpha; false where the module refused a band.
|
|
196
|
+
*/
|
|
197
|
+
export function transformRows(
|
|
198
|
+
wasm: PixelExports,
|
|
199
|
+
pixels: Uint32Array,
|
|
200
|
+
width: number,
|
|
201
|
+
region: PixelRegion,
|
|
202
|
+
muls: readonly number[],
|
|
203
|
+
adds: readonly number[],
|
|
204
|
+
progress: Progress,
|
|
205
|
+
): boolean {
|
|
206
|
+
const { x, y, width: w, height: h } = region;
|
|
207
|
+
const band = Math.max(1, Math.floor(BAND_BYTES / (w * 4)));
|
|
208
|
+
for (; progress.row < h; progress.row += band) {
|
|
209
|
+
const rows = Math.min(band, h - progress.row);
|
|
210
|
+
const at = wasm.resetArena(HEAD + rows * w * 4);
|
|
211
|
+
if (!at) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const block = (at + HEAD) >> 2;
|
|
216
|
+
const memory = new Uint32Array(wasm.memory.buffer);
|
|
217
|
+
for (let row = 0; row < rows; row++) {
|
|
218
|
+
const from = (y + progress.row + row) * width + x;
|
|
219
|
+
memory.set(pixels.subarray(from, from + w), block + row * w);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const params = new DataView(wasm.memory.buffer, at, HEAD);
|
|
223
|
+
const words = [w, rows, block * 4, w];
|
|
224
|
+
for (let k = 0; k < words.length; k++) {
|
|
225
|
+
params.setUint32(k * 4, words[k], true);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
for (let k = 0; k < 4; k++) {
|
|
229
|
+
params.setFloat64(16 + k * 8, muls[k], true);
|
|
230
|
+
params.setFloat64(48 + k * 8, adds[k], true);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (!wasm.transformPixels(at)) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const out = new Uint32Array(wasm.memory.buffer);
|
|
238
|
+
for (let row = 0; row < rows; row++) {
|
|
239
|
+
const to = (y + progress.row + row) * width + x;
|
|
240
|
+
pixels.set(out.subarray(block + row * w, block + (row + 1) * w), to);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* noise over every pixel, `count` a band: Park-Miller's generator from
|
|
249
|
+
* `progress.state`, which it moves on; false where the module refused a band.
|
|
250
|
+
*/
|
|
251
|
+
export function noiseRows(
|
|
252
|
+
wasm: PixelExports,
|
|
253
|
+
pixels: Uint32Array,
|
|
254
|
+
lo: number,
|
|
255
|
+
span: number,
|
|
256
|
+
channels: number,
|
|
257
|
+
gray: boolean,
|
|
258
|
+
transparent: boolean,
|
|
259
|
+
progress: Progress,
|
|
260
|
+
): boolean {
|
|
261
|
+
const band = BAND_BYTES >> 2;
|
|
262
|
+
for (; progress.row < pixels.length; progress.row += band) {
|
|
263
|
+
const count = Math.min(band, pixels.length - progress.row);
|
|
264
|
+
const at = wasm.resetArena(HEAD + count * 4);
|
|
265
|
+
if (!at) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const params = new DataView(wasm.memory.buffer, at, HEAD);
|
|
270
|
+
const words = [count, at + HEAD, progress.state, lo, span, channels, Number(gray)];
|
|
271
|
+
words.push(Number(transparent));
|
|
272
|
+
for (let k = 0; k < words.length; k++) {
|
|
273
|
+
params.setUint32(k * 4, words[k] >>> 0, true);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const state = wasm.noisePixels(at);
|
|
277
|
+
if (!state) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
pixels.set(new Uint32Array(wasm.memory.buffer, at + HEAD, count), progress.row);
|
|
282
|
+
progress.state = state;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/** perlinNoise's set-up, as turbulence.ts makes it of the seed and the call's arguments. */
|
|
289
|
+
export interface PerlinSetup {
|
|
290
|
+
lattice: Int32Array;
|
|
291
|
+
/** Four channels' gradients, x and y interleaved, one after another. */
|
|
292
|
+
gradients: Float64Array;
|
|
293
|
+
offsets: readonly (readonly [number, number])[];
|
|
294
|
+
fx: number;
|
|
295
|
+
fy: number;
|
|
296
|
+
stitch: boolean;
|
|
297
|
+
stitchWidth: number;
|
|
298
|
+
stitchHeight: number;
|
|
299
|
+
fractal: boolean;
|
|
300
|
+
channels: number;
|
|
301
|
+
gray: boolean;
|
|
302
|
+
transparent: boolean;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** perlinNoise over every pixel of a `width`-wide store, band by band; false where the module refused one. */
|
|
306
|
+
export function perlinRows(
|
|
307
|
+
wasm: PixelExports,
|
|
308
|
+
pixels: Uint32Array,
|
|
309
|
+
width: number,
|
|
310
|
+
setup: PerlinSetup,
|
|
311
|
+
progress: Progress,
|
|
312
|
+
): boolean {
|
|
313
|
+
const height = pixels.length / width;
|
|
314
|
+
const octaves = setup.offsets.length;
|
|
315
|
+
const band = Math.max(1, Math.floor(BAND_BYTES / (width * 4)));
|
|
316
|
+
// The tables once, and a band's block, which each band uses again.
|
|
317
|
+
const at = wasm.resetArena(HEAD + 2056 + 8 + 32896 + octaves * 16 + band * width * 4);
|
|
318
|
+
if (!at) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const lattice = at + HEAD;
|
|
323
|
+
const gradients = lattice + 2056 + 8 - ((lattice + 2056) & 7);
|
|
324
|
+
const offsets = gradients + 32896;
|
|
325
|
+
const block = offsets + octaves * 16;
|
|
326
|
+
new Int32Array(wasm.memory.buffer, lattice, 514).set(setup.lattice);
|
|
327
|
+
new Float64Array(wasm.memory.buffer, gradients, 4112).set(setup.gradients);
|
|
328
|
+
const list = new Float64Array(wasm.memory.buffer, offsets, octaves * 2);
|
|
329
|
+
for (let k = 0; k < octaves; k++) {
|
|
330
|
+
list[k * 2] = setup.offsets[k][0];
|
|
331
|
+
list[k * 2 + 1] = setup.offsets[k][1];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
for (; progress.row < height; progress.row += band) {
|
|
335
|
+
const rows = Math.min(band, height - progress.row);
|
|
336
|
+
const params = new DataView(wasm.memory.buffer, at, HEAD);
|
|
337
|
+
const words = [width, rows, progress.row, block, lattice, gradients, offsets, octaves];
|
|
338
|
+
words.push(setup.channels, Number(setup.gray), Number(setup.fractal), Number(setup.stitch));
|
|
339
|
+
words.push(Number(setup.transparent), 0);
|
|
340
|
+
for (let k = 0; k < words.length; k++) {
|
|
341
|
+
params.setUint32(k * 4, words[k] >>> 0, true);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
params.setFloat64(56, setup.fx, true);
|
|
345
|
+
params.setFloat64(64, setup.fy, true);
|
|
346
|
+
params.setFloat64(72, setup.stitchWidth, true);
|
|
347
|
+
params.setFloat64(80, setup.stitchHeight, true);
|
|
348
|
+
if (!wasm.perlinPixels(at)) {
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
pixels.set(new Uint32Array(wasm.memory.buffer, block, rows * width), progress.row * width);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return true;
|
|
356
|
+
}
|