#include #include #include #include #include #include #include #include #include #include #include namespace { class score_view final : public luma::control { public: score_view(luma::application &app, vamp_zero::score_document score, std::string output, std::size_t page, std::bool_t &saved) : app_{app}, score_{std::move(score)}, output_{std::move(output)}, page_{page}, saved_{saved} {} auto measure(luma::draw_context &, luma::theme const &, luma::constraints) -> luma::size override { return {976, 484}; } auto draw(luma::draw_context &context, luma::theme const &) const -> void override { vamp_zero::draw_score_page(context, bounds(), score_, page_); rlDrawRenderBatchActive(); auto image = LoadImageFromScreen(); saved_ = ExportImage(image, output_.c_str()); UnloadImage(image); app_.request_stop(); } private: luma::application &app_; vamp_zero::score_document score_; std::string output_; std::size_t page_; std::bool_t &saved_; }; } int main(int argc, std::char_t **argv) { if (argc < 3) { std::cerr << "Usage: vamp-render-score input.json output.png [page]\n"; return 2; } auto page = std::size_t{}; if (argc > 3) { auto parsed = vamp_zero::parse_integer(argv[3], "page"); if (!parsed) { std::cerr << parsed.error().describe() << '\n'; return 2; } page = *parsed; } auto input = std::ifstream{argv[1]}; auto json = std::string{std::istreambuf_iterator{input}, std::istreambuf_iterator{}}; auto score = vamp_zero::parse_score_document(json, argv[1]); if (!score) { std::cerr << score.error().describe() << '\n'; return 1; } auto app = luma::application{ {.title = "Notation Regression", .display = {.width = 976, .height = 484, .target_fps = 30, .fullscreen = false}}}; auto saved = std::bool_t{false}; auto root = app.set_root(std::make_unique(app, std::move(*score), argv[2], page, saved)); if (!root) { return 1; } auto ran = app.run(); return ran && saved ? 0 : 1; }