@shopify/react-native-skia 0.1.151 → 0.1.153
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/CMakeLists.txt +5 -5
- package/android/cpp/jni/JniLoad.cpp +7 -5
- package/android/cpp/jni/JniSkiaManager.cpp +2 -15
- package/android/cpp/jni/include/JniSkiaBaseView.h +68 -0
- package/android/cpp/jni/include/JniSkiaDrawView.h +64 -47
- package/android/cpp/jni/include/JniSkiaManager.h +8 -10
- package/android/cpp/jni/include/JniSkiaPictureView.h +96 -0
- package/android/cpp/rnskia-android/{RNSkPlatformContextImpl.h → RNSkAndroidPlatformContext.h} +4 -4
- package/android/cpp/rnskia-android/RNSkAndroidView.h +100 -0
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +91 -0
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +39 -0
- package/android/cpp/rnskia-android/SkiaOpenGLRenderer.cpp +15 -6
- package/android/cpp/rnskia-android/SkiaOpenGLRenderer.h +5 -4
- package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +5 -11
- package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaPackage.java +1 -2
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +143 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDrawView.java +17 -145
- package/android/src/main/java/com/shopify/reactnative/skia/{RNSkiaViewManager.java → SkiaDrawViewManager.java} +4 -15
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaManager.java +1 -10
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +45 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureViewManager.java +64 -0
- package/cpp/jsi/JsiValueWrapper.h +11 -0
- package/cpp/rnskia/RNSkInfoParameter.h +4 -14
- package/cpp/rnskia/RNSkJsView.cpp +211 -0
- package/cpp/rnskia/RNSkJsView.h +115 -0
- package/cpp/rnskia/RNSkJsiViewApi.h +6 -6
- package/cpp/rnskia/RNSkManager.cpp +7 -7
- package/cpp/rnskia/RNSkManager.h +7 -7
- package/cpp/rnskia/RNSkPictureView.h +124 -0
- package/cpp/rnskia/RNSkView.h +287 -0
- package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +38 -0
- package/ios/RNSkia-iOS/{RNSkDrawViewImpl.mm → RNSkMetalCanvasProvider.mm} +46 -23
- package/ios/RNSkia-iOS/{PlatformContext.h → RNSkiOSPlatformContext.h} +4 -4
- package/ios/RNSkia-iOS/{PlatformContext.mm → RNSkiOSPlatformContext.mm} +5 -5
- package/ios/RNSkia-iOS/RNSkiOSView.h +34 -0
- package/ios/RNSkia-iOS/SkiaDrawViewManager.mm +19 -11
- package/ios/RNSkia-iOS/SkiaManager.mm +3 -3
- package/ios/RNSkia-iOS/SkiaPictureViewManager.h +8 -0
- package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +51 -0
- package/ios/RNSkia-iOS/SkiaUIView.h +26 -0
- package/ios/RNSkia-iOS/{SkiaDrawView.mm → SkiaUIView.mm} +29 -23
- package/lib/commonjs/views/SkiaBaseWebView.js +213 -0
- package/lib/commonjs/views/SkiaBaseWebView.js.map +1 -0
- package/lib/commonjs/views/SkiaPictureView.js +112 -0
- package/lib/commonjs/views/SkiaPictureView.js.map +1 -0
- package/lib/commonjs/views/SkiaPictureView.web.js +31 -0
- package/lib/commonjs/views/SkiaPictureView.web.js.map +1 -0
- package/lib/commonjs/views/SkiaView.js +1 -1
- package/lib/commonjs/views/SkiaView.js.map +1 -1
- package/lib/commonjs/views/SkiaView.web.js +14 -201
- package/lib/commonjs/views/SkiaView.web.js.map +1 -1
- package/lib/commonjs/views/index.js +13 -0
- package/lib/commonjs/views/index.js.map +1 -1
- package/lib/commonjs/views/types.js.map +1 -1
- package/lib/module/views/SkiaBaseWebView.js +198 -0
- package/lib/module/views/SkiaBaseWebView.js.map +1 -0
- package/lib/module/views/SkiaPictureView.js +94 -0
- package/lib/module/views/SkiaPictureView.js.map +1 -0
- package/lib/module/views/SkiaPictureView.web.js +19 -0
- package/lib/module/views/SkiaPictureView.web.js.map +1 -0
- package/lib/module/views/SkiaView.js +1 -1
- package/lib/module/views/SkiaView.js.map +1 -1
- package/lib/module/views/SkiaView.web.js +15 -199
- package/lib/module/views/SkiaView.web.js.map +1 -1
- package/lib/module/views/index.js +1 -0
- package/lib/module/views/index.js.map +1 -1
- package/lib/module/views/types.js.map +1 -1
- package/lib/typescript/src/views/SkiaBaseWebView.d.ts +58 -0
- package/lib/typescript/src/views/SkiaPictureView.d.ts +27 -0
- package/lib/typescript/src/views/SkiaPictureView.web.d.ts +7 -0
- package/lib/typescript/src/views/SkiaView.d.ts +4 -4
- package/lib/typescript/src/views/SkiaView.web.d.ts +6 -53
- package/lib/typescript/src/views/index.d.ts +1 -0
- package/lib/typescript/src/views/types.d.ts +7 -2
- package/package.json +3 -3
- package/src/views/SkiaBaseWebView.tsx +177 -0
- package/src/views/SkiaPictureView.tsx +93 -0
- package/src/views/SkiaPictureView.web.tsx +23 -0
- package/src/views/SkiaView.tsx +6 -7
- package/src/views/SkiaView.web.tsx +18 -167
- package/src/views/index.ts +1 -0
- package/src/views/types.ts +9 -2
- package/android/cpp/jni/JniSkiaDrawView.cpp +0 -113
- package/android/cpp/rnskia-android/RNSkDrawViewImpl.cpp +0 -73
- package/android/cpp/rnskia-android/RNSkDrawViewImpl.h +0 -48
- package/cpp/rnskia/RNSkDrawView.cpp +0 -315
- package/cpp/rnskia/RNSkDrawView.h +0 -226
- package/ios/RNSkia-iOS/RNSkDrawViewImpl.h +0 -52
- package/ios/RNSkia-iOS/SkiaDrawView.h +0 -23
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
#include "JniSkiaDrawView.h"
|
|
2
|
-
#include "RNSkLog.h"
|
|
3
|
-
|
|
4
|
-
#include <memory>
|
|
5
|
-
#include <string>
|
|
6
|
-
#include <utility>
|
|
7
|
-
#include <vector>
|
|
8
|
-
|
|
9
|
-
#include <GLES2/gl2.h>
|
|
10
|
-
#include <EGL/eglplatform.h>
|
|
11
|
-
#include <android/native_window.h>
|
|
12
|
-
#include <android/native_window_jni.h>
|
|
13
|
-
|
|
14
|
-
#include <SkCanvas.h>
|
|
15
|
-
#include <SkImageInfo.h>
|
|
16
|
-
#include <SkSurface.h>
|
|
17
|
-
#include <gpu/GrDirectContext.h>
|
|
18
|
-
#include <gpu/GrBackendSurface.h>
|
|
19
|
-
#include <gpu/gl/GrGLInterface.h>
|
|
20
|
-
#include <gpu/gl/GrGLTypes.h>
|
|
21
|
-
#include <gpu/GrTypes.h>
|
|
22
|
-
#include <RNSkInfoParameter.h>
|
|
23
|
-
|
|
24
|
-
namespace RNSkia
|
|
25
|
-
{
|
|
26
|
-
using namespace facebook;
|
|
27
|
-
using namespace jni;
|
|
28
|
-
|
|
29
|
-
using TSelf = local_ref<HybridClass<JniSkiaDrawView>::jhybriddata>;
|
|
30
|
-
|
|
31
|
-
/**** DTOR ***/
|
|
32
|
-
JniSkiaDrawView::~JniSkiaDrawView()
|
|
33
|
-
{
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**** JNI ****/
|
|
37
|
-
|
|
38
|
-
TSelf JniSkiaDrawView::initHybrid(
|
|
39
|
-
alias_ref<HybridClass::jhybridobject> jThis,
|
|
40
|
-
JavaSkiaManager skiaManager)
|
|
41
|
-
{
|
|
42
|
-
return makeCxxInstance(jThis, skiaManager);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
void JniSkiaDrawView::registerNatives()
|
|
46
|
-
{
|
|
47
|
-
registerHybrid({makeNativeMethod("initHybrid", JniSkiaDrawView::initHybrid),
|
|
48
|
-
makeNativeMethod("surfaceAvailable", JniSkiaDrawView::surfaceAvailable),
|
|
49
|
-
makeNativeMethod("surfaceDestroyed", JniSkiaDrawView::surfaceDestroyed),
|
|
50
|
-
makeNativeMethod("surfaceSizeChanged", JniSkiaDrawView::surfaceSizeChanged),
|
|
51
|
-
makeNativeMethod("setMode", JniSkiaDrawView::setMode),
|
|
52
|
-
makeNativeMethod("setDebugMode", JniSkiaDrawView::setDebugMode),
|
|
53
|
-
makeNativeMethod("updateTouchPoints", JniSkiaDrawView::updateTouchPoints)});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
void JniSkiaDrawView::setMode(std::string mode)
|
|
57
|
-
{
|
|
58
|
-
if (mode.compare("continuous") == 0)
|
|
59
|
-
{
|
|
60
|
-
_drawView->setDrawingMode(RNSkDrawingMode::Continuous);
|
|
61
|
-
}
|
|
62
|
-
else
|
|
63
|
-
{
|
|
64
|
-
_drawView->setDrawingMode(RNSkDrawingMode::Default);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
void JniSkiaDrawView::setDebugMode(bool show)
|
|
69
|
-
{
|
|
70
|
-
_drawView->setShowDebugOverlays(show);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
void JniSkiaDrawView::updateTouchPoints(jni::JArrayDouble touches)
|
|
74
|
-
{
|
|
75
|
-
// Create touch points
|
|
76
|
-
std::vector<RNSkia::RNSkTouchPoint> points;
|
|
77
|
-
auto pin = touches.pin();
|
|
78
|
-
auto scale = _drawView->getPixelDensity();
|
|
79
|
-
points.reserve(pin.size() / 5);
|
|
80
|
-
for (size_t i = 0; i < pin.size(); i += 5)
|
|
81
|
-
{
|
|
82
|
-
RNSkTouchPoint point;
|
|
83
|
-
point.x = pin[i] / scale;
|
|
84
|
-
point.y = pin[i + 1] / scale;
|
|
85
|
-
point.force = pin[i + 2];
|
|
86
|
-
point.type = (RNSkia::RNSkTouchType)pin[i + 3];
|
|
87
|
-
point.id = pin[i + 4];
|
|
88
|
-
points.push_back(point);
|
|
89
|
-
}
|
|
90
|
-
_drawView->updateTouchState(std::move(points));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
void JniSkiaDrawView::surfaceAvailable(jobject surface, int width, int height)
|
|
94
|
-
{
|
|
95
|
-
_drawView->surfaceAvailable(ANativeWindow_fromSurface(Environment::current(), surface), width, height);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
void JniSkiaDrawView::surfaceSizeChanged(int width, int height)
|
|
99
|
-
{
|
|
100
|
-
_drawView->surfaceSizeChanged(width, height);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
void JniSkiaDrawView::surfaceDestroyed()
|
|
104
|
-
{
|
|
105
|
-
_drawView->surfaceDestroyed();
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
void JniSkiaDrawView::releaseSurface() {
|
|
109
|
-
jni::ThreadScope ts;
|
|
110
|
-
static auto method = javaPart_->getClass()->getMethod<void(void)>("releaseSurface");
|
|
111
|
-
method(javaPart_.get());
|
|
112
|
-
}
|
|
113
|
-
} // namespace RNSkia
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#include <RNSkDrawViewImpl.h>
|
|
2
|
-
|
|
3
|
-
#pragma clang diagnostic push
|
|
4
|
-
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
5
|
-
|
|
6
|
-
#include <SkSurface.h>
|
|
7
|
-
#include <SkCanvas.h>
|
|
8
|
-
|
|
9
|
-
#pragma clang diagnostic pop
|
|
10
|
-
|
|
11
|
-
#include <RNSkLog.h>
|
|
12
|
-
|
|
13
|
-
namespace RNSkia {
|
|
14
|
-
RNSkDrawViewImpl::RNSkDrawViewImpl(std::shared_ptr <RNSkia::RNSkPlatformContext> context, std::function<void()> releaseSurfaceCallback) :
|
|
15
|
-
RNSkia::RNSkDrawView(context),
|
|
16
|
-
_releaseSurfaceCallback(std::move(releaseSurfaceCallback)) {}
|
|
17
|
-
|
|
18
|
-
void RNSkDrawViewImpl::surfaceAvailable(ANativeWindow* surface, int width, int height) {
|
|
19
|
-
_scaledWidth = width;
|
|
20
|
-
_scaledHeight = height;
|
|
21
|
-
|
|
22
|
-
if (_renderer == nullptr)
|
|
23
|
-
{
|
|
24
|
-
// Create renderer!
|
|
25
|
-
_renderer = std::make_unique<SkiaOpenGLRenderer>(surface, getNativeId());
|
|
26
|
-
|
|
27
|
-
// Redraw
|
|
28
|
-
requestRedraw();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
void RNSkDrawViewImpl::surfaceDestroyed() {
|
|
33
|
-
if (_renderer != nullptr)
|
|
34
|
-
{
|
|
35
|
-
// Start teardown
|
|
36
|
-
_renderer->teardown();
|
|
37
|
-
|
|
38
|
-
// Teardown renderer on the render thread since OpenGL demands
|
|
39
|
-
// same thread access for OpenGL contexts.
|
|
40
|
-
getPlatformContext()->runOnRenderThread([weakSelf = weak_from_this()]() {
|
|
41
|
-
auto self = weakSelf.lock();
|
|
42
|
-
if(self) {
|
|
43
|
-
auto drawViewImpl = std::dynamic_pointer_cast<RNSkDrawViewImpl>(self);
|
|
44
|
-
if(drawViewImpl->_renderer != nullptr) {
|
|
45
|
-
drawViewImpl->_renderer->run(nullptr, 0, 0);
|
|
46
|
-
}
|
|
47
|
-
// Remove renderer
|
|
48
|
-
drawViewImpl->_renderer = nullptr;
|
|
49
|
-
drawViewImpl->_releaseSurfaceCallback();
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
void RNSkDrawViewImpl::surfaceSizeChanged(int width, int height) {
|
|
56
|
-
if(width == 0 && height == 0) {
|
|
57
|
-
// Setting width/height to zero is nothing we need to care about when
|
|
58
|
-
// it comes to invalidating the surface.
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
_scaledWidth = width;
|
|
62
|
-
_scaledHeight = height;
|
|
63
|
-
|
|
64
|
-
// Redraw after size change
|
|
65
|
-
requestRedraw();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
void RNSkDrawViewImpl::renderToSkiaCanvas(const std::function<void(SkCanvas*)>& cb) {
|
|
69
|
-
if(_renderer != nullptr) {
|
|
70
|
-
_renderer->run(cb, _scaledWidth, _scaledHeight);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <RNSkDrawView.h>
|
|
4
|
-
|
|
5
|
-
#include <SkiaOpenGLRenderer.h>
|
|
6
|
-
#include <android/native_window.h>
|
|
7
|
-
|
|
8
|
-
#pragma clang diagnostic push
|
|
9
|
-
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
10
|
-
|
|
11
|
-
#include <SkPicture.h>
|
|
12
|
-
#include <SkRefCnt.h>
|
|
13
|
-
|
|
14
|
-
#pragma clang diagnostic pop
|
|
15
|
-
|
|
16
|
-
namespace RNSkia {
|
|
17
|
-
class RNSkDrawViewImpl : public RNSkia::RNSkDrawView {
|
|
18
|
-
public:
|
|
19
|
-
RNSkDrawViewImpl(std::shared_ptr <RNSkia::RNSkPlatformContext> context,
|
|
20
|
-
std::function<void()> releaseSurfaceCallback);
|
|
21
|
-
|
|
22
|
-
void surfaceAvailable(ANativeWindow* surface, int, int);
|
|
23
|
-
void surfaceDestroyed();
|
|
24
|
-
void surfaceSizeChanged(int, int);
|
|
25
|
-
|
|
26
|
-
float getPixelDensity() {
|
|
27
|
-
return getPlatformContext()->getPixelDensity();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
protected:
|
|
31
|
-
float getScaledWidth() override { return _scaledWidth; };
|
|
32
|
-
|
|
33
|
-
float getScaledHeight() override { return _scaledHeight; };
|
|
34
|
-
|
|
35
|
-
void renderToSkiaCanvas(const std::function<void(SkCanvas*)>&) override;
|
|
36
|
-
|
|
37
|
-
private:
|
|
38
|
-
bool createSkiaSurface();
|
|
39
|
-
|
|
40
|
-
std::unique_ptr<SkiaOpenGLRenderer> _renderer = nullptr;
|
|
41
|
-
|
|
42
|
-
int _nativeId;
|
|
43
|
-
float _scaledWidth = -1;
|
|
44
|
-
float _scaledHeight = -1;
|
|
45
|
-
|
|
46
|
-
std::function<void()> _releaseSurfaceCallback;
|
|
47
|
-
};
|
|
48
|
-
}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Created by Christian Falch on 23/08/2021.
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
#include "RNSkDrawView.h"
|
|
6
|
-
|
|
7
|
-
#include <chrono>
|
|
8
|
-
#include <functional>
|
|
9
|
-
#include <sstream>
|
|
10
|
-
#include <string>
|
|
11
|
-
#include <memory>
|
|
12
|
-
#include <vector>
|
|
13
|
-
#include <utility>
|
|
14
|
-
|
|
15
|
-
#include <JsiSkCanvas.h>
|
|
16
|
-
#include <RNSkLog.h>
|
|
17
|
-
#include <RNSkPlatformContext.h>
|
|
18
|
-
|
|
19
|
-
#pragma clang diagnostic push
|
|
20
|
-
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
21
|
-
|
|
22
|
-
#include <SkBBHFactory.h>
|
|
23
|
-
#include <SkCanvas.h>
|
|
24
|
-
#include <SkFont.h>
|
|
25
|
-
#include <SkFontTypes.h>
|
|
26
|
-
#include <SkGraphics.h>
|
|
27
|
-
#include <SkPaint.h>
|
|
28
|
-
#include <SkPictureRecorder.h>
|
|
29
|
-
#include <SkSurface.h>
|
|
30
|
-
#include <SkRect.h>
|
|
31
|
-
|
|
32
|
-
#pragma clang diagnostic pop
|
|
33
|
-
|
|
34
|
-
namespace RNSkia {
|
|
35
|
-
|
|
36
|
-
using namespace std::chrono;
|
|
37
|
-
|
|
38
|
-
RNSkDrawView::RNSkDrawView(std::shared_ptr<RNSkPlatformContext> context)
|
|
39
|
-
: _jsiCanvas(std::make_shared<JsiSkCanvas>(context)),
|
|
40
|
-
_platformContext(std::move(context)),
|
|
41
|
-
_infoObject(std::make_shared<RNSkInfoObject>()),
|
|
42
|
-
_jsDrawingLock(std::make_shared<std::timed_mutex>()),
|
|
43
|
-
_gpuDrawingLock(std::make_shared<std::timed_mutex>()),
|
|
44
|
-
_jsTimingInfo("SKIA/JS"),
|
|
45
|
-
_gpuTimingInfo("SKIA/GPU")
|
|
46
|
-
{}
|
|
47
|
-
|
|
48
|
-
RNSkDrawView::~RNSkDrawView() {
|
|
49
|
-
endDrawingLoop();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
void RNSkDrawView::setJsiProperties(std::unordered_map<std::string, JsiValueWrapper> &props) {
|
|
53
|
-
for(auto& prop: props) {
|
|
54
|
-
if(prop.first == "drawCallback") {
|
|
55
|
-
if(prop.second.isUndefinedOrNull()) {
|
|
56
|
-
// Clear drawcallback
|
|
57
|
-
_drawCallback = nullptr;
|
|
58
|
-
// We can just reset everything - this is a signal that we're done.
|
|
59
|
-
endDrawingLoop();
|
|
60
|
-
return;
|
|
61
|
-
} else if (prop.second.getType() != JsiWrapperValueType::Function) {
|
|
62
|
-
// We expect a function for the draw callback custom property
|
|
63
|
-
throw std::runtime_error("Expected a function for the drawCallback custom property.");
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Save callback
|
|
67
|
-
_drawCallback = prop.second.getAsFunction();
|
|
68
|
-
|
|
69
|
-
// Request redraw
|
|
70
|
-
requestRedraw();
|
|
71
|
-
|
|
72
|
-
} else {
|
|
73
|
-
throw std::runtime_error("Property " + prop.first + " not found.");
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
jsi::Value RNSkDrawView::callJsiMethod(jsi::Runtime& runtime,
|
|
79
|
-
const std::string& name,
|
|
80
|
-
const jsi::Value *arguments,
|
|
81
|
-
size_t count) {
|
|
82
|
-
|
|
83
|
-
// This subclass doesn't support any jsi methods at the moment, but
|
|
84
|
-
// new subclasses created in the future will.
|
|
85
|
-
throw std::runtime_error("RNSkDrawView does not support any JSI methods. Method " + name + "() not found.");
|
|
86
|
-
return jsi::Value::undefined();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
void RNSkDrawView::setNativeId(size_t nativeId) {
|
|
90
|
-
_nativeId = nativeId;
|
|
91
|
-
beginDrawingLoop();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
void RNSkDrawView::callJsDrawCallback(std::shared_ptr<JsiSkCanvas> canvas,
|
|
95
|
-
int width,
|
|
96
|
-
int height,
|
|
97
|
-
double timestamp) {
|
|
98
|
-
if(_drawCallback == nullptr) {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Reset timing info
|
|
103
|
-
_jsTimingInfo.reset();
|
|
104
|
-
_gpuTimingInfo.reset();
|
|
105
|
-
|
|
106
|
-
auto runtime = getPlatformContext()->getJsRuntime();
|
|
107
|
-
|
|
108
|
-
// Update info parameter
|
|
109
|
-
_infoObject->beginDrawOperation(width, height, timestamp);
|
|
110
|
-
|
|
111
|
-
// Set up arguments array
|
|
112
|
-
std::vector<jsi::Value> args(2);
|
|
113
|
-
args[0] = jsi::Object::createFromHostObject(*runtime, canvas);
|
|
114
|
-
args[1] = jsi::Object::createFromHostObject(*runtime, _infoObject);
|
|
115
|
-
|
|
116
|
-
// To be able to call the drawing function we'll wrap it once again
|
|
117
|
-
_drawCallback->call(*runtime,
|
|
118
|
-
static_cast<const jsi::Value *>(args.data()),
|
|
119
|
-
(size_t)2);
|
|
120
|
-
|
|
121
|
-
// Reset touches
|
|
122
|
-
_infoObject->endDrawOperation();
|
|
123
|
-
|
|
124
|
-
// Draw debug overlays
|
|
125
|
-
if (_showDebugOverlay) {
|
|
126
|
-
|
|
127
|
-
// Display average rendering timer
|
|
128
|
-
auto jsAvg = _jsTimingInfo.getAverage();
|
|
129
|
-
//auto jsFps = _jsTimingInfo.getFps();
|
|
130
|
-
|
|
131
|
-
auto gpuAvg = _gpuTimingInfo.getAverage();
|
|
132
|
-
//auto gpuFps = _gpuTimingInfo.getFps();
|
|
133
|
-
|
|
134
|
-
auto total = jsAvg + gpuAvg;
|
|
135
|
-
|
|
136
|
-
// Build string
|
|
137
|
-
std::ostringstream stream;
|
|
138
|
-
stream << "js: " << jsAvg << "ms gpu: " << gpuAvg << "ms " << " total: " << total << "ms";
|
|
139
|
-
|
|
140
|
-
std::string debugString = stream.str();
|
|
141
|
-
|
|
142
|
-
// Set up debug font/paints
|
|
143
|
-
auto font = SkFont();
|
|
144
|
-
font.setSize(14);
|
|
145
|
-
auto paint = SkPaint();
|
|
146
|
-
paint.setColor(SkColors::kRed);
|
|
147
|
-
canvas->getCanvas()->drawSimpleText(
|
|
148
|
-
debugString.c_str(), debugString.size(), SkTextEncoding::kUTF8, 8,
|
|
149
|
-
18, font, paint);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
void RNSkDrawView::drawInCanvas(std::shared_ptr<JsiSkCanvas> canvas,
|
|
154
|
-
int width,
|
|
155
|
-
int height,
|
|
156
|
-
double time) {
|
|
157
|
-
|
|
158
|
-
// Call the draw drawCallback and perform js based drawing
|
|
159
|
-
auto skCanvas = canvas->getCanvas();
|
|
160
|
-
if (_drawCallback != nullptr && skCanvas != nullptr) {
|
|
161
|
-
// Make sure to scale correctly
|
|
162
|
-
auto pd = _platformContext->getPixelDensity();
|
|
163
|
-
skCanvas->save();
|
|
164
|
-
skCanvas->scale(pd, pd);
|
|
165
|
-
|
|
166
|
-
// Call draw function.
|
|
167
|
-
callJsDrawCallback(canvas, width / pd, height / pd, time);
|
|
168
|
-
|
|
169
|
-
// Restore and flush canvas
|
|
170
|
-
skCanvas->restore();
|
|
171
|
-
skCanvas->flush();
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
sk_sp<SkImage> RNSkDrawView::makeImageSnapshot(std::shared_ptr<SkRect> bounds) {
|
|
176
|
-
// Assert width/height
|
|
177
|
-
auto surface = SkSurface::MakeRasterN32Premul(getScaledWidth(), getScaledHeight());
|
|
178
|
-
auto canvas = surface->getCanvas();
|
|
179
|
-
auto jsiCanvas = std::make_shared<JsiSkCanvas>(_platformContext);
|
|
180
|
-
jsiCanvas->setCanvas(canvas);
|
|
181
|
-
|
|
182
|
-
milliseconds ms = duration_cast<milliseconds>(
|
|
183
|
-
system_clock::now().time_since_epoch());
|
|
184
|
-
|
|
185
|
-
drawInCanvas(jsiCanvas, getScaledWidth(), getScaledHeight(), ms.count() / 1000);
|
|
186
|
-
|
|
187
|
-
if(bounds != nullptr) {
|
|
188
|
-
SkIRect b = SkIRect::MakeXYWH(bounds->x(), bounds->y(), bounds->width(), bounds->height());
|
|
189
|
-
return surface->makeImageSnapshot(b);
|
|
190
|
-
} else {
|
|
191
|
-
return surface->makeImageSnapshot();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
void RNSkDrawView::updateTouchState(std::vector<RNSkTouchPoint>&& points) {
|
|
196
|
-
_infoObject->updateTouches(std::move(points));
|
|
197
|
-
requestRedraw();
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
void RNSkDrawView::performDraw() {
|
|
201
|
-
// Start timing
|
|
202
|
-
_jsTimingInfo.beginTiming();
|
|
203
|
-
|
|
204
|
-
// Record the drawing operations on the JS thread so that we can
|
|
205
|
-
// move the actual drawing onto the render thread later
|
|
206
|
-
SkPictureRecorder recorder;
|
|
207
|
-
SkRTreeFactory factory;
|
|
208
|
-
SkCanvas* canvas = recorder.beginRecording(getScaledWidth(), getScaledHeight(), &factory);
|
|
209
|
-
_jsiCanvas->setCanvas(canvas);
|
|
210
|
-
|
|
211
|
-
// Get current milliseconds
|
|
212
|
-
milliseconds ms = duration_cast<milliseconds>(
|
|
213
|
-
system_clock::now().time_since_epoch());
|
|
214
|
-
|
|
215
|
-
try {
|
|
216
|
-
// Perform the javascript drawing
|
|
217
|
-
drawInCanvas(_jsiCanvas, getScaledWidth(), getScaledHeight(), ms.count() / 1000.0);
|
|
218
|
-
} catch(...) {
|
|
219
|
-
_jsTimingInfo.stopTiming();
|
|
220
|
-
_jsDrawingLock->unlock();
|
|
221
|
-
throw;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Finish drawing operations
|
|
225
|
-
auto p = recorder.finishRecordingAsPicture();
|
|
226
|
-
|
|
227
|
-
_jsiCanvas->setCanvas(nullptr);
|
|
228
|
-
|
|
229
|
-
// Calculate duration
|
|
230
|
-
_jsTimingInfo.stopTiming();
|
|
231
|
-
|
|
232
|
-
if(_gpuDrawingLock->try_lock()) {
|
|
233
|
-
|
|
234
|
-
// Post drawing message to the render thread where the picture recorded
|
|
235
|
-
// will be sent to the GPU/backend for rendering to screen.
|
|
236
|
-
auto gpuLock = _gpuDrawingLock;
|
|
237
|
-
_platformContext->runOnRenderThread([weakSelf = weak_from_this(), p = std::move(p), gpuLock]() {
|
|
238
|
-
auto self = weakSelf.lock();
|
|
239
|
-
if (self) {
|
|
240
|
-
// Draw the picture recorded on the real GPU canvas
|
|
241
|
-
self->_gpuTimingInfo.beginTiming();
|
|
242
|
-
self->renderToSkiaCanvas([p = std::move(p)](SkCanvas* canvas) {
|
|
243
|
-
canvas->drawPicture(p);
|
|
244
|
-
});
|
|
245
|
-
self->_gpuTimingInfo.stopTiming();
|
|
246
|
-
}
|
|
247
|
-
// Unlock GPU drawing
|
|
248
|
-
gpuLock->unlock();
|
|
249
|
-
});
|
|
250
|
-
} else {
|
|
251
|
-
#ifdef DEBUG
|
|
252
|
-
_gpuTimingInfo.markSkipped();
|
|
253
|
-
#endif
|
|
254
|
-
// Request a new redraw since the last frame was skipped.
|
|
255
|
-
requestRedraw();
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Unlock JS drawing
|
|
259
|
-
_jsDrawingLock->unlock();
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
void RNSkDrawView::requestRedraw() {
|
|
263
|
-
_redrawRequestCounter++;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
void RNSkDrawView::beginDrawingLoop() {
|
|
267
|
-
if (_drawingLoopId != 0 || _nativeId == 0) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
// Set to zero to avoid calling beginDrawLoop before we return
|
|
271
|
-
_drawingLoopId = _platformContext->beginDrawLoop(_nativeId,
|
|
272
|
-
[weakSelf = weak_from_this()](bool invalidated) {
|
|
273
|
-
auto self = weakSelf.lock();
|
|
274
|
-
if(self) {
|
|
275
|
-
self->drawLoopCallback(invalidated);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
void RNSkDrawView::drawLoopCallback(bool invalidated) {
|
|
281
|
-
if(_redrawRequestCounter > 0 || _drawingMode == RNSkDrawingMode::Continuous) {
|
|
282
|
-
_redrawRequestCounter = 0;
|
|
283
|
-
|
|
284
|
-
// We render on the javascript thread.
|
|
285
|
-
if(_jsDrawingLock->try_lock()) {
|
|
286
|
-
_platformContext->runOnJavascriptThread([weakSelf = weak_from_this()](){
|
|
287
|
-
auto self = weakSelf.lock();
|
|
288
|
-
if(self) {
|
|
289
|
-
self->performDraw();
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
} else {
|
|
293
|
-
#ifdef DEBUG
|
|
294
|
-
_jsTimingInfo.markSkipped();
|
|
295
|
-
#endif
|
|
296
|
-
requestRedraw();
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
void RNSkDrawView::endDrawingLoop() {
|
|
302
|
-
if(_drawingLoopId != 0) {
|
|
303
|
-
_drawingLoopId = 0;
|
|
304
|
-
_platformContext->endDrawLoop(_nativeId);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
void RNSkDrawView::setDrawingMode(RNSkDrawingMode mode) {
|
|
309
|
-
if(mode == _drawingMode || _nativeId == 0) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
_drawingMode = mode;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
} // namespace RNSkia
|