Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,10 @@ export abstract class CanvasEntityAdapterBase<T extends CanvasEntityState, U ext
this.renderer.syncKonvaCache();
};

invalidateRasterCache = () => {
this.renderer.invalidateRasterCache();
};

/**
* Synchronizes the entity's locked state with the canvas.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ export class CanvasEntityObjectRenderer extends CanvasModuleBase {
*/
renderers = new SyncableMap<string, AnyObjectRenderer>();

/**
* Tracks the cache keys used when rasterizing this entity so they can be invalidated on demand.
*/
rasterCacheKeys = new Set<string>();

/**
* A object containing singleton Konva nodes.
*/
Expand Down Expand Up @@ -477,7 +482,7 @@ export class CanvasEntityObjectRenderer extends CanvasModuleBase {
}): Promise<ImageDTO> => {
const rasterizingAdapter = this.manager.stateApi.$rasterizingAdapter.get();
if (rasterizingAdapter) {
assert(false, `Already rasterizing an entity: ${rasterizingAdapter.id}`);
await this.manager.stateApi.waitForRasterizationToFinish();
}

const { rect, replaceObjects, attrs, bg, ignoreCache } = {
Expand All @@ -492,6 +497,7 @@ export class CanvasEntityObjectRenderer extends CanvasModuleBase {
const cachedImageName = this.manager.cache.imageNameCache.get(hash);

if (cachedImageName && !ignoreCache) {
this.rasterCacheKeys.add(hash);
imageDTO = await getImageDTOSafe(cachedImageName);
if (imageDTO) {
this.log.trace({ rect, cachedImageName, imageDTO }, 'Using cached rasterized image');
Expand Down Expand Up @@ -525,6 +531,7 @@ export class CanvasEntityObjectRenderer extends CanvasModuleBase {
replaceObjects,
});
this.manager.cache.imageNameCache.set(hash, imageDTO.image_name);
this.rasterCacheKeys.add(hash);
return imageDTO;
} catch (error) {
this.log.error({ rasterizeArgs, error: serializeError(error as Error) }, 'Failed to rasterize entity');
Expand All @@ -534,6 +541,16 @@ export class CanvasEntityObjectRenderer extends CanvasModuleBase {
}
};

invalidateRasterCache = () => {
if (this.rasterCacheKeys.size === 0) {
return;
}
for (const key of this.rasterCacheKeys) {
this.manager.cache.imageNameCache.delete(key);
}
this.rasterCacheKeys.clear();
};

cloneObjectGroup = (arg: { attrs?: GroupConfig } = {}): Konva.Group => {
const { attrs } = arg;
const clone = this.konva.objectGroup.clone();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,12 @@ export class CanvasManager extends CanvasModuleBase {
];
};

invalidateRegionalGuidanceRasterCache = () => {
for (const adapter of this.adapters.regionMasks.values()) {
adapter.invalidateRasterCache();
}
};

createAdapter = (entityIdentifier: CanvasEntityIdentifier): CanvasEntityAdapter => {
if (isRasterLayerEntityIdentifier(entityIdentifier)) {
const adapter = new CanvasEntityAdapterRasterLayer(entityIdentifier, this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,27 @@ export class CanvasStateApiModule extends CanvasModuleBase {
*/
setGenerationBbox = (rect: Rect) => {
this.store.dispatch(bboxChangedFromCanvas(rect));
this.manager.invalidateRegionalGuidanceRasterCache();
};

waitForRasterizationToFinish = async () => {
if (!this.$rasterizingAdapter.get()) {
return;
}

await new Promise<void>((resolve) => {
const unsubscribe = this.$rasterizingAdapter.listen((adapter) => {
if (!adapter) {
unsubscribe();
resolve();
}
});

if (!this.$rasterizingAdapter.get()) {
unsubscribe();
resolve();
}
});
};

/**
Expand Down