@shopify/react-native-skia 0.1.151 → 0.1.152
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 +4 -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} +40 -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 +1 -1
- 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,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
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <functional>
|
|
4
|
-
#include <memory>
|
|
5
|
-
#include <mutex>
|
|
6
|
-
#include <vector>
|
|
7
|
-
#include <string>
|
|
8
|
-
|
|
9
|
-
#include <jsi/jsi.h>
|
|
10
|
-
|
|
11
|
-
#include <JsiValueWrapper.h>
|
|
12
|
-
|
|
13
|
-
#include <RNSkInfoParameter.h>
|
|
14
|
-
#include <RNSkPlatformContext.h>
|
|
15
|
-
#include <RNSkTimingInfo.h>
|
|
16
|
-
#include <RNSkLog.h>
|
|
17
|
-
|
|
18
|
-
#pragma clang diagnostic push
|
|
19
|
-
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
20
|
-
|
|
21
|
-
#include <SkCanvas.h>
|
|
22
|
-
|
|
23
|
-
#pragma clang diagnostic pop
|
|
24
|
-
|
|
25
|
-
class SkPicture;
|
|
26
|
-
class SkRect;
|
|
27
|
-
class SkImage;
|
|
28
|
-
|
|
29
|
-
namespace RNSkia {
|
|
30
|
-
class JsiSkCanvas;
|
|
31
|
-
using namespace facebook;
|
|
32
|
-
|
|
33
|
-
enum RNSkDrawingMode { Default, Continuous };
|
|
34
|
-
|
|
35
|
-
class RNSkDrawView: public std::enable_shared_from_this<RNSkDrawView> {
|
|
36
|
-
public:
|
|
37
|
-
/**
|
|
38
|
-
* Constructor
|
|
39
|
-
*/
|
|
40
|
-
RNSkDrawView(std::shared_ptr<RNSkPlatformContext> context);
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
Destructor
|
|
44
|
-
*/
|
|
45
|
-
virtual ~RNSkDrawView();
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
Sets custom properties. Custom properties are properties that are set directly from Javascript without having
|
|
49
|
-
to go through the async bridge.
|
|
50
|
-
*/
|
|
51
|
-
void setJsiProperties(std::unordered_map<std::string, JsiValueWrapper> &props);
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
Calls a custom action.
|
|
55
|
-
*/
|
|
56
|
-
jsi::Value callJsiMethod(jsi::Runtime& runtime,
|
|
57
|
-
const std::string& name,
|
|
58
|
-
const jsi::Value *arguments,
|
|
59
|
-
size_t count);
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Repaints the Skia view using the underlying context and the drawcallback.
|
|
63
|
-
* This method schedules a draw request that will be run on the correct
|
|
64
|
-
* thread and js runtime.
|
|
65
|
-
*/
|
|
66
|
-
void requestRedraw();
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
Calls the drawing callback on the javascript thread
|
|
70
|
-
*/
|
|
71
|
-
void performDraw();
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
Sets the native id of the view
|
|
75
|
-
*/
|
|
76
|
-
void setNativeId(size_t nativeId);
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
Returns the native id
|
|
80
|
-
*/
|
|
81
|
-
size_t getNativeId() { return _nativeId; }
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
Sets the drawing mode for the view
|
|
85
|
-
*/
|
|
86
|
-
void setDrawingMode(RNSkDrawingMode mode);
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Set to true to show the debug overlays on render
|
|
90
|
-
*/
|
|
91
|
-
void setShowDebugOverlays(bool show) { _showDebugOverlay = show; }
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
Update touch state with new touch points
|
|
95
|
-
*/
|
|
96
|
-
void updateTouchState(std::vector<RNSkTouchPoint>&& points);
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
Draws the view's surface into an image
|
|
100
|
-
return an SkImage
|
|
101
|
-
*/
|
|
102
|
-
sk_sp<SkImage> makeImageSnapshot(std::shared_ptr<SkRect> bounds);
|
|
103
|
-
|
|
104
|
-
protected:
|
|
105
|
-
/**
|
|
106
|
-
Returns the scaled width of the view
|
|
107
|
-
*/
|
|
108
|
-
virtual float getScaledWidth() = 0;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
Returns the scaled height of the view
|
|
112
|
-
*/
|
|
113
|
-
virtual float getScaledHeight() = 0;
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
Override to render to a canvas
|
|
117
|
-
*/
|
|
118
|
-
virtual void renderToSkiaCanvas(const std::function<void(SkCanvas*)>&) = 0;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* @return The platformcontext
|
|
122
|
-
*/
|
|
123
|
-
std::shared_ptr<RNSkPlatformContext> getPlatformContext() {
|
|
124
|
-
return _platformContext;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
private:
|
|
128
|
-
/**
|
|
129
|
-
* Calls the JS draw callback. This is the JS function that does the actual drawing so this
|
|
130
|
-
* method must be called from the JS thread.
|
|
131
|
-
*/
|
|
132
|
-
void callJsDrawCallback(std::shared_ptr<JsiSkCanvas> canvas, int width, int height, double timestamp);
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
Starts beginDrawCallback loop if the drawing mode is continuous
|
|
136
|
-
*/
|
|
137
|
-
void beginDrawingLoop();
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
Ends an ongoing beginDrawCallback loop for this view
|
|
141
|
-
*/
|
|
142
|
-
void endDrawingLoop();
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
Draw loop callback
|
|
146
|
-
*/
|
|
147
|
-
void drawLoopCallback(bool invalidated);
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
Draw in canvas
|
|
151
|
-
*/
|
|
152
|
-
void drawInCanvas(std::shared_ptr<JsiSkCanvas> canvas,
|
|
153
|
-
int width,
|
|
154
|
-
int height,
|
|
155
|
-
double time);
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Stores the draw drawCallback
|
|
159
|
-
*/
|
|
160
|
-
std::shared_ptr<jsi::Function> _drawCallback;
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Stores a pointer to the jsi wrapper for the canvas. The reason for
|
|
164
|
-
* storing this pointer and not recreate it is that it creates a set of
|
|
165
|
-
* functions that we don't want to recreate on each render
|
|
166
|
-
*/
|
|
167
|
-
std::shared_ptr<JsiSkCanvas> _jsiCanvas;
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* JS Drawing mutex
|
|
171
|
-
*/
|
|
172
|
-
std::shared_ptr<std::timed_mutex> _jsDrawingLock;
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* SKIA Drawing mutex
|
|
176
|
-
*/
|
|
177
|
-
std::shared_ptr<std::timed_mutex> _gpuDrawingLock;
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Pointer to the platform context
|
|
181
|
-
*/
|
|
182
|
-
std::shared_ptr<RNSkPlatformContext> _platformContext;
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
Drawing mode
|
|
186
|
-
*/
|
|
187
|
-
RNSkDrawingMode _drawingMode;
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Show debug overlays
|
|
191
|
-
*/
|
|
192
|
-
bool _showDebugOverlay = false;
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* True if the drawing loop has been requested
|
|
196
|
-
*/
|
|
197
|
-
size_t _drawingLoopId = 0;
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Info object parameter
|
|
201
|
-
*/
|
|
202
|
-
std::shared_ptr<RNSkInfoObject> _infoObject;
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
Timing information for javascript drawing
|
|
206
|
-
*/
|
|
207
|
-
RNSkTimingInfo _jsTimingInfo;
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
Timing information for GPU rendering
|
|
211
|
-
*/
|
|
212
|
-
RNSkTimingInfo _gpuTimingInfo;
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
Redraw queue counter
|
|
216
|
-
*/
|
|
217
|
-
std::atomic<int> _redrawRequestCounter = { 1 };
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Native id
|
|
221
|
-
*/
|
|
222
|
-
size_t _nativeId;
|
|
223
|
-
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
} // namespace RNSkia
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#import "PlatformContext.h"
|
|
4
|
-
#import "RNSKDrawView.h"
|
|
5
|
-
#import <CoreFoundation/CoreFoundation.h>
|
|
6
|
-
#import <UIKit/UIKit.h>
|
|
7
|
-
|
|
8
|
-
#import <GrMtlBackendContext.h>
|
|
9
|
-
#import <MetalKit/MetalKit.h>
|
|
10
|
-
#import <QuartzCore/CAMetalLayer.h>
|
|
11
|
-
|
|
12
|
-
#pragma clang diagnostic push
|
|
13
|
-
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
14
|
-
|
|
15
|
-
#import <SkPicture.h>
|
|
16
|
-
#import <SkRefCnt.h>
|
|
17
|
-
#import <include/gpu/GrDirectContext.h>
|
|
18
|
-
|
|
19
|
-
#pragma clang diagnostic pop
|
|
20
|
-
|
|
21
|
-
class RNSkDrawViewImpl : public RNSkia::RNSkDrawView {
|
|
22
|
-
public:
|
|
23
|
-
RNSkDrawViewImpl(std::shared_ptr<RNSkia::RNSkPlatformContext> context);
|
|
24
|
-
~RNSkDrawViewImpl();
|
|
25
|
-
|
|
26
|
-
CALayer* getLayer() { return _layer; }
|
|
27
|
-
|
|
28
|
-
void setSize(int width, int height);
|
|
29
|
-
|
|
30
|
-
protected:
|
|
31
|
-
float getScaledWidth() override { return _width * _context->getPixelDensity(); };
|
|
32
|
-
float getScaledHeight() override { return _height * _context->getPixelDensity(); };
|
|
33
|
-
|
|
34
|
-
private:
|
|
35
|
-
void renderToSkiaCanvas(const std::function<void(SkCanvas*)>& cb) override;
|
|
36
|
-
bool createSkiaSurface();
|
|
37
|
-
|
|
38
|
-
int _nativeId;
|
|
39
|
-
float _width = -1;
|
|
40
|
-
float _height = -1;
|
|
41
|
-
|
|
42
|
-
#pragma clang diagnostic push
|
|
43
|
-
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
|
|
44
|
-
CAMetalLayer *_layer;
|
|
45
|
-
#pragma clang diagnostic pop
|
|
46
|
-
|
|
47
|
-
static id<MTLCommandQueue> _commandQueue;
|
|
48
|
-
static id<MTLDevice> _device;
|
|
49
|
-
static sk_sp<GrDirectContext> _skContext;
|
|
50
|
-
|
|
51
|
-
std::shared_ptr<RNSkia::RNSkPlatformContext> _context;
|
|
52
|
-
};
|