Thin canvas draw seams and own grid worker

This commit is contained in:
2026-06-16 07:25:57 +02:00
parent 3366b54c7f
commit 17b603536b
7 changed files with 179 additions and 112 deletions

View File

@@ -18,6 +18,22 @@ agent or engineer to remove them without reconstructing context from chat.
## Reductions
- 2026-06-16: `DEBT-0036` was narrowed again. `NodeCanvas` smoothing-mask
overlay draw, smoothing-mask face pass, grid keepalive draw, heightmap draw,
and current-mode draw now route through
`execute_legacy_canvas_draw_merge_post_draw(...)` in
`src/legacy_canvas_draw_merge_services.h` instead of living inline in
`NodeCanvas::draw()`; broader canvas draw orchestration and retained GL
resource ownership remain.
- 2026-06-16: `DEBT-0036` was narrowed again. The retained
`NodePanelGrid::bake_uvs()` worker now uses scoped `std::jthread` ownership
instead of a raw local `std::thread`; retained bake execution, progress-loop
polling, and grid rendering ownership remain.
- 2026-06-16: `DEBT-0017` was narrowed again.
`LegacyPlatformServices::prepare_storage_paths()` now routes Apple storage
path setup through a local helper instead of reading `App::I` directly in
the method body; the retained Apple fallback adapter and broader
platform-to-app singleton reach remain.
- 2026-06-16: `DEBT-0036` was narrowed again. `NodeStrokePreview` background
preview execution now owns its worker as `std::jthread` with explicit stop,
unblock, and join semantics instead of a raw `std::thread`; retained queue

View File

@@ -102,13 +102,16 @@ Current architecture mismatches that must be treated as real blockers:
app shell.
- `pp_panopainter_ui` still depends on `pp_legacy_app`.
- `Canvas`, `NodeCanvas`, and `NodeStrokePreview` still own too much live
OpenGL execution around the renderer boundary.
OpenGL execution around the renderer boundary, even though `NodeCanvas`
display resolve, cache-to-screen composite, and post-draw mask/grid/current-
mode sequencing now route through retained draw-merge helpers.
- `app_layout.cpp` and `app_dialogs.cpp` are still mixed shell/controller files
rather than thin composition/binding surfaces.
- `App`, `Canvas`, `Node`, retained workers, and platform entrypoints still use
global singleton reach, raw observer pointers, retained static worker
ownership in several app families, and ad hoc mutex/condition-variable
ownership.
ownership, even though most previously detached or raw app-facing worker
launches now use owned `std::jthread` or service-owned worker queues.
- Modern C++23 usage exists in extracted components, especially `std::span`,
explicit result/status objects, and a few concepts, but the live app still
does not consistently express ownership, thread affinity, or renderer

View File

@@ -132,8 +132,11 @@ Current slice:
through `legacy_node_stroke_preview_execution_services.h`, but the preview
node still owns most live-pass and retained GL resource execution.
- `NodeCanvas` display resolve plus cache-to-screen checkerboard/cache-texture
composite now route through `legacy_canvas_draw_merge_services.h`, but
broader canvas draw orchestration is still inline.
composite now route through `legacy_canvas_draw_merge_services.h`.
- `NodeCanvas` smoothing-mask overlay, smoothing-mask face pass, grid keepalive
draw, heightmap draw, and current-mode draw now also route through
`execute_legacy_canvas_draw_merge_post_draw(...)`, but broader canvas draw
orchestration is still inline.
Write scope:
- `src/node_stroke_preview.cpp`
@@ -348,9 +351,9 @@ Mini-model packet:
Status: In Progress
Why now:
Canvas imports/exports/saves, cloud transfer, brush import/export, grid
lightmap work, stroke preview, and event persistence still launch detached
threads. That is not a safe modernization foundation.
The biggest app-facing async families have been moved off detached launches,
but retained worker ownership and ad hoc runtime control are still not a safe
modernization foundation.
Current slice:
- app-owned render/UI runtime queues and cloud worker ownership are already
@@ -361,8 +364,9 @@ Current slice:
workers with explicit UI-thread handoff
- canvas async import/export/save/open and timelapse export now also use owned
worker queues instead of detached threads
- preview background rendering and recording thread ownership now also use
`std::jthread`, but their retained loop/control flow is still open
- preview background rendering, recording, and the retained
`NodePanelGrid::bake_uvs()` worker now also use `std::jthread`, but their
retained loop/control flow is still open
Write scope:
- `src/canvas.cpp`
@@ -563,6 +567,9 @@ Current slice:
`App::set_platform_services()`
- `platform_apple` clipboard, display/share, cursor, and save-ui-state calls
now route through injected Apple bridge callbacks instead of `App::I`
- `LegacyPlatformServices::prepare_storage_paths()` now routes Apple path
preparation through a narrow local helper instead of reading `App::I`
directly in that method body
- retained Apple callback injection and broader `platform_legacy` singleton
reach are still open