#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdocumentation" #include #include #include #pragma clang diagnostic pop class SkPicture; class SkRect; class SkImage; namespace RNSkia { class JsiSkCanvas; using namespace facebook; 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 { for(auto& prop: props) { if(prop.first == "drawCallback") { if(prop.second.isUndefinedOrNull()) { // Clear drawcallback std::static_pointer_cast(getRenderer())->setDrawCallback(nullptr); return; } else if (prop.second.getType() != 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(); } else { RNSkView::setJsiProperties(props); } } } }; } // namespace RNSkia