@shopify/react-native-skia 0.1.203 → 0.1.204
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 +0 -56
- package/android/cpp/jni/include/JniSkiaDomView.h +12 -20
- package/android/cpp/jni/include/JniSkiaDrawView.h +14 -20
- package/android/cpp/jni/include/JniSkiaPictureView.h +15 -24
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +32 -77
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseViewManager.java +1 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +0 -3
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDrawView.java +0 -3
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +0 -4
- package/cpp/skia/include/core/SkColorTable.h +1 -1
- package/package.json +1 -1
@@ -62,62 +62,6 @@ protected:
|
|
62
62
|
_skiaAndroidView->viewDidUnmount();
|
63
63
|
}
|
64
64
|
|
65
|
-
/**
|
66
|
-
* Android specific method for rendering an offscreen GPU buffer to an Android
|
67
|
-
* bitmap. The result can be used to render the first frame of the Skia render
|
68
|
-
* to avoid flickering on android.
|
69
|
-
*/
|
70
|
-
/*
|
71
|
-
// TODO: Remove if we find another solution for first frame rendering
|
72
|
-
// protected native Object renderToBitmap(Object bitmap, int width, int
|
73
|
-
height); virtual jobject renderToBitmap(jobject bitmapIn, int width, int
|
74
|
-
height) { auto platformContext = getSkiaManager()->getPlatformContext(); auto
|
75
|
-
provider = std::make_shared<RNSkOffscreenCanvasProvider>( platformContext,
|
76
|
-
[]() {}, width, height);
|
77
|
-
|
78
|
-
// Render into a gpu backed buffer
|
79
|
-
_skiaAndroidView->getSkiaView()->getRenderer()->renderImmediate(provider);
|
80
|
-
auto rect = SkRect::MakeXYWH(0, 0, width, height);
|
81
|
-
auto image = provider->makeSnapshot(&rect);
|
82
|
-
|
83
|
-
AndroidBitmapInfo infoIn;
|
84
|
-
auto env = facebook::jni::Environment::current();
|
85
|
-
void *pixels;
|
86
|
-
|
87
|
-
// Get image info
|
88
|
-
if (AndroidBitmap_getInfo(env, bitmapIn, &infoIn) !=
|
89
|
-
ANDROID_BITMAP_RESULT_SUCCESS) {
|
90
|
-
return env->NewStringUTF("failed");
|
91
|
-
}
|
92
|
-
|
93
|
-
// Check image
|
94
|
-
if (infoIn.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
|
95
|
-
infoIn.format != ANDROID_BITMAP_FORMAT_RGB_565) {
|
96
|
-
return env->NewStringUTF("Only support ANDROID_BITMAP_FORMAT_RGBA_8888 "
|
97
|
-
"and ANDROID_BITMAP_FORMAT_RGB_565");
|
98
|
-
}
|
99
|
-
|
100
|
-
auto imageInfo = SkImageInfo::Make(image->width(), image->height(),
|
101
|
-
image->colorType(), image->alphaType());
|
102
|
-
|
103
|
-
// Lock all images
|
104
|
-
if (AndroidBitmap_lockPixels(env, bitmapIn, &pixels) !=
|
105
|
-
ANDROID_BITMAP_RESULT_SUCCESS) {
|
106
|
-
return env->NewStringUTF("AndroidBitmap_lockPixels failed!");
|
107
|
-
}
|
108
|
-
|
109
|
-
// Set pixels from SkImage
|
110
|
-
image->readPixels(imageInfo, pixels, imageInfo.minRowBytes(), 0, 0);
|
111
|
-
|
112
|
-
// Unlocks everything
|
113
|
-
AndroidBitmap_unlockPixels(env, bitmapIn);
|
114
|
-
|
115
|
-
image = nullptr;
|
116
|
-
provider = nullptr;
|
117
|
-
|
118
|
-
return bitmapIn;
|
119
|
-
}*/
|
120
|
-
|
121
65
|
private:
|
122
66
|
JniSkiaManager *_manager;
|
123
67
|
std::shared_ptr<RNSkBaseAndroidView> _skiaAndroidView;
|
@@ -34,21 +34,18 @@ public:
|
|
34
34
|
}
|
35
35
|
|
36
36
|
static void registerNatives() {
|
37
|
-
registerHybrid(
|
38
|
-
makeNativeMethod("initHybrid", JniSkiaDomView::initHybrid),
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
// TODO: Remove if we find another solution for first frame rendering
|
50
|
-
// makeNativeMethod("renderToBitmap", JniSkiaDomView::renderToBitmap)
|
51
|
-
});
|
37
|
+
registerHybrid(
|
38
|
+
{makeNativeMethod("initHybrid", JniSkiaDomView::initHybrid),
|
39
|
+
makeNativeMethod("surfaceAvailable", JniSkiaDomView::surfaceAvailable),
|
40
|
+
makeNativeMethod("surfaceDestroyed", JniSkiaDomView::surfaceDestroyed),
|
41
|
+
makeNativeMethod("surfaceSizeChanged",
|
42
|
+
JniSkiaDomView::surfaceSizeChanged),
|
43
|
+
makeNativeMethod("setMode", JniSkiaDomView::setMode),
|
44
|
+
makeNativeMethod("setDebugMode", JniSkiaDomView::setDebugMode),
|
45
|
+
makeNativeMethod("updateTouchPoints",
|
46
|
+
JniSkiaDomView::updateTouchPoints),
|
47
|
+
makeNativeMethod("registerView", JniSkiaDomView::registerView),
|
48
|
+
makeNativeMethod("unregisterView", JniSkiaDomView::unregisterView)});
|
52
49
|
}
|
53
50
|
|
54
51
|
protected:
|
@@ -76,11 +73,6 @@ protected:
|
|
76
73
|
|
77
74
|
void unregisterView() override { JniSkiaBaseView::unregisterView(); }
|
78
75
|
|
79
|
-
// TODO: Remove if we find another solution for first frame rendering
|
80
|
-
/*jobject renderToBitmap(jobject bitmap, int width, int height) override {
|
81
|
-
return JniSkiaBaseView::renderToBitmap(bitmap, width, height);
|
82
|
-
}*/
|
83
|
-
|
84
76
|
private:
|
85
77
|
friend HybridBase;
|
86
78
|
|
@@ -33,21 +33,20 @@ public:
|
|
33
33
|
}
|
34
34
|
|
35
35
|
static void registerNatives() {
|
36
|
-
registerHybrid(
|
37
|
-
makeNativeMethod("initHybrid", JniSkiaDrawView::initHybrid),
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
});
|
36
|
+
registerHybrid(
|
37
|
+
{makeNativeMethod("initHybrid", JniSkiaDrawView::initHybrid),
|
38
|
+
makeNativeMethod("surfaceAvailable",
|
39
|
+
JniSkiaDrawView::surfaceAvailable),
|
40
|
+
makeNativeMethod("surfaceDestroyed",
|
41
|
+
JniSkiaDrawView::surfaceDestroyed),
|
42
|
+
makeNativeMethod("surfaceSizeChanged",
|
43
|
+
JniSkiaDrawView::surfaceSizeChanged),
|
44
|
+
makeNativeMethod("setMode", JniSkiaDrawView::setMode),
|
45
|
+
makeNativeMethod("setDebugMode", JniSkiaDrawView::setDebugMode),
|
46
|
+
makeNativeMethod("updateTouchPoints",
|
47
|
+
JniSkiaDrawView::updateTouchPoints),
|
48
|
+
makeNativeMethod("registerView", JniSkiaDrawView::registerView),
|
49
|
+
makeNativeMethod("unregisterView", JniSkiaDrawView::unregisterView)});
|
51
50
|
}
|
52
51
|
|
53
52
|
protected:
|
@@ -75,11 +74,6 @@ protected:
|
|
75
74
|
|
76
75
|
void unregisterView() override { JniSkiaBaseView::unregisterView(); }
|
77
76
|
|
78
|
-
// TODO: Remove if we find another solution for first frame rendering
|
79
|
-
/*jobject renderToBitmap(jobject bitmap, int width, int height) override {
|
80
|
-
return JniSkiaBaseView::renderToBitmap(bitmap, width, height);
|
81
|
-
}*/
|
82
|
-
|
83
77
|
private:
|
84
78
|
friend HybridBase;
|
85
79
|
|
@@ -33,24 +33,21 @@ public:
|
|
33
33
|
}
|
34
34
|
|
35
35
|
static void registerNatives() {
|
36
|
-
registerHybrid(
|
37
|
-
makeNativeMethod("initHybrid", JniSkiaPictureView::initHybrid),
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
// makeNativeMethod("renderToBitmap",
|
52
|
-
// JniSkiaPictureView::renderToBitmap)
|
53
|
-
});
|
36
|
+
registerHybrid(
|
37
|
+
{makeNativeMethod("initHybrid", JniSkiaPictureView::initHybrid),
|
38
|
+
makeNativeMethod("surfaceAvailable",
|
39
|
+
JniSkiaPictureView::surfaceAvailable),
|
40
|
+
makeNativeMethod("surfaceDestroyed",
|
41
|
+
JniSkiaPictureView::surfaceDestroyed),
|
42
|
+
makeNativeMethod("surfaceSizeChanged",
|
43
|
+
JniSkiaPictureView::surfaceSizeChanged),
|
44
|
+
makeNativeMethod("setMode", JniSkiaPictureView::setMode),
|
45
|
+
makeNativeMethod("setDebugMode", JniSkiaPictureView::setDebugMode),
|
46
|
+
makeNativeMethod("updateTouchPoints",
|
47
|
+
JniSkiaPictureView::updateTouchPoints),
|
48
|
+
makeNativeMethod("registerView", JniSkiaPictureView::registerView),
|
49
|
+
makeNativeMethod("unregisterView",
|
50
|
+
JniSkiaPictureView::unregisterView)});
|
54
51
|
}
|
55
52
|
|
56
53
|
protected:
|
@@ -78,12 +75,6 @@ protected:
|
|
78
75
|
|
79
76
|
void unregisterView() override { JniSkiaBaseView::unregisterView(); }
|
80
77
|
|
81
|
-
/*
|
82
|
-
TODO: Remove if we find another solution for first frame rendering
|
83
|
-
jobject renderToBitmap(jobject bitmap, int width, int height) override {
|
84
|
-
return JniSkiaBaseView::renderToBitmap(bitmap, width, height);
|
85
|
-
}*/
|
86
|
-
|
87
78
|
private:
|
88
79
|
friend HybridBase;
|
89
80
|
|
@@ -9,53 +9,51 @@ import android.view.TextureView;
|
|
9
9
|
|
10
10
|
import com.facebook.jni.annotations.DoNotStrip;
|
11
11
|
import com.facebook.react.views.view.ReactViewGroup;
|
12
|
+
|
12
13
|
public abstract class SkiaBaseView extends ReactViewGroup implements TextureView.SurfaceTextureListener {
|
13
14
|
|
14
15
|
@DoNotStrip
|
15
16
|
private Surface mSurface;
|
16
17
|
private TextureView mTexture;
|
17
18
|
|
19
|
+
private String tag = "SkiaView";
|
20
|
+
|
18
21
|
public SkiaBaseView(Context context) {
|
19
22
|
super(context);
|
20
|
-
// TODO: Remove if we find another solution for first frame rendering
|
21
|
-
//setWillNotDraw(!shouldRenderFirstFrameAsBitmap());
|
22
23
|
mTexture = new TextureView(context);
|
23
24
|
mTexture.setSurfaceTextureListener(this);
|
24
25
|
mTexture.setOpaque(false);
|
25
26
|
addView(mTexture);
|
26
27
|
}
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
//
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
null);
|
51
|
-
|
52
|
-
bitmap.recycle();
|
53
|
-
}
|
29
|
+
public void destroySurface() {
|
30
|
+
Log.i(tag, "destroySurface");
|
31
|
+
surfaceDestroyed();
|
32
|
+
mSurface.release();
|
33
|
+
mSurface = null;
|
34
|
+
}
|
35
|
+
|
36
|
+
private void createSurfaceTexture() {
|
37
|
+
// This API Level is >= 26, we created our own SurfaceTexture to have a faster time to first frame
|
38
|
+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
39
|
+
Log.i(tag, "Create SurfaceTexture");
|
40
|
+
SurfaceTexture surface = new SurfaceTexture(false);
|
41
|
+
mTexture.setSurfaceTexture(surface);
|
42
|
+
this.onSurfaceTextureAvailable(surface, this.getMeasuredWidth(), this.getMeasuredHeight());
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
@Override
|
47
|
+
protected void onAttachedToWindow() {
|
48
|
+
super.onAttachedToWindow();
|
49
|
+
if (this.getMeasuredWidth() == 0) {
|
50
|
+
createSurfaceTexture();
|
54
51
|
}
|
55
|
-
}
|
52
|
+
}
|
56
53
|
|
57
54
|
@Override
|
58
55
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
56
|
+
Log.i(tag, "onLayout " + this.getMeasuredWidth() + "/" + this.getMeasuredHeight());
|
59
57
|
super.onLayout(changed, left, top, right, bottom);
|
60
58
|
mTexture.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight());
|
61
59
|
}
|
@@ -132,52 +130,23 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
132
130
|
|
133
131
|
@Override
|
134
132
|
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
|
135
|
-
Log.i(
|
133
|
+
Log.i(tag, "onSurfaceTextureAvailable " + width + "/" + height);
|
136
134
|
mSurface = new Surface(surface);
|
137
135
|
surfaceAvailable(mSurface, width, height);
|
138
|
-
|
139
|
-
/*
|
140
|
-
TODO: Remove if we find another solution for first frame rendering
|
141
|
-
// Clear rendered bitmap when the surface texture has rendered
|
142
|
-
// We'll post a message to the main loop asking to invalidate
|
143
|
-
if (shouldRenderFirstFrameAsBitmap()) {
|
144
|
-
postUpdate(new AtomicInteger());
|
145
|
-
}*/
|
146
136
|
}
|
147
137
|
|
148
|
-
/**
|
149
|
-
* This method is a way for us to clear the bitmap rendered on the first frame
|
150
|
-
* after at least 16 frames have passed - to avoid seeing blinks on the screen caused by
|
151
|
-
* TextureView frame sync issues. This is a hack to avoid those pesky blinks. Have no
|
152
|
-
* idea on how to sync the TextureView OpenGL updates.
|
153
|
-
* @param counter
|
154
|
-
*/
|
155
|
-
/*
|
156
|
-
TODO: Remove if we find another solution for first frame rendering
|
157
|
-
void postUpdate(AtomicInteger counter) {
|
158
|
-
counter.getAndIncrement();
|
159
|
-
if (counter.get() > 16) {
|
160
|
-
invalidate();
|
161
|
-
} else {
|
162
|
-
this.post(() -> {
|
163
|
-
postUpdate(counter);
|
164
|
-
});
|
165
|
-
}
|
166
|
-
}*/
|
167
|
-
|
168
138
|
@Override
|
169
139
|
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
|
170
|
-
Log.i(
|
140
|
+
Log.i(tag, "onSurfaceTextureSizeChanged " + width + "/" + height);
|
171
141
|
surfaceSizeChanged(width, height);
|
172
142
|
}
|
173
143
|
|
174
144
|
@Override
|
175
145
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
|
176
|
-
Log.i(
|
146
|
+
Log.i(tag, "onSurfaceTextureDestroyed");
|
177
147
|
// https://developer.android.com/reference/android/view/TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed(android.graphics.SurfaceTexture)
|
178
|
-
|
179
|
-
|
180
|
-
mSurface = null;
|
148
|
+
destroySurface();
|
149
|
+
createSurfaceTexture();
|
181
150
|
return false;
|
182
151
|
}
|
183
152
|
|
@@ -186,17 +155,6 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
186
155
|
// Nothing special to do here
|
187
156
|
}
|
188
157
|
|
189
|
-
/**
|
190
|
-
* Returns true if the view is able to directly render on the
|
191
|
-
* main thread. This can f.ex then be used to create a first frame
|
192
|
-
* render of the view. Returns true by default - override if not.
|
193
|
-
*/
|
194
|
-
/*
|
195
|
-
TODO: Remove if we find another solution for first frame rendering
|
196
|
-
protected boolean shouldRenderFirstFrameAsBitmap() {
|
197
|
-
return false;
|
198
|
-
}*/
|
199
|
-
|
200
158
|
protected abstract void surfaceAvailable(Object surface, int width, int height);
|
201
159
|
|
202
160
|
protected abstract void surfaceSizeChanged(int width, int height);
|
@@ -212,7 +170,4 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
212
170
|
protected abstract void registerView(int nativeId);
|
213
171
|
|
214
172
|
protected abstract void unregisterView();
|
215
|
-
|
216
|
-
// TODO: Remove if we find another solution for first frame rendering
|
217
|
-
// protected native Object renderToBitmap(Object bitmap, int width, int height);
|
218
173
|
}
|
@@ -41,7 +41,4 @@ public class SkiaDomView extends SkiaBaseView {
|
|
41
41
|
protected native void registerView(int nativeId);
|
42
42
|
|
43
43
|
protected native void unregisterView();
|
44
|
-
|
45
|
-
// TODO: Remove if we find another solution for first frame rendering
|
46
|
-
// protected native Object renderToBitmap(Object bitmap, int width, int height);
|
47
44
|
}
|
@@ -41,7 +41,4 @@ public class SkiaDrawView extends SkiaBaseView {
|
|
41
41
|
protected native void registerView(int nativeId);
|
42
42
|
|
43
43
|
protected native void unregisterView();
|
44
|
-
|
45
|
-
// TODO: Remove if we find another solution for first frame rendering
|
46
|
-
// protected native Object renderToBitmap(Object bitmap, int width, int height);
|
47
44
|
}
|
@@ -41,8 +41,4 @@ public class SkiaPictureView extends SkiaBaseView {
|
|
41
41
|
protected native void registerView(int nativeId);
|
42
42
|
|
43
43
|
protected native void unregisterView();
|
44
|
-
|
45
|
-
// TODO: Remove if we find another solution for first frame rendering
|
46
|
-
// protected native Object renderToBitmap(Object bitmap, int width, int height);
|
47
|
-
|
48
44
|
}
|
@@ -19,7 +19,7 @@ class SkWriteBuffer;
|
|
19
19
|
* of `SkColorFilters::Table`, and provides a way to share the table data between client code and
|
20
20
|
* the returned SkColorFilter. Once created, an SkColorTable is immutable.
|
21
21
|
*/
|
22
|
-
class
|
22
|
+
class SkColorTable : public SkRefCnt {
|
23
23
|
public:
|
24
24
|
// Creates a new SkColorTable with 'table' used for all four channels. The table is copied into
|
25
25
|
// the SkColorTable.
|
package/package.json
CHANGED