New src/map.c (unity-build part) adds a map screen reached from the search
bar's map button:
- Fetches geotag markers (GET /api/map/markers), projects with Web Mercator.
- Clusters markers into count "bubbles" in map space (anchored to the world,
so panning translates them instead of reshuffling); pan (d-pad/touch),
zoom (L/R/pinch). X or tap zooms into a cluster, or opens a lone/co-located
photo — fetching that asset on demand if it isn't paged into the grid —
and returns to the map on back.
- Base map: a Web-Mercator LOD tile pyramid generated offline from a MapChart
PNG (tools/png_to_tiles.py -> assets/maptiles.pak); the level matching the
on-screen scale is drawn from 256px JPEG tiles decoded into pooled textures
(the crash-safe path), with a coarse overview underneath so there are no
gaps while tiles stream in. Georeferencing (full longitude, lat band) was
fit from isolated-island centroids so markers land on land.
main.c uses a larger vita2d vertex pool; app.c wires the mode in.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the grid status dot with the Immich cloud icons (rasterized from the
provided SVGs to white transparent PNGs: cloud = on server, cloud-off = on
device, cloud-done = on both). Drawn white in the cell's bottom-right corner,
no background, with a 1px dark shadow for legibility (red tint on failure).
Icons rendered high-res, thinned, and LANCZOS-downscaled so they stay
anti-aliased at badge size.
Also drop the bottom HUD hint bar on every page (draw_hud is now a no-op).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Startup: bundle the Immich logo (app0:logo.png, transparent + AA) and show a
spinning-logo loading screen while the first page loads on a thread.
Search bar: logo to the left of the field; d-pad up from the top row focuses
the bar, left/right move across field/map/cloud (indigo ring), X activates,
down or [] returns to the grid. The selection square stays hidden while focused.
Cloud: "Made by SadsArches with love" credit; the O/Back button lives on the
See-details menu (top-right, tappable). Reverted the back circle from the
image/detail view.
Resume from sleep: an RTC wall-clock jump triggers an append-only camera
re-scan (startup reserves array headroom so it can't realloc under the worker
/sync threads).
Play overlay redrawn with the AA disc + a baked play-triangle glyph.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- all text renders in the bundled Overpass SemiBold (Immich's
typeface) via vita2d's FreeType path, with a per-pixel-size font
instance cache (vita2d's glyph atlas caches glyphs at their first
drawn size, which rendered stray oversized letters when sizes mixed)
and a system-PGF fallback if the TTF fails to load; the OFL license
ships in the vpk next to the font
- freetype's bzip2 references get failing stubs (the SDK ships no
libbz2 and plain TTFs never hit that path)
- icon rebuilt from the official high-res Immich logo: anti-aliased,
flattened onto white so the LiveArea no longer shows it on black
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The "unsupported protocol" failure was never about HTTPS: the Vita
resolved the public domain to the WAN IP, the router (no NAT loopback)
answered with its own admin page, and curl reported the resulting
HTTP/0.9 garbage as CURLE_UNSUPPORTED_PROTOCOL. serverip= pins the
hostname to the LAN IP via CURLOPT_RESOLVE, keeping Host/SNI intact
for the reverse proxy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Scrollable chronological photo grid with full-screen viewer, fetching
previews from an Immich server via its REST API. Thumbnails stream in
on a background thread over a keep-alive connection. JPEG decoding is
done with libjpeg directly (vita2d's loader rejects Immich's
APP2-first JPEGs). JSON parsed with vendored jsmn (the vitasdk jansson
package is built as PIC, which vita-elf-create can't handle).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>