From 2dd6b47714a183a53390574ba9b993d13b09f1dc Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Wed, 27 May 2026 05:01:30 -0500 Subject: [PATCH] fix: OCR bounding box positioning (#28568) --- web/src/lib/components/AdaptiveImage.svelte | 163 +++++++++++--------- web/src/lib/components/ImageLayer.svelte | 15 +- 2 files changed, 90 insertions(+), 88 deletions(-) diff --git a/web/src/lib/components/AdaptiveImage.svelte b/web/src/lib/components/AdaptiveImage.svelte index 4f3522887c..04136c721c 100644 --- a/web/src/lib/components/AdaptiveImage.svelte +++ b/web/src/lib/components/AdaptiveImage.svelte @@ -149,29 +149,35 @@ return { width: 1, height: 1 }; }); - const { insetInlineStart, top, rasterWidth, rasterHeight, rasterScale } = $derived.by(() => { - const scaleFn = objectFit === 'cover' ? scaleToCover : scaleToFit; - const { width, height } = scaleFn(imageDimensions, container); - if (maxRasterPixels === 0) { + const { insetInlineStart, top, displayWidth, displayHeight, rasterWidth, rasterHeight, rasterScale } = $derived.by( + () => { + const scaleFn = objectFit === 'cover' ? scaleToCover : scaleToFit; + const { width, height } = scaleFn(imageDimensions, container); + if (maxRasterPixels === 0) { + return { + insetInlineStart: (container.width - width) / 2 + 'px', + top: (container.height - height) / 2 + 'px', + displayWidth: width + 'px', + displayHeight: height + 'px', + rasterWidth: width + 'px', + rasterHeight: height + 'px', + rasterScale: 1, + }; + } + const nativeRatio = imageDimensions.width / width; + const budgetRatio = Math.sqrt(maxRasterPixels / Math.max(width * height, 1)); + const rasterRatio = Math.max(1, Math.min(nativeRatio, budgetRatio)); return { insetInlineStart: (container.width - width) / 2 + 'px', top: (container.height - height) / 2 + 'px', - rasterWidth: width + 'px', - rasterHeight: height + 'px', - rasterScale: 1, + displayWidth: width + 'px', + displayHeight: height + 'px', + rasterWidth: width * rasterRatio + 'px', + rasterHeight: height * rasterRatio + 'px', + rasterScale: 1 / rasterRatio, }; - } - const nativeRatio = imageDimensions.width / width; - const budgetRatio = Math.sqrt(maxRasterPixels / Math.max(width * height, 1)); - const rasterRatio = Math.max(1, Math.min(nativeRatio, budgetRatio)); - return { - insetInlineStart: (container.width - width) / 2 + 'px', - top: (container.height - height) / 2 + 'px', - rasterWidth: width * rasterRatio + 'px', - rasterHeight: height * rasterRatio + 'px', - rasterScale: 1 / rasterRatio, - }; - }); + }, + ); const { status } = $derived(adaptiveImageLoader); const alt = $derived(status.urls.preview ? $getAltText(toTimelineAsset(asset)) : ''); @@ -216,69 +222,78 @@ {@render backdrop?.()}
0 ? 'transform' : undefined} + style:width={displayWidth} + style:height={displayHeight} > - {#if show.alphaBackground} - - {/if} - - {#if show.thumbhash} - {#if asset.thumbhash} - - - {:else if show.spinner} - +
0 ? 'transform' : undefined} + > + {#if show.alphaBackground} + {/if} - {/if} - {#if show.thumbnail} - - {/if} + {#if show.thumbhash} + {#if asset.thumbhash} + + + {:else if show.spinner} + + {/if} + {/if} - {#if show.brokenAsset} - - {/if} + {#if show.thumbnail} + + {/if} - {#if show.preview} - - {/if} + {#if show.brokenAsset} + + {/if} - {#if show.original} - + {#if show.preview} + + {/if} + + {#if show.original} + + {/if} +
+ + {#if overlays} +
+ {@render overlays()} +
{/if}
diff --git a/web/src/lib/components/ImageLayer.svelte b/web/src/lib/components/ImageLayer.svelte index 1ac854259d..40bf7d6965 100644 --- a/web/src/lib/components/ImageLayer.svelte +++ b/web/src/lib/components/ImageLayer.svelte @@ -1,7 +1,6 @@ {#key adaptiveImageLoader} @@ -42,6 +30,5 @@ draggable={false} data-testid={quality} /> - {@render overlays?.()} {/key}