#include #include #include "task_flow/src/Task_Runtime.hpp" #include #include #include namespace { /* The process exits only from the asynchronous Scene completion boundary. */ using namespace aethera; using namespace aethera::render_2d; bool contains_color(Image_View image) { for (const auto value : image.data) if (value != std::byte{}) return true; return false; } } // namespace int main() { if (initialize_task_runtime(2) != Initialize_Task_Runtime_Result::initialized) return 2; Frequency_Axis::Builder frequency_builder; frequency_builder .set(&Abs_Axis::Prop::position, Point_F{10.0, 90.0}) .set(&Abs_Axis::Prop::pixel_length, 100.0) .set(&Numeric_Axis::Prop::coordinate_range, Axis_Range{0.0, 100.0}); Numeric_Axis::Builder power_builder; power_builder .set(&Abs_Axis::Prop::position, Point_F{10.0, 90.0}) .set(&Abs_Axis::Prop::pixel_length, -80.0) .set(&Abs_Axis::Prop::orientation, Axis_Orientation::vertical) .set(&Numeric_Axis::Prop::coordinate_range, Axis_Range{-100.0, 0.0}); auto frequency = frequency_builder.build(); auto power = power_builder.build(); Spectrum::Builder spectrum_builder(*frequency, *power); spectrum_builder .set(&Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0}) .set(&Spectrum::Prop::partition_count, 4U) .set([](Spectrum::Frame& frame) { frame.samples = {-100.0, -50.0, -10.0}; }); auto spectrum = spectrum_builder.build(); /* 两根轴并行完成后再进入 Spectrum 的四分区子图。 */ Dag_Relation::Builder dag_builder; dag_builder .add({1}, model_proxy(std::move(frequency))) .add({2}, model_proxy(std::move(power))) .add({3}, model_proxy(std::move(spectrum))) .add_dependency({3}, {1}) .add_dependency({3}, {2}); auto dag = dag_builder.build(); if (!dag) return 2; Render_Scene_2D::Builder scene_builder; scene_builder .set(&Render_Scene_2D::Prop::viewport, Size{120, 100}) .set(&Render_Scene_2D::Prop::background, Color::transparent()) .set(&Render_Scene_2D::Prop::view_active, true) .relation([graph = std::move(*dag)](auto& relation) mutable { relation = std::move(graph); }); auto* scene = scene_builder.build().release(); /* completion 前保持存活;随后随进程退出回收。 */ auto* frame = new Frame_2D{{1, 0}}; /* completion 前保持存活;随后随进程退出回收。 */ const auto submitted = scene->render(frame, [frame](Frame_2D* completed, std::exception_ptr failure) { std::_Exit(!failure && completed == frame && contains_color(completed->image()) ? 0 : 1); }); if (!submitted) return 2; _endthreadex(3); return 3; }