Plan stroke commit sequencing
This commit is contained in:
@@ -1445,6 +1445,55 @@ pp::foundation::Result<CanvasStrokeRasterizationPlan> plan_canvas_stroke_rasteri
|
||||
return pp::foundation::Result<CanvasStrokeRasterizationPlan>::success(plan);
|
||||
}
|
||||
|
||||
CanvasStrokeCommitSequencePlan plan_canvas_stroke_commit_sequence(CanvasStrokeCommitRequest request) noexcept
|
||||
{
|
||||
CanvasStrokeCommitSequencePlan plan;
|
||||
plan.erase_mode = request.erase_mode;
|
||||
plan.alpha_locked = request.alpha_locked;
|
||||
plan.selection_mask_active = request.selection_mask_active;
|
||||
plan.uses_dual_stroke = !request.erase_mode && request.dual_stroke_enabled;
|
||||
plan.uses_pattern = !request.erase_mode && request.pattern_enabled;
|
||||
plan.updates_layer_bounds = !request.alpha_locked;
|
||||
|
||||
auto append_step = [&plan](CanvasStrokeCommitStep step) noexcept {
|
||||
if (plan.step_count >= plan.steps.size()) {
|
||||
return;
|
||||
}
|
||||
plan.steps[plan.step_count] = step;
|
||||
++plan.step_count;
|
||||
};
|
||||
auto bind = [&plan](CanvasStrokeCommitTextureRole role, std::uint8_t slot) noexcept {
|
||||
if (plan.texture_binding_count >= plan.texture_bindings.size()) {
|
||||
return;
|
||||
}
|
||||
plan.texture_bindings[plan.texture_binding_count] = CanvasStrokeCommitTextureBindingPlan {
|
||||
.role = role,
|
||||
.slot = slot,
|
||||
};
|
||||
++plan.texture_binding_count;
|
||||
};
|
||||
|
||||
append_step(CanvasStrokeCommitStep::readback_history_region);
|
||||
append_step(CanvasStrokeCommitStep::update_layer_dirty_state);
|
||||
append_step(CanvasStrokeCommitStep::copy_layer_rtt_to_scratch);
|
||||
append_step(CanvasStrokeCommitStep::bind_commit_inputs);
|
||||
append_step(request.erase_mode ? CanvasStrokeCommitStep::erase_draw : CanvasStrokeCommitStep::composite_draw);
|
||||
append_step(CanvasStrokeCommitStep::copy_committed_rtt_to_scratch);
|
||||
append_step(CanvasStrokeCommitStep::dilate_edges_draw);
|
||||
|
||||
bind(CanvasStrokeCommitTextureRole::layer_scratch, 0);
|
||||
bind(CanvasStrokeCommitTextureRole::stroke, 1);
|
||||
bind(CanvasStrokeCommitTextureRole::selection_mask, 2);
|
||||
if (plan.uses_dual_stroke) {
|
||||
bind(CanvasStrokeCommitTextureRole::dual_stroke, 3);
|
||||
}
|
||||
if (plan.uses_pattern) {
|
||||
bind(CanvasStrokeCommitTextureRole::pattern, 4);
|
||||
}
|
||||
|
||||
return plan;
|
||||
}
|
||||
|
||||
CanvasStrokeSampleBoundsPlan plan_canvas_stroke_sample_bounds(
|
||||
CanvasStrokeSampleBoundsRequest request) noexcept
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user