@shopify/react-native-skia 0.1.185 → 0.1.186
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/build.gradle +2 -1
- package/android/cpp/jni/JniPlatformContext.cpp +92 -3
- package/android/cpp/jni/include/JniPlatformContext.h +4 -0
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +8 -0
- package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +17 -1
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +180 -0
- package/cpp/api/JsiSkFont.h +1 -1
- package/cpp/api/JsiSkHostObjects.h +1 -1
- package/cpp/api/JsiSkImage.h +1 -1
- package/cpp/api/JsiSkImageFactory.h +29 -0
- package/cpp/api/JsiSkPaint.h +7 -7
- package/cpp/api/JsiSkPathFactory.h +1 -1
- package/cpp/api/JsiSkPicture.h +2 -2
- package/cpp/api/JsiSkRuntimeEffect.h +3 -3
- package/cpp/api/JsiSkSVG.h +12 -2
- package/cpp/api/JsiSkShader.h +1 -1
- package/cpp/api/JsiSkSurface.h +3 -3
- package/cpp/api/JsiSkSurfaceFactory.h +1 -1
- package/cpp/api/JsiSkTypeface.h +1 -1
- package/cpp/rnskia/RNSkAnimation.h +3 -3
- package/cpp/rnskia/RNSkDomView.h +9 -9
- package/cpp/rnskia/RNSkInfoParameter.h +2 -2
- package/cpp/rnskia/RNSkJsView.h +8 -8
- package/cpp/rnskia/RNSkJsiViewApi.h +5 -5
- package/cpp/rnskia/RNSkPictureView.h +8 -8
- package/cpp/rnskia/RNSkPlatformContext.h +32 -3
- package/cpp/rnskia/RNSkValueApi.h +5 -5
- package/cpp/rnskia/RNSkView.h +6 -6
- package/cpp/rnskia/dom/base/ConcatablePaint.h +6 -6
- package/cpp/rnskia/dom/base/Declaration.h +1 -1
- package/cpp/rnskia/dom/base/DeclarationContext.h +7 -7
- package/cpp/rnskia/dom/base/DrawingContext.h +3 -3
- package/cpp/rnskia/dom/base/NodePropsContainer.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiBlurMaskNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiColorFilterNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiGlyphsNode.h +8 -7
- package/cpp/rnskia/dom/nodes/JsiImageFilterNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiImageNode.h +5 -2
- package/cpp/rnskia/dom/nodes/JsiImageSvgNode.h +9 -9
- package/cpp/rnskia/dom/nodes/JsiPathEffectNodes.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiPathNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiPointsNode.h +1 -1
- package/cpp/rnskia/dom/nodes/JsiShaderNodes.h +7 -3
- package/cpp/rnskia/dom/nodes/JsiTextNode.h +5 -4
- package/cpp/rnskia/dom/nodes/JsiTextPathNode.h +3 -1
- package/cpp/rnskia/dom/props/BlendModeProp.h +1 -1
- package/cpp/rnskia/dom/props/CircleProp.h +1 -1
- package/cpp/rnskia/dom/props/ClipProp.h +1 -1
- package/cpp/rnskia/dom/props/FontProp.h +15 -10
- package/cpp/rnskia/dom/props/ImageProps.h +30 -16
- package/cpp/rnskia/dom/props/PaintProps.h +1 -1
- package/cpp/rnskia/dom/props/PathProp.h +1 -1
- package/cpp/rnskia/dom/props/PointProp.h +1 -1
- package/cpp/rnskia/dom/props/PointsProp.h +1 -1
- package/cpp/rnskia/dom/props/RRectProp.h +2 -2
- package/cpp/rnskia/dom/props/RadiusProp.h +1 -1
- package/cpp/rnskia/dom/props/RectProp.h +1 -1
- package/cpp/rnskia/dom/props/StrokeProps.h +1 -1
- package/cpp/rnskia/dom/props/SvgProp.h +18 -12
- package/cpp/rnskia/dom/props/TextBlobProp.h +60 -57
- package/cpp/rnskia/dom/props/TileModeProp.h +1 -1
- package/cpp/rnskia/dom/props/UniformsProp.h +1 -1
- package/cpp/rnskia/dom/props/VertexModeProp.h +1 -1
- package/cpp/rnskia/dom/props/VerticesProps.h +1 -1
- package/cpp/rnskia/values/RNSkClockValue.h +2 -2
- package/cpp/rnskia/values/RNSkComputedValue.h +1 -1
- package/cpp/rnskia/values/RNSkReadonlyValue.h +3 -3
- package/cpp/rnskia/values/RNSkValue.h +4 -4
- package/cpp/utils/RNSkMeasureTime.h +1 -1
- package/cpp/utils/RNSkTimingInfo.h +1 -1
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +16 -13
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +8 -0
- package/ios/RNSkia-iOS/SkiaManager.mm +20 -1
- package/ios/RNSkia-iOS/ViewScreenshotService.h +21 -0
- package/ios/RNSkia-iOS/ViewScreenshotService.mm +79 -0
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js +22 -1
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/ImageSVG.js +5 -0
- package/lib/commonjs/dom/nodes/drawings/ImageSVG.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/commonjs/dom/nodes/drawings/Text.js +13 -2
- package/lib/commonjs/dom/nodes/drawings/Text.js.map +1 -1
- package/lib/commonjs/dom/nodes/paint/Shaders.js +5 -0
- package/lib/commonjs/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/commonjs/dom/types/Drawings.d.ts +5 -5
- package/lib/commonjs/dom/types/Drawings.js.map +1 -1
- package/lib/commonjs/dom/types/Shaders.d.ts +1 -1
- package/lib/commonjs/dom/types/Shaders.js.map +1 -1
- package/lib/commonjs/mock/index.js +2 -1
- package/lib/commonjs/mock/index.js.map +1 -1
- package/lib/commonjs/skia/core/Image.d.ts +14 -2
- package/lib/commonjs/skia/core/Image.js +37 -1
- package/lib/commonjs/skia/core/Image.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/commonjs/skia/types/SVG/SVG.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.js +7 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ImageNode.js +22 -1
- package/lib/module/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ImageSVG.js +5 -0
- package/lib/module/dom/nodes/drawings/ImageSVG.js.map +1 -1
- package/lib/module/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/module/dom/nodes/drawings/Text.js +13 -2
- package/lib/module/dom/nodes/drawings/Text.js.map +1 -1
- package/lib/module/dom/nodes/paint/Shaders.js +5 -0
- package/lib/module/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/module/dom/types/Drawings.d.ts +5 -5
- package/lib/module/dom/types/Drawings.js.map +1 -1
- package/lib/module/dom/types/Shaders.d.ts +1 -1
- package/lib/module/dom/types/Shaders.js.map +1 -1
- package/lib/module/mock/index.js +2 -1
- package/lib/module/mock/index.js.map +1 -1
- package/lib/module/skia/core/Image.d.ts +14 -2
- package/lib/module/skia/core/Image.js +32 -0
- package/lib/module/skia/core/Image.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/module/skia/types/SVG/SVG.js.map +1 -1
- package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/lib/module/skia/web/JsiSkImageFactory.js +7 -0
- package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/typescript/src/dom/nodes/drawings/Text.d.ts +2 -2
- package/lib/typescript/src/dom/types/Drawings.d.ts +5 -5
- package/lib/typescript/src/dom/types/Shaders.d.ts +1 -1
- package/lib/typescript/src/skia/core/Image.d.ts +14 -2
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +7 -0
- package/lib/typescript/src/skia/types/SVG/SVG.d.ts +4 -1
- package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -1
- package/package.json +2 -2
- package/scripts/install-npm.js +3 -2
- package/src/dom/nodes/drawings/ImageNode.ts +9 -1
- package/src/dom/nodes/drawings/ImageSVG.ts +3 -0
- package/src/dom/nodes/drawings/Text.ts +13 -3
- package/src/dom/nodes/paint/Shaders.ts +4 -0
- package/src/dom/types/Drawings.ts +5 -5
- package/src/dom/types/Shaders.ts +1 -1
- package/src/mock/index.ts +1 -0
- package/src/skia/core/Image.ts +43 -1
- package/src/skia/types/Image/ImageFactory.ts +8 -0
- package/src/skia/types/SVG/SVG.ts +4 -1
- package/src/skia/web/JsiSkImageFactory.ts +8 -1
package/android/build.gradle
CHANGED
|
@@ -8,7 +8,51 @@
|
|
|
8
8
|
#include "SkRefCnt.h"
|
|
9
9
|
#include "SkStream.h"
|
|
10
10
|
#include "SkTypes.h"
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
#include <android/bitmap.h>
|
|
13
|
+
|
|
14
|
+
#pragma clang diagnostic push
|
|
15
|
+
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
16
|
+
|
|
17
|
+
#include "SkBitmap.h"
|
|
18
|
+
#include "SkPixmap.h"
|
|
19
|
+
|
|
20
|
+
#pragma clang diagnostic pop
|
|
21
|
+
|
|
22
|
+
static SkAlphaType alpha_type(int32_t flags) {
|
|
23
|
+
switch ((flags >> ANDROID_BITMAP_FLAGS_ALPHA_SHIFT) &
|
|
24
|
+
ANDROID_BITMAP_FLAGS_ALPHA_MASK) {
|
|
25
|
+
case ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE:
|
|
26
|
+
return kOpaque_SkAlphaType;
|
|
27
|
+
case ANDROID_BITMAP_FLAGS_ALPHA_PREMUL:
|
|
28
|
+
return kPremul_SkAlphaType;
|
|
29
|
+
case ANDROID_BITMAP_FLAGS_ALPHA_UNPREMUL:
|
|
30
|
+
return kUnpremul_SkAlphaType;
|
|
31
|
+
default:
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return kUnknown_SkAlphaType;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static SkColorType color_type(int32_t format) {
|
|
39
|
+
switch (format) {
|
|
40
|
+
case ANDROID_BITMAP_FORMAT_RGBA_8888:
|
|
41
|
+
return kRGBA_8888_SkColorType;
|
|
42
|
+
case ANDROID_BITMAP_FORMAT_RGB_565:
|
|
43
|
+
return kRGB_565_SkColorType;
|
|
44
|
+
case ANDROID_BITMAP_FORMAT_RGBA_4444:
|
|
45
|
+
return kARGB_4444_SkColorType;
|
|
46
|
+
case ANDROID_BITMAP_FORMAT_RGBA_F16:
|
|
47
|
+
return kRGBA_F16_SkColorType;
|
|
48
|
+
case ANDROID_BITMAP_FORMAT_A_8:
|
|
49
|
+
return kAlpha_8_SkColorType;
|
|
50
|
+
default:
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return kUnknown_SkColorType;
|
|
55
|
+
}
|
|
12
56
|
|
|
13
57
|
namespace RNSkia {
|
|
14
58
|
|
|
@@ -31,6 +75,41 @@ TSelf JniPlatformContext::initHybrid(jni::alias_ref<jhybridobject> jThis,
|
|
|
31
75
|
return makeCxxInstance(jThis, pixelDensity);
|
|
32
76
|
}
|
|
33
77
|
|
|
78
|
+
sk_sp<SkImage> JniPlatformContext::takeScreenshotFromViewTag(size_t tag) {
|
|
79
|
+
// Call the java method for creating a view screenshot as a bitmap:
|
|
80
|
+
auto env = jni::Environment::current();
|
|
81
|
+
static auto method = javaPart_->getClass()->getMethod<jobject(int)>(
|
|
82
|
+
"takeScreenshotFromViewTag");
|
|
83
|
+
|
|
84
|
+
auto bitmap = method(javaPart_.get(), tag).release();
|
|
85
|
+
|
|
86
|
+
// Let's convert to a native bitmap and get some info about the bitmap
|
|
87
|
+
AndroidBitmapInfo bmi;
|
|
88
|
+
AndroidBitmap_getInfo(env, bitmap, &bmi);
|
|
89
|
+
|
|
90
|
+
// Convert android bitmap info to a Skia bitmap info
|
|
91
|
+
auto colorType = color_type(bmi.format);
|
|
92
|
+
auto alphaType = alpha_type(bmi.flags);
|
|
93
|
+
|
|
94
|
+
auto skInfo = SkImageInfo::Make(SkISize::Make(bmi.width, bmi.height),
|
|
95
|
+
colorType, alphaType);
|
|
96
|
+
|
|
97
|
+
// Lock pixels
|
|
98
|
+
void *pixels;
|
|
99
|
+
AndroidBitmap_lockPixels(env, bitmap, &pixels);
|
|
100
|
+
|
|
101
|
+
// Create pixmap from pixels and make a copy of it so that
|
|
102
|
+
// the SkImage owns its own pixels
|
|
103
|
+
SkPixmap pm(skInfo, pixels, bmi.stride);
|
|
104
|
+
auto skImage = SkImage::MakeRasterCopy(pm);
|
|
105
|
+
|
|
106
|
+
// Unlock pixels
|
|
107
|
+
AndroidBitmap_unlockPixels(env, bitmap);
|
|
108
|
+
|
|
109
|
+
// Return our newly created SkImage!
|
|
110
|
+
return skImage;
|
|
111
|
+
}
|
|
112
|
+
|
|
34
113
|
void JniPlatformContext::startDrawLoop() {
|
|
35
114
|
jni::ThreadScope ts;
|
|
36
115
|
// Start drawing loop
|
|
@@ -52,7 +131,19 @@ void JniPlatformContext::notifyDrawLoopExternal() {
|
|
|
52
131
|
_onNotifyDrawLoop();
|
|
53
132
|
}
|
|
54
133
|
|
|
134
|
+
void JniPlatformContext::runTaskOnMainThread(std::function<void()> task) {
|
|
135
|
+
_taskMutex->lock();
|
|
136
|
+
_taskCallbacks.push(task);
|
|
137
|
+
_taskMutex->unlock();
|
|
138
|
+
|
|
139
|
+
// Notify Java that task is ready
|
|
140
|
+
static auto method = javaPart_->getClass()->getMethod<void(void)>(
|
|
141
|
+
"notifyTaskReadyOnMainThread");
|
|
142
|
+
method(javaPart_.get());
|
|
143
|
+
}
|
|
144
|
+
|
|
55
145
|
void JniPlatformContext::notifyTaskReadyExternal() {
|
|
146
|
+
jni::ThreadScope ts;
|
|
56
147
|
_taskMutex->lock();
|
|
57
148
|
auto task = _taskCallbacks.front();
|
|
58
149
|
if (task != nullptr) {
|
|
@@ -67,8 +158,6 @@ void JniPlatformContext::notifyTaskReadyExternal() {
|
|
|
67
158
|
void JniPlatformContext::performStreamOperation(
|
|
68
159
|
const std::string &sourceUri,
|
|
69
160
|
const std::function<void(std::unique_ptr<SkStreamAsset>)> &op) {
|
|
70
|
-
auto measure = RNSkMeasureTime("JniPlatformContext::performStreamOperation");
|
|
71
|
-
|
|
72
161
|
static auto method = javaPart_->getClass()->getMethod<jbyteArray(jstring)>(
|
|
73
162
|
"getJniStreamFromSource");
|
|
74
163
|
|
|
@@ -44,8 +44,12 @@ public:
|
|
|
44
44
|
|
|
45
45
|
void notifyTaskReadyExternal();
|
|
46
46
|
|
|
47
|
+
void runTaskOnMainThread(std::function<void()> task);
|
|
48
|
+
|
|
47
49
|
float getPixelDensity() { return _pixelDensity; }
|
|
48
50
|
|
|
51
|
+
sk_sp<SkImage> takeScreenshotFromViewTag(size_t tag);
|
|
52
|
+
|
|
49
53
|
void setOnNotifyDrawLoop(const std::function<void(void)> &callback) {
|
|
50
54
|
_onNotifyDrawLoop = callback;
|
|
51
55
|
}
|
|
@@ -41,6 +41,14 @@ public:
|
|
|
41
41
|
return MakeOffscreenGLSurface(width, height);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
void runOnMainThread(std::function<void()> task) override {
|
|
45
|
+
_jniPlatformContext->runTaskOnMainThread(task);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
sk_sp<SkImage> takeScreenshotFromViewTag(size_t tag) override {
|
|
49
|
+
return _jniPlatformContext->takeScreenshotFromViewTag(tag);
|
|
50
|
+
}
|
|
51
|
+
|
|
44
52
|
void startDrawLoop() override { _jniPlatformContext->startDrawLoop(); }
|
|
45
53
|
|
|
46
54
|
void stopDrawLoop() override { _jniPlatformContext->stopDrawLoop(); }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.shopify.reactnative.skia;
|
|
2
2
|
|
|
3
3
|
import android.app.Application;
|
|
4
|
+
import android.graphics.Bitmap;
|
|
4
5
|
import android.os.Handler;
|
|
5
6
|
import android.os.Looper;
|
|
6
7
|
import android.util.Log;
|
|
@@ -53,7 +54,7 @@ public class PlatformContext {
|
|
|
53
54
|
Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() {
|
|
54
55
|
@Override
|
|
55
56
|
public void doFrame(long frameTimeNanos) {
|
|
56
|
-
if(_isPaused) {
|
|
57
|
+
if (_isPaused) {
|
|
57
58
|
return;
|
|
58
59
|
}
|
|
59
60
|
notifyDrawLoop();
|
|
@@ -65,6 +66,21 @@ public class PlatformContext {
|
|
|
65
66
|
Choreographer.getInstance().postFrameCallback(frameCallback);
|
|
66
67
|
}
|
|
67
68
|
|
|
69
|
+
@DoNotStrip
|
|
70
|
+
public void notifyTaskReadyOnMainThread() {
|
|
71
|
+
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
|
72
|
+
@Override
|
|
73
|
+
public void run() {
|
|
74
|
+
notifyTaskReady();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@DoNotStrip
|
|
80
|
+
Object takeScreenshotFromViewTag(int tag) {
|
|
81
|
+
return ViewScreenshotService.makeViewScreenshotFromTag(mContext, tag);
|
|
82
|
+
}
|
|
83
|
+
|
|
68
84
|
@DoNotStrip
|
|
69
85
|
public void raise(final String message) {
|
|
70
86
|
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
package com.shopify.reactnative.skia;
|
|
2
|
+
|
|
3
|
+
import static android.view.View.VISIBLE;
|
|
4
|
+
|
|
5
|
+
import android.graphics.Bitmap;
|
|
6
|
+
import android.graphics.Canvas;
|
|
7
|
+
import android.graphics.Matrix;
|
|
8
|
+
import android.graphics.Paint;
|
|
9
|
+
import android.os.Build;
|
|
10
|
+
import android.os.Handler;
|
|
11
|
+
import android.os.Looper;
|
|
12
|
+
import android.util.Log;
|
|
13
|
+
import android.view.PixelCopy;
|
|
14
|
+
import android.view.SurfaceView;
|
|
15
|
+
import android.view.TextureView;
|
|
16
|
+
import android.view.View;
|
|
17
|
+
import android.view.ViewGroup;
|
|
18
|
+
|
|
19
|
+
import androidx.annotation.NonNull;
|
|
20
|
+
|
|
21
|
+
import com.facebook.react.bridge.ReactContext;
|
|
22
|
+
import com.facebook.react.uimanager.UIManagerModule;
|
|
23
|
+
|
|
24
|
+
import java.util.ArrayList;
|
|
25
|
+
import java.util.Collections;
|
|
26
|
+
import java.util.LinkedList;
|
|
27
|
+
import java.util.List;
|
|
28
|
+
import java.util.concurrent.CountDownLatch;
|
|
29
|
+
import java.util.concurrent.TimeUnit;
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
public class ViewScreenshotService {
|
|
33
|
+
private static final long SURFACE_VIEW_READ_PIXELS_TIMEOUT = 5;
|
|
34
|
+
private static final String TAG = "SkiaScreenshot";
|
|
35
|
+
|
|
36
|
+
public static Bitmap makeViewScreenshotFromTag(ReactContext context, int tag) {
|
|
37
|
+
UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class);
|
|
38
|
+
View view = uiManager.resolveView(tag);
|
|
39
|
+
if (view == null) {
|
|
40
|
+
throw new RuntimeException("Could not resolve view from view tag " + tag);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Measure and get size of view
|
|
44
|
+
int width = view.getWidth();
|
|
45
|
+
int height = view.getHeight();
|
|
46
|
+
|
|
47
|
+
if (width <= 0 || height <= 0) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The following code is taken from react-native-view-shot to be able to handle and
|
|
52
|
+
// correctly render all kinds of views, also including TextureViews and SurfaceViews
|
|
53
|
+
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
54
|
+
|
|
55
|
+
final Paint paint = new Paint();
|
|
56
|
+
paint.setAntiAlias(true);
|
|
57
|
+
paint.setFilterBitmap(true);
|
|
58
|
+
paint.setDither(true);
|
|
59
|
+
|
|
60
|
+
// Render the main view and its children
|
|
61
|
+
final Canvas c = new Canvas(bitmap);
|
|
62
|
+
view.draw(c);
|
|
63
|
+
|
|
64
|
+
// Enumerate children
|
|
65
|
+
final List<View> childrenList = getAllChildren(view);
|
|
66
|
+
|
|
67
|
+
for (final View child : childrenList) {
|
|
68
|
+
// skip any child that we don't know how to process
|
|
69
|
+
if (child instanceof TextureView) {
|
|
70
|
+
// skip all invisible to user child views
|
|
71
|
+
if (child.getVisibility() != VISIBLE) continue;
|
|
72
|
+
|
|
73
|
+
final TextureView tvChild = (TextureView) child;
|
|
74
|
+
tvChild.setOpaque(false); // <-- switch off background fill
|
|
75
|
+
|
|
76
|
+
// TextureView should use bitmaps with matching size,
|
|
77
|
+
// otherwise content of the TextureView will be scaled to provided bitmap dimensions
|
|
78
|
+
final Bitmap childBitmapBuffer = tvChild.getBitmap(Bitmap.createBitmap(child.getWidth(), child.getHeight(), Bitmap.Config.ARGB_8888));
|
|
79
|
+
|
|
80
|
+
final int countCanvasSave = c.save();
|
|
81
|
+
applyTransformations(c, view, child);
|
|
82
|
+
|
|
83
|
+
// due to re-use of bitmaps for screenshot, we can get bitmap that is bigger in size than requested
|
|
84
|
+
c.drawBitmap(childBitmapBuffer, 0, 0, paint);
|
|
85
|
+
|
|
86
|
+
c.restoreToCount(countCanvasSave);
|
|
87
|
+
} else if (child instanceof SurfaceView) {
|
|
88
|
+
final SurfaceView svChild = (SurfaceView)child;
|
|
89
|
+
final CountDownLatch latch = new CountDownLatch(1);
|
|
90
|
+
|
|
91
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
92
|
+
final Bitmap childBitmapBuffer = Bitmap.createBitmap(child.getWidth(), child.getHeight(), Bitmap.Config.ARGB_8888);
|
|
93
|
+
try {
|
|
94
|
+
PixelCopy.request(svChild, childBitmapBuffer, new PixelCopy.OnPixelCopyFinishedListener() {
|
|
95
|
+
@Override
|
|
96
|
+
public void onPixelCopyFinished(int copyResult) {
|
|
97
|
+
final int countCanvasSave = c.save();
|
|
98
|
+
applyTransformations(c, view, child);
|
|
99
|
+
c.drawBitmap(childBitmapBuffer, 0, 0, paint);
|
|
100
|
+
c.restoreToCount(countCanvasSave);
|
|
101
|
+
latch.countDown();
|
|
102
|
+
}
|
|
103
|
+
}, new Handler(Looper.getMainLooper()));
|
|
104
|
+
latch.await(SURFACE_VIEW_READ_PIXELS_TIMEOUT, TimeUnit.SECONDS);
|
|
105
|
+
} catch (Exception e) {
|
|
106
|
+
Log.e(TAG, "Cannot PixelCopy for " + svChild, e);
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
Bitmap cache = svChild.getDrawingCache();
|
|
110
|
+
if (cache != null) {
|
|
111
|
+
c.drawBitmap(svChild.getDrawingCache(), 0, 0, paint);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return bitmap;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private static List<View> getAllChildren(@NonNull final View v) {
|
|
121
|
+
if (!(v instanceof ViewGroup)) {
|
|
122
|
+
final ArrayList<View> viewArrayList = new ArrayList<>();
|
|
123
|
+
viewArrayList.add(v);
|
|
124
|
+
|
|
125
|
+
return viewArrayList;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
final ArrayList<View> result = new ArrayList<>();
|
|
129
|
+
|
|
130
|
+
ViewGroup viewGroup = (ViewGroup) v;
|
|
131
|
+
for (int i = 0; i < viewGroup.getChildCount(); i++) {
|
|
132
|
+
View child = viewGroup.getChildAt(i);
|
|
133
|
+
|
|
134
|
+
//Do not add any parents, just add child elements
|
|
135
|
+
result.addAll(getAllChildren(child));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Concat all the transformation matrix's from parent to child.
|
|
143
|
+
*/
|
|
144
|
+
@NonNull
|
|
145
|
+
@SuppressWarnings("UnusedReturnValue")
|
|
146
|
+
private static Matrix applyTransformations(final Canvas c, @NonNull final View root, @NonNull final View child) {
|
|
147
|
+
final Matrix transform = new Matrix();
|
|
148
|
+
final LinkedList<View> ms = new LinkedList<>();
|
|
149
|
+
|
|
150
|
+
// find all parents of the child view
|
|
151
|
+
View iterator = child;
|
|
152
|
+
do {
|
|
153
|
+
ms.add(iterator);
|
|
154
|
+
|
|
155
|
+
iterator = (View) iterator.getParent();
|
|
156
|
+
} while (iterator != root);
|
|
157
|
+
|
|
158
|
+
// apply transformations from parent --> child order
|
|
159
|
+
Collections.reverse(ms);
|
|
160
|
+
|
|
161
|
+
for (final View v : ms) {
|
|
162
|
+
c.save();
|
|
163
|
+
|
|
164
|
+
// apply each view transformations, so each child will be affected by them
|
|
165
|
+
final float dx = v.getLeft() + ((v != child) ? v.getPaddingLeft() : 0) + v.getTranslationX();
|
|
166
|
+
final float dy = v.getTop() + ((v != child) ? v.getPaddingTop() : 0) + v.getTranslationY();
|
|
167
|
+
c.translate(dx, dy);
|
|
168
|
+
c.rotate(v.getRotation(), v.getPivotX(), v.getPivotY());
|
|
169
|
+
c.scale(v.getScaleX(), v.getScaleY());
|
|
170
|
+
|
|
171
|
+
// compute the matrix just for any future use
|
|
172
|
+
transform.postTranslate(dx, dy);
|
|
173
|
+
transform.postRotate(v.getRotation(), v.getPivotX(), v.getPivotY());
|
|
174
|
+
transform.postScale(v.getScaleX(), v.getScaleY());
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return transform;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
}
|
package/cpp/api/JsiSkFont.h
CHANGED
package/cpp/api/JsiSkImage.h
CHANGED
|
@@ -38,7 +38,36 @@ public:
|
|
|
38
38
|
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
JSI_HOST_FUNCTION(MakeImageFromViewTag) {
|
|
42
|
+
auto viewTag = arguments[0].asNumber();
|
|
43
|
+
auto context = getContext();
|
|
44
|
+
return react::createPromiseAsJSIValue(
|
|
45
|
+
runtime,
|
|
46
|
+
[context = std::move(context),
|
|
47
|
+
viewTag](jsi::Runtime &runtime,
|
|
48
|
+
std::shared_ptr<react::Promise> promise) -> void {
|
|
49
|
+
// Create a stream operation - this will be run on the main thread
|
|
50
|
+
context->makeViewScreenshot(
|
|
51
|
+
viewTag, [&runtime, context = std::move(context),
|
|
52
|
+
promise = std::move(promise)](sk_sp<SkImage> image) {
|
|
53
|
+
context->runOnJavascriptThread([&runtime,
|
|
54
|
+
context = std::move(context),
|
|
55
|
+
promise = std::move(promise),
|
|
56
|
+
result = std::move(image)]() {
|
|
57
|
+
if (result == nullptr) {
|
|
58
|
+
promise->reject("Failed to create image from view tag");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
promise->resolve(jsi::Object::createFromHostObject(
|
|
62
|
+
runtime, std::make_shared<JsiSkImage>(
|
|
63
|
+
std::move(context), std::move(result))));
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
41
69
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromEncoded),
|
|
70
|
+
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromViewTag),
|
|
42
71
|
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImage), )
|
|
43
72
|
|
|
44
73
|
explicit JsiSkImageFactory(std::shared_ptr<RNSkPlatformContext> context)
|
package/cpp/api/JsiSkPaint.h
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
#include <jsi/jsi.h>
|
|
7
7
|
|
|
8
|
-
#include
|
|
9
|
-
#include
|
|
10
|
-
#include
|
|
11
|
-
#include
|
|
12
|
-
#include
|
|
13
|
-
#include
|
|
14
|
-
#include
|
|
8
|
+
#include "JsiSkColor.h"
|
|
9
|
+
#include "JsiSkColorFilter.h"
|
|
10
|
+
#include "JsiSkHostObjects.h"
|
|
11
|
+
#include "JsiSkImageFilter.h"
|
|
12
|
+
#include "JsiSkMaskFilter.h"
|
|
13
|
+
#include "JsiSkPathEffect.h"
|
|
14
|
+
#include "JsiSkShader.h"
|
|
15
15
|
|
|
16
16
|
#pragma clang diagnostic push
|
|
17
17
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
package/cpp/api/JsiSkPicture.h
CHANGED
package/cpp/api/JsiSkSVG.h
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
#include <jsi/jsi.h>
|
|
7
7
|
|
|
8
|
-
#include
|
|
8
|
+
#include "JsiSkHostObjects.h"
|
|
9
9
|
|
|
10
10
|
#pragma clang diagnostic push
|
|
11
11
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
@@ -28,6 +28,14 @@ public:
|
|
|
28
28
|
return jsi::String::createFromUtf8(runtime, "SVG");
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
JSI_HOST_FUNCTION(width) {
|
|
32
|
+
return static_cast<double>(getObject()->containerSize().width());
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
JSI_HOST_FUNCTION(height) {
|
|
36
|
+
return static_cast<double>(getObject()->containerSize().height());
|
|
37
|
+
}
|
|
38
|
+
|
|
31
39
|
JSI_EXPORT_PROPERTY_GETTERS(JSI_EXPORT_PROP_GET(JsiSkSVG, __typename__))
|
|
32
40
|
|
|
33
41
|
JSI_HOST_FUNCTION(dispose) {
|
|
@@ -35,7 +43,9 @@ public:
|
|
|
35
43
|
return jsi::Value::undefined();
|
|
36
44
|
}
|
|
37
45
|
|
|
38
|
-
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkSVG,
|
|
46
|
+
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkSVG, width),
|
|
47
|
+
JSI_EXPORT_FUNC(JsiSkSVG, height),
|
|
48
|
+
JSI_EXPORT_FUNC(JsiSkSVG, dispose))
|
|
39
49
|
|
|
40
50
|
/**
|
|
41
51
|
Returns the underlying object from a host object of this type
|
package/cpp/api/JsiSkShader.h
CHANGED
package/cpp/api/JsiSkSurface.h
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
#include "JsiSkHostObjects.h"
|
|
9
9
|
|
|
10
|
-
#include
|
|
11
|
-
#include
|
|
12
|
-
#include
|
|
10
|
+
#include "JsiSkCanvas.h"
|
|
11
|
+
#include "JsiSkImage.h"
|
|
12
|
+
#include "JsiSkSurfaceFactory.h"
|
|
13
13
|
|
|
14
14
|
#pragma clang diagnostic push
|
|
15
15
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
package/cpp/api/JsiSkTypeface.h
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
#include <array>
|
|
4
4
|
#include <memory>
|
|
5
5
|
|
|
6
|
-
#include
|
|
7
|
-
#include
|
|
8
|
-
#include
|
|
6
|
+
#include "JsiHostObject.h"
|
|
7
|
+
#include "RNSkClockValue.h"
|
|
8
|
+
#include "RNSkPlatformContext.h"
|
|
9
9
|
#include <jsi/jsi.h>
|
|
10
10
|
|
|
11
11
|
namespace RNSkia {
|
package/cpp/rnskia/RNSkDomView.h
CHANGED
|
@@ -9,21 +9,21 @@
|
|
|
9
9
|
|
|
10
10
|
#include <jsi/jsi.h>
|
|
11
11
|
|
|
12
|
-
#include
|
|
13
|
-
#include
|
|
12
|
+
#include "JsiValueWrapper.h"
|
|
13
|
+
#include "RNSkView.h"
|
|
14
14
|
|
|
15
15
|
#include "JsiDomRenderNode.h"
|
|
16
|
-
#include
|
|
17
|
-
#include
|
|
18
|
-
#include
|
|
19
|
-
#include
|
|
16
|
+
#include "RNSkInfoParameter.h"
|
|
17
|
+
#include "RNSkLog.h"
|
|
18
|
+
#include "RNSkPlatformContext.h"
|
|
19
|
+
#include "RNSkTimingInfo.h"
|
|
20
20
|
|
|
21
21
|
#pragma clang diagnostic push
|
|
22
22
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
23
23
|
|
|
24
|
-
#include
|
|
25
|
-
#include
|
|
26
|
-
#include
|
|
24
|
+
#include "SkBBHFactory.h"
|
|
25
|
+
#include "SkCanvas.h"
|
|
26
|
+
#include "SkPictureRecorder.h"
|
|
27
27
|
|
|
28
28
|
#pragma clang diagnostic pop
|
|
29
29
|
|
package/cpp/rnskia/RNSkJsView.h
CHANGED
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
|
|
10
10
|
#include <jsi/jsi.h>
|
|
11
11
|
|
|
12
|
-
#include
|
|
13
|
-
#include
|
|
14
|
-
|
|
15
|
-
#include
|
|
16
|
-
#include
|
|
17
|
-
#include
|
|
18
|
-
#include
|
|
19
|
-
#include
|
|
12
|
+
#include "JsiValueWrapper.h"
|
|
13
|
+
#include "RNSkView.h"
|
|
14
|
+
|
|
15
|
+
#include "JsiSkCanvas.h"
|
|
16
|
+
#include "RNSkInfoParameter.h"
|
|
17
|
+
#include "RNSkLog.h"
|
|
18
|
+
#include "RNSkPlatformContext.h"
|
|
19
|
+
#include "RNSkTimingInfo.h"
|
|
20
20
|
|
|
21
21
|
#pragma clang diagnostic push
|
|
22
22
|
#pragma clang diagnostic ignored "-Wdocumentation"
|