#pragma once #include #include #include #include #include #include #include #include "JsiValueWrapper.h" #include "RNSkView.h" #include "JsiSkPicture.h" #include "RNSkInfoParameter.h" #include "RNSkLog.h" #include "RNSkPlatformContext.h" #include "RNSkTimingInfo.h" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdocumentation" #include "SkBBHFactory.h" #include "SkCanvas.h" #include "SkPictureRecorder.h" #pragma clang diagnostic pop class SkPicture; class SkRect; class SkImage; namespace RNSkia { namespace jsi = facebook::jsi; class RNSkPictureRenderer : public RNSkRenderer, public std::enable_shared_from_this { public: RNSkPictureRenderer(std::function requestRedraw, std::shared_ptr context) : RNSkRenderer(requestRedraw), _platformContext(context) {} bool tryRender(std::shared_ptr canvasProvider) override { return performDraw(canvasProvider); } void renderImmediate(std::shared_ptr canvasProvider) override { performDraw(canvasProvider); } void setPicture(std::shared_ptr picture) { if (picture == nullptr) { _picture = nullptr; } else { _picture = std::dynamic_pointer_cast(picture); } _requestRedraw(); } private: bool performDraw(std::shared_ptr canvasProvider) { canvasProvider->renderToCanvas([=](SkCanvas *canvas) { // Make sure to scale correctly auto pd = _platformContext->getPixelDensity(); canvas->clear(SK_ColorTRANSPARENT); canvas->save(); canvas->scale(pd, pd); if (_picture != nullptr) { canvas->drawPicture(_picture->getObject()); } canvas->restore(); }); return true; } std::shared_ptr _platformContext; std::shared_ptr _picture; }; class RNSkPictureView : public RNSkView { public: /** * Constructor */ RNSkPictureView(std::shared_ptr context, std::shared_ptr canvasProvider) : RNSkView( context, canvasProvider, std::make_shared( std::bind(&RNSkPictureView::requestRedraw, this), context)) {} void setJsiProperties( std::unordered_map &props) override { RNSkView::setJsiProperties(props); for (auto &prop : props) { if (prop.first == "picture") { if (prop.second.isUndefinedOrNull()) { // Clear picture std::static_pointer_cast(getRenderer()) ->setPicture(nullptr); continue; } else if (prop.second.getType() != RNJsi::JsiWrapperValueType::HostObject) { // We expect a function for the picture custom property throw std::runtime_error( "Expected an object for the picture custom property."); } // Save picture std::static_pointer_cast(getRenderer()) ->setPicture(prop.second.getAsHostObject()); } } } }; } // namespace RNSkia