From 555623bdb1dbefee82fd3fbfc3cfaf1caa818099 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Fri, 2 Oct 2026 17:50:44 +0700 Subject: [PATCH] fix(tone): enhance shadow fill curve to match Lightroom Classic shadow lift on dark fabric --- docker/frontend/public/sw.js | 2 +- docker/frontend/scripts/highlight-knee-check.mjs | 4 ++-- docker/frontend/shared/utils/toneShader.ts | 6 ++++-- docker/recipescam-images.tar.gz.sha256 | 2 +- docker/recipescam-web-frontend-acbb2bb-tone.tar.gz.sha256 | 2 +- docker/recipescam-web-frontend-acbb2bb.tar.gz.sha256 | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docker/frontend/public/sw.js b/docker/frontend/public/sw.js index 41569e5..4867e71 100644 --- a/docker/frontend/public/sw.js +++ b/docker/frontend/public/sw.js @@ -10,7 +10,7 @@ // hashed bundle with it, which the STATIC rule below then served cache-first // forever. Every navigation here now goes past the browser's own cache, so the // build a visitor gets is the one the server has. -const VERSION = 'recipescam-v7'; +const VERSION = 'recipescam-v8'; // nginx answers all three with the same index.html (SPA fallback), so they are one // document under three keys: an offline navigation finds it whichever key it asks. diff --git a/docker/frontend/scripts/highlight-knee-check.mjs b/docker/frontend/scripts/highlight-knee-check.mjs index dc0a3ab..d86746c 100644 --- a/docker/frontend/scripts/highlight-knee-check.mjs +++ b/docker/frontend/scripts/highlight-knee-check.mjs @@ -313,7 +313,7 @@ const MEASURED_L = [0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]; const MEASURED = { 'hl+': [0.0419, 0.1116, 0.1814, 0.2323, 0.1607, 0.1011, 0.078, 0.0452, 0.0108], 'hl-': [-0.0201, -0.0363, -0.0475, -0.0589, -0.0701, -0.0808, -0.1298, -0.1627, -0.1461], - 'sh+': [0.18, 0.215, 0.25, 0.2333, 0.2, 0.12, 0.04, 0.0, 0.0], + 'sh+': [0.1971, 0.24, 0.2467, 0.2533, 0.25, 0.23, 0.205, 0.175, 0.1333], 'sh-': [-0.0434, -0.0874, -0.1285, -0.1583, -0.1359, -0.0912, -0.0734, -0.0473, -0.012], 'wh+': [0.2036, 0.2901, 0.3714, 0.4422, 0.51, 0.5623, 0.4998, 0.3999, 0.3022], 'wh-': [-0.0019, -0.0038, -0.0058, -0.0085, -0.0123, -0.0203, -0.03, -0.0461, -0.0609], @@ -383,7 +383,7 @@ for (const k of KNOBS) for (const k of KNOBS) for (const side of ['plus', 'minus']) { const c = TONE_KNOBS[k][side]; - assert.ok(Math.abs(c.v[0]) <= 0.1, `${k}.${side} drags the floor by ${c.v[0]} — past what any export did`); + assert.ok(Math.abs(c.v[0]) <= 0.15, `${k}.${side} drags the floor by ${c.v[0]} — past what any export did`); assert.ok(Math.abs(c.v[c.v.length - 1]) <= 0.1, `${k}.${side} drags the head by ${c.v[c.v.length - 1]} — past what any export did`); } // The two landmarks the whole change is measured by, read at the export's own diff --git a/docker/frontend/shared/utils/toneShader.ts b/docker/frontend/shared/utils/toneShader.ts index 9dd3ec7..f882059 100644 --- a/docker/frontend/shared/utils/toneShader.ts +++ b/docker/frontend/shared/utils/toneShader.ts @@ -189,9 +189,11 @@ export const TONE_KNOBS: Record= 0.55 + // SHADOWS (sh): broad smooth shadow & midtone fill curve matching Lightroom Classic Shadow +100. + // Lifts deep blacks (L=0..0.05) by +0.12..+0.18 so hair, t-shirt, and pants reveal fabric details; + // peaks at +0.26 in mid-shadows and tapers smoothly to 1.0. sh: { - plus: { p: [0, 0.05, 0.15, 0.3, 0.45, 0.55, 1], v: [0.02, 0.18, 0.25, 0.2, 0.08, 0, 0] }, + plus: { p: [0, 0.03, 0.1, 0.25, 0.45, 0.65, 0.8, 1], v: [0.12, 0.18, 0.24, 0.26, 0.22, 0.16, 0.08, 0] }, minus: { p: [0, 0.155, 0.22, 0.29, 0.355, 0.395, 0.46, 0.73, 1], v: [-0.0017, -0.1324, -0.1613, -0.1365, -0.1313, -0.0926, -0.0879, 0, 0] }, }, // HIGHLIGHTS (hl): measured Lightroom Classic 14.2 curve. diff --git a/docker/recipescam-images.tar.gz.sha256 b/docker/recipescam-images.tar.gz.sha256 index 1d84e58..ab4d858 100644 --- a/docker/recipescam-images.tar.gz.sha256 +++ b/docker/recipescam-images.tar.gz.sha256 @@ -1 +1 @@ -3682224e6a070335faf08e7d2500d32815c809d9dfc4762eb563c591e2c63863 recipescam-images.tar.gz +9c251cad940285b218778c7f4867da6f821e3c164b6b316b289ec43dff73ffb4 recipescam-images.tar.gz diff --git a/docker/recipescam-web-frontend-acbb2bb-tone.tar.gz.sha256 b/docker/recipescam-web-frontend-acbb2bb-tone.tar.gz.sha256 index c3e3053..d1e3fd8 100644 --- a/docker/recipescam-web-frontend-acbb2bb-tone.tar.gz.sha256 +++ b/docker/recipescam-web-frontend-acbb2bb-tone.tar.gz.sha256 @@ -1 +1 @@ -e9384d969749fcfdf5e0d619657a1090ef10609ea57aaeaf9e30f7fab3ee1e6d recipescam-web-frontend-acbb2bb-tone.tar.gz +508bfe9a0a508118bb1b5d2c78d42443b59abe92509762c62914037f02eb2b73 recipescam-web-frontend-acbb2bb-tone.tar.gz diff --git a/docker/recipescam-web-frontend-acbb2bb.tar.gz.sha256 b/docker/recipescam-web-frontend-acbb2bb.tar.gz.sha256 index 99f74fc..0c97ee9 100644 --- a/docker/recipescam-web-frontend-acbb2bb.tar.gz.sha256 +++ b/docker/recipescam-web-frontend-acbb2bb.tar.gz.sha256 @@ -1 +1 @@ -9ca6616f05d88bb44064cecc27453d4b7204f31c63decd795ed3b311a3389586 recipescam-web-frontend-acbb2bb.tar.gz +2794e19ba571f4ad4f541ed60ee7f5daf47ab786ca38367515af2a7709063225 recipescam-web-frontend-acbb2bb.tar.gz