Commit Graph

753 Commits

Author SHA1 Message Date
3dtours a5031c76d5 chore(docker): stamp the image bundle with fce6479 2026-10-16 20:01:32 +07:00
3dtours fce6479c6a fix(ui): ensure DevelopPanels in Light tab can scroll when solo mode is disabled 2026-10-16 20:01:12 +07:00
3dtours 210ffceea4 chore(docker): stamp the image bundle with 41bbf8a 2026-10-16 19:23:14 +07:00
3dtours 41bbf8a326 fix(heal): develop photorealistic ripples and texture from border inward into selection center 2026-10-16 19:22:51 +07:00
3dtours 95481d4996 chore(docker): stamp the image bundle with 985ef68 2026-10-16 19:02:31 +07:00
3dtours 985ef68f8c feat(ui): group Saturation and Vibrance under Basic Correction in Light tab 2026-10-16 19:02:23 +07:00
3dtours 574c3c9e5c chore(docker): stamp the image bundle with 40f0913 2026-10-16 18:45:19 +07:00
3dtours 40f0913cbc fix(heal): correct mask polarity for MI-GAN and eliminate Voronoi facets with harmonic Coons blend 2026-10-16 18:44:53 +07:00
3dtours 8ee51495cd chore(docker): stamp the image bundle with 73939c2 2026-10-16 18:04:56 +07:00
3dtours 73939c2151 fix(heal): eliminate extraneous pattern overlays and restore seamless directional texture via structure-tensor guided inpainting 2026-10-16 18:03:34 +07:00
3dtours 593e58fe33 chore(docker): stamp the image bundle with 7255d89 2026-10-16 16:51:15 +07:00
3dtours 7255d896bc fix(heal): eliminate jumbled patchwork and restore seamless aligned textures via Euclidean proximity harmonic inpainting 2026-10-16 16:50:55 +07:00
3dtours a7e7620a4b chore(docker): stamp the image bundle with 105fc67 2026-10-16 16:10:55 +07:00
3dtours 105fc67c9b fix(heal): restore sharp photorealistic textures and structural lines via 1:1 scale exemplar synthesis 2026-10-16 16:10:27 +07:00
3dtours 4c249fc173 chore(docker): stamp the image bundle with 9610d1b 2026-10-16 15:46:50 +07:00
3dtours 9610d1b111 fix(heal): eliminate brush cursor mouse lag and stutter in desktop STUDIO by bypassing React reconciliation on pointermove 2026-10-16 15:46:24 +07:00
3dtours 7e4bfd3da7 Merge branch origin/recipes-web into recipes-web 2026-10-16 12:34:06 +07:00
3dtours a70037970b chore(docker): stamp the image bundle with 4df6ba7 2026-10-16 12:32:40 +07:00
3dtours 4df6ba7ccc fix(ui): expand develop sidebar width and fix ruler track and chip label wrapping in desktop STUDIO 2026-10-16 12:29:36 +07:00
3dtours f96a60f416 fix(heal): apply HEAL directly to base image before exposure grading and use fast texture synthesis on mobile to prevent iOS reload 2026-10-16 12:04:18 +07:00
3dtours d579a67ed9 fix(heal): restore direct single-threaded WASM inpainting on mobile, remove worker to prevent WebKit reload 2026-10-16 11:32:06 +07:00
3dtours b90086c8a8 fix(heal): run neural inpaint via dedicated worker on mobile to eliminate blur fallback and prevent browser reload 2026-10-16 11:05:24 +07:00
3dtours ea7973cb1e fix(heal): continuous anisotropic isophote inpaint on mobile to eliminate reload and blockiness 2026-10-16 10:47:17 +07:00
3dtours ea274de7a9 chore(docker): stamp the image bundle with 8952d1f 2026-10-16 10:37:31 +07:00
3dtours 8952d1f282 fix(heal): run neural inpaint via WebGPU and dedicated worker to prevent crash and blocky patch 2026-10-16 10:37:21 +07:00
3dtours fbff975888 chore(docker): stamp the image bundle with bdea7d3 2026-10-16 09:59:00 +07:00
3dtours bdea7d3395 fix(heal): exemplar-based texture synthesis inpaint on mobile to prevent WebKit crash and grey blob 2026-10-16 09:58:07 +07:00
3dtours e124823e8f chore(docker): stamp the image bundle with ce31e49 2026-10-16 09:40:48 +07:00
3dtours ce31e498d9 fix(heal): enable MI-GAN neural inpaint on mobile with bounded memory to prevent grey blob 2026-10-16 09:39:15 +07:00
3dtours 455800c248 chore(docker): stamp the image bundle with de20fb4 2026-10-16 09:04:44 +07:00
3dtours de20fb4440 fix(heal): handle mobile/iOS with fast local Poisson inpainting to prevent WebKit OOM crash 2026-10-16 09:03:56 +07:00
3dtours 3810bfd2b8 chore(docker): stamp the image bundle with 7a3b81b 2026-10-16 08:57:44 +07:00
3dtours 7a3b81b6ea feat(ui): compact Color Wheels & Match panel with MiniSlider rulers and 4-column color bands 2026-10-16 08:56:49 +07:00
3dtours a841c7f5a0 chore(docker): stamp the image bundle with 2dac868 2026-10-16 08:00:29 +07:00
3dtours 2dac868274 fix(heal): feed crisp photo context to inpaint model and cache patch across zoom levels 2026-10-16 07:58:38 +07:00
3dtours 21659f0d8a chore(docker): stamp the image bundle with 64e6ff2 2026-10-16 07:40:26 +07:00
3dtours 64e6ff2608 fix(heal): restore inpaint-web MI-GAN neural model to resolve grey blob bug 2026-10-16 07:36:25 +07:00
3dtours 4b039ba9c8 chore(docker): stamp the image bundle with f670de1 2026-10-16 06:14:01 +07:00
3dtours f670de1377 revert(heal): cut the mask's own fade again, not a step over the whole brush
This reverts 8809eb8. The step cut takes the whole brush out of the frame, so
the fill below has only the rim left to read from.

