From 8e1aea9a2dcc9d61130df43ec9ee69c91ddffcee Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sun, 14 Jun 2026 00:29:05 +0200 Subject: [PATCH] Extract draw merge branch dispatch object helper --- src/canvas.cpp | 119 +++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 44 deletions(-) diff --git a/src/canvas.cpp b/src/canvas.cpp index 3433027..8935afd 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -514,6 +514,16 @@ static void execute_canvas_draw_merge_plane_final_composite( bool draw_checkerboard, bool use_blend); +static pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution make_canvas_draw_merge_branch_dispatch( + Canvas& canvas, + int plane_index, + int layer_index, + const std::shared_ptr& layer, + const Brush& brush, + const glm::mat4& ortho, + bool copy_blend_destination, + bool draw_checkerboard); + static void execute_canvas_draw_merge_branch_body( Canvas& canvas, int plane_index, @@ -535,55 +545,76 @@ static void execute_canvas_draw_merge_branch_body( canvas.m_current_stroke && canvas.m_current_mode == kCanvasMode::Erase && canvas.m_show_tmp && canvas.m_current_layer_idx == layer_index, canvas.m_current_stroke && canvas.m_show_tmp && canvas.m_current_layer_idx == layer_index, use_blend, - pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution { - .execute_temporary_erase = [&] { - execute_canvas_draw_merge_temporary_erase_dispatch( + make_canvas_draw_merge_branch_dispatch( + canvas, + plane_index, + layer_index, + layer, + brush, + ortho, + copy_blend_destination, + draw_checkerboard)); +} + +static pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution make_canvas_draw_merge_branch_dispatch( + Canvas& canvas, + int plane_index, + int layer_index, + const std::shared_ptr& layer, + const Brush& brush, + const glm::mat4& ortho, + bool copy_blend_destination, + bool draw_checkerboard) +{ + return pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution { + .execute_temporary_erase = [&] { + execute_canvas_draw_merge_temporary_erase_dispatch( + canvas, + plane_index, + layer_index, + layer, + ortho); + }, + .execute_temporary_paint = [&] { + canvas.draw_merge_temporary_paint_branch( + layer_index, + plane_index, + layer, + brush, + ortho, + copy_blend_destination, + draw_checkerboard); + }, + .execute_layer_texture = [&] { + execute_canvas_draw_merge_layer_texture( + pp::panopainter::LegacyCanvasDrawMergeTextureAlphaUniforms { + .mvp = ortho, + .texture_slot = 0, + .alpha = layer->m_opacity, + .highlight = layer->m_hightlight, + }, + make_canvas_draw_merge_layer_texture_dispatch( canvas, plane_index, - layer_index, - layer, - ortho); - }, - .execute_temporary_paint = [&] { - canvas.draw_merge_temporary_paint_branch( - layer_index, - plane_index, - layer, - brush, - ortho, - copy_blend_destination, - draw_checkerboard); - }, - .execute_layer_texture = [&] { - execute_canvas_draw_merge_layer_texture( - pp::panopainter::LegacyCanvasDrawMergeTextureAlphaUniforms { + layer_index)); + }, + .execute_layer_blend = [&] { + execute_canvas_draw_merge_layer_blend( + pp::panopainter::LegacyCanvasDrawMergeLayerBlendUniforms { + .shader = { .mvp = ortho, .texture_slot = 0, - .alpha = layer->m_opacity, - .highlight = layer->m_hightlight, + .destination_texture_slot = 2, + .use_destination_texture = copy_blend_destination, + .blend_mode = layer->m_blend_mode, + .alpha = 1.f, }, - make_canvas_draw_merge_layer_texture_dispatch( - canvas, - plane_index, - layer_index)); - }, - .execute_layer_blend = [&] { - execute_canvas_draw_merge_layer_blend( - pp::panopainter::LegacyCanvasDrawMergeLayerBlendUniforms { - .shader = { - .mvp = ortho, - .texture_slot = 0, - .destination_texture_slot = 2, - .use_destination_texture = copy_blend_destination, - .blend_mode = layer->m_blend_mode, - .alpha = 1.f, - }, - .copy_destination = copy_blend_destination, - }, - make_canvas_draw_merge_layer_blend_dispatch( - canvas)); - }, - }); + .copy_destination = copy_blend_destination, + }, + make_canvas_draw_merge_layer_blend_dispatch( + canvas)); + }, + }; } static auto make_canvas_draw_merge_temporary_erase_dispatch(