summaryrefslogtreecommitdiff
path: root/apps/web/src/services/renderer/nodes/sticker-node.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-13 04:41:17 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-13 05:08:29 +0200
commitcad88ee4d1c9e06e7529b88ef5e5d3fdf3f89149 (patch)
tree0bfc1fcb18b3da4969afa2836bb65e6a5e25d123 /apps/web/src/services/renderer/nodes/sticker-node.ts
parent36efdf66e707c818b81009acf8a00630a0309ca1 (diff)
downloadopencut-cad88ee4d1c9e06e7529b88ef5e5d3fdf3f89149.tar.gz
refactor: rendering pipeline
Made-with: Cursor
Diffstat (limited to 'apps/web/src/services/renderer/nodes/sticker-node.ts')
-rw-r--r--apps/web/src/services/renderer/nodes/sticker-node.ts49
1 files changed, 14 insertions, 35 deletions
diff --git a/apps/web/src/services/renderer/nodes/sticker-node.ts b/apps/web/src/services/renderer/nodes/sticker-node.ts
index 71cb37b5..3c155cb6 100644
--- a/apps/web/src/services/renderer/nodes/sticker-node.ts
+++ b/apps/web/src/services/renderer/nodes/sticker-node.ts
@@ -1,6 +1,9 @@
-import type { CanvasRenderer } from "../canvas-renderer";
import { resolveStickerId } from "@/lib/stickers";
-import { VisualNode, type VisualNodeParams } from "./visual-node";
+import {
+ VisualNode,
+ type ResolvedVisualSourceNodeState,
+ type VisualNodeParams,
+} from "./visual-node";
export interface StickerNodeParams extends VisualNodeParams {
stickerId: string;
@@ -16,7 +19,11 @@ interface CachedStickerSource {
const stickerSourceCache = new Map<string, Promise<CachedStickerSource>>();
-function loadStickerSource({ stickerId }: { stickerId: string }): Promise<CachedStickerSource> {
+export function loadStickerSource({
+ stickerId,
+}: {
+ stickerId: string;
+}): Promise<CachedStickerSource> {
const cached = stickerSourceCache.get(stickerId);
if (cached) return cached;
@@ -42,35 +49,7 @@ function loadStickerSource({ stickerId }: { stickerId: string }): Promise<Cached
return promise;
}
-export class StickerNode extends VisualNode<StickerNodeParams> {
- private cachedSource: Promise<CachedStickerSource>;
-
- constructor(params: StickerNodeParams) {
- super(params);
- this.cachedSource = loadStickerSource({ stickerId: params.stickerId });
- }
-
- async render({ renderer, time }: { renderer: CanvasRenderer; time: number }) {
- await super.render({ renderer, time });
-
- if (!this.isInRange({ time })) {
- return;
- }
-
- const { source, width: loadedWidth, height: loadedHeight } =
- await this.cachedSource;
-
- // Prefer element-stored intrinsic dimensions as the geometry authority.
- // The loaded image is only the drawable source.
- const sourceWidth = this.params.intrinsicWidth ?? loadedWidth;
- const sourceHeight = this.params.intrinsicHeight ?? loadedHeight;
-
- this.renderVisual({
- renderer,
- source,
- sourceWidth,
- sourceHeight,
- timelineTime: time,
- });
- }
-}
+export class StickerNode extends VisualNode<
+ StickerNodeParams,
+ ResolvedVisualSourceNodeState
+> {}