The colour leak that cut was for no longer needs it: 49c5c9c handed the mask
the whole spot, and heal-colour-pass.mjs measures the repair 1.08 levels off
the ground with the fade cut — the same 1.08 it measures with the step.
2026-10-16 06:13:35 +07:00
3dtours 1633287a46 chore(docker): stamp the image bundle with f044f77 2026-10-16 06:07:17 +07:00
3dtours f044f7756f fix(heal): take df44200's outer-union band back, and let it rest off the photo
The band is traced as one outer boundary again, as df44200 left it, so a
stroke that crosses itself no longer fills as a figure-eight with its lobes
cut open; and an idle band is opacity 0 again, so no wash of the tool's own
stays on the repair once the pointer is off it.
2026-10-16 06:06:20 +07:00
3dtours 5b7e065b8a chore(docker): stamp the image bundle with 9753c86 2026-10-16 00:49:31 +07:00
3dtours 9753c866ec fix(heal): the fallback reads its grain off the rim, not off a mirror of itself 2026-10-16 00:48:53 +07:00
3dtours 5650fe8888 chore(docker): stamp the image bundle with 49c5c9c 2026-10-15 23:24:41 +07:00
3dtours 49c5c9c5b9 fix(heal): the mask owns the whole spot, and the fill is the diffusion, not the model 2026-10-15 23:24:01 +07:00
3dtours 5830812862 chore(docker): stamp the image bundle with 5ff4611 2026-10-15 22:41:18 +07:00
3dtours 5ff46116ce fix(heal): read the rim for the fill, take the grid from the frame; VIGNETTING both ways; EV in the wide panel
HEAL came back a stain larger and softer than the stain it was asked to
remove, and the model's half of it answered in a colour that appears nowhere
near the repair. Three causes, all inside `engine/inpaint.ts`:

