fix: preserve psd clipped image layer order
This commit is contained in:
parent
0808f34021
commit
0dcc759c80
@ -1713,6 +1713,27 @@ function getAssignedImageFrameLayer(
|
||||
return layers.find((item) => item.id === layer.clipMaskLayerId) || layer;
|
||||
}
|
||||
|
||||
function shouldRenderAssignedImageLayerPreview(params: {
|
||||
layer: AgentPsdTemplateImageLayerSlot;
|
||||
hiddenLayerIdSet: Set<string>;
|
||||
}) {
|
||||
const { layer, hiddenLayerIdSet } = params;
|
||||
if (hiddenLayerIdSet.has(layer.id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
layer.forceClipMask &&
|
||||
layer.clipMaskLayerId &&
|
||||
layer.clipMaskLayerId !== layer.id &&
|
||||
hiddenLayerIdSet.has(layer.clipMaskLayerId)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function hasEditedTextValue(
|
||||
layer: AgentPsdTemplateTextLayerSlot,
|
||||
value: string
|
||||
@ -2253,15 +2274,14 @@ export function AgentPsdTemplateEditorDialog({
|
||||
])
|
||||
);
|
||||
}, [orderedPreviewLayers]);
|
||||
const defaultSourceImageLayerId =
|
||||
getDefaultSourceImageLayer(selectedTemplateLayers)?.id || "";
|
||||
const renderBaseZIndex = useMemo(() => {
|
||||
const defaultSourceImageLayer = getDefaultSourceImageLayer(
|
||||
selectedTemplateLayers
|
||||
);
|
||||
const defaultSourceImageZIndex = defaultSourceImageLayer
|
||||
? layerStackZIndexById.get(defaultSourceImageLayer.id) || 0
|
||||
const defaultSourceImageZIndex = defaultSourceImageLayerId
|
||||
? layerStackZIndexById.get(defaultSourceImageLayerId) || 0
|
||||
: 0;
|
||||
return defaultSourceImageZIndex + PSD_RENDER_BASE_Z_INDEX_OFFSET;
|
||||
}, [layerStackZIndexById, selectedTemplateLayers]);
|
||||
}, [defaultSourceImageLayerId, layerStackZIndexById]);
|
||||
const shouldShowCompositeFallback = useMemo(
|
||||
() =>
|
||||
orderedVisiblePreviewLayers.length === 0 ||
|
||||
@ -4393,6 +4413,15 @@ export function AgentPsdTemplateEditorDialog({
|
||||
if (isAgentPsdImageLayerSlot(layer)) {
|
||||
const assignedUrl =
|
||||
effectiveImageAssignments[layer.id];
|
||||
if (
|
||||
assignedUrl &&
|
||||
!shouldRenderAssignedImageLayerPreview({
|
||||
layer,
|
||||
hiddenLayerIdSet,
|
||||
})
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
const layerImageUrl =
|
||||
assignedUrl ||
|
||||
getPsdLayerPreviewSourceUrl(layer);
|
||||
@ -4429,14 +4458,10 @@ export function AgentPsdTemplateEditorDialog({
|
||||
),
|
||||
}
|
||||
: layerBoxStyle;
|
||||
const assignedFrameBaseZIndex =
|
||||
layerStackZIndexById.get(
|
||||
assignedFrameLayer.id
|
||||
) || baseZIndex;
|
||||
const previewZIndex = assignedUrl
|
||||
? assignedFrameLayer.id === layer.id
|
||||
? layer.id === defaultSourceImageLayerId
|
||||
? Math.max(baseZIndex, renderBaseZIndex + 1)
|
||||
: assignedFrameBaseZIndex + 1
|
||||
: baseZIndex
|
||||
: baseZIndex;
|
||||
|
||||
return (
|
||||
|
||||
@ -912,30 +912,6 @@ export async function renderAgentPsdTemplate(params: {
|
||||
}
|
||||
}
|
||||
|
||||
function getAssignedImageRenderFrameLayer(layer: AgentPsdTemplateImageLayerSlot) {
|
||||
if (!layer.forceClipMask || !layer.clipMaskLayerId) {
|
||||
return layer;
|
||||
}
|
||||
|
||||
return layerMap.get(layer.clipMaskLayerId) || layer;
|
||||
}
|
||||
|
||||
const assignedImageLayersByFrameId = new Map<string, AgentPsdTemplateImageLayerSlot[]>();
|
||||
for (const layer of orderedTemplateLayers) {
|
||||
if (
|
||||
hiddenLayerIdSet.has(layer.id) ||
|
||||
!isAgentPsdImageLayerSlot(layer) ||
|
||||
!String(imageAssignments[layer.id] || "").trim()
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const frameLayer = getAssignedImageRenderFrameLayer(layer);
|
||||
const currentLayers = assignedImageLayersByFrameId.get(frameLayer.id) || [];
|
||||
currentLayers.push(layer);
|
||||
assignedImageLayersByFrameId.set(frameLayer.id, currentLayers);
|
||||
}
|
||||
|
||||
const appendedImageAssignmentLayerIds = new Set<string>();
|
||||
async function appendAssignedImageLayer(layer: AgentPsdTemplateImageLayerSlot) {
|
||||
if (appendedImageAssignmentLayerIds.has(layer.id)) {
|
||||
@ -954,6 +930,13 @@ export async function renderAgentPsdTemplate(params: {
|
||||
layer.forceClipMask && layer.clipMaskLayerId
|
||||
? layerMap.get(layer.clipMaskLayerId)
|
||||
: null;
|
||||
if (
|
||||
clipMaskLayer &&
|
||||
clipMaskLayer.id !== layer.id &&
|
||||
hiddenLayerIdSet.has(clipMaskLayer.id)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const renderFrameLayer = clipMaskLayer || layer;
|
||||
const renderFrameContentBounds =
|
||||
clipMaskLayer && isAgentPsdImageLayerSlot(clipMaskLayer)
|
||||
@ -1093,14 +1076,6 @@ export async function renderAgentPsdTemplate(params: {
|
||||
});
|
||||
}
|
||||
|
||||
async function appendAssignedImagesForFrameLayer(frameLayerId: string) {
|
||||
for (const assignedLayer of assignedImageLayersByFrameId.get(frameLayerId) || []) {
|
||||
if (assignedLayer.id !== frameLayerId) {
|
||||
await appendAssignedImageLayer(assignedLayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
shouldUseRenderBaseFallback &&
|
||||
(!defaultSourceImageLayerId || hiddenLayerIdSet.has(defaultSourceImageLayerId))
|
||||
@ -1119,11 +1094,9 @@ export async function renderAgentPsdTemplate(params: {
|
||||
|
||||
if (!isAgentPsdTemplateLayerUserEditable(layer)) {
|
||||
if (shouldUseRenderBaseFallback || shouldUseRenderSegments) {
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
continue;
|
||||
}
|
||||
await appendStoredLayer(layer, { optional: shouldUseRenderBaseFallback });
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1137,15 +1110,10 @@ export async function renderAgentPsdTemplate(params: {
|
||||
if (isDefaultSourceImageLayer) {
|
||||
await appendRenderBaseOverlay();
|
||||
}
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
const renderFrameLayer = getAssignedImageRenderFrameLayer(layer);
|
||||
if (renderFrameLayer.id === layer.id) {
|
||||
await appendAssignedImageLayer(layer);
|
||||
}
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
await appendAssignedImageLayer(layer);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1169,7 +1137,6 @@ export async function renderAgentPsdTemplate(params: {
|
||||
optional: shouldUseRenderBaseFallback,
|
||||
});
|
||||
}
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
continue;
|
||||
}
|
||||
const textAlign = resolveAgentPsdTextLayerEffectiveAlign(layer);
|
||||
@ -1279,7 +1246,6 @@ export async function renderAgentPsdTemplate(params: {
|
||||
height: overlayFrame.height,
|
||||
});
|
||||
if (!didAppend) continue;
|
||||
await appendAssignedImagesForFrameLayer(layer.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user