@thi.ng/shader-ast-js
Version:
Customizable JS codegen, compiler & runtime for @thi.ng/shader-ast
51 lines (50 loc) • 1.67 kB
JavaScript
import { clamp, clamp01 } from "@thi.ng/math/interval";
import { intBufferFromCanvas } from "@thi.ng/pixel/int";
const rgbaBgra8888 = (rgba) => clamp01(rgba[0]) * 255.5 << 0 | clamp01(rgba[1]) * 255.5 << 8 | clamp01(rgba[2]) * 255.5 << 16 | clamp01(rgba[3]) * 255.5 << 24;
const rgbaRgb565 = (rgba) => (clamp01(rgba[0]) * 255.5 & 248) << 8 | (clamp01(rgba[1]) * 255.5 & 252) << 3 | (clamp01(rgba[2]) * 255.5 & 248) >> 3;
const __clampCoord = (x, maxW, w) => w !== void 0 ? Math.min(x + w, maxW) : maxW;
const renderPixels = (fn, pixels, { x, y, w, h, bufW, bufH, offsetX, offsetY, imgH, fmt }) => {
offsetX = offsetX || 0;
offsetY = offsetY || 0;
imgH = (imgH || bufH) - 1 - offsetY;
x = clamp(x || 0, 0, bufW);
y = clamp(y || 0, 0, bufH);
const x2 = __clampCoord(x, bufW, w);
const y2 = __clampCoord(y, bufH, h);
const fragCoord = [];
for (let yy = y; yy < y2; yy++) {
fragCoord[1] = imgH - yy;
let i = yy * bufW + x;
for (let xx = x; xx < x2; xx++) {
fragCoord[0] = xx + offsetX;
pixels[i++] = fmt(fn(fragCoord));
}
}
return pixels;
};
const renderBuffer = (fn, buf, opts) => {
renderPixels(fn, buf.data, {
fmt: rgbaBgra8888,
bufW: buf.width,
bufH: buf.height,
x: 0,
y: 0,
...opts
});
return buf;
};
const canvasRenderer = (canvas) => {
const buf = intBufferFromCanvas(canvas);
const data = new ImageData(canvas.width, canvas.height);
return (fn, x = 0, y = 0, w = canvas.width, h = canvas.height) => {
renderBuffer(fn, buf, { x, y, w, h });
buf.blitCanvas(canvas, { data });
};
};
export {
canvasRenderer,
renderBuffer,
renderPixels,
rgbaBgra8888,
rgbaRgb565
};