@shopify/react-native-skia 1.5.10 → 1.7.0
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/cpp/jni/include/JniSkiaBaseView.h +6 -5
- package/android/cpp/jni/include/JniSkiaDomView.h +6 -4
- package/android/cpp/jni/include/JniSkiaManager.h +2 -2
- package/android/cpp/jni/include/JniSkiaPictureView.h +6 -4
- package/android/cpp/rnskia-android/MainThreadDispatcher.h +3 -0
- package/android/cpp/rnskia-android/OpenGLContext.h +44 -9
- package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +0 -1
- package/android/cpp/rnskia-android/OpenGLWindowContext.h +2 -2
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +61 -3
- package/android/cpp/rnskia-android/RNSkAndroidView.h +10 -13
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +42 -36
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +2 -2
- package/android/cpp/rnskia-android/gl/Display.h +2 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaAHBView.java +113 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +45 -54
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseViewManager.java +5 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +2 -2
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +2 -2
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaSurfaceView.java +42 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaTextureView.java +90 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaViewAPI.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerInterface.java +1 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerDelegate.java +3 -1
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerInterface.java +1 -0
- package/cpp/api/JsiSkContourMeasure.h +1 -5
- package/cpp/api/JsiSkImage.h +11 -0
- package/cpp/api/JsiSkImageFactory.h +14 -0
- package/cpp/api/JsiSkPicture.h +2 -0
- package/cpp/api/JsiSkSurface.h +7 -0
- package/cpp/api/JsiTextureInfo.h +53 -0
- package/cpp/jsi/ViewProperty.h +48 -0
- package/cpp/rnskia/RNSkDomView.cpp +0 -20
- package/cpp/rnskia/RNSkDomView.h +4 -9
- package/cpp/rnskia/RNSkJsiViewApi.h +3 -3
- package/cpp/rnskia/RNSkPictureView.h +11 -28
- package/cpp/rnskia/RNSkPlatformContext.h +18 -12
- package/cpp/rnskia/RNSkView.h +5 -29
- package/ios/RNSkia-iOS/MetalContext.h +101 -15
- package/ios/RNSkia-iOS/MetalContext.mm +9 -8
- package/ios/RNSkia-iOS/MetalWindowContext.h +39 -0
- package/ios/RNSkia-iOS/MetalWindowContext.mm +60 -0
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +13 -25
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +88 -2
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +9 -2
- package/ios/RNSkia-iOS/SkiaDomViewManager.mm +5 -0
- package/ios/RNSkia-iOS/SkiaManager.mm +1 -2
- package/ios/RNSkia-iOS/SkiaPictureView.mm +1 -0
- package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +5 -0
- package/ios/RNSkia-iOS/SkiaUIView.h +1 -0
- package/ios/RNSkia-iOS/SkiaUIView.mm +21 -14
- package/lib/commonjs/skia/types/Image/ColorType.d.ts +21 -0
- package/lib/commonjs/skia/types/Image/ColorType.js +29 -0
- package/lib/commonjs/skia/types/Image/ColorType.js.map +1 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.js +27 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.js.map +1 -0
- package/lib/commonjs/skia/types/Image/Image.d.ts +10 -0
- package/lib/commonjs/skia/types/Image/Image.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +19 -19
- package/lib/commonjs/skia/types/Image/ImageFactory.js +1 -21
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/Image/index.d.ts +1 -0
- package/lib/commonjs/skia/types/Image/index.js +11 -0
- package/lib/commonjs/skia/types/Image/index.js.map +1 -1
- package/lib/commonjs/skia/types/Matrix4.d.ts +6 -0
- package/lib/commonjs/skia/types/Matrix4.js +69 -1
- package/lib/commonjs/skia/types/Matrix4.js.map +1 -1
- package/lib/commonjs/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/commonjs/skia/types/Surface/Surface.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkImage.js +4 -0
- package/lib/commonjs/skia/web/JsiSkImage.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js +3 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkSurface.js +4 -0
- package/lib/commonjs/skia/web/JsiSkSurface.js.map +1 -1
- package/lib/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
- package/lib/commonjs/views/SkiaDomView.js +3 -1
- package/lib/commonjs/views/SkiaDomView.js.map +1 -1
- package/lib/commonjs/views/SkiaPictureView.js +5 -1
- package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
- package/lib/commonjs/views/types.d.ts +2 -0
- package/lib/commonjs/views/types.js.map +1 -1
- package/lib/module/skia/types/Image/ColorType.d.ts +21 -0
- package/lib/module/skia/types/Image/ColorType.js +23 -0
- package/lib/module/skia/types/Image/ColorType.js.map +1 -0
- package/lib/module/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/module/skia/types/Image/ColorType.web.js +21 -0
- package/lib/module/skia/types/Image/ColorType.web.js.map +1 -0
- package/lib/module/skia/types/Image/Image.d.ts +10 -0
- package/lib/module/skia/types/Image/Image.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +19 -19
- package/lib/module/skia/types/Image/ImageFactory.js +0 -20
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/Image/index.d.ts +1 -0
- package/lib/module/skia/types/Image/index.js +1 -0
- package/lib/module/skia/types/Image/index.js.map +1 -1
- package/lib/module/skia/types/Matrix4.d.ts +6 -0
- package/lib/module/skia/types/Matrix4.js +67 -0
- package/lib/module/skia/types/Matrix4.js.map +1 -1
- package/lib/module/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/module/skia/types/Surface/Surface.js.map +1 -1
- package/lib/module/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/module/skia/web/JsiSkImage.js +4 -0
- package/lib/module/skia/web/JsiSkImage.js.map +1 -1
- package/lib/module/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/module/skia/web/JsiSkImageFactory.js +3 -0
- package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/module/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/module/skia/web/JsiSkSurface.js +4 -0
- package/lib/module/skia/web/JsiSkSurface.js.map +1 -1
- package/lib/module/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
- package/lib/module/views/SkiaDomView.js +3 -1
- package/lib/module/views/SkiaDomView.js.map +1 -1
- package/lib/module/views/SkiaPictureView.js +5 -1
- package/lib/module/views/SkiaPictureView.js.map +1 -1
- package/lib/module/views/types.d.ts +2 -0
- package/lib/module/views/types.js.map +1 -1
- package/lib/typescript/lib/commonjs/skia/types/Image/ColorType.d.ts +2 -0
- package/lib/typescript/lib/commonjs/skia/types/Image/ColorType.web.d.ts +2 -0
- package/lib/typescript/lib/commonjs/skia/types/Image/ImageFactory.d.ts +0 -1
- package/lib/typescript/lib/commonjs/skia/types/Matrix4.d.ts +6 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/typescript/lib/module/mock/index.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Image/ColorType.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Image/ColorType.web.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Image/ImageFactory.d.ts +0 -1
- package/lib/typescript/lib/module/skia/types/Image/index.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Matrix4.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/typescript/src/skia/types/Image/ColorType.d.ts +21 -0
- package/lib/typescript/src/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/typescript/src/skia/types/Image/Image.d.ts +10 -0
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +19 -19
- package/lib/typescript/src/skia/types/Image/index.d.ts +1 -0
- package/lib/typescript/src/skia/types/Matrix4.d.ts +6 -0
- package/lib/typescript/src/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/typescript/src/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/typescript/src/views/types.d.ts +2 -0
- package/package.json +1 -1
- package/src/renderer/__tests__/e2e/Matrix4.spec.tsx +93 -0
- package/src/skia/__tests__/Enums.spec.ts +2 -2
- package/src/skia/types/Image/ColorType.ts +21 -0
- package/src/skia/types/Image/ColorType.web.ts +19 -0
- package/src/skia/types/Image/Image.ts +11 -0
- package/src/skia/types/Image/ImageFactory.ts +25 -20
- package/src/skia/types/Image/index.ts +1 -0
- package/src/skia/types/Matrix4.ts +101 -0
- package/src/skia/types/Surface/Surface.ts +12 -0
- package/src/skia/web/JsiSkImage.ts +5 -0
- package/src/skia/web/JsiSkImageFactory.ts +4 -0
- package/src/skia/web/JsiSkSurface.ts +5 -0
- package/src/specs/SkiaPictureViewNativeComponent.ts +1 -0
- package/src/views/SkiaDomView.tsx +2 -1
- package/src/views/SkiaPictureView.tsx +4 -1
- package/src/views/types.ts +3 -0
- package/cpp/jsi/JsiValueWrapper.h +0 -164
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +0 -128
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -92
|
@@ -3,97 +3,88 @@ package com.shopify.reactnative.skia;
|
|
|
3
3
|
import android.content.Context;
|
|
4
4
|
import android.graphics.SurfaceTexture;
|
|
5
5
|
import android.util.Log;
|
|
6
|
-
import android.view.
|
|
6
|
+
import android.view.Surface;
|
|
7
|
+
import android.view.View;
|
|
7
8
|
|
|
8
9
|
import com.facebook.react.views.view.ReactViewGroup;
|
|
9
10
|
|
|
10
|
-
public abstract class SkiaBaseView extends ReactViewGroup implements
|
|
11
|
-
private
|
|
11
|
+
public abstract class SkiaBaseView extends ReactViewGroup implements SkiaViewAPI {
|
|
12
|
+
private View mView;
|
|
12
13
|
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
private boolean isDropped = false;
|
|
14
|
+
private final boolean debug = false;
|
|
15
|
+
private final String tag = "SkiaView";
|
|
16
16
|
|
|
17
17
|
public SkiaBaseView(Context context) {
|
|
18
18
|
super(context);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
mTexture.setOpaque(false);
|
|
22
|
-
addView(mTexture);
|
|
19
|
+
mView = new SkiaTextureView(context, this, debug);
|
|
20
|
+
addView(mView);
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
public void setOpaque(boolean value) {
|
|
24
|
+
if (value && mView instanceof SkiaTextureView) {
|
|
25
|
+
removeView(mView);
|
|
26
|
+
mView = new SkiaSurfaceView(getContext(), this, debug);
|
|
27
|
+
addView(mView);
|
|
28
|
+
} else if (!value && mView instanceof SkiaSurfaceView) {
|
|
29
|
+
removeView(mView);
|
|
30
|
+
mView = new SkiaTextureView(getContext(), this, debug);
|
|
31
|
+
addView(mView);
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
void dropInstance() {
|
|
36
|
-
isDropped = true;
|
|
37
|
-
unregisterView();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
35
|
@Override
|
|
41
36
|
protected void onAttachedToWindow() {
|
|
42
37
|
super.onAttachedToWindow();
|
|
43
|
-
if (
|
|
44
|
-
|
|
38
|
+
if (getMeasuredWidth() == 0) {
|
|
39
|
+
if (mView instanceof SkiaTextureView) {
|
|
40
|
+
((SkiaTextureView) mView).createSurfaceTexture();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void dropInstance() {
|
|
46
|
+
if (mView instanceof SkiaTextureView) {
|
|
47
|
+
((SkiaTextureView)mView).isDropped = true;
|
|
45
48
|
}
|
|
49
|
+
unregisterView();
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
@Override
|
|
49
53
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
50
|
-
Log.i(tag, "onLayout " + this.getMeasuredWidth() + "/" + this.getMeasuredHeight());
|
|
51
54
|
super.onLayout(changed, left, top, right, bottom);
|
|
52
|
-
|
|
55
|
+
mView.layout(0, 0, right - left, bottom - top);
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
@Override
|
|
56
|
-
public void
|
|
57
|
-
|
|
58
|
-
surfaceAvailable(surface, width, height);
|
|
59
|
+
public void onSurfaceCreated(Surface surface, int width, int height) {
|
|
60
|
+
surfaceAvailable(surface, width, height, true);
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
@Override
|
|
62
|
-
public void
|
|
63
|
-
if (isDropped) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
64
|
+
public void onSurfaceChanged(Surface surface, int width, int height) {
|
|
66
65
|
Log.i(tag, "onSurfaceTextureSizeChanged " + width + "/" + height);
|
|
67
|
-
surfaceSizeChanged(surface, width, height);
|
|
66
|
+
surfaceSizeChanged(surface, width, height, true);
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
@Override
|
|
71
|
-
public
|
|
72
|
-
|
|
73
|
-
// https://developer.android.com/reference/android/view/TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed(android.graphics.SurfaceTexture)
|
|
74
|
-
surfaceDestroyed();
|
|
75
|
-
// Because of React Native Screens (which dettach the view), we always keep the surface alive.
|
|
76
|
-
// If not, Texture view will recreate the texture surface by itself and
|
|
77
|
-
// we will lose the fast first time to frame.
|
|
78
|
-
// We only delete the surface when the view is dropped (destroySurface invoked by SkiaBaseViewManager);
|
|
79
|
-
if (!isDropped) {
|
|
80
|
-
createSurfaceTexture();
|
|
81
|
-
}
|
|
82
|
-
return false;
|
|
70
|
+
public void onSurfaceTextureCreated(SurfaceTexture surface, int width, int height) {
|
|
71
|
+
surfaceAvailable(surface, width, height, false);
|
|
83
72
|
}
|
|
84
73
|
|
|
85
|
-
private long _prevTimestamp = 0;
|
|
86
74
|
@Override
|
|
87
|
-
public void
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
75
|
+
public void onSurfaceTextureChanged(SurfaceTexture surface, int width, int height) {
|
|
76
|
+
Log.i(tag, "onSurfaceTextureSizeChanged " + width + "/" + height);
|
|
77
|
+
surfaceSizeChanged(surface, width, height, false);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Override
|
|
81
|
+
public void onSurfaceDestroyed() {
|
|
82
|
+
surfaceDestroyed();
|
|
92
83
|
}
|
|
93
84
|
|
|
94
|
-
protected abstract void surfaceAvailable(Object surface, int width, int height);
|
|
85
|
+
protected abstract void surfaceAvailable(Object surface, int width, int height, boolean opaque);
|
|
95
86
|
|
|
96
|
-
protected abstract void surfaceSizeChanged(Object surface, int width, int height);
|
|
87
|
+
protected abstract void surfaceSizeChanged(Object surface, int width, int height, boolean opaque);
|
|
97
88
|
|
|
98
89
|
protected abstract void surfaceDestroyed();
|
|
99
90
|
|
|
@@ -26,6 +26,11 @@ public abstract class SkiaBaseViewManager<T extends SkiaBaseView> extends ReactV
|
|
|
26
26
|
((SkiaBaseView)view).setDebugMode(show);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
@ReactProp(name = "opaque")
|
|
30
|
+
public void setOpaque(T view, boolean value) {
|
|
31
|
+
((SkiaBaseView)view).setOpaque(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
@Override
|
|
30
35
|
public void onDropViewInstance(@NonNull ReactViewGroup view) {
|
|
31
36
|
super.onDropViewInstance(view);
|
|
@@ -25,9 +25,9 @@ public class SkiaDomView extends SkiaBaseView {
|
|
|
25
25
|
|
|
26
26
|
private native HybridData initHybrid(SkiaManager skiaManager);
|
|
27
27
|
|
|
28
|
-
protected native void surfaceAvailable(Object surface, int width, int height);
|
|
28
|
+
protected native void surfaceAvailable(Object surface, int width, int height, boolean opaque);
|
|
29
29
|
|
|
30
|
-
protected native void surfaceSizeChanged(Object surface, int width, int height);
|
|
30
|
+
protected native void surfaceSizeChanged(Object surface, int width, int height, boolean opaque);
|
|
31
31
|
|
|
32
32
|
protected native void surfaceDestroyed();
|
|
33
33
|
|
|
@@ -24,9 +24,9 @@ public class SkiaPictureView extends SkiaBaseView {
|
|
|
24
24
|
|
|
25
25
|
private native HybridData initHybrid(SkiaManager skiaManager);
|
|
26
26
|
|
|
27
|
-
protected native void surfaceAvailable(Object surface, int width, int height);
|
|
27
|
+
protected native void surfaceAvailable(Object surface, int width, int height, boolean opaque);
|
|
28
28
|
|
|
29
|
-
protected native void surfaceSizeChanged(Object surface, int width, int height);
|
|
29
|
+
protected native void surfaceSizeChanged(Object surface, int width, int height, boolean opaque);
|
|
30
30
|
|
|
31
31
|
protected native void surfaceDestroyed();
|
|
32
32
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package com.shopify.reactnative.skia;
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint;
|
|
4
|
+
import android.content.Context;
|
|
5
|
+
import android.view.SurfaceHolder;
|
|
6
|
+
import android.view.SurfaceView;
|
|
7
|
+
import androidx.annotation.NonNull;
|
|
8
|
+
|
|
9
|
+
@SuppressLint("ViewConstructor")
|
|
10
|
+
public class SkiaSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
|
|
11
|
+
|
|
12
|
+
SkiaViewAPI mApi;
|
|
13
|
+
boolean mDebug;
|
|
14
|
+
|
|
15
|
+
public SkiaSurfaceView(Context context, SkiaViewAPI api, boolean debug) {
|
|
16
|
+
super(context);
|
|
17
|
+
mApi = api;
|
|
18
|
+
mDebug = debug;
|
|
19
|
+
getHolder().addCallback(this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
protected void onDetachedFromWindow() {
|
|
24
|
+
super.onDetachedFromWindow();
|
|
25
|
+
mApi.onSurfaceDestroyed();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public void surfaceCreated(@NonNull SurfaceHolder holder) {
|
|
30
|
+
mApi.onSurfaceCreated(holder.getSurface(), getWidth(), getHeight());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Override
|
|
34
|
+
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
|
|
35
|
+
mApi.onSurfaceChanged(holder.getSurface(), getWidth(), getHeight());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@Override
|
|
39
|
+
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
|
|
40
|
+
mApi.onSurfaceDestroyed();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
package com.shopify.reactnative.skia;
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint;
|
|
4
|
+
import android.content.Context;
|
|
5
|
+
import android.graphics.SurfaceTexture;
|
|
6
|
+
import android.util.Log;
|
|
7
|
+
import android.view.Surface;
|
|
8
|
+
import android.view.TextureView;
|
|
9
|
+
import androidx.annotation.NonNull;
|
|
10
|
+
|
|
11
|
+
@SuppressLint("ViewConstructor")
|
|
12
|
+
public class SkiaTextureView extends TextureView implements TextureView.SurfaceTextureListener {
|
|
13
|
+
|
|
14
|
+
private String tag = "SkiaTextureView";
|
|
15
|
+
|
|
16
|
+
SkiaViewAPI mApi;
|
|
17
|
+
boolean mDebug;
|
|
18
|
+
boolean pristine = true;
|
|
19
|
+
|
|
20
|
+
public boolean isDropped = false;
|
|
21
|
+
|
|
22
|
+
public SkiaTextureView(Context context, SkiaViewAPI api, boolean debug) {
|
|
23
|
+
super(context);
|
|
24
|
+
mApi = api;
|
|
25
|
+
mDebug = debug;
|
|
26
|
+
setOpaque(false);
|
|
27
|
+
setSurfaceTextureListener(this);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public void createSurfaceTexture() {
|
|
31
|
+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
32
|
+
Log.i(tag, "Create SurfaceTexture");
|
|
33
|
+
SurfaceTexture surfaceTexture = new SurfaceTexture(false);
|
|
34
|
+
setSurfaceTexture(surfaceTexture);
|
|
35
|
+
onSurfaceTextureAvailable(surfaceTexture, getWidth(), getHeight());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private void reCreateSurfaceTexture() {
|
|
40
|
+
boolean surfaceIsAlreadyAvailable = getSurfaceTexture() != null;
|
|
41
|
+
if (surfaceIsAlreadyAvailable) {
|
|
42
|
+
createSurfaceTexture();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Override
|
|
47
|
+
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
48
|
+
super.onLayout(changed, left, top, right, bottom);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
|
|
53
|
+
Log.i(tag, "onSurfaceTextureAvailable: " + width + "x" + height);
|
|
54
|
+
mApi.onSurfaceTextureCreated(surfaceTexture, width, height);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Override
|
|
58
|
+
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
|
|
59
|
+
Log.i(tag, "onSurfaceTextureSizeChanged: " + width + "x" + height);
|
|
60
|
+
if (isDropped) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
mApi.onSurfaceTextureCreated(surfaceTexture, width, height);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Override
|
|
67
|
+
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {
|
|
68
|
+
mApi.onSurfaceDestroyed();
|
|
69
|
+
// Because of React Native Screens (which dettach the view), we always keep the surface alive.
|
|
70
|
+
// If not, Texture view will recreate the texture surface by itself and
|
|
71
|
+
// we will lose the fast first time to frame.
|
|
72
|
+
// We only delete the surface when the view is dropped (destroySurface invoked by SkiaBaseViewManager);
|
|
73
|
+
if (!isDropped) {
|
|
74
|
+
reCreateSurfaceTexture();
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private long _prevTimestamp = 0;
|
|
80
|
+
@Override
|
|
81
|
+
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
|
|
82
|
+
if (!mDebug) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
long timestamp = surface.getTimestamp();
|
|
86
|
+
long frameDuration = (timestamp - _prevTimestamp)/1000000;
|
|
87
|
+
Log.i("SkiaTextureView", "onSurfaceTextureUpdated "+frameDuration+"ms");
|
|
88
|
+
_prevTimestamp = timestamp;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package com.shopify.reactnative.skia;
|
|
2
|
+
|
|
3
|
+
import android.graphics.SurfaceTexture;
|
|
4
|
+
import android.view.Surface;
|
|
5
|
+
|
|
6
|
+
public interface SkiaViewAPI {
|
|
7
|
+
void onSurfaceCreated(Surface surface, int width, int height);
|
|
8
|
+
|
|
9
|
+
void onSurfaceChanged(Surface surface, int width, int height);
|
|
10
|
+
|
|
11
|
+
void onSurfaceTextureCreated(SurfaceTexture surface, int width, int height);
|
|
12
|
+
|
|
13
|
+
void onSurfaceTextureChanged(SurfaceTexture surface, int width, int height);
|
|
14
|
+
|
|
15
|
+
void onSurfaceDestroyed();
|
|
16
|
+
}
|
package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerDelegate.java
CHANGED
|
@@ -21,6 +21,9 @@ public class SkiaDomViewManagerDelegate<T extends View, U extends BaseViewManage
|
|
|
21
21
|
@Override
|
|
22
22
|
public void setProperty(T view, String propName, @Nullable Object value) {
|
|
23
23
|
switch (propName) {
|
|
24
|
+
case "opaque":
|
|
25
|
+
mViewManager.setOpaque(view, value != null && (boolean) value);
|
|
26
|
+
break;
|
|
24
27
|
case "debug":
|
|
25
28
|
mViewManager.setDebug(view, value != null && (boolean) value);
|
|
26
29
|
break;
|
package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerDelegate.java
CHANGED
|
@@ -24,8 +24,10 @@ public class SkiaPictureViewManagerDelegate<T extends View, U extends BaseViewMa
|
|
|
24
24
|
case "mode":
|
|
25
25
|
mViewManager.setMode(view, value == null ? null : (String) value);
|
|
26
26
|
break;
|
|
27
|
+
case "opaque":
|
|
28
|
+
mViewManager.setOpaque(view, value != null && (boolean) value);
|
|
27
29
|
case "debug":
|
|
28
|
-
mViewManager.setDebug(view, value
|
|
30
|
+
mViewManager.setDebug(view, value != null && (boolean) value);
|
|
29
31
|
break;
|
|
30
32
|
default:
|
|
31
33
|
super.setProperty(view, propName, value);
|
|
@@ -26,11 +26,7 @@ public:
|
|
|
26
26
|
JsiSkContourMeasure(std::shared_ptr<RNSkPlatformContext> context,
|
|
27
27
|
const sk_sp<SkContourMeasure> contourMeasure)
|
|
28
28
|
: JsiSkWrappingSkPtrHostObject(std::move(context),
|
|
29
|
-
std::move(contourMeasure)) {
|
|
30
|
-
if (contourMeasure == nullptr) {
|
|
31
|
-
throw jsi::JSError(*context->getJsRuntime(), "Contour measure is null");
|
|
32
|
-
}
|
|
33
|
-
}
|
|
29
|
+
std::move(contourMeasure)) {}
|
|
34
30
|
|
|
35
31
|
JSI_HOST_FUNCTION(getPosTan) {
|
|
36
32
|
auto dist = arguments[0].asNumber();
|
package/cpp/api/JsiSkImage.h
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
#include "JsiSkShader.h"
|
|
11
11
|
#include "third_party/base64.h"
|
|
12
12
|
|
|
13
|
+
#include "JsiTextureInfo.h"
|
|
13
14
|
#include "RNSkTypedArray.h"
|
|
14
15
|
|
|
15
16
|
#if defined(SK_GRAPHITE)
|
|
@@ -215,6 +216,15 @@ public:
|
|
|
215
216
|
runtime, std::make_shared<JsiSkImage>(getContext(), rasterImage));
|
|
216
217
|
}
|
|
217
218
|
|
|
219
|
+
JSI_HOST_FUNCTION(getNativeTextureUnstable) {
|
|
220
|
+
auto image = getObject();
|
|
221
|
+
if (!image->isTextureBacked()) {
|
|
222
|
+
return jsi::Value::null();
|
|
223
|
+
}
|
|
224
|
+
auto texInfo = getContext()->getTexture(image);
|
|
225
|
+
return JsiTextureInfo::toValue(runtime, texInfo);
|
|
226
|
+
}
|
|
227
|
+
|
|
218
228
|
EXPORT_JSI_API_TYPENAME(JsiSkImage, Image)
|
|
219
229
|
|
|
220
230
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImage, width),
|
|
@@ -226,6 +236,7 @@ public:
|
|
|
226
236
|
JSI_EXPORT_FUNC(JsiSkImage, encodeToBase64),
|
|
227
237
|
JSI_EXPORT_FUNC(JsiSkImage, readPixels),
|
|
228
238
|
JSI_EXPORT_FUNC(JsiSkImage, makeNonTextureImage),
|
|
239
|
+
JSI_EXPORT_FUNC(JsiSkImage, getNativeTextureUnstable),
|
|
229
240
|
JSI_EXPORT_FUNC(JsiSkImage, dispose))
|
|
230
241
|
|
|
231
242
|
JsiSkImage(std::shared_ptr<RNSkPlatformContext> context,
|
|
@@ -78,10 +78,24 @@ public:
|
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
JSI_HOST_FUNCTION(MakeImageFromNativeTextureUnstable) {
|
|
82
|
+
auto texInfo = JsiTextureInfo::fromValue(runtime, arguments[0]);
|
|
83
|
+
auto image = getContext()->makeImageFromNativeTexture(
|
|
84
|
+
texInfo, arguments[1].asNumber(), arguments[2].asNumber(),
|
|
85
|
+
count > 3 && arguments[3].asBool());
|
|
86
|
+
if (image == nullptr) {
|
|
87
|
+
throw std::runtime_error("Failed to convert native texture to SkImage!");
|
|
88
|
+
}
|
|
89
|
+
return jsi::Object::createFromHostObject(
|
|
90
|
+
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
|
91
|
+
}
|
|
92
|
+
|
|
81
93
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromEncoded),
|
|
82
94
|
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromViewTag),
|
|
83
95
|
JSI_EXPORT_FUNC(JsiSkImageFactory,
|
|
84
96
|
MakeImageFromNativeBuffer),
|
|
97
|
+
JSI_EXPORT_FUNC(JsiSkImageFactory,
|
|
98
|
+
MakeImageFromNativeTextureUnstable),
|
|
85
99
|
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImage))
|
|
86
100
|
|
|
87
101
|
explicit JsiSkImageFactory(std::shared_ptr<RNSkPlatformContext> context)
|
package/cpp/api/JsiSkPicture.h
CHANGED
package/cpp/api/JsiSkSurface.h
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
#include <jsi/jsi.h>
|
|
7
7
|
|
|
8
8
|
#include "JsiSkHostObjects.h"
|
|
9
|
+
#include "JsiTextureInfo.h"
|
|
9
10
|
|
|
10
11
|
#include "JsiSkCanvas.h"
|
|
11
12
|
#include "JsiSkImage.h"
|
|
@@ -78,11 +79,17 @@ public:
|
|
|
78
79
|
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
JSI_HOST_FUNCTION(getNativeTextureUnstable) {
|
|
83
|
+
auto texInfo = getContext()->getTexture(getObject());
|
|
84
|
+
return JsiTextureInfo::toValue(runtime, texInfo);
|
|
85
|
+
}
|
|
86
|
+
|
|
81
87
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkSurface, width),
|
|
82
88
|
JSI_EXPORT_FUNC(JsiSkSurface, height),
|
|
83
89
|
JSI_EXPORT_FUNC(JsiSkSurface, getCanvas),
|
|
84
90
|
JSI_EXPORT_FUNC(JsiSkSurface, makeImageSnapshot),
|
|
85
91
|
JSI_EXPORT_FUNC(JsiSkSurface, flush),
|
|
92
|
+
JSI_EXPORT_FUNC(JsiSkSurface, getNativeTextureUnstable),
|
|
86
93
|
JSI_EXPORT_FUNC(JsiSkSurface, dispose))
|
|
87
94
|
};
|
|
88
95
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <jsi/jsi.h>
|
|
4
|
+
|
|
5
|
+
#include "RNSkPlatformContext.h"
|
|
6
|
+
|
|
7
|
+
namespace jsi = facebook::jsi;
|
|
8
|
+
namespace react = facebook::react;
|
|
9
|
+
|
|
10
|
+
namespace RNSkia {
|
|
11
|
+
|
|
12
|
+
namespace JsiTextureInfo {
|
|
13
|
+
|
|
14
|
+
inline jsi::Value toValue(jsi::Runtime &runtime, const TextureInfo &texInfo) {
|
|
15
|
+
jsi::Object textureInfo(runtime);
|
|
16
|
+
textureInfo.setProperty(
|
|
17
|
+
runtime, "mtlTexture",
|
|
18
|
+
jsi::BigInt::fromUint64(runtime,
|
|
19
|
+
reinterpret_cast<uint64_t>(texInfo.mtlTexture)));
|
|
20
|
+
textureInfo.setProperty(runtime, "glTarget",
|
|
21
|
+
static_cast<int>(texInfo.glTarget));
|
|
22
|
+
textureInfo.setProperty(runtime, "glID", static_cast<int>(texInfo.glID));
|
|
23
|
+
textureInfo.setProperty(runtime, "glFormat",
|
|
24
|
+
static_cast<int>(texInfo.glFormat));
|
|
25
|
+
textureInfo.setProperty(runtime, "glProtected",
|
|
26
|
+
static_cast<int>(texInfo.glProtected));
|
|
27
|
+
return textureInfo;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
inline TextureInfo fromValue(jsi::Runtime &runtime, const jsi::Value &value) {
|
|
31
|
+
auto object = value.getObject(runtime);
|
|
32
|
+
TextureInfo texInfo;
|
|
33
|
+
if (object.hasProperty(runtime, "mtlTexture")) {
|
|
34
|
+
texInfo.mtlTexture =
|
|
35
|
+
reinterpret_cast<const void *>(object.getProperty(runtime, "mtlTexture")
|
|
36
|
+
.asBigInt(runtime)
|
|
37
|
+
.asUint64(runtime));
|
|
38
|
+
}
|
|
39
|
+
if (object.hasProperty(runtime, "glID")) {
|
|
40
|
+
texInfo.glTarget = static_cast<unsigned int>(
|
|
41
|
+
object.getProperty(runtime, "glTarget").asNumber());
|
|
42
|
+
texInfo.glID = static_cast<unsigned int>(
|
|
43
|
+
object.getProperty(runtime, "glID").asNumber());
|
|
44
|
+
texInfo.glFormat = static_cast<unsigned int>(
|
|
45
|
+
object.getProperty(runtime, "glFormat").asNumber());
|
|
46
|
+
texInfo.glProtected =
|
|
47
|
+
object.getProperty(runtime, "glProtected").asNumber() != 0;
|
|
48
|
+
}
|
|
49
|
+
return texInfo;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
} // namespace JsiTextureInfo
|
|
53
|
+
} // namespace RNSkia
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <jsi/jsi.h>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <string>
|
|
6
|
+
|
|
7
|
+
#include "JsiDomRenderNode.h"
|
|
8
|
+
#include "JsiSkPicture.h"
|
|
9
|
+
|
|
10
|
+
namespace RNJsi {
|
|
11
|
+
namespace jsi = facebook::jsi;
|
|
12
|
+
|
|
13
|
+
class ViewProperty {
|
|
14
|
+
public:
|
|
15
|
+
ViewProperty(jsi::Runtime &runtime, const jsi::Value &value) {
|
|
16
|
+
if (value.isObject()) {
|
|
17
|
+
auto object = value.asObject(runtime);
|
|
18
|
+
if (object.isHostObject(runtime)) {
|
|
19
|
+
auto hostObject = object.asHostObject(runtime);
|
|
20
|
+
auto dom =
|
|
21
|
+
std::dynamic_pointer_cast<RNSkia::JsiDomRenderNode>(hostObject);
|
|
22
|
+
if (dom) {
|
|
23
|
+
_value = dom;
|
|
24
|
+
} else {
|
|
25
|
+
auto jsiPicture =
|
|
26
|
+
std::dynamic_pointer_cast<RNSkia::JsiSkPicture>(hostObject);
|
|
27
|
+
if (jsiPicture) {
|
|
28
|
+
_value = jsiPicture->getObject();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
bool isNull() { return std::holds_alternative<nullptr_t>(_value); }
|
|
36
|
+
|
|
37
|
+
std::shared_ptr<RNSkia::JsiDomRenderNode> getDomRenderNode() {
|
|
38
|
+
return std::get<std::shared_ptr<RNSkia::JsiDomRenderNode>>(_value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
sk_sp<SkPicture> getPicture() { return std::get<sk_sp<SkPicture>>(_value); }
|
|
42
|
+
|
|
43
|
+
private:
|
|
44
|
+
std::variant<nullptr_t, sk_sp<SkPicture>,
|
|
45
|
+
std::shared_ptr<RNSkia::JsiDomRenderNode>>
|
|
46
|
+
_value = nullptr;
|
|
47
|
+
};
|
|
48
|
+
} // namespace RNJsi
|
|
@@ -26,26 +26,6 @@ RNSkDomRenderer::~RNSkDomRenderer() {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
bool RNSkDomRenderer::tryRender(
|
|
30
|
-
std::shared_ptr<RNSkCanvasProvider> canvasProvider) {
|
|
31
|
-
|
|
32
|
-
// We render on the main thread
|
|
33
|
-
if (_renderLock->try_lock()) {
|
|
34
|
-
bool result = false;
|
|
35
|
-
// If we have a Dom Node we can render directly on the main thread
|
|
36
|
-
if (_root != nullptr) {
|
|
37
|
-
result = canvasProvider->renderToCanvas(std::bind(
|
|
38
|
-
&RNSkDomRenderer::renderCanvas, this, std::placeholders::_1,
|
|
39
|
-
canvasProvider->getScaledWidth(), canvasProvider->getScaledHeight()));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
_renderLock->unlock();
|
|
43
|
-
return result;
|
|
44
|
-
} else {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
29
|
void RNSkDomRenderer::renderImmediate(
|
|
50
30
|
std::shared_ptr<RNSkCanvasProvider> canvasProvider) {
|
|
51
31
|
auto prevDebugOverlay = getShowDebugOverlays();
|
package/cpp/rnskia/RNSkDomView.h
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
#include <jsi/jsi.h>
|
|
11
11
|
|
|
12
|
-
#include "JsiValueWrapper.h"
|
|
13
12
|
#include "RNSkView.h"
|
|
13
|
+
#include "ViewProperty.h"
|
|
14
14
|
|
|
15
15
|
#include "JsiDomRenderNode.h"
|
|
16
16
|
#include "RNSkLog.h"
|
|
@@ -42,8 +42,6 @@ public:
|
|
|
42
42
|
|
|
43
43
|
~RNSkDomRenderer();
|
|
44
44
|
|
|
45
|
-
bool tryRender(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override;
|
|
46
|
-
|
|
47
45
|
void
|
|
48
46
|
renderImmediate(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override;
|
|
49
47
|
|
|
@@ -77,20 +75,17 @@ public:
|
|
|
77
75
|
std::bind(&RNSkView::requestRedraw, this), context)) {}
|
|
78
76
|
|
|
79
77
|
void setJsiProperties(
|
|
80
|
-
std::unordered_map<std::string,
|
|
81
|
-
|
|
82
|
-
RNSkView::setJsiProperties(props);
|
|
78
|
+
std::unordered_map<std::string, ViewProperty> &props) override {
|
|
83
79
|
|
|
84
80
|
for (auto &prop : props) {
|
|
85
81
|
if (prop.first == "root") {
|
|
86
82
|
// Save root
|
|
87
|
-
if (prop.second.
|
|
83
|
+
if (prop.second.isNull()) {
|
|
88
84
|
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
|
89
85
|
->setRoot(nullptr);
|
|
90
86
|
} else {
|
|
91
87
|
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
|
92
|
-
->setRoot(
|
|
93
|
-
prop.second.getAsHostObject()));
|
|
88
|
+
->setRoot(prop.second.getDomRenderNode());
|
|
94
89
|
}
|
|
95
90
|
|
|
96
91
|
// Request redraw
|