fix: clip PSD super lock replacements

This commit is contained in:
Your Name 2026-06-01 18:23:13 +08:00
parent e2cf152662
commit d82a47c035
2 changed files with 46 additions and 15 deletions

View File

@ -1471,19 +1471,30 @@ function renderTextLayerPreviewContent(
);
}
function getAssignedImageMaskStyle(
layer: AgentPsdTemplateImageLayerSlot
): CSSProperties {
const hasMask = Boolean(layer.maskUrl);
function getAssignedImageMaskStyle(params: {
layer: AgentPsdTemplateImageLayerSlot;
maskSourceUrl?: string;
}): CSSProperties {
const normalizedMaskUrl = String(
params.layer.maskUrl || params.maskSourceUrl || ""
).trim();
const hasMask = Boolean(normalizedMaskUrl);
const maskImageUrl = hasMask
? `url(${buildPsdLayerPreviewUrl(normalizedMaskUrl, {
width: params.layer.width,
quality: 72,
})})`
: undefined;
return {
WebkitMaskImage: hasMask ? `url(${layer.maskUrl})` : undefined,
maskImage: hasMask ? `url(${layer.maskUrl})` : undefined,
WebkitMaskImage: maskImageUrl,
maskImage: maskImageUrl,
WebkitMaskSize: hasMask ? "100% 100%" : undefined,
maskSize: hasMask ? "100% 100%" : undefined,
WebkitMaskRepeat: hasMask ? "no-repeat" : undefined,
maskRepeat: hasMask ? "no-repeat" : undefined,
WebkitMaskPosition: hasMask ? "center" : undefined,
maskPosition: hasMask ? "center" : undefined,
maskMode: hasMask ? "alpha" : undefined,
};
}
@ -4228,12 +4239,20 @@ export function AgentPsdTemplateEditorDialog({
if (!layerImageUrl) {
return null;
}
const layerPreviewSourceUrl =
getPsdLayerPreviewSourceUrl(layer);
const assignedImageContainerStyle = assignedUrl
? {
...layerBoxStyle,
...getAssignedImageMaskStyle(layer),
...getAssignedImageMaskStyle({
layer,
maskSourceUrl: layerPreviewSourceUrl,
}),
}
: layerBoxStyle;
const previewZIndex = hasAssignedImage
? Math.max(baseZIndex, renderBaseZIndex + 1)
: baseZIndex;
return (
<div
@ -4261,7 +4280,7 @@ export function AgentPsdTemplateEditorDialog({
}}
style={{
...assignedImageContainerStyle,
zIndex: baseZIndex,
zIndex: previewZIndex,
cursor: canDragAssignedImage
? imagePlacementDragStateRef.current
?.layerId === layer.id
@ -4523,6 +4542,9 @@ export function AgentPsdTemplateEditorDialog({
effectiveImageAssignments[layer.id] || ""
).trim()
);
const effectiveBaseZIndex = hasAssignedImage
? Math.max(baseZIndex, renderBaseZIndex + 1)
: baseZIndex;
const isLayerSuperLocked =
isAgentPsdLayerSuperLocked(layer);
@ -4534,7 +4556,7 @@ export function AgentPsdTemplateEditorDialog({
style={{
...frameStyle,
zIndex:
baseZIndex +
effectiveBaseZIndex +
SELECTED_LAYER_INTERACTION_Z_BOOST,
background: "rgba(249,115,22,0.08)",
cursor:
@ -4567,7 +4589,7 @@ export function AgentPsdTemplateEditorDialog({
style={{
...frameStyle,
zIndex:
baseZIndex +
effectiveBaseZIndex +
(isSelected
? SELECTED_LAYER_INTERACTION_Z_BOOST
: 0),
@ -4604,6 +4626,9 @@ export function AgentPsdTemplateEditorDialog({
);
const baseZIndex =
layerStackZIndexById.get(layer.id) || 1;
const effectiveBaseZIndex = hasAssignedImage
? Math.max(baseZIndex, renderBaseZIndex + 1)
: baseZIndex;
if (!isSelected || !hasAssignedImage) {
return null;
}
@ -4631,7 +4656,7 @@ export function AgentPsdTemplateEditorDialog({
44
),
zIndex:
baseZIndex +
effectiveBaseZIndex +
SELECTED_LAYER_CONTROLS_Z_BOOST,
}}
>

View File

@ -1035,11 +1035,17 @@ export async function renderAgentPsdTemplate(params: {
.png(PSD_RENDER_PNG_OPTIONS)
.toBuffer();
if (layer.maskUrl) {
const shouldUseLayerSourceAsMask =
!layer.maskUrl && isAgentPsdLayerSuperLocked(layer);
if (layer.maskUrl || shouldUseLayerSourceAsMask) {
try {
const maskBuffer = await sharp(
await readCachedBuffer(layer.maskUrl, "PSD 蒙版资源")
)
const rawMaskBuffer = layer.maskUrl
? await readCachedBuffer(layer.maskUrl, "PSD 蒙版资源")
: await readReusableLayerBuffer(layer);
if (!rawMaskBuffer) {
throw new Error("Missing PSD layer mask source");
}
const maskBuffer = await sharp(rawMaskBuffer)
.resize({
width: Math.max(1, Math.round(layer.width)),
height: Math.max(1, Math.round(layer.height)),