Extract stroke commit history mutation helpers
This commit is contained in:
@@ -606,48 +606,13 @@ static auto make_canvas_stroke_commit_callbacks(
|
||||
canvas.apply_canvas_clear_color(cc);
|
||||
set_active_texture_unit(0);
|
||||
},
|
||||
[&]() {
|
||||
action->m_layer_idx = canvas.m_current_layer_idx;
|
||||
action->m_frame_idx = canvas.layer().m_frame_index;
|
||||
action->m_canvas = &canvas;
|
||||
ActionManager::add(action);
|
||||
},
|
||||
[&]() { stamp_canvas_stroke_commit_action(canvas, action); },
|
||||
[&]() {
|
||||
canvas.stroke_commit_timelapse();
|
||||
},
|
||||
[&](int i) {
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->rtt(i).bindFramebuffer();
|
||||
},
|
||||
[&](int i) {
|
||||
glm::vec2 box_sz = zw(canvas.m_dirty_box[i]) - xy(canvas.m_dirty_box[i]);
|
||||
action->m_image[i] = std::make_unique<uint8_t[]>(
|
||||
static_cast<std::size_t>(box_sz.x * box_sz.y * 4));
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->rtt(i).readPixelsRgba8(
|
||||
static_cast<int>(canvas.m_dirty_box[i].x),
|
||||
static_cast<int>(canvas.m_dirty_box[i].y),
|
||||
static_cast<int>(box_sz.x),
|
||||
static_cast<int>(box_sz.y),
|
||||
action->m_image[i].get());
|
||||
|
||||
action->m_box[i] = canvas.m_dirty_box[i];
|
||||
action->m_old_box[i] = canvas.m_layers[canvas.m_current_layer_idx]->box(i);
|
||||
action->m_old_dirty[i] = canvas.m_layers[canvas.m_current_layer_idx]->face(i);
|
||||
},
|
||||
[&](int i) {
|
||||
if (!canvas.m_layers[canvas.m_current_layer_idx]->m_alpha_locked) {
|
||||
auto& lbox = canvas.m_layers[canvas.m_current_layer_idx]->box(i);
|
||||
lbox = glm::vec4(
|
||||
glm::min(xy(canvas.m_dirty_box[i]), xy(lbox)),
|
||||
glm::max(zw(canvas.m_dirty_box[i]), zw(lbox)));
|
||||
}
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->face(i) = true;
|
||||
},
|
||||
[&](int i) {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_tex2[i].bind();
|
||||
copy_framebuffer_to_texture_2d(0, 0, 0, 0, canvas.m_width, canvas.m_height);
|
||||
canvas.m_tex2[i].unbind();
|
||||
},
|
||||
[&](int i) { capture_canvas_stroke_commit_layer_state(canvas, action, i); },
|
||||
[&](int i) { apply_canvas_stroke_commit_dirty_mutation(canvas, i); },
|
||||
[&](int i) { copy_canvas_stroke_commit_layer_image(canvas, i); },
|
||||
[&](int i) {
|
||||
bind_commit_inputs(i);
|
||||
},
|
||||
@@ -848,6 +813,61 @@ static auto make_canvas_stroke_commit_request(
|
||||
return pp::panopainter::make_legacy_canvas_stroke_commit_request(faces, sequence, commit_callbacks);
|
||||
}
|
||||
|
||||
static void stamp_canvas_stroke_commit_action(
|
||||
Canvas& canvas,
|
||||
ActionStroke* action)
|
||||
{
|
||||
action->m_layer_idx = canvas.m_current_layer_idx;
|
||||
action->m_frame_idx = canvas.layer().m_frame_index;
|
||||
action->m_canvas = &canvas;
|
||||
ActionManager::add(action);
|
||||
}
|
||||
|
||||
static void capture_canvas_stroke_commit_layer_state(
|
||||
Canvas& canvas,
|
||||
ActionStroke* action,
|
||||
int i)
|
||||
{
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->rtt(i).bindFramebuffer();
|
||||
|
||||
glm::vec2 box_sz = zw(canvas.m_dirty_box[i]) - xy(canvas.m_dirty_box[i]);
|
||||
action->m_image[i] = std::make_unique<uint8_t[]>(
|
||||
static_cast<std::size_t>(box_sz.x * box_sz.y * 4));
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->rtt(i).readPixelsRgba8(
|
||||
static_cast<int>(canvas.m_dirty_box[i].x),
|
||||
static_cast<int>(canvas.m_dirty_box[i].y),
|
||||
static_cast<int>(box_sz.x),
|
||||
static_cast<int>(box_sz.y),
|
||||
action->m_image[i].get());
|
||||
|
||||
action->m_box[i] = canvas.m_dirty_box[i];
|
||||
action->m_old_box[i] = canvas.m_layers[canvas.m_current_layer_idx]->box(i);
|
||||
action->m_old_dirty[i] = canvas.m_layers[canvas.m_current_layer_idx]->face(i);
|
||||
}
|
||||
|
||||
static void apply_canvas_stroke_commit_dirty_mutation(
|
||||
Canvas& canvas,
|
||||
int i)
|
||||
{
|
||||
if (!canvas.m_layers[canvas.m_current_layer_idx]->m_alpha_locked) {
|
||||
auto& lbox = canvas.m_layers[canvas.m_current_layer_idx]->box(i);
|
||||
lbox = glm::vec4(
|
||||
glm::min(xy(canvas.m_dirty_box[i]), xy(lbox)),
|
||||
glm::max(zw(canvas.m_dirty_box[i]), zw(lbox)));
|
||||
}
|
||||
canvas.m_layers[canvas.m_current_layer_idx]->face(i) = true;
|
||||
}
|
||||
|
||||
static void copy_canvas_stroke_commit_layer_image(
|
||||
Canvas& canvas,
|
||||
int i)
|
||||
{
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_tex2[i].bind();
|
||||
copy_framebuffer_to_texture_2d(0, 0, 0, 0, canvas.m_width, canvas.m_height);
|
||||
canvas.m_tex2[i].unbind();
|
||||
}
|
||||
|
||||
std::vector<Canvas::StrokeFrame> Canvas::stroke_draw_compute(Stroke& stroke) const
|
||||
{
|
||||
auto samples = stroke.compute_samples();
|
||||
|
||||
Reference in New Issue
Block a user