Files
Genarrative/packages/image-canvas-core/src/exportModel.ts
T
menghao 03a4410272
Project CI / Repository checks (push) Successful in 1m5s
Project CI / Frontend tests (push) Successful in 3m20s
Project CI / Backend tests (push) Successful in 4m1s
Project CI / Native shell tests (push) Failing after 11m56s
game agent无限画布开发 (#136)
主要工作是共享同一套“画布内核与通用 UI 源码”,网站和 Tauri 只分别实现宿主适配层。

---------

Co-authored-by: 段舒康 <kdletters@qq.com>
Co-authored-by: kdletters <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/136
Co-authored-by: menghao <mh18530625731@163.com>
Co-committed-by: menghao <mh18530625731@163.com>
2026-08-12 10:54:16 +08:00

60 lines
1.6 KiB
TypeScript

import type { CanvasLayer } from './types';
export type CanvasExportLayer = {
id: string;
title: string;
mediaType: 'image';
mediaRef: string;
x: number;
y: number;
width: number;
height: number;
zIndex: number;
flipX: boolean;
flipY: boolean;
};
export type CanvasExportModel = {
bounds: { x: number; y: number; width: number; height: number };
backgroundColor: string;
layers: CanvasExportLayer[];
};
export function createCanvasExportModel({
layers,
backgroundColor,
}: {
layers: CanvasLayer[];
backgroundColor: string;
}): CanvasExportModel | null {
const visibleImages = layers
.filter(
(layer) => !layer.hidden && (layer.mediaType ?? 'image') === 'image',
)
.sort((first, second) => first.zIndex - second.zIndex);
if (visibleImages.length === 0) return null;
const minX = Math.min(...visibleImages.map((layer) => layer.x));
const minY = Math.min(...visibleImages.map((layer) => layer.y));
const maxX = Math.max(...visibleImages.map((layer) => layer.x + layer.width));
const maxY = Math.max(
...visibleImages.map((layer) => layer.y + layer.height),
);
return {
bounds: { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
backgroundColor,
layers: visibleImages.map((layer) => ({
id: layer.id,
title: layer.title,
mediaType: 'image',
mediaRef: layer.objectKey ?? layer.assetObjectId ?? layer.src,
x: layer.x,
y: layer.y,
width: layer.width,
height: layer.height,
zIndex: layer.zIndex,
flipX: Boolean(layer.flipX),
flipY: Boolean(layer.flipY),
})),
};
}