blob: aba63ea50f83d53ac1a4ea51f28e4ebd5ccbe7cd [file] [log] [blame] [edit]
/*
* Copyright 2022 Rive
*/
#include "testing_window.hpp"
#if defined(TESTING) || !defined(RIVE_SKIA)
TestingWindow* TestingWindow::MakeSkia() { return nullptr; }
#else
#include "skia_factory.hpp"
#include "skia_renderer.hpp"
#include "skia/include/core/SkCanvas.h"
#include "skia/include/core/SkSurface.h"
#include "skia/include/gpu/GrDirectContext.h"
#include "skia/include/gpu/gl/GrGLAssembleInterface.h"
TestingWindow* TestingWindow::MakeSkia()
{
class TestingWindowSkiaRaster : public TestingWindow
{
public:
rive::Factory* factory() override { return &m_factory; }
void resize(int width, int height) override
{
auto info = SkImageInfo::MakeN32Premul(width, height);
m_surface = SkSurface::MakeRaster(info);
}
std::unique_ptr<rive::Renderer> beginFrame(
const FrameOptions& options) override
{
if (m_surface)
{
SkCanvas* canvas = m_surface->getCanvas();
if (options.doClear)
{
canvas->clear(options.clearColor);
}
return std::make_unique<rive::SkiaRenderer>(canvas);
}
return nullptr;
}
void endFrame(std::vector<uint8_t>* pixelData) override
{
if (!m_surface)
{
return;
}
m_surface->getCanvas()->flush();
if (pixelData)
{
auto img = m_surface->makeImageSnapshot();
int w = img->width();
int h = img->height();
pixelData->resize(h * w * 4);
SkColorInfo colorInfo(kRGBA_8888_SkColorType,
kPremul_SkAlphaType,
nullptr);
// Read the canvas back upside down to match GL's orientation.
for (int y = 0; y < h; ++y)
{
img->readPixels(
nullptr,
SkPixmap(SkImageInfo::Make({w, 1}, colorInfo),
pixelData->data() + y * w * 4,
img->width() * 4),
0,
h - y - 1);
}
}
}
private:
rive::SkiaFactory m_factory;
sk_sp<SkSurface> m_surface;
};
return new TestingWindowSkiaRaster();
}
#endif