- The fallback's reading ring was the hole dilated by two pixels whatever the
  brush, so the boundary of the fill was the dirt's own penumbra and the fill
  came back as the dirt. The pad is now proportional to the hole's own radius
  (`rimPad`), the fill is an inverse-square average of the clean ring relaxed
  into one field by 36 Jacobi rounds, and the hole's grain is read against a
  2px box of the clean pixels and taken from the pixel it mirrors through its
  own middle. The texture half before this was a no-op — `detail = rgba[p] -
  fR[idx]` with `fR[idx]` the same pixel's own colour, so every donor handed
  over zero and the hole was the smooth field alone (15.6% of the ground's
  detail). Measured on a stain of radius 10 with a halo to 16 under a 12px
  brush (`probe-fallback.mjs`): the repair landed 22.3 levels below the ground
  it sits in, and comes back 0.06 off it.

- The plate the model reads under the mask was the mean of every pixel of the
  crop, so the network met a hard step at the mask's own edge and answered in
  that colour. It is now the rim's own light spread inward (`cropPlate`), and
  the mask is downsampled by "any hole pixel in this cell" rather than by a
  corner sample. Step across the mask's edge: 69.3 levels before, 9.5 after.

- The same repair came back different every time the reader zoomed out of it:
  the crop was sized from the stage's own pixels on the zoom ladder
  (`PREVIEW_QUANTUM`), so each zoom handed the model a different grid, and
  every grid invents its own pixels. The crop's box is now its share of the
  FRAME (`INPAINT_REF_LONG`, `exportEngine` 6e), so one spot is one grid at
  every zoom and at the export's own size.

The patch is deliberately not baked into the photo: a recipe stays reusable on
other frames and the repair stays a pass. ponytail: the pixels handed to the
model are still read from whatever the stage rendered at, so the answer is the
same repair to within the resampling of its input; a patch cache keyed on the
frame's identity and the spots is the rung that makes it identical, and the one
to take if a zoom still shows a repair move.

VIGNETTING now runs both ways (-10..10): down darkens the four corners, up
lifts the lens' own falloff out of them with a white ink — the same curve and
the same weight. EV was defined and live on the phone but absent from the wide
panel's own Light row, which is `DevelopPanels.tsx` and nothing else.

`npx tsc --noEmit`, `vite build`, `heal-check`, `studio-drag` and the other
suites pass. `studio-export-check` fails one assertion here on the code at HEAD
as well — a frame left behind files its waiting look 9s after the pick — so it
is not this change.
2026-10-15 22:37:05 +07:00
3dtours e33bb6a529 chore(docker): stamp the image bundle with 4d9be10 2026-10-15 22:04:41 +07:00
3dtours 4d9be1014c fix(mobile): the phone library wears the app's theme
The phone screen was painted in literals — `#101014`, `#f4f4f5` and forty more
— so it stayed dark whatever theme was set: pick Light, press Mobile Cloud,
and the reader is handed a black page with white ink.

Every surface and ink in `styles/mobile-library.css` is now one alias
(`--ml-bg`, `--ml-text`, …) that reads the theme's own tokens, the faint
linings and fills are a `color-mix` of the ink at the alpha they already
carried, and the amber the file already asked `var(--accent)` for is now what
the star, the pressed pill and the selected frame wear too. Only the four
status inks carry a light-theme override, the tokens having no word for them.

The five inline dark styles left in `MobileLibrary.tsx` read the same aliases.

Measured on the running container at 390×800, Light chosen on the desktop: the
phone was `rgb(16,16,20)` on ink `rgb(244,244,245)` whichever theme was set;
it is now `rgb(255,255,255)` on `rgb(20,24,29)` under Light and `rgb(0,0,0)` on
`rgb(242,243,245)` under Dark, held through the handover and on the way back. A
contrast sweep of the grid and the reader in both themes leaves nothing under
3:1 but the tick glyph, which its own box draws.

`mobile-pick-check` asked for one frozen amber; it asks for the accent the app
is using, which is what that outline has become.
2026-10-15 22:03:50 +07:00
3dtours 3efdfb34f5 chore(docker): stamp the image bundle with 916a9de 2026-10-15 21:38:41 +07:00