Skip to content

Commit

Permalink
feat(pixel): add OffscreenCanvas support
Browse files Browse the repository at this point in the history
- update IBlit.blitCanvas() signature to accept
  `OffscreenCanvas` & `OffscreenCanvasRenderingContext2D`
- update blitCanvas() impls for Float/IntBuffer (extract shared internals)
- update canvasPixels()
- minor cleanup after #488
  • Loading branch information
postspectacular committed Aug 1, 2024
1 parent 54da486 commit 1617255
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 18 deletions.
6 changes: 5 additions & 1 deletion packages/pixel/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,11 @@ export interface IBlit<T extends IPixelBuffer> {
* buffer, only the top-left region will be written.
*/
blitCanvas(
canvas: HTMLCanvasElement | CanvasRenderingContext2D,
canvas:
| HTMLCanvasElement
| CanvasRenderingContext2D
| OffscreenCanvas
| OffscreenCanvasRenderingContext2D,
opts?: Partial<BlitCanvasOpts>
): void;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/pixel/src/canvas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export function canvasPixels(
ctx = c.ctx;
} else {
canvas = width;
ctx = canvas.getContext("2d")! as typeof ctx;
ctx = canvas.getContext("2d")!;
}
if (parent && canvas instanceof HTMLCanvasElement)
parent.appendChild(canvas);
Expand Down
15 changes: 6 additions & 9 deletions packages/pixel/src/float.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ import { defFloatFormat } from "./format/float-format.js";
import { FLOAT_GRAY } from "./format/float-gray.js";
import { FLOAT_RGBA, ROT_IDS } from "./index.js";
import { IntBuffer, intBufferFromCanvas, intBufferFromImage } from "./int.js";
import { __clampRegion, __prepRegions } from "./internal/utils.js";
import {
__blitCanvas,
__clampRegion,
__prepRegions,
} from "./internal/utils.js";
import { defSampler } from "./sample.js";

/**
Expand Down Expand Up @@ -358,14 +362,7 @@ export class FloatBuffer
| OffscreenCanvasRenderingContext2D,
opts: Partial<BlitCanvasOpts> = {}
) {
const ctx =
canvas instanceof HTMLCanvasElement ||
canvas instanceof OffscreenCanvas
? (canvas.getContext("2d")! as
| CanvasRenderingContext2D
| OffscreenCanvasRenderingContext2D)
: canvas;
ctx.putImageData(this.toImageData(opts.data), opts.x || 0, opts.y || 0);
__blitCanvas(this, canvas, opts);
}

toImageData(idata?: ImageData) {
Expand Down
8 changes: 2 additions & 6 deletions packages/pixel/src/int.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import {
__compileGrayToABGR,
} from "./internal/codegen.js";
import {
__blitCanvas,
__clampRegion,
__prepRegions,
__setChannelConvert,
Expand Down Expand Up @@ -301,12 +302,7 @@ export class IntBuffer
| OffscreenCanvasRenderingContext2D,
opts: Partial<BlitCanvasOpts> = {}
) {
const ctx =
canvas instanceof HTMLCanvasElement ||
canvas instanceof OffscreenCanvas
? canvas.getContext("2d")!
: canvas;
ctx.putImageData(this.toImageData(opts.data), opts.x || 0, opts.y || 0);
__blitCanvas(this, canvas, opts);
}

toImageData(idata?: ImageData) {
Expand Down
27 changes: 26 additions & 1 deletion packages/pixel/src/internal/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@
import type { Fn, Fn2, FnN, UIntArray } from "@thi.ng/api";
import { isNumber } from "@thi.ng/checks/is-number";
import { clamp } from "@thi.ng/math/interval";
import type { BlitOpts, IntFormat } from "../api.js";
import type {
BlitCanvasOpts,
BlitOpts,
IntFormat,
IPixelBuffer,
IToImageData,
} from "../api.js";

export const __luminanceABGR: FnN = (c) =>
(((c >>> 16) & 0xff) * 29 + ((c >>> 8) & 0xff) * 150 + (c & 0xff) * 76) /
Expand Down Expand Up @@ -131,3 +137,22 @@ export const __asIntVec = (x: number | [number, number]) => {
*/
export const __swapLane13: FnN = (x) =>
((x & 0xff) << 16) | ((x >> 16) & 0xff) | (x & 0xff00ff00);

/**
* Shared implementation for {@link IBlit.blitCanvas}.
*
* @internal
*/
export const __blitCanvas = (
buf: IPixelBuffer & IToImageData,
canvas:
| HTMLCanvasElement
| CanvasRenderingContext2D
| OffscreenCanvas
| OffscreenCanvasRenderingContext2D,
opts: Partial<BlitCanvasOpts> = {}
) =>
(canvas instanceof HTMLCanvasElement || canvas instanceof OffscreenCanvas
? canvas.getContext("2d")!
: canvas
).putImageData(buf.toImageData(opts.data), opts.x || 0, opts.y || 0);

0 comments on commit 1617255

Please sign in to comment.