@shopify/react-native-skia 1.2.1 → 1.2.3
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/rnskia-android/SkiaOpenGLSurfaceFactory.cpp +34 -14
- package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +2 -1
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +13 -8
- package/cpp/api/JsiSkImageFactory.h +3 -3
- package/cpp/rnskia/RNSkPlatformContext.h +3 -3
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +2 -6
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.h +42 -7
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +178 -5
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +10 -13
- package/lib/commonjs/external/ModuleProxy.d.ts +10 -0
- package/lib/commonjs/external/ModuleProxy.js +36 -0
- package/lib/commonjs/external/ModuleProxy.js.map +1 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.js +18 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.js.map +1 -0
- package/lib/commonjs/external/reanimated/buffers.js +9 -6
- package/lib/commonjs/external/reanimated/buffers.js.map +1 -1
- package/lib/commonjs/external/reanimated/interpolators.js +8 -7
- package/lib/commonjs/external/reanimated/interpolators.js.map +1 -1
- package/lib/commonjs/external/reanimated/renderHelpers.js +27 -11
- package/lib/commonjs/external/reanimated/renderHelpers.js.map +1 -1
- package/lib/commonjs/external/reanimated/textures.js +4 -3
- package/lib/commonjs/external/reanimated/textures.js.map +1 -1
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.js +6 -6
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/commonjs/external/reanimated/useDerivedValueOnJS.js +6 -5
- package/lib/commonjs/external/reanimated/useDerivedValueOnJS.js.map +1 -1
- package/lib/commonjs/renderer/Offscreen.js +1 -5
- package/lib/commonjs/renderer/Offscreen.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.js +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.js.map +1 -1
- package/lib/commonjs/specs/NativeSkiaModule.web.d.ts +0 -2
- package/lib/commonjs/specs/NativeSkiaModule.web.js +0 -8
- package/lib/commonjs/specs/NativeSkiaModule.web.js.map +1 -1
- package/lib/module/external/ModuleProxy.d.ts +10 -0
- package/lib/module/external/ModuleProxy.js +28 -0
- package/lib/module/external/ModuleProxy.js.map +1 -0
- package/lib/module/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/module/external/reanimated/ReanimatedProxy.js +12 -0
- package/lib/module/external/reanimated/ReanimatedProxy.js.map +1 -0
- package/lib/module/external/reanimated/buffers.js +8 -6
- package/lib/module/external/reanimated/buffers.js.map +1 -1
- package/lib/module/external/reanimated/interpolators.js +7 -7
- package/lib/module/external/reanimated/interpolators.js.map +1 -1
- package/lib/module/external/reanimated/renderHelpers.js +26 -11
- package/lib/module/external/reanimated/renderHelpers.js.map +1 -1
- package/lib/module/external/reanimated/textures.js +3 -3
- package/lib/module/external/reanimated/textures.js.map +1 -1
- package/lib/module/external/reanimated/useAnimatedImageValue.js +5 -6
- package/lib/module/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/module/external/reanimated/useDerivedValueOnJS.js +5 -5
- package/lib/module/external/reanimated/useDerivedValueOnJS.js.map +1 -1
- package/lib/module/renderer/Offscreen.js +1 -5
- package/lib/module/renderer/Offscreen.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.js +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.js.map +1 -1
- package/lib/module/specs/NativeSkiaModule.web.d.ts +0 -2
- package/lib/module/specs/NativeSkiaModule.web.js +0 -3
- package/lib/module/specs/NativeSkiaModule.web.js.map +1 -1
- package/lib/typescript/src/external/ModuleProxy.d.ts +10 -0
- package/lib/typescript/src/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/typescript/src/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/typescript/src/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/typescript/src/specs/NativeSkiaModule.web.d.ts +0 -2
- package/libs/ios/libskia.xcframework/Info.plist +5 -5
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
- package/libs/ios/libskottie.xcframework/Info.plist +5 -5
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
- package/package.json +1 -1
- package/src/external/ModuleProxy.ts +30 -0
- package/src/external/reanimated/ReanimatedProxy.ts +18 -0
- package/src/external/reanimated/buffers.ts +7 -6
- package/src/external/reanimated/interpolators.ts +7 -12
- package/src/external/reanimated/renderHelpers.ts +31 -18
- package/src/external/reanimated/textures.tsx +3 -3
- package/src/external/reanimated/useAnimatedImageValue.ts +5 -10
- package/src/external/reanimated/useDerivedValueOnJS.ts +5 -10
- package/src/renderer/Offscreen.tsx +1 -7
- package/src/skia/types/Image/ImageFactory.ts +3 -3
- package/src/skia/types/NativeBuffer/NativeBufferFactory.ts +3 -3
- package/src/skia/web/JsiSkNativeBufferFactory.ts +1 -1
- package/src/specs/NativeSkiaModule.web.ts +0 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerDelegate.java +0 -34
- package/cpp/skia/include/gpu/GrBackendDrawableInfo.h +0 -9
- package/lib/commonjs/external/reanimated/moduleWrapper.d.ts +0 -15
- package/lib/commonjs/external/reanimated/moduleWrapper.js +0 -46
- package/lib/commonjs/external/reanimated/moduleWrapper.js.map +0 -1
- package/lib/module/external/reanimated/moduleWrapper.d.ts +0 -15
- package/lib/module/external/reanimated/moduleWrapper.js +0 -37
- package/lib/module/external/reanimated/moduleWrapper.js.map +0 -1
- package/lib/typescript/src/external/reanimated/moduleWrapper.d.ts +0 -15
- package/src/external/reanimated/moduleWrapper.ts +0 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Host","JsiSkNativeBufferFactory","constructor","CanvasKit","MakeFromImage","image","info","getImageInfo","uint8ClampedArray","Uint8ClampedArray","readPixels","imageData","ImageData","width","height","canvas","OffscreenCanvas","ctx","getContext","Error","putImageData","Release","
|
|
1
|
+
{"version":3,"names":["Host","JsiSkNativeBufferFactory","constructor","CanvasKit","MakeFromImage","image","info","getImageInfo","uint8ClampedArray","Uint8ClampedArray","readPixels","imageData","ImageData","width","height","canvas","OffscreenCanvas","ctx","getContext","Error","putImageData","Release","_nativeBuffer"],"sources":["JsiSkNativeBufferFactory.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport {\n type NativeBuffer,\n type NativeBufferFactory,\n type SkImage,\n} from \"../types\";\n\nimport { Host } from \"./Host\";\n\nexport class JsiSkNativeBufferFactory\n extends Host\n implements NativeBufferFactory\n{\n constructor(CanvasKit: CanvasKit) {\n super(CanvasKit);\n }\n\n MakeFromImage(image: SkImage): NativeBuffer {\n const info = image.getImageInfo();\n const uint8ClampedArray = new Uint8ClampedArray(image.readPixels()!);\n const imageData = new ImageData(uint8ClampedArray, info.width, info.height);\n const canvas = new OffscreenCanvas(info.width, info.height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2d context from canvas\");\n }\n ctx.putImageData(imageData, 0, 0);\n return canvas;\n }\n\n Release(_nativeBuffer: NativeBuffer) {\n // it's a noop on Web\n }\n}\n"],"mappings":"AAQA,SAASA,IAAI,QAAQ,QAAQ;AAE7B,OAAO,MAAMC,wBAAwB,SAC3BD,IAAI,CAEd;EACEE,WAAWA,CAACC,SAAoB,EAAE;IAChC,KAAK,CAACA,SAAS,CAAC;EAClB;EAEAC,aAAaA,CAACC,KAAc,EAAgB;IAC1C,MAAMC,IAAI,GAAGD,KAAK,CAACE,YAAY,CAAC,CAAC;IACjC,MAAMC,iBAAiB,GAAG,IAAIC,iBAAiB,CAACJ,KAAK,CAACK,UAAU,CAAC,CAAE,CAAC;IACpE,MAAMC,SAAS,GAAG,IAAIC,SAAS,CAACJ,iBAAiB,EAAEF,IAAI,CAACO,KAAK,EAAEP,IAAI,CAACQ,MAAM,CAAC;IAC3E,MAAMC,MAAM,GAAG,IAAIC,eAAe,CAACV,IAAI,CAACO,KAAK,EAAEP,IAAI,CAACQ,MAAM,CAAC;IAC3D,MAAMG,GAAG,GAAGF,MAAM,CAACG,UAAU,CAAC,IAAI,CAAC;IACnC,IAAI,CAACD,GAAG,EAAE;MACR,MAAM,IAAIE,KAAK,CAAC,sCAAsC,CAAC;IACzD;IACAF,GAAG,CAACG,YAAY,CAACT,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACjC,OAAOI,MAAM;EACf;EAEAM,OAAOA,CAACC,aAA2B,EAAE;IACnC;EAAA;AAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["NativeSkiaModule.web.ts"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type ImportType = ReturnType<typeof require>;
|
|
2
|
+
/**
|
|
3
|
+
* Create a lazily-imported module proxy.
|
|
4
|
+
* This is useful for lazily requiring optional dependencies.
|
|
5
|
+
*/
|
|
6
|
+
export declare const createModuleProxy: <TModule>(getModule: () => ImportType) => TModule;
|
|
7
|
+
export declare class OptionalDependencyNotInstalledError extends Error {
|
|
8
|
+
constructor(name: string);
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
@@ -46,7 +46,7 @@ export interface ImageFactory {
|
|
|
46
46
|
MakeImageFromEncoded: (encoded: SkData) => SkImage | null;
|
|
47
47
|
/**
|
|
48
48
|
* Return an Image backed by a given native buffer.
|
|
49
|
-
* The
|
|
49
|
+
* The native buffer must be a valid owning reference.
|
|
50
50
|
*
|
|
51
51
|
* For instance, this API is used by
|
|
52
52
|
* [react-native-vision-camera](https://github.com/mrousavy/react-native-vision-camera)
|
|
@@ -54,9 +54,9 @@ export interface ImageFactory {
|
|
|
54
54
|
*
|
|
55
55
|
* - On Android; This is an `AHardwareBuffer*`
|
|
56
56
|
* - On iOS, this is a `CVPixelBufferRef`
|
|
57
|
-
* @param nativeBuffer A strong `uintptr_t` pointer to the native
|
|
57
|
+
* @param nativeBuffer A strong `uintptr_t` pointer to the native buffer
|
|
58
58
|
* @throws Throws an error if the Image could not be created, for example when the given
|
|
59
|
-
*
|
|
59
|
+
* native buffer is invalid.
|
|
60
60
|
*/
|
|
61
61
|
MakeImageFromNativeBuffer: (nativeBuffer: NativeBuffer) => SkImage;
|
|
62
62
|
/**
|
|
@@ -8,11 +8,11 @@ export declare const isNativeBufferWeb: (buffer: NativeBuffer) => buffer is Canv
|
|
|
8
8
|
export declare const isNativeBufferNode: (buffer: NativeBuffer) => buffer is ArrayBuffer;
|
|
9
9
|
export interface NativeBufferFactory {
|
|
10
10
|
/**
|
|
11
|
-
* Copy pixels to a
|
|
11
|
+
* Copy pixels to a native buffer.
|
|
12
12
|
*/
|
|
13
13
|
MakeFromImage: (image: SkImage) => NativeBuffer;
|
|
14
14
|
/**
|
|
15
|
-
* Release a
|
|
15
|
+
* Release a native buffer that was created with `MakeFromImage`.
|
|
16
16
|
*/
|
|
17
|
-
Release: (
|
|
17
|
+
Release: (nativeBuffer: NativeBuffer) => void;
|
|
18
18
|
}
|
|
@@ -4,5 +4,5 @@ import { Host } from "./Host";
|
|
|
4
4
|
export declare class JsiSkNativeBufferFactory extends Host implements NativeBufferFactory {
|
|
5
5
|
constructor(CanvasKit: CanvasKit);
|
|
6
6
|
MakeFromImage(image: SkImage): NativeBuffer;
|
|
7
|
-
Release(
|
|
7
|
+
Release(_nativeBuffer: NativeBuffer): void;
|
|
8
8
|
}
|
|
@@ -6,32 +6,32 @@
|
|
|
6
6
|
<array>
|
|
7
7
|
<dict>
|
|
8
8
|
<key>LibraryIdentifier</key>
|
|
9
|
-
<string>ios-
|
|
9
|
+
<string>ios-arm64_arm64e_x86_64-simulator</string>
|
|
10
10
|
<key>LibraryPath</key>
|
|
11
11
|
<string>libskia.a</string>
|
|
12
12
|
<key>SupportedArchitectures</key>
|
|
13
13
|
<array>
|
|
14
14
|
<string>arm64</string>
|
|
15
15
|
<string>arm64e</string>
|
|
16
|
+
<string>x86_64</string>
|
|
16
17
|
</array>
|
|
17
18
|
<key>SupportedPlatform</key>
|
|
18
19
|
<string>ios</string>
|
|
20
|
+
<key>SupportedPlatformVariant</key>
|
|
21
|
+
<string>simulator</string>
|
|
19
22
|
</dict>
|
|
20
23
|
<dict>
|
|
21
24
|
<key>LibraryIdentifier</key>
|
|
22
|
-
<string>ios-
|
|
25
|
+
<string>ios-arm64_arm64e</string>
|
|
23
26
|
<key>LibraryPath</key>
|
|
24
27
|
<string>libskia.a</string>
|
|
25
28
|
<key>SupportedArchitectures</key>
|
|
26
29
|
<array>
|
|
27
30
|
<string>arm64</string>
|
|
28
31
|
<string>arm64e</string>
|
|
29
|
-
<string>x86_64</string>
|
|
30
32
|
</array>
|
|
31
33
|
<key>SupportedPlatform</key>
|
|
32
34
|
<string>ios</string>
|
|
33
|
-
<key>SupportedPlatformVariant</key>
|
|
34
|
-
<string>simulator</string>
|
|
35
35
|
</dict>
|
|
36
36
|
</array>
|
|
37
37
|
<key>CFBundlePackageType</key>
|
|
Binary file
|
|
Binary file
|
|
@@ -6,32 +6,32 @@
|
|
|
6
6
|
<array>
|
|
7
7
|
<dict>
|
|
8
8
|
<key>LibraryIdentifier</key>
|
|
9
|
-
<string>ios-
|
|
9
|
+
<string>ios-arm64_arm64e</string>
|
|
10
10
|
<key>LibraryPath</key>
|
|
11
11
|
<string>libskottie.a</string>
|
|
12
12
|
<key>SupportedArchitectures</key>
|
|
13
13
|
<array>
|
|
14
14
|
<string>arm64</string>
|
|
15
15
|
<string>arm64e</string>
|
|
16
|
-
<string>x86_64</string>
|
|
17
16
|
</array>
|
|
18
17
|
<key>SupportedPlatform</key>
|
|
19
18
|
<string>ios</string>
|
|
20
|
-
<key>SupportedPlatformVariant</key>
|
|
21
|
-
<string>simulator</string>
|
|
22
19
|
</dict>
|
|
23
20
|
<dict>
|
|
24
21
|
<key>LibraryIdentifier</key>
|
|
25
|
-
<string>ios-
|
|
22
|
+
<string>ios-arm64_arm64e_x86_64-simulator</string>
|
|
26
23
|
<key>LibraryPath</key>
|
|
27
24
|
<string>libskottie.a</string>
|
|
28
25
|
<key>SupportedArchitectures</key>
|
|
29
26
|
<array>
|
|
30
27
|
<string>arm64</string>
|
|
31
28
|
<string>arm64e</string>
|
|
29
|
+
<string>x86_64</string>
|
|
32
30
|
</array>
|
|
33
31
|
<key>SupportedPlatform</key>
|
|
34
32
|
<string>ios</string>
|
|
33
|
+
<key>SupportedPlatformVariant</key>
|
|
34
|
+
<string>simulator</string>
|
|
35
35
|
</dict>
|
|
36
36
|
</array>
|
|
37
37
|
<key>CFBundlePackageType</key>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"setup-skia-web": "./scripts/setup-canvaskit.js"
|
|
8
8
|
},
|
|
9
9
|
"title": "React Native Skia",
|
|
10
|
-
"version": "1.2.
|
|
10
|
+
"version": "1.2.3",
|
|
11
11
|
"description": "High-performance React Native Graphics using Skia",
|
|
12
12
|
"main": "lib/module/index.js",
|
|
13
13
|
"react-native": "src/index.ts",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// https://github.com/mrousavy/react-native-vision-camera/blob/main/package/src/dependencies/ModuleProxy.ts
|
|
2
|
+
type ImportType = ReturnType<typeof require>;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Create a lazily-imported module proxy.
|
|
6
|
+
* This is useful for lazily requiring optional dependencies.
|
|
7
|
+
*/
|
|
8
|
+
export const createModuleProxy = <TModule>(
|
|
9
|
+
getModule: () => ImportType
|
|
10
|
+
): TModule => {
|
|
11
|
+
const holder: { module: TModule | undefined } = { module: undefined };
|
|
12
|
+
|
|
13
|
+
const proxy = new Proxy(holder, {
|
|
14
|
+
get: (target, property) => {
|
|
15
|
+
if (target.module == null) {
|
|
16
|
+
// lazy initialize module via require()
|
|
17
|
+
// caller needs to make sure the require() call is wrapped in a try/catch
|
|
18
|
+
target.module = getModule() as TModule;
|
|
19
|
+
}
|
|
20
|
+
return target.module[property as keyof typeof holder.module];
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
return proxy as unknown as TModule;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export class OptionalDependencyNotInstalledError extends Error {
|
|
27
|
+
constructor(name: string) {
|
|
28
|
+
super(`${name} is not installed!`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type * as ReanimatedT from "react-native-reanimated";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
OptionalDependencyNotInstalledError,
|
|
5
|
+
createModuleProxy,
|
|
6
|
+
} from "../ModuleProxy";
|
|
7
|
+
type TReanimated = typeof ReanimatedT;
|
|
8
|
+
|
|
9
|
+
const Reanimated = createModuleProxy<TReanimated>(() => {
|
|
10
|
+
try {
|
|
11
|
+
return require("react-native-reanimated");
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw new OptionalDependencyNotInstalledError("react-native-reanimated");
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line import/no-default-export
|
|
18
|
+
export default Reanimated;
|
|
@@ -4,17 +4,18 @@ import type { WorkletFunction } from "react-native-reanimated/lib/typescript/rea
|
|
|
4
4
|
import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
|
|
5
5
|
import { Skia } from "../../skia";
|
|
6
6
|
|
|
7
|
-
import { startMapper, stopMapper, makeMutable } from "./moduleWrapper";
|
|
8
7
|
import { notifyChange } from "./interpolators";
|
|
8
|
+
import Rea from "./ReanimatedProxy";
|
|
9
9
|
|
|
10
10
|
type Modifier<T> = (input: T, index: number) => void;
|
|
11
11
|
|
|
12
|
-
const useBufferValue = <T>(size: number, bufferInitializer: () => T) =>
|
|
13
|
-
useMemo(
|
|
14
|
-
() => makeMutable(new Array(size).fill(0).map(bufferInitializer)),
|
|
12
|
+
const useBufferValue = <T>(size: number, bufferInitializer: () => T) => {
|
|
13
|
+
return useMemo(
|
|
14
|
+
() => Rea.makeMutable(new Array(size).fill(0).map(bufferInitializer)),
|
|
15
15
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
16
|
[size]
|
|
17
17
|
);
|
|
18
|
+
};
|
|
18
19
|
|
|
19
20
|
const useBuffer = <T>(
|
|
20
21
|
size: number,
|
|
@@ -24,7 +25,7 @@ const useBuffer = <T>(
|
|
|
24
25
|
const values = useBufferValue(size, bufferInitializer);
|
|
25
26
|
const mod = modifier as WorkletFunction;
|
|
26
27
|
const deps = [size, ...Object.values(mod.__closure ?? {})];
|
|
27
|
-
const mapperId = startMapper(() => {
|
|
28
|
+
const mapperId = Rea.startMapper(() => {
|
|
28
29
|
"worklet";
|
|
29
30
|
values.value.forEach((val, index) => {
|
|
30
31
|
modifier(val, index);
|
|
@@ -34,7 +35,7 @@ const useBuffer = <T>(
|
|
|
34
35
|
|
|
35
36
|
useEffect(() => {
|
|
36
37
|
return () => {
|
|
37
|
-
stopMapper(mapperId);
|
|
38
|
+
Rea.stopMapper(mapperId);
|
|
38
39
|
};
|
|
39
40
|
}, [mapperId]);
|
|
40
41
|
|
|
@@ -10,12 +10,7 @@ import { interpolatePaths, interpolateVector } from "../../animation";
|
|
|
10
10
|
import { Skia } from "../../skia";
|
|
11
11
|
import { isOnMainThread } from "../../renderer/Offscreen";
|
|
12
12
|
|
|
13
|
-
import
|
|
14
|
-
useAnimatedReaction,
|
|
15
|
-
useFrameCallback,
|
|
16
|
-
useSharedValue,
|
|
17
|
-
useDerivedValue,
|
|
18
|
-
} from "./moduleWrapper";
|
|
13
|
+
import Rea from "./ReanimatedProxy";
|
|
19
14
|
|
|
20
15
|
export const notifyChange = (value: SharedValue<unknown>) => {
|
|
21
16
|
"worklet";
|
|
@@ -27,8 +22,8 @@ export const notifyChange = (value: SharedValue<unknown>) => {
|
|
|
27
22
|
|
|
28
23
|
export const usePathValue = (cb: (path: SkPath) => void, init?: SkPath) => {
|
|
29
24
|
const pathInit = useMemo(() => Skia.Path.Make(), []);
|
|
30
|
-
const path = useSharedValue(pathInit);
|
|
31
|
-
useDerivedValue(() => {
|
|
25
|
+
const path = Rea.useSharedValue(pathInit);
|
|
26
|
+
Rea.useDerivedValue(() => {
|
|
32
27
|
path.value.reset();
|
|
33
28
|
if (init !== undefined) {
|
|
34
29
|
path.value.addPath(init);
|
|
@@ -40,7 +35,7 @@ export const usePathValue = (cb: (path: SkPath) => void, init?: SkPath) => {
|
|
|
40
35
|
};
|
|
41
36
|
|
|
42
37
|
export const useClock = () => {
|
|
43
|
-
const clock = useSharedValue(0);
|
|
38
|
+
const clock = Rea.useSharedValue(0);
|
|
44
39
|
const callback = useCallback(
|
|
45
40
|
(info: FrameInfo) => {
|
|
46
41
|
"worklet";
|
|
@@ -48,7 +43,7 @@ export const useClock = () => {
|
|
|
48
43
|
},
|
|
49
44
|
[clock]
|
|
50
45
|
);
|
|
51
|
-
useFrameCallback(callback);
|
|
46
|
+
Rea.useFrameCallback(callback);
|
|
52
47
|
return clock;
|
|
53
48
|
};
|
|
54
49
|
|
|
@@ -73,8 +68,8 @@ const useInterpolator = <T>(
|
|
|
73
68
|
) => {
|
|
74
69
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
75
70
|
const init = useMemo(() => factory(), []);
|
|
76
|
-
const result = useSharedValue(init);
|
|
77
|
-
useAnimatedReaction(
|
|
71
|
+
const result = Rea.useSharedValue(init);
|
|
72
|
+
Rea.useAnimatedReaction(
|
|
78
73
|
() => value.value,
|
|
79
74
|
(val) => {
|
|
80
75
|
result.value = interpolator(val, input, output, options, result.value);
|
|
@@ -4,26 +4,39 @@ import type { Container } from "../../renderer/Container";
|
|
|
4
4
|
import type { AnimatedProps } from "../../renderer/processors";
|
|
5
5
|
import type { Node } from "../../dom/types";
|
|
6
6
|
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
import Rea from "./ReanimatedProxy";
|
|
8
|
+
|
|
9
|
+
let HAS_REANIMATED = false;
|
|
10
|
+
let HAS_REANIMATED_3 = false;
|
|
11
|
+
try {
|
|
12
|
+
require("react-native-reanimated");
|
|
13
|
+
HAS_REANIMATED = true;
|
|
14
|
+
const reanimatedVersion =
|
|
15
|
+
require("react-native-reanimated/package.json").version;
|
|
16
|
+
if (
|
|
17
|
+
reanimatedVersion &&
|
|
18
|
+
(reanimatedVersion >= "3.0.0" || reanimatedVersion.includes("3.0.0-"))
|
|
19
|
+
) {
|
|
20
|
+
HAS_REANIMATED_3 = true;
|
|
21
|
+
}
|
|
22
|
+
} catch (e) {
|
|
23
|
+
HAS_REANIMATED = false;
|
|
24
|
+
}
|
|
15
25
|
|
|
16
26
|
const _bindings = new WeakMap<Node<unknown>, unknown>();
|
|
17
27
|
|
|
18
28
|
export const unbindReanimatedNode = (node: Node<unknown>) => {
|
|
29
|
+
if (!HAS_REANIMATED) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
19
32
|
const previousMapperId = _bindings.get(node);
|
|
20
33
|
if (previousMapperId !== undefined) {
|
|
21
|
-
stopMapper(previousMapperId as number);
|
|
34
|
+
Rea.stopMapper(previousMapperId as number);
|
|
22
35
|
}
|
|
23
36
|
};
|
|
24
37
|
|
|
25
38
|
export function extractReanimatedProps(props: AnimatedProps<any>) {
|
|
26
|
-
if (!
|
|
39
|
+
if (!HAS_REANIMATED) {
|
|
27
40
|
return [props, {}];
|
|
28
41
|
}
|
|
29
42
|
const reanimatedProps = {} as AnimatedProps<any>;
|
|
@@ -33,7 +46,7 @@ export function extractReanimatedProps(props: AnimatedProps<any>) {
|
|
|
33
46
|
continue;
|
|
34
47
|
}
|
|
35
48
|
const propValue = props[propName];
|
|
36
|
-
if (isSharedValue(propValue)) {
|
|
49
|
+
if (Rea.isSharedValue(propValue)) {
|
|
37
50
|
reanimatedProps[propName] = propValue;
|
|
38
51
|
otherProps[propName] = propValue.value;
|
|
39
52
|
} else {
|
|
@@ -51,7 +64,7 @@ function bindReanimatedProps2(
|
|
|
51
64
|
const sharedValues = Object.values(reanimatedProps);
|
|
52
65
|
const previousMapperId = _bindings.get(node);
|
|
53
66
|
if (previousMapperId !== undefined) {
|
|
54
|
-
stopMapper(previousMapperId as number);
|
|
67
|
+
Rea.stopMapper(previousMapperId as number);
|
|
55
68
|
}
|
|
56
69
|
if (sharedValues.length > 0) {
|
|
57
70
|
const viewId = container.getNativeId();
|
|
@@ -70,9 +83,9 @@ function bindReanimatedProps2(
|
|
|
70
83
|
container.redraw();
|
|
71
84
|
}
|
|
72
85
|
};
|
|
73
|
-
const mapperId = startMapper(() => {
|
|
86
|
+
const mapperId = Rea.startMapper(() => {
|
|
74
87
|
"worklet";
|
|
75
|
-
runOnJS(updateProps)();
|
|
88
|
+
Rea.runOnJS(updateProps)();
|
|
76
89
|
}, sharedValues);
|
|
77
90
|
_bindings.set(node, mapperId);
|
|
78
91
|
}
|
|
@@ -83,21 +96,21 @@ export function bindReanimatedProps(
|
|
|
83
96
|
node: Node<any>,
|
|
84
97
|
reanimatedProps: AnimatedProps<any>
|
|
85
98
|
) {
|
|
86
|
-
if (
|
|
99
|
+
if (HAS_REANIMATED && !HAS_REANIMATED_3) {
|
|
87
100
|
return bindReanimatedProps2(container, node, reanimatedProps);
|
|
88
101
|
}
|
|
89
|
-
if (!
|
|
102
|
+
if (!HAS_REANIMATED) {
|
|
90
103
|
return;
|
|
91
104
|
}
|
|
92
105
|
const sharedValues = Object.values(reanimatedProps);
|
|
93
106
|
const previousMapperId = _bindings.get(node);
|
|
94
107
|
if (previousMapperId !== undefined) {
|
|
95
|
-
stopMapper(previousMapperId as number);
|
|
108
|
+
Rea.stopMapper(previousMapperId as number);
|
|
96
109
|
}
|
|
97
110
|
if (sharedValues.length > 0) {
|
|
98
111
|
const viewId = container.getNativeId();
|
|
99
112
|
const { SkiaViewApi } = global;
|
|
100
|
-
const mapperId = startMapper(() => {
|
|
113
|
+
const mapperId = Rea.startMapper(() => {
|
|
101
114
|
"worklet";
|
|
102
115
|
if (node) {
|
|
103
116
|
for (const propName in reanimatedProps) {
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "../../renderer/Offscreen";
|
|
15
15
|
import { Skia, useImage } from "../../skia";
|
|
16
16
|
|
|
17
|
-
import
|
|
17
|
+
import Rea from "./ReanimatedProxy";
|
|
18
18
|
|
|
19
19
|
const createTexture = (
|
|
20
20
|
texture: SharedValue<SkImage | null>,
|
|
@@ -57,10 +57,10 @@ export const usePictureAsTexture = (
|
|
|
57
57
|
picture: SkPicture | null,
|
|
58
58
|
size: SkSize
|
|
59
59
|
) => {
|
|
60
|
-
const texture = useSharedValue<SkImage | null>(null);
|
|
60
|
+
const texture = Rea.useSharedValue<SkImage | null>(null);
|
|
61
61
|
useEffect(() => {
|
|
62
62
|
if (picture !== null) {
|
|
63
|
-
runOnUI(createTexture)(texture, picture, size);
|
|
63
|
+
Rea.runOnUI(createTexture)(texture, picture, size);
|
|
64
64
|
}
|
|
65
65
|
}, [texture, picture, size]);
|
|
66
66
|
return texture;
|
|
@@ -4,11 +4,7 @@ import { type FrameInfo, type SharedValue } from "react-native-reanimated";
|
|
|
4
4
|
import { useAnimatedImage } from "../../skia/core/AnimatedImage";
|
|
5
5
|
import type { DataSourceParam, SkImage } from "../../skia/types";
|
|
6
6
|
|
|
7
|
-
import
|
|
8
|
-
throwOnMissingReanimated,
|
|
9
|
-
useFrameCallback,
|
|
10
|
-
useSharedValue,
|
|
11
|
-
} from "./moduleWrapper";
|
|
7
|
+
import Rea from "./ReanimatedProxy";
|
|
12
8
|
|
|
13
9
|
const DEFAULT_FRAME_DURATION = 60;
|
|
14
10
|
|
|
@@ -16,11 +12,10 @@ export const useAnimatedImageValue = (
|
|
|
16
12
|
source: DataSourceParam,
|
|
17
13
|
paused?: SharedValue<boolean>
|
|
18
14
|
) => {
|
|
19
|
-
|
|
20
|
-
const defaultPaused = useSharedValue(false);
|
|
15
|
+
const defaultPaused = Rea.useSharedValue(false);
|
|
21
16
|
const isPaused = paused ?? defaultPaused;
|
|
22
|
-
const currentFrame = useSharedValue<null | SkImage>(null);
|
|
23
|
-
const lastTimestamp = useSharedValue(-1);
|
|
17
|
+
const currentFrame = Rea.useSharedValue<null | SkImage>(null);
|
|
18
|
+
const lastTimestamp = Rea.useSharedValue(-1);
|
|
24
19
|
const animatedImage = useAnimatedImage(
|
|
25
20
|
source,
|
|
26
21
|
(err) => {
|
|
@@ -32,7 +27,7 @@ export const useAnimatedImageValue = (
|
|
|
32
27
|
const frameDuration =
|
|
33
28
|
animatedImage?.currentFrameDuration() || DEFAULT_FRAME_DURATION;
|
|
34
29
|
|
|
35
|
-
useFrameCallback((frameInfo: FrameInfo) => {
|
|
30
|
+
Rea.useFrameCallback((frameInfo: FrameInfo) => {
|
|
36
31
|
if (!animatedImage) {
|
|
37
32
|
currentFrame.value = null;
|
|
38
33
|
return;
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { useEffect, useMemo } from "react";
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
useSharedValue,
|
|
5
|
-
runOnJS,
|
|
6
|
-
startMapper,
|
|
7
|
-
stopMapper,
|
|
8
|
-
} from "./moduleWrapper";
|
|
3
|
+
import Rea from "./ReanimatedProxy";
|
|
9
4
|
|
|
10
5
|
export const useDerivedValueOnJS = (
|
|
11
6
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -13,13 +8,13 @@ export const useDerivedValueOnJS = (
|
|
|
13
8
|
deps: unknown[]
|
|
14
9
|
) => {
|
|
15
10
|
const init = useMemo(() => fn(), [fn]);
|
|
16
|
-
const value = useSharedValue(init);
|
|
11
|
+
const value = Rea.useSharedValue(init);
|
|
17
12
|
useEffect(() => {
|
|
18
|
-
const mapperId = startMapper(() => {
|
|
13
|
+
const mapperId = Rea.startMapper(() => {
|
|
19
14
|
"worklet";
|
|
20
|
-
runOnJS(fn)();
|
|
15
|
+
Rea.runOnJS(fn)();
|
|
21
16
|
}, deps);
|
|
22
|
-
return () => stopMapper(mapperId);
|
|
17
|
+
return () => Rea.stopMapper(mapperId);
|
|
23
18
|
}, [deps, fn]);
|
|
24
19
|
return value;
|
|
25
20
|
};
|
|
@@ -32,16 +32,10 @@ export const drawAsImage = (element: ReactElement, size: SkSize) => {
|
|
|
32
32
|
return drawAsImageFromPicture(drawAsPicture(element), size);
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
// TODO: We're not sure yet why PixelRatio is not needed here.
|
|
36
|
-
const pd = 1;
|
|
37
35
|
export const drawAsImageFromPicture = (picture: SkPicture, size: SkSize) => {
|
|
38
36
|
"worklet";
|
|
39
|
-
const surface = Skia.Surface.MakeOffscreen(
|
|
40
|
-
size.width * pd,
|
|
41
|
-
size.height * pd
|
|
42
|
-
)!;
|
|
37
|
+
const surface = Skia.Surface.MakeOffscreen(size.width, size.height)!;
|
|
43
38
|
const canvas = surface.getCanvas();
|
|
44
|
-
canvas.scale(pd, pd);
|
|
45
39
|
canvas.drawPicture(picture);
|
|
46
40
|
surface.flush();
|
|
47
41
|
const image = surface.makeImageSnapshot();
|
|
@@ -54,7 +54,7 @@ export interface ImageFactory {
|
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Return an Image backed by a given native buffer.
|
|
57
|
-
* The
|
|
57
|
+
* The native buffer must be a valid owning reference.
|
|
58
58
|
*
|
|
59
59
|
* For instance, this API is used by
|
|
60
60
|
* [react-native-vision-camera](https://github.com/mrousavy/react-native-vision-camera)
|
|
@@ -62,9 +62,9 @@ export interface ImageFactory {
|
|
|
62
62
|
*
|
|
63
63
|
* - On Android; This is an `AHardwareBuffer*`
|
|
64
64
|
* - On iOS, this is a `CVPixelBufferRef`
|
|
65
|
-
* @param nativeBuffer A strong `uintptr_t` pointer to the native
|
|
65
|
+
* @param nativeBuffer A strong `uintptr_t` pointer to the native buffer
|
|
66
66
|
* @throws Throws an error if the Image could not be created, for example when the given
|
|
67
|
-
*
|
|
67
|
+
* native buffer is invalid.
|
|
68
68
|
*/
|
|
69
69
|
MakeImageFromNativeBuffer: (nativeBuffer: NativeBuffer) => SkImage;
|
|
70
70
|
|
|
@@ -28,11 +28,11 @@ export const isNativeBufferNode = (
|
|
|
28
28
|
|
|
29
29
|
export interface NativeBufferFactory {
|
|
30
30
|
/**
|
|
31
|
-
* Copy pixels to a
|
|
31
|
+
* Copy pixels to a native buffer.
|
|
32
32
|
*/
|
|
33
33
|
MakeFromImage: (image: SkImage) => NativeBuffer;
|
|
34
34
|
/**
|
|
35
|
-
* Release a
|
|
35
|
+
* Release a native buffer that was created with `MakeFromImage`.
|
|
36
36
|
*/
|
|
37
|
-
Release: (
|
|
37
|
+
Release: (nativeBuffer: NativeBuffer) => void;
|
|
38
38
|
}
|