| /* | |
| * 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 |