feat: add inpaint region functionality and related tools

- Enhanced cursor behavior for new tools: semantic select, mask lasso, and mask rectangle.
- Updated mask edit state to include mask asset ID and kind.
- Implemented inpaint region commands for adding, applying, and removing inpaint regions.
- Introduced new operations for lasso and semantic selection tools.
- Created UI components for candidate review and inpaint region management.
- Added tests for inpaint region commands to ensure functionality.
- Updated various components to support new inpaint features and improve user experience.
This commit is contained in:
syntaxbullet
2026-07-11 16:41:22 +02:00
parent f4e13b80e7
commit ff762b8f17
78 changed files with 1632 additions and 301 deletions

View File

@@ -1,5 +1,5 @@
import type { Rect, Size } from "./geometry";
import type { AssetId, GenerationCandidateId, LayerId } from "./id";
import type { AssetId, GenerationCandidateId, InpaintRegionId, LayerId } from "./id";
export type GeneratedAssetMode = "text-to-image" | "image-to-image" | "inpaint" | "outpaint";
@@ -26,10 +26,13 @@ export type AssetGenerationProvenance = {
scheduler: string;
width: number;
height: number;
batchSize: number;
refinePass: boolean;
refineStrength: number;
};
inpaint?: {
targetLayerId: LayerId;
maskLayerId: LayerId;
regionId: InpaintRegionId;
sourceAssetId: AssetId;
maskAssetId: AssetId;
crop: {
@@ -49,6 +52,11 @@ export type AssetGenerationProvenance = {
maskFeather: number;
maskExpand: number;
cropPadding: number;
profile: string;
structureControl: string;
controlStrength: number;
controlModel: string;
colorMatch: boolean;
};
};
};

View File

@@ -1,6 +1,7 @@
import type { Artboard } from "./artboard";
import type { Asset } from "./asset";
import type { DocumentId } from "./id";
import type { InpaintRegion } from "./inpaint-region";
export type ImageDocument = {
id: DocumentId;
@@ -8,4 +9,5 @@ export type ImageDocument = {
version: number;
artboards: Artboard[];
assets: Asset[];
inpaintRegions: InpaintRegion[];
};

View File

@@ -5,5 +5,6 @@ export type DocumentId = OpaqueId<"DocumentId">;
export type ArtboardId = OpaqueId<"ArtboardId">;
export type LayerId = OpaqueId<"LayerId">;
export type AssetId = OpaqueId<"AssetId">;
export type InpaintRegionId = OpaqueId<"InpaintRegionId">;
export type GenerationCandidateId = OpaqueId<"GenerationCandidateId">;
export type GenerationJobId = OpaqueId<"GenerationJobId">;

View File

@@ -13,7 +13,8 @@ export type {
Transform,
Vec2D,
} from "./geometry";
export type { ArtboardId, AssetId, DocumentId, GenerationCandidateId, GenerationJobId, LayerId } from "./id";
export type { ArtboardId, AssetId, DocumentId, GenerationCandidateId, GenerationJobId, InpaintRegionId, LayerId } from "./id";
export type { InpaintRegion } from "./inpaint-region";
export type { ImageLayer } from "./image-layer";
export type { AdjustmentLayer, ColorAdjustment } from "./adjustment-layer";
export { neutralColorAdjustment } from "./adjustment-layer";

9
core/inpaint-region.ts Normal file
View File

@@ -0,0 +1,9 @@
import type { AssetId, InpaintRegionId, LayerId } from "./id";
export type InpaintRegion = {
id: InpaintRegionId;
name: string;
targetLayerId: LayerId;
maskAssetId: AssetId;
enabled: boolean;
};