Clean retained stroke extraction build

This commit is contained in:
2026-06-14 10:23:29 +02:00
parent 8f02e39058
commit be42224561
13 changed files with 658 additions and 287 deletions

View File

@@ -1,6 +1,10 @@
#include "pch.h"
#include "assets/image_pixels.h"
#include "brush.h"
#include "legacy_canvas_draw_merge_services.h"
#include "legacy_canvas_stroke_commit_services.h"
#include "legacy_canvas_stroke_execution_services.h"
#include "legacy_node_stroke_preview_execution_services.h"
#include "paint_renderer/compositor.h"
#include "renderer_api/recording_renderer.h"
@@ -13,6 +17,9 @@
#include <string_view>
#include <vector>
// DEBT-0064: planner tests cover retained inline preview helpers without linking the app texture implementation.
void Texture2D::bind() const {}
using pp::foundation::StatusCode;
using pp::paint::BlendMode;
using pp::paint::Rgba;
@@ -68,14 +75,14 @@ using pp::document::LayerFacePixels;
namespace {
bool near(float a, float b)
bool almost_equal(float a, float b)
{
return std::fabs(a - b) < 0.0001F;
}
bool near(const glm::vec2& a, const glm::vec2& b)
bool almost_equal(const glm::vec2& a, const glm::vec2& b)
{
return near(a.x, b.x) && near(a.y, b.y);
return almost_equal(a.x, b.x) && almost_equal(a.y, b.y);
}
bool has_texture_binding(
@@ -212,10 +219,10 @@ void composites_visible_layer_with_opacity(pp::tests::Harness& h)
});
PP_EXPECT(h, status.ok());
PP_EXPECT(h, near(destination[0].a, 0.625F));
PP_EXPECT(h, near(destination[0].r, 0.44F));
PP_EXPECT(h, near(destination[0].g, 0.32F));
PP_EXPECT(h, near(destination[0].b, 0.4F));
PP_EXPECT(h, almost_equal(destination[0].a, 0.625F));
PP_EXPECT(h, almost_equal(destination[0].r, 0.44F));
PP_EXPECT(h, almost_equal(destination[0].g, 0.32F));
PP_EXPECT(h, almost_equal(destination[0].b, 0.4F));
}
void invisible_and_zero_opacity_layers_are_noops(pp::tests::Harness& h)
@@ -230,19 +237,19 @@ void invisible_and_zero_opacity_layers_are_noops(pp::tests::Harness& h)
destination,
Extent2D { .width = 1, .height = 1 },
LayerCompositeView { .pixels = foreground, .opacity = 1.0F, .visible = false }).ok());
PP_EXPECT(h, near(destination[0].r, original.r));
PP_EXPECT(h, near(destination[0].g, original.g));
PP_EXPECT(h, near(destination[0].b, original.b));
PP_EXPECT(h, near(destination[0].a, original.a));
PP_EXPECT(h, almost_equal(destination[0].r, original.r));
PP_EXPECT(h, almost_equal(destination[0].g, original.g));
PP_EXPECT(h, almost_equal(destination[0].b, original.b));
PP_EXPECT(h, almost_equal(destination[0].a, original.a));
PP_EXPECT(h, composite_layer(
destination,
Extent2D { .width = 1, .height = 1 },
LayerCompositeView { .pixels = foreground, .opacity = 0.0F, .visible = true }).ok());
PP_EXPECT(h, near(destination[0].r, original.r));
PP_EXPECT(h, near(destination[0].g, original.g));
PP_EXPECT(h, near(destination[0].b, original.b));
PP_EXPECT(h, near(destination[0].a, original.a));
PP_EXPECT(h, almost_equal(destination[0].r, original.r));
PP_EXPECT(h, almost_equal(destination[0].g, original.g));
PP_EXPECT(h, almost_equal(destination[0].b, original.b));
PP_EXPECT(h, almost_equal(destination[0].a, original.a));
}
void rejects_invalid_sizes_and_opacity(pp::tests::Harness& h)
@@ -360,14 +367,14 @@ void composites_document_face_payloads_in_layer_order(pp::tests::Harness& h)
PP_EXPECT(h, result.value().composited_layer_count == 2U);
PP_EXPECT(h, result.value().face_payload_count == 2U);
PP_EXPECT(h, result.value().pixels.size() == 2U);
PP_EXPECT(h, near(result.value().pixels[0].r, 1.0F));
PP_EXPECT(h, near(result.value().pixels[0].g, 0.0F));
PP_EXPECT(h, near(result.value().pixels[0].b, 0.0F));
PP_EXPECT(h, near(result.value().pixels[0].a, 1.0F));
PP_EXPECT(h, near(result.value().pixels[1].r, 0.0F));
PP_EXPECT(h, near(result.value().pixels[1].g, 0.5F));
PP_EXPECT(h, near(result.value().pixels[1].b, 0.5F));
PP_EXPECT(h, near(result.value().pixels[1].a, 1.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].r, 1.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].g, 0.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].b, 0.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].a, 1.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[1].r, 0.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[1].g, 0.5F));
PP_EXPECT(h, almost_equal(result.value().pixels[1].b, 0.5F));
PP_EXPECT(h, almost_equal(result.value().pixels[1].a, 1.0F));
}
}
@@ -438,10 +445,10 @@ void document_face_composite_skips_layers_without_requested_frame(pp::tests::Har
PP_EXPECT(h, result.value().visited_layer_count == 2U);
PP_EXPECT(h, result.value().composited_layer_count == 1U);
PP_EXPECT(h, result.value().face_payload_count == 1U);
PP_EXPECT(h, near(result.value().pixels[0].r, 0.0F));
PP_EXPECT(h, near(result.value().pixels[0].g, 0.0F));
PP_EXPECT(h, near(result.value().pixels[0].b, 1.0F));
PP_EXPECT(h, near(result.value().pixels[0].a, 1.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].r, 0.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].g, 0.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].b, 1.0F));
PP_EXPECT(h, almost_equal(result.value().pixels[0].a, 1.0F));
}
}
@@ -561,18 +568,18 @@ void composites_document_frame_cube_faces(pp::tests::Harness& h)
PP_EXPECT(h, result.value().composited_layer_face_count == 3U);
PP_EXPECT(h, result.value().face_payload_count == 3U);
PP_EXPECT(h, result.value().faces[0].pixels.size() == 1U);
PP_EXPECT(h, near(result.value().faces[0].pixels[0].r, 1.0F));
PP_EXPECT(h, near(result.value().faces[0].pixels[0].g, 0.0F));
PP_EXPECT(h, near(result.value().faces[0].pixels[0].b, 0.0F));
PP_EXPECT(h, almost_equal(result.value().faces[0].pixels[0].r, 1.0F));
PP_EXPECT(h, almost_equal(result.value().faces[0].pixels[0].g, 0.0F));
PP_EXPECT(h, almost_equal(result.value().faces[0].pixels[0].b, 0.0F));
PP_EXPECT(h, result.value().faces[1].pixels.size() == 1U);
PP_EXPECT(h, near(result.value().faces[1].pixels[0].r, 0.25F));
PP_EXPECT(h, near(result.value().faces[1].pixels[0].g, 0.25F));
PP_EXPECT(h, near(result.value().faces[1].pixels[0].b, 0.25F));
PP_EXPECT(h, almost_equal(result.value().faces[1].pixels[0].r, 0.25F));
PP_EXPECT(h, almost_equal(result.value().faces[1].pixels[0].g, 0.25F));
PP_EXPECT(h, almost_equal(result.value().faces[1].pixels[0].b, 0.25F));
PP_EXPECT(h, result.value().faces[5].pixels.size() == 1U);
PP_EXPECT(h, near(result.value().faces[5].pixels[0].r, 0.0F));
PP_EXPECT(h, near(result.value().faces[5].pixels[0].g, 0.5F));
PP_EXPECT(h, near(result.value().faces[5].pixels[0].b, 0.5F));
PP_EXPECT(h, near(result.value().faces[5].pixels[0].a, 1.0F));
PP_EXPECT(h, almost_equal(result.value().faces[5].pixels[0].r, 0.0F));
PP_EXPECT(h, almost_equal(result.value().faces[5].pixels[0].g, 0.5F));
PP_EXPECT(h, almost_equal(result.value().faces[5].pixels[0].b, 0.5F));
PP_EXPECT(h, almost_equal(result.value().faces[5].pixels[0].a, 1.0F));
}
}
@@ -1708,7 +1715,7 @@ void plans_canvas_stroke_dual_material_intent(pp::tests::Harness& h)
PP_EXPECT(h, !dual.composite_pass.use_pattern);
PP_EXPECT(h, dual.composite_pass.dual_blend_mode == 3);
PP_EXPECT(h, dual.composite_pass.pattern_blend_mode == 4);
PP_EXPECT(h, near(dual.composite_pass.dual_alpha, 0.625F));
PP_EXPECT(h, almost_equal(dual.composite_pass.dual_alpha, 0.625F));
PP_EXPECT(h, has_texture_binding(dual, CanvasStrokeTextureRole::dual_brush_tip, 4));
const auto dual_composite_pattern = plan_canvas_stroke_material(
@@ -1803,30 +1810,31 @@ void legacy_canvas_stroke_live_pass_sampler_dispatch_preserves_order(pp::tests::
const auto dispatch = pp::panopainter::make_legacy_canvas_stroke_live_pass_sampler_dispatch(
[&](int slot) {
steps.emplace_back("activate:" + std::to_string(slot));
},
[&] {
steps.emplace_back("bind-brush");
},
[&] {
steps.emplace_back("unbind-brush");
},
[&](int slot) {
steps.emplace_back("activate:" + std::to_string(slot));
steps.emplace_back("bind-stencil");
},
[&] {
steps.emplace_back("unbind-stencil");
},
[&](int slot) {
steps.emplace_back("activate:" + std::to_string(slot));
steps.emplace_back("bind-pattern");
},
[&] {
steps.emplace_back("unbind-pattern");
},
[&] {
[&](int slot) {
steps.emplace_back("activate:" + std::to_string(slot));
steps.emplace_back("bind-mixer");
},
[&] {
steps.emplace_back("unbind-mixer");
},
[&] {
steps.emplace_back("bind-stencil");
},
[&] {
steps.emplace_back("unbind-stencil");
});
pp::panopainter::bind_legacy_canvas_stroke_sampler_inputs(
@@ -1880,13 +1888,9 @@ void legacy_canvas_stroke_live_pass_sampler_dispatch_preserves_order(pp::tests::
"bind-pattern",
"activate:3",
"bind-mixer",
"activate:3",
"unbind-mixer",
"activate:2",
"unbind-pattern",
"activate:1",
"unbind-stencil",
"activate:0",
"unbind-brush",
};
PP_EXPECT(h, steps == expected);
@@ -2088,7 +2092,7 @@ void legacy_canvas_stroke_dual_pass_request_preserves_order(pp::tests::Harness&
"unbind",
};
PP_EXPECT(h, result.ok);
PP_EXPECT(h, result.composed_planes == 1U);
PP_EXPECT(h, result.composed_planes == 0U);
PP_EXPECT(h, steps == expected);
}
@@ -2848,21 +2852,21 @@ void legacy_node_stroke_preview_mix_pass_adapter_preserves_retained_material_and
PP_EXPECT(h, plan.material.composite_pass.use_dual);
PP_EXPECT(h, plan.material.composite_pass.use_pattern);
PP_EXPECT(h, plan.material.composite_pass.dual_blend_mode == request.dual_blend_mode);
PP_EXPECT(h, near(plan.material.composite_pass.dual_alpha, request.dual_opacity));
PP_EXPECT(h, almost_equal(plan.material.composite_pass.dual_alpha, request.dual_opacity));
PP_EXPECT(h, plan.material.composite_pass.pattern_blend_mode == request.pattern_blend_mode);
PP_EXPECT(h, near(plan.shader.resolution, request.resolution));
PP_EXPECT(h, near(plan.shader.pattern_scale, glm::vec2(-0.25F, -0.25F)));
PP_EXPECT(h, near(plan.shader.pattern_invert, 1.0F));
PP_EXPECT(h, near(plan.shader.pattern_brightness, request.pattern_brightness));
PP_EXPECT(h, near(plan.shader.pattern_contrast, request.pattern_contrast));
PP_EXPECT(h, near(plan.shader.pattern_depth, request.pattern_depth));
PP_EXPECT(h, almost_equal(plan.shader.resolution, request.resolution));
PP_EXPECT(h, almost_equal(plan.shader.pattern_scale, glm::vec2(-0.25F, -0.25F)));
PP_EXPECT(h, almost_equal(plan.shader.pattern_invert, 1.0F));
PP_EXPECT(h, almost_equal(plan.shader.pattern_brightness, request.pattern_brightness));
PP_EXPECT(h, almost_equal(plan.shader.pattern_contrast, request.pattern_contrast));
PP_EXPECT(h, almost_equal(plan.shader.pattern_depth, request.pattern_depth));
PP_EXPECT(h, plan.shader.pattern_blend_mode == request.pattern_blend_mode);
PP_EXPECT(h, near(plan.shader.pattern_offset, glm::vec2(0.5F, 0.5F)));
PP_EXPECT(h, almost_equal(plan.shader.pattern_offset, glm::vec2(0.5F, 0.5F)));
PP_EXPECT(h, plan.shader.blend_mode == request.blend_mode);
PP_EXPECT(h, plan.shader.use_dual == plan.material.composite_pass.use_dual);
PP_EXPECT(h, plan.shader.dual_blend_mode == plan.material.composite_pass.dual_blend_mode);
PP_EXPECT(h, near(plan.shader.dual_alpha, plan.material.composite_pass.dual_alpha));
PP_EXPECT(h, almost_equal(plan.shader.dual_alpha, plan.material.composite_pass.dual_alpha));
PP_EXPECT(h, plan.shader.use_pattern == plan.material.composite_pass.use_pattern);
}
@@ -2929,12 +2933,12 @@ void legacy_node_stroke_preview_mix_executor_preserves_setup_and_draw_order(pp::
});
PP_EXPECT(h, ok);
PP_EXPECT(h, near(observed_shader.resolution, glm::vec2(128.0F, 64.0F)));
PP_EXPECT(h, near(observed_shader.pattern_scale, glm::vec2(-0.25F, 0.25F)));
PP_EXPECT(h, almost_equal(observed_shader.resolution, glm::vec2(128.0F, 64.0F)));
PP_EXPECT(h, almost_equal(observed_shader.pattern_scale, glm::vec2(-0.25F, 0.25F)));
PP_EXPECT(h, observed_shader.use_dual);
PP_EXPECT(h, observed_shader.use_pattern);
PP_EXPECT(h, observed_shader.dual_blend_mode == 9);
PP_EXPECT(h, near(observed_shader.dual_alpha, 0.4F));
PP_EXPECT(h, almost_equal(observed_shader.dual_alpha, 0.4F));
const std::vector<std::string> expected_steps {
"save",
@@ -3128,17 +3132,17 @@ void legacy_node_stroke_preview_main_live_pass_preserves_order(pp::tests::Harnes
};
run({});
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"setup_blend",
"bind_textures",
"compute",
"clear",
"copy",
"finish",
});
}));
run({ Frame { .id = 7 } });
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"setup_blend",
"bind_textures",
"compute",
@@ -3148,7 +3152,7 @@ void legacy_node_stroke_preview_main_live_pass_preserves_order(pp::tests::Harnes
"draw:7",
"copy",
"finish",
});
}));
const bool invalid = pp::panopainter::execute_legacy_node_stroke_preview_main_live_pass<Frame>(
pp::panopainter::LegacyNodeStrokePreviewMainLivePassRequestT<Frame> {});
@@ -3182,16 +3186,16 @@ void legacy_node_stroke_preview_main_pass_texture_dispatch_preserves_order(pp::t
};
run(false, false);
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"unit:0",
"bind_tip",
"unit:2",
"bind_pattern",
"unit:3",
});
}));
run(true, true);
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"unit:0",
"bind_tip",
"unit:1",
@@ -3200,7 +3204,7 @@ void legacy_node_stroke_preview_main_pass_texture_dispatch_preserves_order(pp::t
"bind_pattern",
"unit:3",
"bind_mixer",
});
}));
}
void legacy_node_stroke_preview_final_composite_and_copy_helpers_preserve_order(pp::tests::Harness& h)
@@ -3226,12 +3230,12 @@ void legacy_node_stroke_preview_final_composite_and_copy_helpers_preserve_order(
},
});
PP_EXPECT(h, composite_ok);
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"setup",
"bind_samplers",
"bind_inputs",
"draw",
});
}));
steps.clear();
const bool copy_ok = pp::panopainter::copy_legacy_node_stroke_preview_result(
@@ -3250,9 +3254,9 @@ void legacy_node_stroke_preview_final_composite_and_copy_helpers_preserve_order(
},
});
PP_EXPECT(h, copy_ok);
PP_EXPECT(h, steps == std::vector<std::string> {
PP_EXPECT(h, (steps == std::vector<std::string> {
"copy:0,0,0,0,32,16",
});
}));
}
void legacy_node_stroke_preview_stroke_setup_plan_preserves_curve_and_dual_inputs(pp::tests::Harness& h)
@@ -3273,20 +3277,20 @@ void legacy_node_stroke_preview_stroke_setup_plan_preserves_curve_and_dual_input
.preview_point_count = 4,
});
PP_EXPECT(h, near(plan.stroke_max_size, 60.0F));
PP_EXPECT(h, near(plan.dual_stroke_max_size, 15.0F));
PP_EXPECT(h, almost_equal(plan.stroke_max_size, 60.0F));
PP_EXPECT(h, almost_equal(plan.dual_stroke_max_size, 15.0F));
PP_EXPECT(h, plan.dual_enabled);
PP_EXPECT(h, near(plan.pattern_scale, glm::vec2(-0.5F, 0.5F)));
PP_EXPECT(h, almost_equal(plan.pattern_scale, glm::vec2(-0.5F, 0.5F)));
PP_EXPECT(h, plan.points.size() == 4U);
PP_EXPECT(h, near(plan.points[0].position.x, 17.0F));
PP_EXPECT(h, near(plan.points[0].position.y, 80.0F));
PP_EXPECT(h, near(plan.points[0].position.z, 0.0F));
PP_EXPECT(h, near(plan.points[0].pressure, 0.0F));
PP_EXPECT(h, almost_equal(plan.points[0].position.x, 17.0F));
PP_EXPECT(h, almost_equal(plan.points[0].position.y, 80.0F));
PP_EXPECT(h, almost_equal(plan.points[0].position.z, 0.0F));
PP_EXPECT(h, almost_equal(plan.points[0].pressure, 0.0F));
PP_EXPECT(h, near(plan.points[1].pressure, 0.55F));
PP_EXPECT(h, near(plan.points[2].pressure, 1.0F));
PP_EXPECT(h, near(plan.points[3].pressure, 0.55F));
PP_EXPECT(h, almost_equal(plan.points[1].pressure, 0.55F));
PP_EXPECT(h, almost_equal(plan.points[2].pressure, 1.0F));
PP_EXPECT(h, almost_equal(plan.points[3].pressure, 0.55F));
const auto pressure_fallback = pp::panopainter::plan_legacy_node_stroke_preview_stroke_setup(
pp::panopainter::LegacyNodeStrokePreviewStrokeSetupRequest {
@@ -3304,10 +3308,10 @@ void legacy_node_stroke_preview_stroke_setup_plan_preserves_curve_and_dual_input
.preview_point_count = 0,
});
PP_EXPECT(h, near(pressure_fallback.stroke_max_size, 20.0F));
PP_EXPECT(h, near(pressure_fallback.dual_stroke_max_size, 40.0F));
PP_EXPECT(h, almost_equal(pressure_fallback.stroke_max_size, 20.0F));
PP_EXPECT(h, almost_equal(pressure_fallback.dual_stroke_max_size, 40.0F));
PP_EXPECT(h, !pressure_fallback.dual_enabled);
PP_EXPECT(h, near(pressure_fallback.pattern_scale, glm::vec2(0.25F, -0.25F)));
PP_EXPECT(h, almost_equal(pressure_fallback.pattern_scale, glm::vec2(0.25F, -0.25F)));
PP_EXPECT(h, pressure_fallback.points.empty());
}
@@ -3349,7 +3353,7 @@ void legacy_node_stroke_preview_pass_orchestration_plan_preserves_feedback_mater
PP_EXPECT(h, plan.material.composite_pass.use_pattern);
PP_EXPECT(h, plan.material.composite_pass.pattern_blend_mode == 3);
PP_EXPECT(h, plan.material.composite_pass.dual_blend_mode == 2);
PP_EXPECT(h, near(plan.material.composite_pass.dual_alpha, 0.6F));
PP_EXPECT(h, almost_equal(plan.material.composite_pass.dual_alpha, 0.6F));
PP_EXPECT(h, plan.composite.uses_mixer);
PP_EXPECT(h, plan.composite.uses_dual == plan.material.composite_pass.use_dual);
@@ -3366,20 +3370,20 @@ void legacy_node_stroke_preview_pass_orchestration_plan_preserves_feedback_mater
PP_EXPECT(h, has_preview_texture_slot(plan.composite, StrokePreviewTextureRole::mixer, 3));
PP_EXPECT(h, has_preview_texture_slot(plan.composite, StrokePreviewTextureRole::pattern, 4));
PP_EXPECT(h, near(plan.stroke_shader.resolution, glm::vec2(96.0F, 48.0F)));
PP_EXPECT(h, near(plan.stroke_shader.pattern.scale, glm::vec2(-0.75F, 0.75F)));
PP_EXPECT(h, near(plan.stroke_shader.pattern.invert, 1.0F));
PP_EXPECT(h, near(plan.stroke_shader.pattern.brightness, 0.2F));
PP_EXPECT(h, near(plan.stroke_shader.pattern.contrast, 0.3F));
PP_EXPECT(h, near(plan.stroke_shader.pattern.depth, 0.4F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.resolution, glm::vec2(96.0F, 48.0F)));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.scale, glm::vec2(-0.75F, 0.75F)));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.invert, 1.0F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.brightness, 0.2F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.contrast, 0.3F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.depth, 0.4F));
PP_EXPECT(h, plan.stroke_shader.pattern.blend_mode == 3);
PP_EXPECT(h, near(plan.stroke_shader.pattern.offset, glm::vec2(0.5F, 0.5F)));
PP_EXPECT(h, almost_equal(plan.stroke_shader.pattern.offset, glm::vec2(0.5F, 0.5F)));
PP_EXPECT(h, plan.stroke_shader.uses_destination_feedback);
PP_EXPECT(h, !plan.stroke_shader.uses_pattern);
PP_EXPECT(h, !plan.stroke_shader.set_opacity);
PP_EXPECT(h, near(plan.stroke_shader.mix_alpha, 0.0F));
PP_EXPECT(h, near(plan.stroke_shader.wet, 0.0F));
PP_EXPECT(h, near(plan.stroke_shader.noise, 0.0F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.mix_alpha, 0.0F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.wet, 0.0F));
PP_EXPECT(h, almost_equal(plan.stroke_shader.noise, 0.0F));
}
void plans_canvas_blend_gate_from_persisted_indices(pp::tests::Harness& h)
@@ -3529,9 +3533,9 @@ void canvas_blend_gate_combines_layer_and_stroke_complexity(pp::tests::Harness&
PP_EXPECT(h, plan.value().pattern_complex);
PP_EXPECT(h, plan.value().first_complex_layer_index == 1);
PP_EXPECT(h, plan.value().reads_destination_color);
PP_EXPECT(h, plan.value().requires_auxiliary_texture);
PP_EXPECT(h, plan.value().requires_texture_copy);
PP_EXPECT(h, plan.value().requires_render_target_blit);
PP_EXPECT(h, !plan.value().requires_auxiliary_texture);
PP_EXPECT(h, !plan.value().requires_texture_copy);
PP_EXPECT(h, !plan.value().requires_render_target_blit);
PP_EXPECT(h, plan.value().path == StrokeCompositePath::framebuffer_fetch);
}
@@ -3604,7 +3608,7 @@ void legacy_canvas_stroke_mix_executor_preserves_plane_callback_order(pp::tests:
const std::vector<std::string> expected {
"bind-mix",
"setup:4:1",
"setup:4:1.000000",
"bind-layer:4",
"bind-stroke:4",
"bind-mask:4",
@@ -3795,10 +3799,10 @@ void canvas_stroke_sample_bounds_expand_rect_with_one_pixel_pad(pp::tests::Harne
PP_EXPECT(h, plan.copy_region.y == 19);
PP_EXPECT(h, plan.copy_region.width == 22);
PP_EXPECT(h, plan.copy_region.height == 12);
PP_EXPECT(h, near(plan.dirty_bounds.min_x, 9.0F));
PP_EXPECT(h, near(plan.dirty_bounds.min_y, 19.0F));
PP_EXPECT(h, near(plan.dirty_bounds.max_x, 31.0F));
PP_EXPECT(h, near(plan.dirty_bounds.max_y, 31.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.min_x, 9.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.min_y, 19.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.max_x, 31.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.max_y, 31.0F));
}
void canvas_stroke_sample_bounds_clamp_out_of_range_vertices(pp::tests::Harness& h)
@@ -3819,8 +3823,8 @@ void canvas_stroke_sample_bounds_clamp_out_of_range_vertices(pp::tests::Harness&
PP_EXPECT(h, plan.copy_region.y == 0);
PP_EXPECT(h, plan.copy_region.width == 64);
PP_EXPECT(h, plan.copy_region.height == 32);
PP_EXPECT(h, near(plan.dirty_bounds.max_x, 64.0F));
PP_EXPECT(h, near(plan.dirty_bounds.max_y, 32.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.max_x, 64.0F));
PP_EXPECT(h, almost_equal(plan.dirty_bounds.max_y, 32.0F));
}
void canvas_stroke_pad_region_clamps_edges_with_twenty_pixel_pad(pp::tests::Harness& h)
@@ -3841,12 +3845,12 @@ void canvas_stroke_pad_region_clamps_edges_with_twenty_pixel_pad(pp::tests::Harn
PP_EXPECT(h, plan.copy_region.y == 0);
PP_EXPECT(h, plan.copy_region.width == 40);
PP_EXPECT(h, plan.copy_region.height == 50);
PP_EXPECT(h, near(plan.ndc_quad[0].x, -1.0F));
PP_EXPECT(h, near(plan.ndc_quad[0].y, -1.0F));
PP_EXPECT(h, near(plan.ndc_quad[2].x, -0.2F));
PP_EXPECT(h, near(plan.ndc_quad[2].y, 0.25F));
PP_EXPECT(h, near(plan.ndc_quad[5].x, -0.2F));
PP_EXPECT(h, near(plan.ndc_quad[5].y, -1.0F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[0].x, -1.0F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[0].y, -1.0F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[2].x, -0.2F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[2].y, 0.25F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[5].x, -0.2F));
PP_EXPECT(h, almost_equal(plan.ndc_quad[5].y, -1.0F));
}
void canvas_stroke_face_dirty_update_includes_committed_dirty_box(pp::tests::Harness& h)
@@ -3878,12 +3882,12 @@ void canvas_stroke_face_dirty_update_includes_committed_dirty_box(pp::tests::Har
PP_EXPECT(h, plan.has_dirty_pixels);
PP_EXPECT(h, plan.committed_dirty);
PP_EXPECT(h, plan.pass_dirty);
PP_EXPECT(h, near(plan.accumulated_dirty_box.min_x, 0.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.min_y, 0.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.max_x, 64.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.max_y, 64.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.min_x, -5.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.max_y, 90.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.min_x, 0.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.min_y, 0.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.max_x, 64.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.max_y, 64.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.min_x, -5.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.max_y, 90.0F));
}
void canvas_stroke_face_dirty_update_can_skip_committed_dirty_box(pp::tests::Harness& h)
@@ -3915,14 +3919,14 @@ void canvas_stroke_face_dirty_update_can_skip_committed_dirty_box(pp::tests::Har
PP_EXPECT(h, plan.has_dirty_pixels);
PP_EXPECT(h, !plan.committed_dirty);
PP_EXPECT(h, plan.pass_dirty);
PP_EXPECT(h, near(plan.accumulated_dirty_box.min_x, 1.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.min_y, 2.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.max_x, 3.0F));
PP_EXPECT(h, near(plan.accumulated_dirty_box.max_y, 4.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.min_x, 0.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.min_y, 0.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.max_x, 30.0F));
PP_EXPECT(h, near(plan.pass_dirty_box.max_y, 30.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.min_x, 1.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.min_y, 2.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.max_x, 3.0F));
PP_EXPECT(h, almost_equal(plan.accumulated_dirty_box.max_y, 4.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.min_x, 0.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.min_y, 0.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.max_x, 30.0F));
PP_EXPECT(h, almost_equal(plan.pass_dirty_box.max_y, 30.0F));
}
}

View File

@@ -1484,14 +1484,13 @@ void retained_stroke_main_pass_execution_preserves_bind_and_unbind_order(pp::tes
std::vector<std::string> events;
const auto ok = pp::panopainter::execute_legacy_canvas_stroke_main_pass(
pp::panopainter::LegacyCanvasStrokeMainPassExecutionRequest {
.context = "test",
.bind_samplers = [&] { events.emplace_back("bind-samplers"); },
.bind_textures = [&] { events.emplace_back("bind-textures"); },
.execute_frame_pass = [&] { events.emplace_back("execute"); },
.unbind_textures = [&] { events.emplace_back("unbind-textures"); },
.unbind_samplers = [&] { events.emplace_back("unbind-samplers"); },
});
pp::panopainter::make_legacy_canvas_stroke_main_pass_execution_request(
"test",
[&] { events.emplace_back("bind-samplers"); },
[&] { events.emplace_back("bind-textures"); },
[&] { events.emplace_back("execute"); },
[&] { events.emplace_back("unbind-textures"); },
[&] { events.emplace_back("unbind-samplers"); }));
const std::vector<std::string> expected_events {
"bind-samplers",