#pragma once #include #include #include #include #include #include #include #include "JsiValueWrapper.h" #include "RNSkView.h" #include "JsiSkCanvas.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 { class JsiSkCanvas; namespace jsi = facebook::jsi; class RNSkJsRenderer : public RNSkRenderer, public std::enable_shared_from_this { public: RNSkJsRenderer(std::function requestRedraw, std::shared_ptr context); bool tryRender(std::shared_ptr canvasProvider) override; void renderImmediate(std::shared_ptr canvasProvider) override; void setDrawCallback(std::shared_ptr drawCallback); std::shared_ptr getInfoObject(); private: void performDraw(std::shared_ptr canvasProvider); void callJsDrawCallback(std::shared_ptr jsiCanvas, int width, int height, double timestamp); void drawInJsiCanvas(std::shared_ptr jsiCanvas, int width, int height, double time); std::shared_ptr _platformContext; std::shared_ptr _drawCallback; std::shared_ptr _jsiCanvas; std::shared_ptr _jsDrawingLock; std::shared_ptr _gpuDrawingLock; std::shared_ptr _infoObject; RNSkTimingInfo _jsTimingInfo; RNSkTimingInfo _gpuTimingInfo; }; class RNSkJsView : public RNSkView { public: /** * Constructor */ RNSkJsView(std::shared_ptr context, std::shared_ptr canvasProvider) : RNSkView(context, canvasProvider, std::make_shared( std::bind(&RNSkJsView::requestRedraw, this), context)) {} void updateTouchState(std::vector &touches) override { std::static_pointer_cast(getRenderer()) ->getInfoObject() ->updateTouches(touches); RNSkView::updateTouchState(touches); } void setJsiProperties( std::unordered_map &props) override { RNSkView::setJsiProperties(props); for (auto &prop : props) { if (prop.first == "drawCallback") { if (prop.second.isUndefinedOrNull()) { // Clear drawcallback std::static_pointer_cast(getRenderer()) ->setDrawCallback(nullptr); requestRedraw(); continue; } else if (prop.second.getType() != RNJsi::JsiWrapperValueType::Function) { // We expect a function for the draw callback custom property throw std::runtime_error( "Expected a function for the drawCallback custom property."); } // Save callback std::static_pointer_cast(getRenderer()) ->setDrawCallback(prop.second.getAsFunction()); // Request redraw requestRedraw(); } } } }; } // namespace RNSkia