diff --git a/docs/modernization/debt.md b/docs/modernization/debt.md index eb9fa26..b191eef 100644 --- a/docs/modernization/debt.md +++ b/docs/modernization/debt.md @@ -18,6 +18,10 @@ agent or engineer to remove them without reconstructing context from chat. ## Recent Reductions +- 2026-06-13: DEBT-0036 was narrowed again. `Canvas::stroke_draw` pad-region + planning now routes through the retained stroke execution helper wrapping + `pp_paint_renderer`; pad color selection, dirty-face iteration, + framebuffer copies, quad upload, and draw execution remain retained. - 2026-06-13: DEBT-0036 was narrowed again. `Canvas::stroke_draw` face dirty-box planning now routes through a retained stroke execution helper wrapping `pp_paint_renderer`, retained stroke commit step dispatch clamps diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index 27a64f3..20c78ce 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -3079,6 +3079,10 @@ Results: compositor coverage now includes malformed retained commit plans plus all-input stroke-preview composite planning. Live stroke rasterization, callback execution, texture binding, and history mutation remain retained. +- `Canvas::stroke_draw` pad-region planning now shares the retained stroke + execution helper wrapping `pp_paint_renderer`, while pad color selection, + dirty-face iteration, framebuffer copies, quad upload, and draw execution + remain retained. - Remaining simple color, hue, color-quad, grid heightmap, and pen/line preview shader setup in UI nodes and canvas modes now shares retained helper surfaces, while geometry, texture/sampler binding, blend/depth state, diff --git a/src/canvas.cpp b/src/canvas.cpp index 40dc138..f092be9 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -95,21 +95,6 @@ pp::renderer::Extent2D canvas_stroke_extent(int width, int height) noexcept }; } -pp::paint_renderer::CanvasStrokeBox canvas_stroke_box(glm::vec4 box) noexcept -{ - return pp::paint_renderer::CanvasStrokeBox { - .min_x = box.x, - .min_y = box.y, - .max_x = box.z, - .max_y = box.w, - }; -} - -glm::vec4 glm_box(pp::paint_renderer::CanvasStrokeBox box) noexcept -{ - return glm::vec4(box.min_x, box.min_y, box.max_x, box.max_y); -} - pp::paint_renderer::CanvasBlendGatePlan draw_merge_blend_gate_plan( int width, int height, @@ -822,10 +807,10 @@ void Canvas::stroke_draw() { if (!box_dirty[i]) continue; - const auto pad_region = pp::paint_renderer::plan_canvas_stroke_pad_region( - pp::paint_renderer::CanvasStrokePadRegionRequest { + const auto pad_region = pp::panopainter::plan_legacy_canvas_stroke_pad_region( + pp::panopainter::LegacyCanvasStrokePadRegionRequest { .extent = stroke_extent, - .pass_dirty_box = canvas_stroke_box(box_face[i]), + .pass_dirty_box = box_face[i], }); if (!pad_region.has_pixels) continue; diff --git a/src/legacy_canvas_stroke_execution_services.h b/src/legacy_canvas_stroke_execution_services.h index bc526cd..cb17a2c 100644 --- a/src/legacy_canvas_stroke_execution_services.h +++ b/src/legacy_canvas_stroke_execution_services.h @@ -1,6 +1,7 @@ #pragma once #include "paint_renderer/compositor.h" +#include "../libs/glm/glm/glm.hpp" #include "util.h" #include @@ -46,6 +47,17 @@ struct LegacyCanvasStrokeFaceDirtyResult { bool pass_dirty = false; }; +struct LegacyCanvasStrokePadRegionRequest { + pp::renderer::Extent2D extent {}; + glm::vec4 pass_dirty_box {}; +}; + +struct LegacyCanvasStrokePadRegionResult { + bool has_pixels = false; + pp::paint_renderer::CanvasStrokeCopyRegion copy_region {}; + std::array ndc_quad {}; +}; + [[nodiscard]] inline pp::paint_renderer::CanvasStrokeBox legacy_canvas_stroke_box(glm::vec4 box) noexcept { return pp::paint_renderer::CanvasStrokeBox { @@ -62,6 +74,22 @@ struct LegacyCanvasStrokeFaceDirtyResult { return glm::vec4(box.min_x, box.min_y, box.max_x, box.max_y); } +[[nodiscard]] inline LegacyCanvasStrokePadRegionResult plan_legacy_canvas_stroke_pad_region( + const LegacyCanvasStrokePadRegionRequest& request) noexcept +{ + const auto plan = pp::paint_renderer::plan_canvas_stroke_pad_region( + pp::paint_renderer::CanvasStrokePadRegionRequest { + .extent = request.extent, + .pass_dirty_box = legacy_canvas_stroke_box(request.pass_dirty_box), + }); + + return LegacyCanvasStrokePadRegionResult { + .has_pixels = plan.has_pixels, + .copy_region = plan.copy_region, + .ndc_quad = plan.ndc_quad, + }; +} + [[nodiscard]] inline LegacyCanvasStrokeFaceDirtyResult plan_legacy_canvas_stroke_face_dirty_update( const LegacyCanvasStrokeFaceDirtyRequest& request) noexcept {