From dfd42e2edd75028743291bd8246fb9ae072a41b9 Mon Sep 17 00:00:00 2001 From: fkwp Date: Fri, 18 Sep 2026 13:59:07 +0200 Subject: [PATCH] Give a background something to cover with - The stand-in backgrounds were the app's own gradients, which are overlay scrims: measured, not one pixel in either is opaque, and where they look dark they are transparent. As a background their dark half was simply absent, which is what showed on the slow path. - They are now laid on the canvas colour they are painted over and kept as JPEG, which cannot carry transparency at all. - The same hole was waiting for anyone's own picture: a canvas starts transparent, WebP keeps an alpha channel, and a file small enough to keep as it was never passed through either. Every picture now goes through an opaque ground, whatever its size. Co-Authored-By: Claude Opus 5 (1M context) --- src/graphics/background-indoor-standin.jpg | Bin 0 -> 27744 bytes src/graphics/background-outdoor-standin.jpg | Bin 0 -> 22295 bytes src/livekit/backgroundEffects.ts | 19 +++++++++++++------ src/livekit/backgroundImages.ts | 14 +++++++++++--- 4 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 src/graphics/background-indoor-standin.jpg create mode 100644 src/graphics/background-outdoor-standin.jpg diff --git a/src/graphics/background-indoor-standin.jpg b/src/graphics/background-indoor-standin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d709f81981885dc6140dc8501153d286a9940a6 GIT binary patch literal 27744 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 literal 0 HcmV?d00001 diff --git a/src/graphics/background-outdoor-standin.jpg b/src/graphics/background-outdoor-standin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91baebc55c3c6810789a869c58ade441e4e20e5a GIT binary patch literal 22295 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 literal 0 HcmV?d00001 diff --git a/src/livekit/backgroundEffects.ts b/src/livekit/backgroundEffects.ts index e43dc9837..e3dcb3153 100644 --- a/src/livekit/backgroundEffects.ts +++ b/src/livekit/backgroundEffects.ts @@ -5,8 +5,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ -import desktopGradient from "../graphics/desktop-gradient.png?url"; -import mobileGradient from "../graphics/mobile-gradient.png?url"; +import indoorStandIn from "../graphics/background-indoor-standin.jpg?url"; +import outdoorStandIn from "../graphics/background-outdoor-standin.jpg?url"; /** How much to blur, when the chosen effect is blur. */ export const blurRadius = 15; @@ -17,11 +17,18 @@ export interface ShippedBackground { } // EXPLORATION SHORTCUT (S1): the two shipped backgrounds, one indoor and one -// outdoor, do not exist yet. These stand-ins are existing gradient assets, so -// the pipeline can be exercised and measured. Never port this. +// outdoor, do not exist yet. These stand-ins are the app's own gradients, laid +// on the canvas colour they are painted over and kept as JPEG. +// +// Not a detail: those gradients are overlay scrims, and measured, not one +// pixel in either is opaque — where they look dark they are transparent. Used +// directly as a background their dark half was simply absent, which is what +// showed on the slow path. Flattening them is what makes them a picture rather +// than a veil, and JPEG cannot carry transparency at all, so it cannot come +// back. Never port this. export const shippedBackgrounds: ShippedBackground[] = [ - { id: "indoor", imagePath: desktopGradient }, - { id: "outdoor", imagePath: mobileGradient }, + { id: "indoor", imagePath: indoorStandIn }, + { id: "outdoor", imagePath: outdoorStandIn }, ]; export type BackgroundEffect = diff --git a/src/livekit/backgroundImages.ts b/src/livekit/backgroundImages.ts index f8554aaab..3ab2a1c5d 100644 --- a/src/livekit/backgroundImages.ts +++ b/src/livekit/backgroundImages.ts @@ -83,16 +83,24 @@ export async function prepareImage(file: Blob): Promise { } try { + // Every picture goes through the canvas, not only the oversized ones: a + // background covers what is behind it, so it has to be opaque, and a + // picture with transparency in it — a logo, a screenshot with rounded + // corners — would otherwise be stored with its holes and drawn with them. + // Passing small files straight through is what kept them. const longest = Math.max(bitmap.width, bitmap.height); - if (longest <= maxStoredEdge) return file; - - const scale = maxStoredEdge / longest; + const scale = Math.min(1, maxStoredEdge / longest); const canvas = new OffscreenCanvas( Math.round(bitmap.width * scale), Math.round(bitmap.height * scale), ); const context = canvas.getContext("2d"); if (!context) throw new UnusableImage("undecodable"); + // The ground the picture is laid on, so nothing it does not cover is a + // hole. Black rather than white: an unfilled corner reads as the frame's + // own edge rather than as a lamp. + context.fillStyle = "black"; + context.fillRect(0, 0, canvas.width, canvas.height); context.drawImage(bitmap, 0, 0, canvas.width, canvas.height); return await canvas.convertToBlob({ type: "image/webp", quality: 0.9 }); } finally {