@shopify/react-native-skia 1.5.10 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|