blob: 50a955d57d8d48ab8b974c3288624f709bd66155 [file] [log] [blame]
#include "SkData.h"
#include "SkImage.h"
#include "SkStream.h"
#include "SkSurface.h"
#include "rive/file.hpp"
#include "rive/math/aabb.hpp"
#include "skia_factory.hpp"
#include "skia_renderer.hpp"
#include <cstdio>
#include <stdio.h>
#include <string>
std::string getFileName(char* path) {
std::string str(path);
const size_t from = str.find_last_of("\\/");
const size_t to = str.find_last_of(".");
return str.substr(from + 1, to - from - 1);
}
int main(int argc, char* argv[]) {
rive::SkiaFactory factory;
if (argc < 2) {
fprintf(stderr, "must pass source file");
return 1;
}
FILE* fp = fopen(argv[1], "rb");
const char* outPath;
std::string filename;
std::string fullName;
if (argc > 2) {
outPath = argv[2];
} else {
filename = getFileName(argv[1]);
fullName = filename + ".png";
outPath = fullName.c_str();
}
if (fp == nullptr) {
fprintf(stderr, "Failed to open rive file.\n");
return 1;
}
fseek(fp, 0, SEEK_END);
auto length = ftell(fp);
fseek(fp, 0, SEEK_SET);
std::vector<uint8_t> bytes(length);
if (fread(bytes.data(), 1, length, fp) != length) {
fprintf(stderr, "Failed to read rive file.\n");
fclose(fp);
return 1;
}
fclose(fp);
auto file = rive::File::import(rive::toSpan(bytes), &factory);
if (!file) {
fprintf(stderr, "Failed to read rive file.\n");
return 1;
}
auto artboard = file->artboardDefault();
artboard->advance(0.0f);
int width = 256, height = 256;
sk_sp<SkSurface> rasterSurface = SkSurface::MakeRasterN32Premul(width, height);
SkCanvas* rasterCanvas = rasterSurface->getCanvas();
rive::SkiaRenderer renderer(rasterCanvas);
renderer.save();
renderer.align(rive::Fit::cover,
rive::Alignment::center,
rive::AABB(0, 0, width, height),
artboard->bounds());
artboard->draw(&renderer);
renderer.restore();
sk_sp<SkImage> img(rasterSurface->makeImageSnapshot());
if (!img) {
return 1;
}
sk_sp<SkData> png(img->encodeToData());
if (!png) {
return 1;
}
SkFILEWStream out(outPath);
(void)out.write(png->data(), png->size());
return 0;
}