Files
product-vamp/tests/render_score.cpp
T
khodowany fe42d811fa
ci / checks (push) Successful in 42m54s
Formatting
2026-09-15 00:06:02 -05:00

72 lines
2.2 KiB
C++

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <memory>
#include <raylib.h>
#include <rlgl.h>
#include <luma.hpp>
#include <vamp_zero/library.hpp>
#include <vamp_zero/parse.hpp>
#include <vamp_zero/score.hpp>
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<std::size_t>(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<std::char_t>{input}, std::istreambuf_iterator<std::char_t>{}};
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<score_view>(app, std::move(*score), argv[2], page, saved));
if (!root) {
return 1;
}
auto ran = app.run();
return ran && saved ? 0 : 1;
}