UNPKG

@thi.ng/shader-ast-js

Version:

Customizable JS codegen, compiler & runtime for @thi.ng/shader-ast

51 lines (50 loc) 1.67 kB
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 };