feat: implement inpainting functionality with mask handling

- Added `createMaskedPixelReplacementSource` function to handle pixel replacement using inpainting.
- Introduced `buildInpaintBundle` to prepare inpainting data including mask generation and validation.
- Created utility functions for mask operations such as `applyMaskedContentModeToRgba`, `expandRectWithinBounds`, and others for mask manipulation.
- Developed tests for inpainting preparation and mask raster utilities to ensure functionality and correctness.
- Implemented mask raster operations including inversion, feathering, blurring, and more.
This commit is contained in:
syntaxbullet
2026-07-05 09:35:16 +02:00
parent 6e5d58a638
commit f5c610dac5
35 changed files with 2285 additions and 242 deletions

View File

@@ -25,7 +25,7 @@ export type AppProps = {
export function App({ app }: AppProps) {
const shellState = useAppState(app.store, selectAppShellState, shallowEqual);
const { document, selection, viewport, tools, transformSession, maskEdit } = shellState;
const { document, selection, viewport, tools, generation, transformSession, maskEdit } = shellState;
const viewportActivityIsland = useViewportActivityIsland(viewport);
const imageImport = useImageImport(app.store);
const [layersOpen, setLayersOpen] = useState(false);
@@ -161,6 +161,7 @@ export function App({ app }: AppProps) {
activeTool={tools.activeTool}
brushSettings={tools.brush}
generateSettings={tools.generate}
generation={generation}
chromaKeySettings={tools.chromaKey}
magicWandSettings={tools.magicWand}
editingMask={Boolean(maskEdit)}
@@ -189,6 +190,7 @@ type AppShellState = {
selection: AppState["editor"]["selection"];
viewport: AppState["editor"]["viewport"];
tools: AppState["editor"]["tools"];
generation: AppState["editor"]["generation"];
transformSession: AppState["editor"]["transformSession"];
maskEdit: AppState["editor"]["maskEdit"];
};
@@ -199,6 +201,7 @@ function selectAppShellState(state: AppState): AppShellState {
selection: state.editor.selection,
viewport: state.editor.viewport,
tools: state.editor.tools,
generation: state.editor.generation,
transformSession: state.editor.transformSession,
maskEdit: state.editor.maskEdit,
};