@shopify/react-native-skia 0.1.238 → 0.1.240

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.
Files changed (28) hide show
  1. package/cpp/rnskia/dom/nodes/JsiAtlasNode.h +0 -1
  2. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +4 -3
  3. package/ios/RNSkia-iOS/SkiaManager.h +3 -1
  4. package/ios/RNSkia-iOS/SkiaManager.mm +6 -5
  5. package/ios/RNSkiaModule.mm +7 -1
  6. package/lib/commonjs/Platform/Platform.web.js +15 -2
  7. package/lib/commonjs/Platform/Platform.web.js.map +1 -1
  8. package/lib/commonjs/external/reanimated/buffers.d.ts +6 -4
  9. package/lib/commonjs/external/reanimated/buffers.js +16 -6
  10. package/lib/commonjs/external/reanimated/buffers.js.map +1 -1
  11. package/lib/commonjs/external/reanimated/textures.d.ts +6 -3
  12. package/lib/commonjs/external/reanimated/textures.js +52 -7
  13. package/lib/commonjs/external/reanimated/textures.js.map +1 -1
  14. package/lib/module/Platform/Platform.web.js +15 -2
  15. package/lib/module/Platform/Platform.web.js.map +1 -1
  16. package/lib/module/external/reanimated/buffers.d.ts +6 -4
  17. package/lib/module/external/reanimated/buffers.js +18 -8
  18. package/lib/module/external/reanimated/buffers.js.map +1 -1
  19. package/lib/module/external/reanimated/textures.d.ts +6 -3
  20. package/lib/module/external/reanimated/textures.js +46 -4
  21. package/lib/module/external/reanimated/textures.js.map +1 -1
  22. package/lib/typescript/src/external/reanimated/buffers.d.ts +6 -4
  23. package/lib/typescript/src/external/reanimated/textures.d.ts +6 -3
  24. package/package.json +1 -1
  25. package/scripts/setup-canvaskit.js +41 -10
  26. package/src/Platform/Platform.web.tsx +10 -2
  27. package/src/external/reanimated/buffers.ts +29 -26
  28. package/src/external/reanimated/textures.tsx +55 -6
@@ -46,7 +46,6 @@ protected:
46
46
 
47
47
  _rectsProp->require();
48
48
  _rsxFormsProp->require();
49
- _imageProp->require();
50
49
  }
51
50
 
52
51
  private:
@@ -2,7 +2,6 @@
2
2
 
3
3
  #import <React/RCTBridge+Private.h>
4
4
  #import <React/RCTBridge.h>
5
- #import <ReactCommon/RCTTurboModule.h>
6
5
 
7
6
  #include <functional>
8
7
  #include <memory>
@@ -30,8 +29,10 @@ static void handleNotification(CFNotificationCenterRef center, void *observer,
30
29
 
31
30
  class RNSkiOSPlatformContext : public RNSkPlatformContext {
32
31
  public:
33
- RNSkiOSPlatformContext(jsi::Runtime *runtime, RCTBridge *bridge)
34
- : RNSkPlatformContext(runtime, bridge.jsCallInvoker,
32
+ RNSkiOSPlatformContext(
33
+ jsi::Runtime *runtime, RCTBridge *bridge,
34
+ std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)
35
+ : RNSkPlatformContext(runtime, jsCallInvoker,
35
36
  [[UIScreen mainScreen] scale]) {
36
37
 
37
38
  // We need to make sure we invalidate when modules are freed
@@ -12,6 +12,8 @@
12
12
 
13
13
  - (void)invalidate;
14
14
 
15
- - (instancetype)initWithBridge:(RCTBridge *)bridge;
15
+ - (instancetype)initWithBridge:(RCTBridge *)bridge
16
+ jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)
17
+ jsInvoker;
16
18
 
17
19
  @end
@@ -6,8 +6,6 @@
6
6
  #import <React/RCTBridge.h>
7
7
  #import <React/RCTUIManager.h>
8
8
 
9
- #import <ReactCommon/RCTTurboModule.h>
10
-
11
9
  #import "RNSkiOSPlatformContext.h"
12
10
 
13
11
  @implementation SkiaManager {
@@ -26,7 +24,9 @@
26
24
  _skManager = nullptr;
27
25
  }
28
26
 
29
- - (instancetype)initWithBridge:(RCTBridge *)bridge {
27
+ - (instancetype)initWithBridge:(RCTBridge *)bridge
28
+ jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)
29
+ jsInvoker {
30
30
  self = [super init];
31
31
  if (self) {
32
32
  RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
@@ -37,8 +37,9 @@
37
37
 
38
38
  // Create the RNSkiaManager (cross platform)
39
39
  _skManager = std::make_shared<RNSkia::RNSkManager>(
40
- jsRuntime, bridge.jsCallInvoker,
41
- std::make_shared<RNSkia::RNSkiOSPlatformContext>(jsRuntime, bridge));
40
+ jsRuntime, jsInvoker,
41
+ std::make_shared<RNSkia::RNSkiOSPlatformContext>(jsRuntime, bridge,
42
+ jsInvoker));
42
43
  }
43
44
  }
44
45
  return self;
@@ -1,9 +1,11 @@
1
1
 
2
2
  #import "RNSkiaModule.h"
3
3
  #import <React/RCTBridge+Private.h>
4
+ #import <ReactCommon/RCTTurboModule.h>
4
5
 
5
6
  @implementation RNSkiaModule {
6
7
  SkiaManager *skiaManager;
8
+ std::shared_ptr<facebook::react::CallInvoker> jsInvoker;
7
9
  }
8
10
 
9
11
  RCT_EXPORT_MODULE()
@@ -33,13 +35,17 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) {
33
35
  return @true;
34
36
  }
35
37
  RCTBridge *bridge = [RCTBridge currentBridge];
36
- skiaManager = [[SkiaManager alloc] initWithBridge:bridge];
38
+ if (!jsInvoker) {
39
+ jsInvoker = bridge.jsCallInvoker;
40
+ }
41
+ skiaManager = [[SkiaManager alloc] initWithBridge:bridge jsInvoker:jsInvoker];
37
42
  return @true;
38
43
  }
39
44
 
40
45
  #ifdef RCT_NEW_ARCH_ENABLED
41
46
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
42
47
  (const facebook::react::ObjCTurboModule::InitParams &)params {
48
+ jsInvoker = params.jsInvoker;
43
49
  return std::make_shared<facebook::react::NativeSkiaModuleSpecJSI>(params);
44
50
  }
45
51
  #endif
@@ -116,10 +116,23 @@ const View = ({
116
116
  };
117
117
  const Platform = exports.Platform = {
118
118
  OS: "web",
119
- PixelRatio: window.devicePixelRatio,
119
+ PixelRatio: typeof window !== "undefined" ? window.devicePixelRatio : 1,
120
+ // window is not defined on node
120
121
  resolveAsset: source => {
121
122
  if ((0, _types.isRNModule)(source)) {
122
- throw new Error("Image source is a number - this is not supported on the web");
123
+ if (typeof source === "number" && typeof require === "function") {
124
+ const {
125
+ getAssetByID
126
+ } = require("react-native/Libraries/Image/AssetRegistry");
127
+ const {
128
+ httpServerLocation,
129
+ name,
130
+ type
131
+ } = getAssetByID(source);
132
+ const uri = `${httpServerLocation}/${name}.${type}`;
133
+ return uri;
134
+ }
135
+ throw new Error("Asset source is a number - this is not supported on the web");
123
136
  }
124
137
  return source.default;
125
138
  },
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_types","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","DOM_LAYOUT_HANDLER_NAME","resizeObserver","getObserver","window","ResizeObserver","entries","forEach","entry","node","target","left","top","width","height","contentRect","onLayout","setTimeout","timeStamp","Date","now","nativeEvent","layout","x","y","currentTarget","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","Error","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","useElementLayout","ref","observer","useLayoutEffect","current","observe","unobserve","View","children","style","rawStyle","useMemo","useRef","cssStyles","display","flexDirection","flexWrap","justifyContent","alignItems","alignContent","createElement","Platform","exports","OS","PixelRatio","devicePixelRatio","resolveAsset","source","isRNModule","findNodeHandle"],"sources":["Platform.web.tsx"],"sourcesContent":["import type { RefObject, CSSProperties } from \"react\";\nimport React, { useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { LayoutChangeEvent, ViewComponent, ViewProps } from \"react-native\";\n\nimport type { DataModule } from \"../skia/types\";\nimport { isRNModule } from \"../skia/types\";\n\nimport type { IPlatform } from \"./IPlatform\";\n\n// eslint-disable-next-line max-len\n// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/modules/useElementLayout/index.js\nconst DOM_LAYOUT_HANDLER_NAME = \"__reactLayoutHandler\";\ntype OnLayout = ((event: LayoutChangeEvent) => void) | undefined;\ntype Div = HTMLDivElement & {\n __reactLayoutHandler: OnLayout;\n};\n\nlet resizeObserver: ResizeObserver | null = null;\n\nconst getObserver = () => {\n if (resizeObserver == null) {\n resizeObserver = new window.ResizeObserver(function (entries) {\n entries.forEach((entry) => {\n const node = entry.target as Div;\n const { left, top, width, height } = entry.contentRect;\n const onLayout = node[DOM_LAYOUT_HANDLER_NAME];\n if (typeof onLayout === \"function\") {\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () =>\n onLayout({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x: left, y: top, width, height } },\n currentTarget: 0,\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n }),\n 0\n );\n }\n });\n });\n }\n return resizeObserver;\n};\n\nconst useElementLayout = (ref: RefObject<Div>, onLayout: OnLayout) => {\n const observer = getObserver();\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node !== null) {\n node[DOM_LAYOUT_HANDLER_NAME] = onLayout;\n }\n }, [ref, onLayout]);\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node != null && observer != null) {\n if (typeof node[DOM_LAYOUT_HANDLER_NAME] === \"function\") {\n observer.observe(node);\n } else {\n observer.unobserve(node);\n }\n }\n return () => {\n if (node != null && observer != null) {\n observer.unobserve(node);\n }\n };\n }, [observer, ref]);\n};\n\nconst View = (({ children, onLayout, style: rawStyle }: ViewProps) => {\n const style = useMemo(() => (rawStyle ?? {}) as CSSProperties, [rawStyle]);\n const ref = useRef<Div>(null);\n useElementLayout(ref, onLayout);\n const cssStyles = useMemo(() => {\n return {\n ...style,\n display: \"flex\",\n flexDirection: style.flexDirection || \"inherit\",\n flexWrap: style.flexWrap || \"nowrap\",\n justifyContent: style.justifyContent || \"flex-start\",\n alignItems: style.alignItems || \"stretch\",\n alignContent: style.alignContent || \"stretch\",\n };\n }, [style]);\n\n return (\n <div ref={ref} style={cssStyles}>\n {children}\n </div>\n );\n}) as unknown as typeof ViewComponent;\n\nexport const Platform: IPlatform = {\n OS: \"web\",\n PixelRatio: window.devicePixelRatio,\n resolveAsset: (source: DataModule) => {\n if (isRNModule(source)) {\n throw new Error(\n \"Image source is a number - this is not supported on the web\"\n );\n }\n return source.default;\n },\n findNodeHandle: () => {\n throw new Error(\"findNodeHandle is not supported on the web\");\n },\n View,\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_types","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","DOM_LAYOUT_HANDLER_NAME","resizeObserver","getObserver","window","ResizeObserver","entries","forEach","entry","node","target","left","top","width","height","contentRect","onLayout","setTimeout","timeStamp","Date","now","nativeEvent","layout","x","y","currentTarget","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","Error","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","useElementLayout","ref","observer","useLayoutEffect","current","observe","unobserve","View","children","style","rawStyle","useMemo","useRef","cssStyles","display","flexDirection","flexWrap","justifyContent","alignItems","alignContent","createElement","Platform","exports","OS","PixelRatio","devicePixelRatio","resolveAsset","source","isRNModule","getAssetByID","httpServerLocation","name","uri","findNodeHandle"],"sources":["Platform.web.tsx"],"sourcesContent":["import type { RefObject, CSSProperties } from \"react\";\nimport React, { useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { LayoutChangeEvent, ViewComponent, ViewProps } from \"react-native\";\n\nimport type { DataModule } from \"../skia/types\";\nimport { isRNModule } from \"../skia/types\";\n\nimport type { IPlatform } from \"./IPlatform\";\n\n// eslint-disable-next-line max-len\n// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/modules/useElementLayout/index.js\nconst DOM_LAYOUT_HANDLER_NAME = \"__reactLayoutHandler\";\ntype OnLayout = ((event: LayoutChangeEvent) => void) | undefined;\ntype Div = HTMLDivElement & {\n __reactLayoutHandler: OnLayout;\n};\n\nlet resizeObserver: ResizeObserver | null = null;\n\nconst getObserver = () => {\n if (resizeObserver == null) {\n resizeObserver = new window.ResizeObserver(function (entries) {\n entries.forEach((entry) => {\n const node = entry.target as Div;\n const { left, top, width, height } = entry.contentRect;\n const onLayout = node[DOM_LAYOUT_HANDLER_NAME];\n if (typeof onLayout === \"function\") {\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () =>\n onLayout({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x: left, y: top, width, height } },\n currentTarget: 0,\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n }),\n 0\n );\n }\n });\n });\n }\n return resizeObserver;\n};\n\nconst useElementLayout = (ref: RefObject<Div>, onLayout: OnLayout) => {\n const observer = getObserver();\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node !== null) {\n node[DOM_LAYOUT_HANDLER_NAME] = onLayout;\n }\n }, [ref, onLayout]);\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node != null && observer != null) {\n if (typeof node[DOM_LAYOUT_HANDLER_NAME] === \"function\") {\n observer.observe(node);\n } else {\n observer.unobserve(node);\n }\n }\n return () => {\n if (node != null && observer != null) {\n observer.unobserve(node);\n }\n };\n }, [observer, ref]);\n};\n\nconst View = (({ children, onLayout, style: rawStyle }: ViewProps) => {\n const style = useMemo(() => (rawStyle ?? {}) as CSSProperties, [rawStyle]);\n const ref = useRef<Div>(null);\n useElementLayout(ref, onLayout);\n const cssStyles = useMemo(() => {\n return {\n ...style,\n display: \"flex\",\n flexDirection: style.flexDirection || \"inherit\",\n flexWrap: style.flexWrap || \"nowrap\",\n justifyContent: style.justifyContent || \"flex-start\",\n alignItems: style.alignItems || \"stretch\",\n alignContent: style.alignContent || \"stretch\",\n };\n }, [style]);\n\n return (\n <div ref={ref} style={cssStyles}>\n {children}\n </div>\n );\n}) as unknown as typeof ViewComponent;\n\nexport const Platform: IPlatform = {\n OS: \"web\",\n PixelRatio: typeof window !== \"undefined\" ? window.devicePixelRatio : 1, // window is not defined on node\n resolveAsset: (source: DataModule) => {\n if (isRNModule(source)) {\n if (typeof source === \"number\" && typeof require === \"function\") {\n const {\n getAssetByID,\n } = require(\"react-native/Libraries/Image/AssetRegistry\");\n const { httpServerLocation, name, type } = getAssetByID(source);\n const uri = `${httpServerLocation}/${name}.${type}`;\n return uri;\n }\n throw new Error(\n \"Asset source is a number - this is not supported on the web\"\n );\n }\n return source.default;\n },\n findNodeHandle: () => {\n throw new Error(\"findNodeHandle is not supported on the web\");\n },\n View,\n};\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAIA,IAAAC,MAAA,GAAAD,OAAA;AAA2C,SAAAE,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAI3C;AACA;AACA,MAAMY,uBAAuB,GAAG,sBAAsB;AAMtD,IAAIC,cAAqC,GAAG,IAAI;AAEhD,MAAMC,WAAW,GAAGA,CAAA,KAAM;EACxB,IAAID,cAAc,IAAI,IAAI,EAAE;IAC1BA,cAAc,GAAG,IAAIE,MAAM,CAACC,cAAc,CAAC,UAAUC,OAAO,EAAE;MAC5DA,OAAO,CAACC,OAAO,CAAEC,KAAK,IAAK;QACzB,MAAMC,IAAI,GAAGD,KAAK,CAACE,MAAa;QAChC,MAAM;UAAEC,IAAI;UAAEC,GAAG;UAAEC,KAAK;UAAEC;QAAO,CAAC,GAAGN,KAAK,CAACO,WAAW;QACtD,MAAMC,QAAQ,GAAGP,IAAI,CAACR,uBAAuB,CAAC;QAC9C,IAAI,OAAOe,QAAQ,KAAK,UAAU,EAAE;UAClC;UACAC,UAAU,CACR,MACED,QAAQ,CAAC;YACPE,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,WAAW,EAAE;cAAEC,MAAM,EAAE;gBAAEC,CAAC,EAAEZ,IAAI;gBAAEa,CAAC,EAAEZ,GAAG;gBAAEC,KAAK;gBAAEC;cAAO;YAAE,CAAC;YAC3DW,aAAa,EAAE,CAAC;YAChBf,MAAM,EAAE,CAAC;YACTgB,OAAO,EAAE,KAAK;YACdC,UAAU,EAAE,KAAK;YACjBC,gBAAgB,EAAE,KAAK;YACvBC,UAAU,EAAE,CAAC;YACbC,kBAAkBA,CAAA,EAAG;cACnB,MAAM,IAAIC,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDC,oBAAoBA,CAAA,EAAG;cACrB,MAAM,IAAID,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDE,OAAOA,CAAA,EAAG;cACR,MAAM,IAAIF,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDG,cAAcA,CAAA,EAAG;cACf,MAAM,IAAIH,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDI,eAAeA,CAAA,EAAG;cAChB,MAAM,IAAIJ,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDK,SAAS,EAAE,IAAI;YACfC,IAAI,EAAE;UACR,CAAC,CAAC,EACJ,CACF,CAAC;QACH;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA,OAAOnC,cAAc;AACvB,CAAC;AAED,MAAMoC,gBAAgB,GAAGA,CAACC,GAAmB,EAAEvB,QAAkB,KAAK;EACpE,MAAMwB,QAAQ,GAAGrC,WAAW,CAAC,CAAC;EAE9B,IAAAsC,sBAAe,EAAC,MAAM;IACpB,MAAMhC,IAAI,GAAG8B,GAAG,CAACG,OAAO;IACxB,IAAIjC,IAAI,KAAK,IAAI,EAAE;MACjBA,IAAI,CAACR,uBAAuB,CAAC,GAAGe,QAAQ;IAC1C;EACF,CAAC,EAAE,CAACuB,GAAG,EAAEvB,QAAQ,CAAC,CAAC;EAEnB,IAAAyB,sBAAe,EAAC,MAAM;IACpB,MAAMhC,IAAI,GAAG8B,GAAG,CAACG,OAAO;IACxB,IAAIjC,IAAI,IAAI,IAAI,IAAI+B,QAAQ,IAAI,IAAI,EAAE;MACpC,IAAI,OAAO/B,IAAI,CAACR,uBAAuB,CAAC,KAAK,UAAU,EAAE;QACvDuC,QAAQ,CAACG,OAAO,CAAClC,IAAI,CAAC;MACxB,CAAC,MAAM;QACL+B,QAAQ,CAACI,SAAS,CAACnC,IAAI,CAAC;MAC1B;IACF;IACA,OAAO,MAAM;MACX,IAAIA,IAAI,IAAI,IAAI,IAAI+B,QAAQ,IAAI,IAAI,EAAE;QACpCA,QAAQ,CAACI,SAAS,CAACnC,IAAI,CAAC;MAC1B;IACF,CAAC;EACH,CAAC,EAAE,CAAC+B,QAAQ,EAAED,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAMM,IAAI,GAAIA,CAAC;EAAEC,QAAQ;EAAE9B,QAAQ;EAAE+B,KAAK,EAAEC;AAAoB,CAAC,KAAK;EACpE,MAAMD,KAAK,GAAG,IAAAE,cAAO,EAAC,MAAOD,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAI,CAAC,CAAmB,EAAE,CAACA,QAAQ,CAAC,CAAC;EAC1E,MAAMT,GAAG,GAAG,IAAAW,aAAM,EAAM,IAAI,CAAC;EAC7BZ,gBAAgB,CAACC,GAAG,EAAEvB,QAAQ,CAAC;EAC/B,MAAMmC,SAAS,GAAG,IAAAF,cAAO,EAAC,MAAM;IAC9B,OAAO;MACL,GAAGF,KAAK;MACRK,OAAO,EAAE,MAAM;MACfC,aAAa,EAAEN,KAAK,CAACM,aAAa,IAAI,SAAS;MAC/CC,QAAQ,EAAEP,KAAK,CAACO,QAAQ,IAAI,QAAQ;MACpCC,cAAc,EAAER,KAAK,CAACQ,cAAc,IAAI,YAAY;MACpDC,UAAU,EAAET,KAAK,CAACS,UAAU,IAAI,SAAS;MACzCC,YAAY,EAAEV,KAAK,CAACU,YAAY,IAAI;IACtC,CAAC;EACH,CAAC,EAAE,CAACV,KAAK,CAAC,CAAC;EAEX,oBACEvE,MAAA,CAAAU,OAAA,CAAAwE,aAAA;IAAKnB,GAAG,EAAEA,GAAI;IAACQ,KAAK,EAAEI;EAAU,GAC7BL,QACE,CAAC;AAEV,CAAqC;AAE9B,MAAMa,QAAmB,GAAAC,OAAA,CAAAD,QAAA,GAAG;EACjCE,EAAE,EAAE,KAAK;EACTC,UAAU,EAAE,OAAO1D,MAAM,KAAK,WAAW,GAAGA,MAAM,CAAC2D,gBAAgB,GAAG,CAAC;EAAE;EACzEC,YAAY,EAAGC,MAAkB,IAAK;IACpC,IAAI,IAAAC,iBAAU,EAACD,MAAM,CAAC,EAAE;MACtB,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAI,OAAOvF,OAAO,KAAK,UAAU,EAAE;QAC/D,MAAM;UACJyF;QACF,CAAC,GAAGzF,OAAO,CAAC,4CAA4C,CAAC;QACzD,MAAM;UAAE0F,kBAAkB;UAAEC,IAAI;UAAEhC;QAAK,CAAC,GAAG8B,YAAY,CAACF,MAAM,CAAC;QAC/D,MAAMK,GAAG,GAAI,GAAEF,kBAAmB,IAAGC,IAAK,IAAGhC,IAAK,EAAC;QACnD,OAAOiC,GAAG;MACZ;MACA,MAAM,IAAIvC,KAAK,CACb,6DACF,CAAC;IACH;IACA,OAAOkC,MAAM,CAAC/E,OAAO;EACvB,CAAC;EACDqF,cAAc,EAAEA,CAAA,KAAM;IACpB,MAAM,IAAIxC,KAAK,CAAC,4CAA4C,CAAC;EAC/D,CAAC;EACDc;AACF,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
2
- export declare const useRectBuffer: (size: number, modifier: (input: SkHostRect, index: number) => void) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
3
- export declare const useRSXformBuffer: (size: number, modifier: (input: SkRSXform, index: number) => void) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
4
- export declare const usePointBuffer: (size: number, modifier: (input: SkPoint, index: number) => void) => import("react-native-reanimated").SharedValue<SkPoint[]>;
5
- export declare const useColorBuffer: (size: number, modifier: (input: SkColor, index: number) => void) => import("react-native-reanimated").SharedValue<Float32Array[]>;
2
+ type Modifier<T> = (input: T, index: number) => void;
3
+ export declare const useRectBuffer: (size: number, modifier: Modifier<SkHostRect>) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
4
+ export declare const useRSXformBuffer: (size: number, modifier: Modifier<SkRSXform>) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
5
+ export declare const usePointBuffer: (size: number, modifier: Modifier<SkPoint>) => import("react-native-reanimated").SharedValue<SkPoint[]>;
6
+ export declare const useColorBuffer: (size: number, modifier: Modifier<SkColor>) => import("react-native-reanimated").SharedValue<Float32Array[]>;
7
+ export {};
@@ -5,22 +5,32 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useRectBuffer = exports.useRSXformBuffer = exports.usePointBuffer = exports.useColorBuffer = void 0;
7
7
  var _react = require("react");
8
+ var _reactNativeReanimated = require("react-native-reanimated");
8
9
  var _skia = require("../../skia");
9
10
  var _moduleWrapper = require("./moduleWrapper");
10
11
  var _interpolators = require("./interpolators");
11
12
  const useBuffer = (size, bufferInitializer, modifier) => {
13
+ var _mod$__closure;
12
14
  const buffer = (0, _react.useMemo)(() => new Array(size).fill(0).map(bufferInitializer),
13
15
  // eslint-disable-next-line react-hooks/exhaustive-deps
14
16
  [size]);
15
- const transforms = (0, _moduleWrapper.useSharedValue)(buffer);
16
- (0, _moduleWrapper.useDerivedValue)(() => {
17
+ const values = (0, _moduleWrapper.useSharedValue)(buffer);
18
+ const mod = modifier;
19
+ const deps = Object.values((_mod$__closure = mod.__closure) !== null && _mod$__closure !== void 0 ? _mod$__closure : {});
20
+ const mapperId = (0, _reactNativeReanimated.startMapper)(() => {
21
+ "worklet";
22
+
17
23
  buffer.forEach((val, index) => {
18
24
  modifier(val, index);
19
25
  });
20
- // Assuming notifyChange is a function that notifies about the change in transforms.
21
- (0, _interpolators.notifyChange)(transforms);
22
- });
23
- return transforms;
26
+ (0, _interpolators.notifyChange)(values);
27
+ }, deps);
28
+ (0, _react.useEffect)(() => {
29
+ return () => {
30
+ (0, _reactNativeReanimated.stopMapper)(mapperId);
31
+ };
32
+ }, [mapperId]);
33
+ return values;
24
34
  };
25
35
  const useRectBuffer = (size, modifier) => useBuffer(size, () => _skia.Skia.XYWHRect(0, 0, 0, 0), modifier);
26
36
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_skia","_moduleWrapper","_interpolators","useBuffer","size","bufferInitializer","modifier","buffer","useMemo","Array","fill","map","transforms","useSharedValue","useDerivedValue","forEach","val","index","notifyChange","useRectBuffer","Skia","XYWHRect","exports","useRSXformBuffer","RSXform","usePointBuffer","Point","useColorBuffer","Color"],"sources":["buffers.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport type { SkColor, SkHostRect, SkPoint, SkRSXform } from \"../../skia/types\";\nimport { Skia } from \"../../skia\";\n\nimport { useDerivedValue, useSharedValue } from \"./moduleWrapper\";\nimport { notifyChange } from \"./interpolators\";\n\nconst useBuffer = <T>(\n size: number,\n bufferInitializer: () => T,\n modifier: (input: T, index: number) => void\n) => {\n const buffer = useMemo(\n () => new Array(size).fill(0).map(bufferInitializer),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [size]\n );\n const transforms = useSharedValue(buffer);\n\n useDerivedValue(() => {\n buffer.forEach((val, index) => {\n modifier(val, index);\n });\n // Assuming notifyChange is a function that notifies about the change in transforms.\n notifyChange(transforms);\n });\n\n return transforms;\n};\n\nexport const useRectBuffer = (\n size: number,\n modifier: (input: SkHostRect, index: number) => void\n) => useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);\n\n// Usage for RSXform Buffer\nexport const useRSXformBuffer = (\n size: number,\n modifier: (input: SkRSXform, index: number) => void\n) => useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);\n\n// Usage for Point Buffer\nexport const usePointBuffer = (\n size: number,\n modifier: (input: SkPoint, index: number) => void\n) => useBuffer(size, () => Skia.Point(0, 0), modifier);\n\n// Usage for Color Buffer\nexport const useColorBuffer = (\n size: number,\n modifier: (input: SkColor, index: number) => void\n) => useBuffer(size, () => Skia.Color(\"black\"), modifier);\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,KAAA,GAAAD,OAAA;AAEA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAEA,MAAMI,SAAS,GAAGA,CAChBC,IAAY,EACZC,iBAA0B,EAC1BC,QAA2C,KACxC;EACH,MAAMC,MAAM,GAAG,IAAAC,cAAO,EACpB,MAAM,IAAIC,KAAK,CAACL,IAAI,CAAC,CAACM,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAACN,iBAAiB,CAAC;EACpD;EACA,CAACD,IAAI,CACP,CAAC;EACD,MAAMQ,UAAU,GAAG,IAAAC,6BAAc,EAACN,MAAM,CAAC;EAEzC,IAAAO,8BAAe,EAAC,MAAM;IACpBP,MAAM,CAACQ,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MAC7BX,QAAQ,CAACU,GAAG,EAAEC,KAAK,CAAC;IACtB,CAAC,CAAC;IACF;IACA,IAAAC,2BAAY,EAACN,UAAU,CAAC;EAC1B,CAAC,CAAC;EAEF,OAAOA,UAAU;AACnB,CAAC;AAEM,MAAMO,aAAa,GAAGA,CAC3Bf,IAAY,EACZE,QAAoD,KACjDH,SAAS,CAACC,IAAI,EAAE,MAAMgB,UAAI,CAACC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEf,QAAQ,CAAC;;AAE/D;AAAAgB,OAAA,CAAAH,aAAA,GAAAA,aAAA;AACO,MAAMI,gBAAgB,GAAGA,CAC9BnB,IAAY,EACZE,QAAmD,KAChDH,SAAS,CAACC,IAAI,EAAE,MAAMgB,UAAI,CAACI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAElB,QAAQ,CAAC;;AAE9D;AAAAgB,OAAA,CAAAC,gBAAA,GAAAA,gBAAA;AACO,MAAME,cAAc,GAAGA,CAC5BrB,IAAY,EACZE,QAAiD,KAC9CH,SAAS,CAACC,IAAI,EAAE,MAAMgB,UAAI,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEpB,QAAQ,CAAC;;AAEtD;AAAAgB,OAAA,CAAAG,cAAA,GAAAA,cAAA;AACO,MAAME,cAAc,GAAGA,CAC5BvB,IAAY,EACZE,QAAiD,KAC9CH,SAAS,CAACC,IAAI,EAAE,MAAMgB,UAAI,CAACQ,KAAK,CAAC,OAAO,CAAC,EAAEtB,QAAQ,CAAC;AAACgB,OAAA,CAAAK,cAAA,GAAAA,cAAA"}
1
+ {"version":3,"names":["_react","require","_reactNativeReanimated","_skia","_moduleWrapper","_interpolators","useBuffer","size","bufferInitializer","modifier","_mod$__closure","buffer","useMemo","Array","fill","map","values","useSharedValue","mod","deps","Object","__closure","mapperId","startMapper","forEach","val","index","notifyChange","useEffect","stopMapper","useRectBuffer","Skia","XYWHRect","exports","useRSXformBuffer","RSXform","usePointBuffer","Point","useColorBuffer","Color"],"sources":["buffers.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { startMapper, stopMapper } from \"react-native-reanimated\";\nimport type { WorkletFunction } from \"react-native-reanimated/lib/typescript/reanimated2/commonTypes\";\n\nimport type { SkColor, SkHostRect, SkPoint, SkRSXform } from \"../../skia/types\";\nimport { Skia } from \"../../skia\";\n\nimport { useSharedValue } from \"./moduleWrapper\";\nimport { notifyChange } from \"./interpolators\";\n\ntype Modifier<T> = (input: T, index: number) => void;\n\nconst useBuffer = <T>(\n size: number,\n bufferInitializer: () => T,\n modifier: Modifier<T>\n) => {\n const buffer = useMemo(\n () => new Array(size).fill(0).map(bufferInitializer),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [size]\n );\n const values = useSharedValue(buffer);\n const mod = modifier as WorkletFunction;\n const deps = Object.values(mod.__closure ?? {});\n const mapperId = startMapper(() => {\n \"worklet\";\n buffer.forEach((val, index) => {\n modifier(val, index);\n });\n notifyChange(values);\n }, deps);\n\n useEffect(() => {\n return () => {\n stopMapper(mapperId);\n };\n }, [mapperId]);\n\n return values;\n};\n\nexport const useRectBuffer = (size: number, modifier: Modifier<SkHostRect>) =>\n useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);\n\n// Usage for RSXform Buffer\nexport const useRSXformBuffer = (size: number, modifier: Modifier<SkRSXform>) =>\n useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);\n\n// Usage for Point Buffer\nexport const usePointBuffer = (size: number, modifier: Modifier<SkPoint>) =>\n useBuffer(size, () => Skia.Point(0, 0), modifier);\n\n// Usage for Color Buffer\nexport const useColorBuffer = (size: number, modifier: Modifier<SkColor>) =>\n useBuffer(size, () => Skia.Color(\"black\"), modifier);\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AAIA,IAAAE,KAAA,GAAAF,OAAA;AAEA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AAIA,MAAMK,SAAS,GAAGA,CAChBC,IAAY,EACZC,iBAA0B,EAC1BC,QAAqB,KAClB;EAAA,IAAAC,cAAA;EACH,MAAMC,MAAM,GAAG,IAAAC,cAAO,EACpB,MAAM,IAAIC,KAAK,CAACN,IAAI,CAAC,CAACO,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAACP,iBAAiB,CAAC;EACpD;EACA,CAACD,IAAI,CACP,CAAC;EACD,MAAMS,MAAM,GAAG,IAAAC,6BAAc,EAACN,MAAM,CAAC;EACrC,MAAMO,GAAG,GAAGT,QAA2B;EACvC,MAAMU,IAAI,GAAGC,MAAM,CAACJ,MAAM,EAAAN,cAAA,GAACQ,GAAG,CAACG,SAAS,cAAAX,cAAA,cAAAA,cAAA,GAAI,CAAC,CAAC,CAAC;EAC/C,MAAMY,QAAQ,GAAG,IAAAC,kCAAW,EAAC,MAAM;IACjC,SAAS;;IACTZ,MAAM,CAACa,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MAC7BjB,QAAQ,CAACgB,GAAG,EAAEC,KAAK,CAAC;IACtB,CAAC,CAAC;IACF,IAAAC,2BAAY,EAACX,MAAM,CAAC;EACtB,CAAC,EAAEG,IAAI,CAAC;EAER,IAAAS,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACX,IAAAC,iCAAU,EAACP,QAAQ,CAAC;IACtB,CAAC;EACH,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAON,MAAM;AACf,CAAC;AAEM,MAAMc,aAAa,GAAGA,CAACvB,IAAY,EAAEE,QAA8B,KACxEH,SAAS,CAACC,IAAI,EAAE,MAAMwB,UAAI,CAACC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEvB,QAAQ,CAAC;;AAE5D;AAAAwB,OAAA,CAAAH,aAAA,GAAAA,aAAA;AACO,MAAMI,gBAAgB,GAAGA,CAAC3B,IAAY,EAAEE,QAA6B,KAC1EH,SAAS,CAACC,IAAI,EAAE,MAAMwB,UAAI,CAACI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE1B,QAAQ,CAAC;;AAE3D;AAAAwB,OAAA,CAAAC,gBAAA,GAAAA,gBAAA;AACO,MAAME,cAAc,GAAGA,CAAC7B,IAAY,EAAEE,QAA2B,KACtEH,SAAS,CAACC,IAAI,EAAE,MAAMwB,UAAI,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE5B,QAAQ,CAAC;;AAEnD;AAAAwB,OAAA,CAAAG,cAAA,GAAAA,cAAA;AACO,MAAME,cAAc,GAAGA,CAAC/B,IAAY,EAAEE,QAA2B,KACtEH,SAAS,CAACC,IAAI,EAAE,MAAMwB,UAAI,CAACQ,KAAK,CAAC,OAAO,CAAC,EAAE9B,QAAQ,CAAC;AAACwB,OAAA,CAAAK,cAAA,GAAAA,cAAA"}
@@ -1,5 +1,8 @@
1
1
  import type { ReactElement } from "react";
2
2
  import type { SharedValue } from "react-native-reanimated";
3
- import type { SkImage, SkPicture, SkSize } from "../../skia/types";
4
- export declare const useTextureValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
- export declare const useTextureValueFromPicture: (picture: SkPicture, size: SkSize) => SharedValue<SkImage | null>;
3
+ import type { DataSourceParam, SkImage, SkPicture, SkSize } from "../../skia/types";
4
+ export declare const useTexture: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
+ export declare const useTextureAsValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
6
+ export declare const useTextureValueFromPicture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
7
+ export declare const usePictureAsTexture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
8
+ export declare const useImageAsTexture: (source: DataSourceParam) => SharedValue<SkImage | null>;
@@ -3,28 +3,73 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useTextureValueFromPicture = exports.useTextureValue = void 0;
6
+ exports.useTextureValueFromPicture = exports.useTextureAsValue = exports.useTexture = exports.usePictureAsTexture = exports.useImageAsTexture = void 0;
7
7
  var _react = require("react");
8
8
  var _Offscreen = require("../../renderer/Offscreen");
9
+ var _skia = require("../../skia");
9
10
  var _moduleWrapper = require("./moduleWrapper");
10
- const createTextureValue = (texture, picture, size) => {
11
+ const createTexture = (texture, picture, size) => {
11
12
  "worklet";
12
13
 
13
14
  texture.value = (0, _Offscreen.drawAsImageFromPicture)(picture, size);
14
15
  };
15
- const useTextureValue = (element, size) => {
16
+ const useTexture = (element, size) => {
16
17
  const picture = (0, _react.useMemo)(() => {
17
18
  return (0, _Offscreen.drawAsPicture)(element);
18
19
  }, [element]);
19
- return useTextureValueFromPicture(picture, size);
20
+ return usePictureAsTexture(picture, size);
20
21
  };
21
- exports.useTextureValue = useTextureValue;
22
+ exports.useTexture = useTexture;
23
+ const useTextureAsValue = (element, size) => {
24
+ console.warn("useTextureAsValue has been renamed to use useTexture");
25
+ return useTexture(element, size);
26
+ };
27
+ exports.useTextureAsValue = useTextureAsValue;
22
28
  const useTextureValueFromPicture = (picture, size) => {
29
+ console.warn("useTextureValueFromPicture has been renamed to use usePictureAsTexture");
30
+ return usePictureAsTexture(picture, size);
31
+ };
32
+ exports.useTextureValueFromPicture = useTextureValueFromPicture;
33
+ const usePictureAsTexture = (picture, size) => {
23
34
  const texture = (0, _moduleWrapper.useSharedValue)(null);
24
35
  (0, _react.useEffect)(() => {
25
- (0, _moduleWrapper.runOnUI)(createTextureValue)(texture, picture, size);
36
+ if (picture !== null) {
37
+ (0, _moduleWrapper.runOnUI)(createTexture)(texture, picture, size);
38
+ }
26
39
  }, [texture, picture, size]);
27
40
  return texture;
28
41
  };
29
- exports.useTextureValueFromPicture = useTextureValueFromPicture;
42
+ exports.usePictureAsTexture = usePictureAsTexture;
43
+ const useImageAsTexture = source => {
44
+ const image = (0, _skia.useImage)(source);
45
+ const size = (0, _react.useMemo)(() => {
46
+ if (image) {
47
+ return {
48
+ width: image.width(),
49
+ height: image.height()
50
+ };
51
+ }
52
+ return {
53
+ width: 0,
54
+ height: 0
55
+ };
56
+ }, [image]);
57
+ const picture = (0, _react.useMemo)(() => {
58
+ if (image) {
59
+ const recorder = _skia.Skia.PictureRecorder();
60
+ const canvas = recorder.beginRecording({
61
+ x: 0,
62
+ y: 0,
63
+ width: size.width,
64
+ height: size.height
65
+ });
66
+ canvas.drawImage(image, 0, 0);
67
+ return recorder.finishRecordingAsPicture();
68
+ } else {
69
+ return null;
70
+ }
71
+ }, [size, image]);
72
+ return usePictureAsTexture(picture, size);
73
+ };
74
+ exports.useImageAsTexture = useImageAsTexture;
30
75
  //# sourceMappingURL=textures.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_Offscreen","_moduleWrapper","createTextureValue","texture","picture","size","value","drawAsImageFromPicture","useTextureValue","element","useMemo","drawAsPicture","useTextureValueFromPicture","exports","useSharedValue","useEffect","runOnUI"],"sources":["textures.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type { SkImage, SkPicture, SkSize } from \"../../skia/types\";\nimport {\n drawAsImageFromPicture,\n drawAsPicture,\n} from \"../../renderer/Offscreen\";\n\nimport { runOnUI, useSharedValue } from \"./moduleWrapper\";\n\nconst createTextureValue = (\n texture: SharedValue<SkImage | null>,\n picture: SkPicture,\n size: SkSize\n) => {\n \"worklet\";\n texture.value = drawAsImageFromPicture(picture, size);\n};\n\nexport const useTextureValue = (element: ReactElement, size: SkSize) => {\n const picture = useMemo(() => {\n return drawAsPicture(element);\n }, [element]);\n return useTextureValueFromPicture(picture, size);\n};\n\nexport const useTextureValueFromPicture = (\n picture: SkPicture,\n size: SkSize\n) => {\n const texture = useSharedValue<SkImage | null>(null);\n useEffect(() => {\n runOnUI(createTextureValue)(texture, picture, size);\n }, [texture, picture, size]);\n return texture;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAKA,IAAAC,UAAA,GAAAD,OAAA;AAKA,IAAAE,cAAA,GAAAF,OAAA;AAEA,MAAMG,kBAAkB,GAAGA,CACzBC,OAAoC,EACpCC,OAAkB,EAClBC,IAAY,KACT;EACH,SAAS;;EACTF,OAAO,CAACG,KAAK,GAAG,IAAAC,iCAAsB,EAACH,OAAO,EAAEC,IAAI,CAAC;AACvD,CAAC;AAEM,MAAMG,eAAe,GAAGA,CAACC,OAAqB,EAAEJ,IAAY,KAAK;EACtE,MAAMD,OAAO,GAAG,IAAAM,cAAO,EAAC,MAAM;IAC5B,OAAO,IAAAC,wBAAa,EAACF,OAAO,CAAC;EAC/B,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EACb,OAAOG,0BAA0B,CAACR,OAAO,EAAEC,IAAI,CAAC;AAClD,CAAC;AAACQ,OAAA,CAAAL,eAAA,GAAAA,eAAA;AAEK,MAAMI,0BAA0B,GAAGA,CACxCR,OAAkB,EAClBC,IAAY,KACT;EACH,MAAMF,OAAO,GAAG,IAAAW,6BAAc,EAAiB,IAAI,CAAC;EACpD,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAAC,sBAAO,EAACd,kBAAkB,CAAC,CAACC,OAAO,EAAEC,OAAO,EAAEC,IAAI,CAAC;EACrD,CAAC,EAAE,CAACF,OAAO,EAAEC,OAAO,EAAEC,IAAI,CAAC,CAAC;EAC5B,OAAOF,OAAO;AAChB,CAAC;AAACU,OAAA,CAAAD,0BAAA,GAAAA,0BAAA"}
1
+ {"version":3,"names":["_react","require","_Offscreen","_skia","_moduleWrapper","createTexture","texture","picture","size","value","drawAsImageFromPicture","useTexture","element","useMemo","drawAsPicture","usePictureAsTexture","exports","useTextureAsValue","console","warn","useTextureValueFromPicture","useSharedValue","useEffect","runOnUI","useImageAsTexture","source","image","useImage","width","height","recorder","Skia","PictureRecorder","canvas","beginRecording","x","y","drawImage","finishRecordingAsPicture"],"sources":["textures.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type {\n DataSourceParam,\n SkImage,\n SkPicture,\n SkSize,\n} from \"../../skia/types\";\nimport {\n drawAsImageFromPicture,\n drawAsPicture,\n} from \"../../renderer/Offscreen\";\nimport { Skia, useImage } from \"../../skia\";\n\nimport { runOnUI, useSharedValue } from \"./moduleWrapper\";\n\nconst createTexture = (\n texture: SharedValue<SkImage | null>,\n picture: SkPicture,\n size: SkSize\n) => {\n \"worklet\";\n texture.value = drawAsImageFromPicture(picture, size);\n};\n\nexport const useTexture = (element: ReactElement, size: SkSize) => {\n const picture = useMemo(() => {\n return drawAsPicture(element);\n }, [element]);\n return usePictureAsTexture(picture, size);\n};\n\nexport const useTextureAsValue = (element: ReactElement, size: SkSize) => {\n console.warn(\"useTextureAsValue has been renamed to use useTexture\");\n return useTexture(element, size);\n};\n\nexport const useTextureValueFromPicture = (\n picture: SkPicture | null,\n size: SkSize\n) => {\n console.warn(\n \"useTextureValueFromPicture has been renamed to use usePictureAsTexture\"\n );\n return usePictureAsTexture(picture, size);\n};\n\nexport const usePictureAsTexture = (\n picture: SkPicture | null,\n size: SkSize\n) => {\n const texture = useSharedValue<SkImage | null>(null);\n useEffect(() => {\n if (picture !== null) {\n runOnUI(createTexture)(texture, picture, size);\n }\n }, [texture, picture, size]);\n return texture;\n};\n\nexport const useImageAsTexture = (source: DataSourceParam) => {\n const image = useImage(source);\n const size = useMemo(() => {\n if (image) {\n return { width: image.width(), height: image.height() };\n }\n return { width: 0, height: 0 };\n }, [image]);\n const picture = useMemo(() => {\n if (image) {\n const recorder = Skia.PictureRecorder();\n const canvas = recorder.beginRecording({\n x: 0,\n y: 0,\n width: size.width,\n height: size.height,\n });\n canvas.drawImage(image, 0, 0);\n return recorder.finishRecordingAsPicture();\n } else {\n return null;\n }\n }, [size, image]);\n return usePictureAsTexture(picture, size);\n};\n"],"mappings":"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"}
@@ -108,10 +108,23 @@ const View = ({
108
108
  };
109
109
  export const Platform = {
110
110
  OS: "web",
111
- PixelRatio: window.devicePixelRatio,
111
+ PixelRatio: typeof window !== "undefined" ? window.devicePixelRatio : 1,
112
+ // window is not defined on node
112
113
  resolveAsset: source => {
113
114
  if (isRNModule(source)) {
114
- throw new Error("Image source is a number - this is not supported on the web");
115
+ if (typeof source === "number" && typeof require === "function") {
116
+ const {
117
+ getAssetByID
118
+ } = require("react-native/Libraries/Image/AssetRegistry");
119
+ const {
120
+ httpServerLocation,
121
+ name,
122
+ type
123
+ } = getAssetByID(source);
124
+ const uri = `${httpServerLocation}/${name}.${type}`;
125
+ return uri;
126
+ }
127
+ throw new Error("Asset source is a number - this is not supported on the web");
115
128
  }
116
129
  return source.default;
117
130
  },
@@ -1 +1 @@
1
- {"version":3,"names":["React","useLayoutEffect","useMemo","useRef","isRNModule","DOM_LAYOUT_HANDLER_NAME","resizeObserver","getObserver","window","ResizeObserver","entries","forEach","entry","node","target","left","top","width","height","contentRect","onLayout","setTimeout","timeStamp","Date","now","nativeEvent","layout","x","y","currentTarget","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","Error","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","useElementLayout","ref","observer","current","observe","unobserve","View","children","style","rawStyle","cssStyles","display","flexDirection","flexWrap","justifyContent","alignItems","alignContent","createElement","Platform","OS","PixelRatio","devicePixelRatio","resolveAsset","source","default","findNodeHandle"],"sources":["Platform.web.tsx"],"sourcesContent":["import type { RefObject, CSSProperties } from \"react\";\nimport React, { useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { LayoutChangeEvent, ViewComponent, ViewProps } from \"react-native\";\n\nimport type { DataModule } from \"../skia/types\";\nimport { isRNModule } from \"../skia/types\";\n\nimport type { IPlatform } from \"./IPlatform\";\n\n// eslint-disable-next-line max-len\n// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/modules/useElementLayout/index.js\nconst DOM_LAYOUT_HANDLER_NAME = \"__reactLayoutHandler\";\ntype OnLayout = ((event: LayoutChangeEvent) => void) | undefined;\ntype Div = HTMLDivElement & {\n __reactLayoutHandler: OnLayout;\n};\n\nlet resizeObserver: ResizeObserver | null = null;\n\nconst getObserver = () => {\n if (resizeObserver == null) {\n resizeObserver = new window.ResizeObserver(function (entries) {\n entries.forEach((entry) => {\n const node = entry.target as Div;\n const { left, top, width, height } = entry.contentRect;\n const onLayout = node[DOM_LAYOUT_HANDLER_NAME];\n if (typeof onLayout === \"function\") {\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () =>\n onLayout({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x: left, y: top, width, height } },\n currentTarget: 0,\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n }),\n 0\n );\n }\n });\n });\n }\n return resizeObserver;\n};\n\nconst useElementLayout = (ref: RefObject<Div>, onLayout: OnLayout) => {\n const observer = getObserver();\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node !== null) {\n node[DOM_LAYOUT_HANDLER_NAME] = onLayout;\n }\n }, [ref, onLayout]);\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node != null && observer != null) {\n if (typeof node[DOM_LAYOUT_HANDLER_NAME] === \"function\") {\n observer.observe(node);\n } else {\n observer.unobserve(node);\n }\n }\n return () => {\n if (node != null && observer != null) {\n observer.unobserve(node);\n }\n };\n }, [observer, ref]);\n};\n\nconst View = (({ children, onLayout, style: rawStyle }: ViewProps) => {\n const style = useMemo(() => (rawStyle ?? {}) as CSSProperties, [rawStyle]);\n const ref = useRef<Div>(null);\n useElementLayout(ref, onLayout);\n const cssStyles = useMemo(() => {\n return {\n ...style,\n display: \"flex\",\n flexDirection: style.flexDirection || \"inherit\",\n flexWrap: style.flexWrap || \"nowrap\",\n justifyContent: style.justifyContent || \"flex-start\",\n alignItems: style.alignItems || \"stretch\",\n alignContent: style.alignContent || \"stretch\",\n };\n }, [style]);\n\n return (\n <div ref={ref} style={cssStyles}>\n {children}\n </div>\n );\n}) as unknown as typeof ViewComponent;\n\nexport const Platform: IPlatform = {\n OS: \"web\",\n PixelRatio: window.devicePixelRatio,\n resolveAsset: (source: DataModule) => {\n if (isRNModule(source)) {\n throw new Error(\n \"Image source is a number - this is not supported on the web\"\n );\n }\n return source.default;\n },\n findNodeHandle: () => {\n throw new Error(\"findNodeHandle is not supported on the web\");\n },\n View,\n};\n"],"mappings":"AACA,OAAOA,KAAK,IAAIC,eAAe,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAI/D,SAASC,UAAU,QAAQ,eAAe;AAI1C;AACA;AACA,MAAMC,uBAAuB,GAAG,sBAAsB;AAMtD,IAAIC,cAAqC,GAAG,IAAI;AAEhD,MAAMC,WAAW,GAAGA,CAAA,KAAM;EACxB,IAAID,cAAc,IAAI,IAAI,EAAE;IAC1BA,cAAc,GAAG,IAAIE,MAAM,CAACC,cAAc,CAAC,UAAUC,OAAO,EAAE;MAC5DA,OAAO,CAACC,OAAO,CAAEC,KAAK,IAAK;QACzB,MAAMC,IAAI,GAAGD,KAAK,CAACE,MAAa;QAChC,MAAM;UAAEC,IAAI;UAAEC,GAAG;UAAEC,KAAK;UAAEC;QAAO,CAAC,GAAGN,KAAK,CAACO,WAAW;QACtD,MAAMC,QAAQ,GAAGP,IAAI,CAACR,uBAAuB,CAAC;QAC9C,IAAI,OAAOe,QAAQ,KAAK,UAAU,EAAE;UAClC;UACAC,UAAU,CACR,MACED,QAAQ,CAAC;YACPE,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,WAAW,EAAE;cAAEC,MAAM,EAAE;gBAAEC,CAAC,EAAEZ,IAAI;gBAAEa,CAAC,EAAEZ,GAAG;gBAAEC,KAAK;gBAAEC;cAAO;YAAE,CAAC;YAC3DW,aAAa,EAAE,CAAC;YAChBf,MAAM,EAAE,CAAC;YACTgB,OAAO,EAAE,KAAK;YACdC,UAAU,EAAE,KAAK;YACjBC,gBAAgB,EAAE,KAAK;YACvBC,UAAU,EAAE,CAAC;YACbC,kBAAkBA,CAAA,EAAG;cACnB,MAAM,IAAIC,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDC,oBAAoBA,CAAA,EAAG;cACrB,MAAM,IAAID,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDE,OAAOA,CAAA,EAAG;cACR,MAAM,IAAIF,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDG,cAAcA,CAAA,EAAG;cACf,MAAM,IAAIH,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDI,eAAeA,CAAA,EAAG;cAChB,MAAM,IAAIJ,KAAK,CAAC,8BAA8B,CAAC;YACjD,CAAC;YACDK,SAAS,EAAE,IAAI;YACfC,IAAI,EAAE;UACR,CAAC,CAAC,EACJ,CACF,CAAC;QACH;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA,OAAOnC,cAAc;AACvB,CAAC;AAED,MAAMoC,gBAAgB,GAAGA,CAACC,GAAmB,EAAEvB,QAAkB,KAAK;EACpE,MAAMwB,QAAQ,GAAGrC,WAAW,CAAC,CAAC;EAE9BN,eAAe,CAAC,MAAM;IACpB,MAAMY,IAAI,GAAG8B,GAAG,CAACE,OAAO;IACxB,IAAIhC,IAAI,KAAK,IAAI,EAAE;MACjBA,IAAI,CAACR,uBAAuB,CAAC,GAAGe,QAAQ;IAC1C;EACF,CAAC,EAAE,CAACuB,GAAG,EAAEvB,QAAQ,CAAC,CAAC;EAEnBnB,eAAe,CAAC,MAAM;IACpB,MAAMY,IAAI,GAAG8B,GAAG,CAACE,OAAO;IACxB,IAAIhC,IAAI,IAAI,IAAI,IAAI+B,QAAQ,IAAI,IAAI,EAAE;MACpC,IAAI,OAAO/B,IAAI,CAACR,uBAAuB,CAAC,KAAK,UAAU,EAAE;QACvDuC,QAAQ,CAACE,OAAO,CAACjC,IAAI,CAAC;MACxB,CAAC,MAAM;QACL+B,QAAQ,CAACG,SAAS,CAAClC,IAAI,CAAC;MAC1B;IACF;IACA,OAAO,MAAM;MACX,IAAIA,IAAI,IAAI,IAAI,IAAI+B,QAAQ,IAAI,IAAI,EAAE;QACpCA,QAAQ,CAACG,SAAS,CAAClC,IAAI,CAAC;MAC1B;IACF,CAAC;EACH,CAAC,EAAE,CAAC+B,QAAQ,EAAED,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAMK,IAAI,GAAIA,CAAC;EAAEC,QAAQ;EAAE7B,QAAQ;EAAE8B,KAAK,EAAEC;AAAoB,CAAC,KAAK;EACpE,MAAMD,KAAK,GAAGhD,OAAO,CAAC,MAAOiD,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAI,CAAC,CAAmB,EAAE,CAACA,QAAQ,CAAC,CAAC;EAC1E,MAAMR,GAAG,GAAGxC,MAAM,CAAM,IAAI,CAAC;EAC7BuC,gBAAgB,CAACC,GAAG,EAAEvB,QAAQ,CAAC;EAC/B,MAAMgC,SAAS,GAAGlD,OAAO,CAAC,MAAM;IAC9B,OAAO;MACL,GAAGgD,KAAK;MACRG,OAAO,EAAE,MAAM;MACfC,aAAa,EAAEJ,KAAK,CAACI,aAAa,IAAI,SAAS;MAC/CC,QAAQ,EAAEL,KAAK,CAACK,QAAQ,IAAI,QAAQ;MACpCC,cAAc,EAAEN,KAAK,CAACM,cAAc,IAAI,YAAY;MACpDC,UAAU,EAAEP,KAAK,CAACO,UAAU,IAAI,SAAS;MACzCC,YAAY,EAAER,KAAK,CAACQ,YAAY,IAAI;IACtC,CAAC;EACH,CAAC,EAAE,CAACR,KAAK,CAAC,CAAC;EAEX,oBACElD,KAAA,CAAA2D,aAAA;IAAKhB,GAAG,EAAEA,GAAI;IAACO,KAAK,EAAEE;EAAU,GAC7BH,QACE,CAAC;AAEV,CAAqC;AAErC,OAAO,MAAMW,QAAmB,GAAG;EACjCC,EAAE,EAAE,KAAK;EACTC,UAAU,EAAEtD,MAAM,CAACuD,gBAAgB;EACnCC,YAAY,EAAGC,MAAkB,IAAK;IACpC,IAAI7D,UAAU,CAAC6D,MAAM,CAAC,EAAE;MACtB,MAAM,IAAI9B,KAAK,CACb,6DACF,CAAC;IACH;IACA,OAAO8B,MAAM,CAACC,OAAO;EACvB,CAAC;EACDC,cAAc,EAAEA,CAAA,KAAM;IACpB,MAAM,IAAIhC,KAAK,CAAC,4CAA4C,CAAC;EAC/D,CAAC;EACDa;AACF,CAAC"}
1
+ {"version":3,"names":["React","useLayoutEffect","useMemo","useRef","isRNModule","DOM_LAYOUT_HANDLER_NAME","resizeObserver","getObserver","window","ResizeObserver","entries","forEach","entry","node","target","left","top","width","height","contentRect","onLayout","setTimeout","timeStamp","Date","now","nativeEvent","layout","x","y","currentTarget","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","Error","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","useElementLayout","ref","observer","current","observe","unobserve","View","children","style","rawStyle","cssStyles","display","flexDirection","flexWrap","justifyContent","alignItems","alignContent","createElement","Platform","OS","PixelRatio","devicePixelRatio","resolveAsset","source","require","getAssetByID","httpServerLocation","name","uri","default","findNodeHandle"],"sources":["Platform.web.tsx"],"sourcesContent":["import type { RefObject, CSSProperties } from \"react\";\nimport React, { useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { LayoutChangeEvent, ViewComponent, ViewProps } from \"react-native\";\n\nimport type { DataModule } from \"../skia/types\";\nimport { isRNModule } from \"../skia/types\";\n\nimport type { IPlatform } from \"./IPlatform\";\n\n// eslint-disable-next-line max-len\n// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/modules/useElementLayout/index.js\nconst DOM_LAYOUT_HANDLER_NAME = \"__reactLayoutHandler\";\ntype OnLayout = ((event: LayoutChangeEvent) => void) | undefined;\ntype Div = HTMLDivElement & {\n __reactLayoutHandler: OnLayout;\n};\n\nlet resizeObserver: ResizeObserver | null = null;\n\nconst getObserver = () => {\n if (resizeObserver == null) {\n resizeObserver = new window.ResizeObserver(function (entries) {\n entries.forEach((entry) => {\n const node = entry.target as Div;\n const { left, top, width, height } = entry.contentRect;\n const onLayout = node[DOM_LAYOUT_HANDLER_NAME];\n if (typeof onLayout === \"function\") {\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () =>\n onLayout({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x: left, y: top, width, height } },\n currentTarget: 0,\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n }),\n 0\n );\n }\n });\n });\n }\n return resizeObserver;\n};\n\nconst useElementLayout = (ref: RefObject<Div>, onLayout: OnLayout) => {\n const observer = getObserver();\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node !== null) {\n node[DOM_LAYOUT_HANDLER_NAME] = onLayout;\n }\n }, [ref, onLayout]);\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node != null && observer != null) {\n if (typeof node[DOM_LAYOUT_HANDLER_NAME] === \"function\") {\n observer.observe(node);\n } else {\n observer.unobserve(node);\n }\n }\n return () => {\n if (node != null && observer != null) {\n observer.unobserve(node);\n }\n };\n }, [observer, ref]);\n};\n\nconst View = (({ children, onLayout, style: rawStyle }: ViewProps) => {\n const style = useMemo(() => (rawStyle ?? {}) as CSSProperties, [rawStyle]);\n const ref = useRef<Div>(null);\n useElementLayout(ref, onLayout);\n const cssStyles = useMemo(() => {\n return {\n ...style,\n display: \"flex\",\n flexDirection: style.flexDirection || \"inherit\",\n flexWrap: style.flexWrap || \"nowrap\",\n justifyContent: style.justifyContent || \"flex-start\",\n alignItems: style.alignItems || \"stretch\",\n alignContent: style.alignContent || \"stretch\",\n };\n }, [style]);\n\n return (\n <div ref={ref} style={cssStyles}>\n {children}\n </div>\n );\n}) as unknown as typeof ViewComponent;\n\nexport const Platform: IPlatform = {\n OS: \"web\",\n PixelRatio: typeof window !== \"undefined\" ? window.devicePixelRatio : 1, // window is not defined on node\n resolveAsset: (source: DataModule) => {\n if (isRNModule(source)) {\n if (typeof source === \"number\" && typeof require === \"function\") {\n const {\n getAssetByID,\n } = require(\"react-native/Libraries/Image/AssetRegistry\");\n const { httpServerLocation, name, type } = getAssetByID(source);\n const uri = `${httpServerLocation}/${name}.${type}`;\n return uri;\n }\n throw new Error(\n \"Asset source is a number - this is not supported on the web\"\n );\n }\n return source.default;\n },\n findNodeHandle: () => {\n throw new Error(\"findNodeHandle is not supported on the web\");\n },\n View,\n};\n"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
2
- export declare const useRectBuffer: (size: number, modifier: (input: SkHostRect, index: number) => void) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
3
- export declare const useRSXformBuffer: (size: number, modifier: (input: SkRSXform, index: number) => void) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
4
- export declare const usePointBuffer: (size: number, modifier: (input: SkPoint, index: number) => void) => import("react-native-reanimated").SharedValue<SkPoint[]>;
5
- export declare const useColorBuffer: (size: number, modifier: (input: SkColor, index: number) => void) => import("react-native-reanimated").SharedValue<Float32Array[]>;
2
+ type Modifier<T> = (input: T, index: number) => void;
3
+ export declare const useRectBuffer: (size: number, modifier: Modifier<SkHostRect>) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
4
+ export declare const useRSXformBuffer: (size: number, modifier: Modifier<SkRSXform>) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
5
+ export declare const usePointBuffer: (size: number, modifier: Modifier<SkPoint>) => import("react-native-reanimated").SharedValue<SkPoint[]>;
6
+ export declare const useColorBuffer: (size: number, modifier: Modifier<SkColor>) => import("react-native-reanimated").SharedValue<Float32Array[]>;
7
+ export {};
@@ -1,20 +1,30 @@
1
- import { useMemo } from "react";
1
+ import { useEffect, useMemo } from "react";
2
+ import { startMapper, stopMapper } from "react-native-reanimated";
2
3
  import { Skia } from "../../skia";
3
- import { useDerivedValue, useSharedValue } from "./moduleWrapper";
4
+ import { useSharedValue } from "./moduleWrapper";
4
5
  import { notifyChange } from "./interpolators";
5
6
  const useBuffer = (size, bufferInitializer, modifier) => {
7
+ var _mod$__closure;
6
8
  const buffer = useMemo(() => new Array(size).fill(0).map(bufferInitializer),
7
9
  // eslint-disable-next-line react-hooks/exhaustive-deps
8
10
  [size]);
9
- const transforms = useSharedValue(buffer);
10
- useDerivedValue(() => {
11
+ const values = useSharedValue(buffer);
12
+ const mod = modifier;
13
+ const deps = Object.values((_mod$__closure = mod.__closure) !== null && _mod$__closure !== void 0 ? _mod$__closure : {});
14
+ const mapperId = startMapper(() => {
15
+ "worklet";
16
+
11
17
  buffer.forEach((val, index) => {
12
18
  modifier(val, index);
13
19
  });
14
- // Assuming notifyChange is a function that notifies about the change in transforms.
15
- notifyChange(transforms);
16
- });
17
- return transforms;
20
+ notifyChange(values);
21
+ }, deps);
22
+ useEffect(() => {
23
+ return () => {
24
+ stopMapper(mapperId);
25
+ };
26
+ }, [mapperId]);
27
+ return values;
18
28
  };
19
29
  export const useRectBuffer = (size, modifier) => useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);
20
30
 
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Skia","useDerivedValue","useSharedValue","notifyChange","useBuffer","size","bufferInitializer","modifier","buffer","Array","fill","map","transforms","forEach","val","index","useRectBuffer","XYWHRect","useRSXformBuffer","RSXform","usePointBuffer","Point","useColorBuffer","Color"],"sources":["buffers.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport type { SkColor, SkHostRect, SkPoint, SkRSXform } from \"../../skia/types\";\nimport { Skia } from \"../../skia\";\n\nimport { useDerivedValue, useSharedValue } from \"./moduleWrapper\";\nimport { notifyChange } from \"./interpolators\";\n\nconst useBuffer = <T>(\n size: number,\n bufferInitializer: () => T,\n modifier: (input: T, index: number) => void\n) => {\n const buffer = useMemo(\n () => new Array(size).fill(0).map(bufferInitializer),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [size]\n );\n const transforms = useSharedValue(buffer);\n\n useDerivedValue(() => {\n buffer.forEach((val, index) => {\n modifier(val, index);\n });\n // Assuming notifyChange is a function that notifies about the change in transforms.\n notifyChange(transforms);\n });\n\n return transforms;\n};\n\nexport const useRectBuffer = (\n size: number,\n modifier: (input: SkHostRect, index: number) => void\n) => useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);\n\n// Usage for RSXform Buffer\nexport const useRSXformBuffer = (\n size: number,\n modifier: (input: SkRSXform, index: number) => void\n) => useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);\n\n// Usage for Point Buffer\nexport const usePointBuffer = (\n size: number,\n modifier: (input: SkPoint, index: number) => void\n) => useBuffer(size, () => Skia.Point(0, 0), modifier);\n\n// Usage for Color Buffer\nexport const useColorBuffer = (\n size: number,\n modifier: (input: SkColor, index: number) => void\n) => useBuffer(size, () => Skia.Color(\"black\"), modifier);\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,SAASC,IAAI,QAAQ,YAAY;AAEjC,SAASC,eAAe,EAAEC,cAAc,QAAQ,iBAAiB;AACjE,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAMC,SAAS,GAAGA,CAChBC,IAAY,EACZC,iBAA0B,EAC1BC,QAA2C,KACxC;EACH,MAAMC,MAAM,GAAGT,OAAO,CACpB,MAAM,IAAIU,KAAK,CAACJ,IAAI,CAAC,CAACK,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAACL,iBAAiB,CAAC;EACpD;EACA,CAACD,IAAI,CACP,CAAC;EACD,MAAMO,UAAU,GAAGV,cAAc,CAACM,MAAM,CAAC;EAEzCP,eAAe,CAAC,MAAM;IACpBO,MAAM,CAACK,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MAC7BR,QAAQ,CAACO,GAAG,EAAEC,KAAK,CAAC;IACtB,CAAC,CAAC;IACF;IACAZ,YAAY,CAACS,UAAU,CAAC;EAC1B,CAAC,CAAC;EAEF,OAAOA,UAAU;AACnB,CAAC;AAED,OAAO,MAAMI,aAAa,GAAGA,CAC3BX,IAAY,EACZE,QAAoD,KACjDH,SAAS,CAACC,IAAI,EAAE,MAAML,IAAI,CAACiB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEV,QAAQ,CAAC;;AAE/D;AACA,OAAO,MAAMW,gBAAgB,GAAGA,CAC9Bb,IAAY,EACZE,QAAmD,KAChDH,SAAS,CAACC,IAAI,EAAE,MAAML,IAAI,CAACmB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEZ,QAAQ,CAAC;;AAE9D;AACA,OAAO,MAAMa,cAAc,GAAGA,CAC5Bf,IAAY,EACZE,QAAiD,KAC9CH,SAAS,CAACC,IAAI,EAAE,MAAML,IAAI,CAACqB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEd,QAAQ,CAAC;;AAEtD;AACA,OAAO,MAAMe,cAAc,GAAGA,CAC5BjB,IAAY,EACZE,QAAiD,KAC9CH,SAAS,CAACC,IAAI,EAAE,MAAML,IAAI,CAACuB,KAAK,CAAC,OAAO,CAAC,EAAEhB,QAAQ,CAAC"}
1
+ {"version":3,"names":["useEffect","useMemo","startMapper","stopMapper","Skia","useSharedValue","notifyChange","useBuffer","size","bufferInitializer","modifier","_mod$__closure","buffer","Array","fill","map","values","mod","deps","Object","__closure","mapperId","forEach","val","index","useRectBuffer","XYWHRect","useRSXformBuffer","RSXform","usePointBuffer","Point","useColorBuffer","Color"],"sources":["buffers.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { startMapper, stopMapper } from \"react-native-reanimated\";\nimport type { WorkletFunction } from \"react-native-reanimated/lib/typescript/reanimated2/commonTypes\";\n\nimport type { SkColor, SkHostRect, SkPoint, SkRSXform } from \"../../skia/types\";\nimport { Skia } from \"../../skia\";\n\nimport { useSharedValue } from \"./moduleWrapper\";\nimport { notifyChange } from \"./interpolators\";\n\ntype Modifier<T> = (input: T, index: number) => void;\n\nconst useBuffer = <T>(\n size: number,\n bufferInitializer: () => T,\n modifier: Modifier<T>\n) => {\n const buffer = useMemo(\n () => new Array(size).fill(0).map(bufferInitializer),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [size]\n );\n const values = useSharedValue(buffer);\n const mod = modifier as WorkletFunction;\n const deps = Object.values(mod.__closure ?? {});\n const mapperId = startMapper(() => {\n \"worklet\";\n buffer.forEach((val, index) => {\n modifier(val, index);\n });\n notifyChange(values);\n }, deps);\n\n useEffect(() => {\n return () => {\n stopMapper(mapperId);\n };\n }, [mapperId]);\n\n return values;\n};\n\nexport const useRectBuffer = (size: number, modifier: Modifier<SkHostRect>) =>\n useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);\n\n// Usage for RSXform Buffer\nexport const useRSXformBuffer = (size: number, modifier: Modifier<SkRSXform>) =>\n useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);\n\n// Usage for Point Buffer\nexport const usePointBuffer = (size: number, modifier: Modifier<SkPoint>) =>\n useBuffer(size, () => Skia.Point(0, 0), modifier);\n\n// Usage for Color Buffer\nexport const useColorBuffer = (size: number, modifier: Modifier<SkColor>) =>\n useBuffer(size, () => Skia.Color(\"black\"), modifier);\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAC1C,SAASC,WAAW,EAAEC,UAAU,QAAQ,yBAAyB;AAIjE,SAASC,IAAI,QAAQ,YAAY;AAEjC,SAASC,cAAc,QAAQ,iBAAiB;AAChD,SAASC,YAAY,QAAQ,iBAAiB;AAI9C,MAAMC,SAAS,GAAGA,CAChBC,IAAY,EACZC,iBAA0B,EAC1BC,QAAqB,KAClB;EAAA,IAAAC,cAAA;EACH,MAAMC,MAAM,GAAGX,OAAO,CACpB,MAAM,IAAIY,KAAK,CAACL,IAAI,CAAC,CAACM,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAACN,iBAAiB,CAAC;EACpD;EACA,CAACD,IAAI,CACP,CAAC;EACD,MAAMQ,MAAM,GAAGX,cAAc,CAACO,MAAM,CAAC;EACrC,MAAMK,GAAG,GAAGP,QAA2B;EACvC,MAAMQ,IAAI,GAAGC,MAAM,CAACH,MAAM,EAAAL,cAAA,GAACM,GAAG,CAACG,SAAS,cAAAT,cAAA,cAAAA,cAAA,GAAI,CAAC,CAAC,CAAC;EAC/C,MAAMU,QAAQ,GAAGnB,WAAW,CAAC,MAAM;IACjC,SAAS;;IACTU,MAAM,CAACU,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MAC7Bd,QAAQ,CAACa,GAAG,EAAEC,KAAK,CAAC;IACtB,CAAC,CAAC;IACFlB,YAAY,CAACU,MAAM,CAAC;EACtB,CAAC,EAAEE,IAAI,CAAC;EAERlB,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXG,UAAU,CAACkB,QAAQ,CAAC;IACtB,CAAC;EACH,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAOL,MAAM;AACf,CAAC;AAED,OAAO,MAAMS,aAAa,GAAGA,CAACjB,IAAY,EAAEE,QAA8B,KACxEH,SAAS,CAACC,IAAI,EAAE,MAAMJ,IAAI,CAACsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEhB,QAAQ,CAAC;;AAE5D;AACA,OAAO,MAAMiB,gBAAgB,GAAGA,CAACnB,IAAY,EAAEE,QAA6B,KAC1EH,SAAS,CAACC,IAAI,EAAE,MAAMJ,IAAI,CAACwB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAElB,QAAQ,CAAC;;AAE3D;AACA,OAAO,MAAMmB,cAAc,GAAGA,CAACrB,IAAY,EAAEE,QAA2B,KACtEH,SAAS,CAACC,IAAI,EAAE,MAAMJ,IAAI,CAAC0B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEpB,QAAQ,CAAC;;AAEnD;AACA,OAAO,MAAMqB,cAAc,GAAGA,CAACvB,IAAY,EAAEE,QAA2B,KACtEH,SAAS,CAACC,IAAI,EAAE,MAAMJ,IAAI,CAAC4B,KAAK,CAAC,OAAO,CAAC,EAAEtB,QAAQ,CAAC"}
@@ -1,5 +1,8 @@
1
1
  import type { ReactElement } from "react";
2
2
  import type { SharedValue } from "react-native-reanimated";
3
- import type { SkImage, SkPicture, SkSize } from "../../skia/types";
4
- export declare const useTextureValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
- export declare const useTextureValueFromPicture: (picture: SkPicture, size: SkSize) => SharedValue<SkImage | null>;
3
+ import type { DataSourceParam, SkImage, SkPicture, SkSize } from "../../skia/types";
4
+ export declare const useTexture: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
+ export declare const useTextureAsValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
6
+ export declare const useTextureValueFromPicture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
7
+ export declare const usePictureAsTexture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
8
+ export declare const useImageAsTexture: (source: DataSourceParam) => SharedValue<SkImage | null>;
@@ -1,22 +1,64 @@
1
1
  import { useEffect, useMemo } from "react";
2
2
  import { drawAsImageFromPicture, drawAsPicture } from "../../renderer/Offscreen";
3
+ import { Skia, useImage } from "../../skia";
3
4
  import { runOnUI, useSharedValue } from "./moduleWrapper";
4
- const createTextureValue = (texture, picture, size) => {
5
+ const createTexture = (texture, picture, size) => {
5
6
  "worklet";
6
7
 
7
8
  texture.value = drawAsImageFromPicture(picture, size);
8
9
  };
9
- export const useTextureValue = (element, size) => {
10
+ export const useTexture = (element, size) => {
10
11
  const picture = useMemo(() => {
11
12
  return drawAsPicture(element);
12
13
  }, [element]);
13
- return useTextureValueFromPicture(picture, size);
14
+ return usePictureAsTexture(picture, size);
15
+ };
16
+ export const useTextureAsValue = (element, size) => {
17
+ console.warn("useTextureAsValue has been renamed to use useTexture");
18
+ return useTexture(element, size);
14
19
  };
15
20
  export const useTextureValueFromPicture = (picture, size) => {
21
+ console.warn("useTextureValueFromPicture has been renamed to use usePictureAsTexture");
22
+ return usePictureAsTexture(picture, size);
23
+ };
24
+ export const usePictureAsTexture = (picture, size) => {
16
25
  const texture = useSharedValue(null);
17
26
  useEffect(() => {
18
- runOnUI(createTextureValue)(texture, picture, size);
27
+ if (picture !== null) {
28
+ runOnUI(createTexture)(texture, picture, size);
29
+ }
19
30
  }, [texture, picture, size]);
20
31
  return texture;
21
32
  };
33
+ export const useImageAsTexture = source => {
34
+ const image = useImage(source);
35
+ const size = useMemo(() => {
36
+ if (image) {
37
+ return {
38
+ width: image.width(),
39
+ height: image.height()
40
+ };
41
+ }
42
+ return {
43
+ width: 0,
44
+ height: 0
45
+ };
46
+ }, [image]);
47
+ const picture = useMemo(() => {
48
+ if (image) {
49
+ const recorder = Skia.PictureRecorder();
50
+ const canvas = recorder.beginRecording({
51
+ x: 0,
52
+ y: 0,
53
+ width: size.width,
54
+ height: size.height
55
+ });
56
+ canvas.drawImage(image, 0, 0);
57
+ return recorder.finishRecordingAsPicture();
58
+ } else {
59
+ return null;
60
+ }
61
+ }, [size, image]);
62
+ return usePictureAsTexture(picture, size);
63
+ };
22
64
  //# sourceMappingURL=textures.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useMemo","drawAsImageFromPicture","drawAsPicture","runOnUI","useSharedValue","createTextureValue","texture","picture","size","value","useTextureValue","element","useTextureValueFromPicture"],"sources":["textures.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type { SkImage, SkPicture, SkSize } from \"../../skia/types\";\nimport {\n drawAsImageFromPicture,\n drawAsPicture,\n} from \"../../renderer/Offscreen\";\n\nimport { runOnUI, useSharedValue } from \"./moduleWrapper\";\n\nconst createTextureValue = (\n texture: SharedValue<SkImage | null>,\n picture: SkPicture,\n size: SkSize\n) => {\n \"worklet\";\n texture.value = drawAsImageFromPicture(picture, size);\n};\n\nexport const useTextureValue = (element: ReactElement, size: SkSize) => {\n const picture = useMemo(() => {\n return drawAsPicture(element);\n }, [element]);\n return useTextureValueFromPicture(picture, size);\n};\n\nexport const useTextureValueFromPicture = (\n picture: SkPicture,\n size: SkSize\n) => {\n const texture = useSharedValue<SkImage | null>(null);\n useEffect(() => {\n runOnUI(createTextureValue)(texture, picture, size);\n }, [texture, picture, size]);\n return texture;\n};\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAK1C,SACEC,sBAAsB,EACtBC,aAAa,QACR,0BAA0B;AAEjC,SAASC,OAAO,EAAEC,cAAc,QAAQ,iBAAiB;AAEzD,MAAMC,kBAAkB,GAAGA,CACzBC,OAAoC,EACpCC,OAAkB,EAClBC,IAAY,KACT;EACH,SAAS;;EACTF,OAAO,CAACG,KAAK,GAAGR,sBAAsB,CAACM,OAAO,EAAEC,IAAI,CAAC;AACvD,CAAC;AAED,OAAO,MAAME,eAAe,GAAGA,CAACC,OAAqB,EAAEH,IAAY,KAAK;EACtE,MAAMD,OAAO,GAAGP,OAAO,CAAC,MAAM;IAC5B,OAAOE,aAAa,CAACS,OAAO,CAAC;EAC/B,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EACb,OAAOC,0BAA0B,CAACL,OAAO,EAAEC,IAAI,CAAC;AAClD,CAAC;AAED,OAAO,MAAMI,0BAA0B,GAAGA,CACxCL,OAAkB,EAClBC,IAAY,KACT;EACH,MAAMF,OAAO,GAAGF,cAAc,CAAiB,IAAI,CAAC;EACpDL,SAAS,CAAC,MAAM;IACdI,OAAO,CAACE,kBAAkB,CAAC,CAACC,OAAO,EAAEC,OAAO,EAAEC,IAAI,CAAC;EACrD,CAAC,EAAE,CAACF,OAAO,EAAEC,OAAO,EAAEC,IAAI,CAAC,CAAC;EAC5B,OAAOF,OAAO;AAChB,CAAC"}
1
+ {"version":3,"names":["useEffect","useMemo","drawAsImageFromPicture","drawAsPicture","Skia","useImage","runOnUI","useSharedValue","createTexture","texture","picture","size","value","useTexture","element","usePictureAsTexture","useTextureAsValue","console","warn","useTextureValueFromPicture","useImageAsTexture","source","image","width","height","recorder","PictureRecorder","canvas","beginRecording","x","y","drawImage","finishRecordingAsPicture"],"sources":["textures.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type {\n DataSourceParam,\n SkImage,\n SkPicture,\n SkSize,\n} from \"../../skia/types\";\nimport {\n drawAsImageFromPicture,\n drawAsPicture,\n} from \"../../renderer/Offscreen\";\nimport { Skia, useImage } from \"../../skia\";\n\nimport { runOnUI, useSharedValue } from \"./moduleWrapper\";\n\nconst createTexture = (\n texture: SharedValue<SkImage | null>,\n picture: SkPicture,\n size: SkSize\n) => {\n \"worklet\";\n texture.value = drawAsImageFromPicture(picture, size);\n};\n\nexport const useTexture = (element: ReactElement, size: SkSize) => {\n const picture = useMemo(() => {\n return drawAsPicture(element);\n }, [element]);\n return usePictureAsTexture(picture, size);\n};\n\nexport const useTextureAsValue = (element: ReactElement, size: SkSize) => {\n console.warn(\"useTextureAsValue has been renamed to use useTexture\");\n return useTexture(element, size);\n};\n\nexport const useTextureValueFromPicture = (\n picture: SkPicture | null,\n size: SkSize\n) => {\n console.warn(\n \"useTextureValueFromPicture has been renamed to use usePictureAsTexture\"\n );\n return usePictureAsTexture(picture, size);\n};\n\nexport const usePictureAsTexture = (\n picture: SkPicture | null,\n size: SkSize\n) => {\n const texture = useSharedValue<SkImage | null>(null);\n useEffect(() => {\n if (picture !== null) {\n runOnUI(createTexture)(texture, picture, size);\n }\n }, [texture, picture, size]);\n return texture;\n};\n\nexport const useImageAsTexture = (source: DataSourceParam) => {\n const image = useImage(source);\n const size = useMemo(() => {\n if (image) {\n return { width: image.width(), height: image.height() };\n }\n return { width: 0, height: 0 };\n }, [image]);\n const picture = useMemo(() => {\n if (image) {\n const recorder = Skia.PictureRecorder();\n const canvas = recorder.beginRecording({\n x: 0,\n y: 0,\n width: size.width,\n height: size.height,\n });\n canvas.drawImage(image, 0, 0);\n return recorder.finishRecordingAsPicture();\n } else {\n return null;\n }\n }, [size, image]);\n return usePictureAsTexture(picture, size);\n};\n"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
2
- export declare const useRectBuffer: (size: number, modifier: (input: SkHostRect, index: number) => void) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
3
- export declare const useRSXformBuffer: (size: number, modifier: (input: SkRSXform, index: number) => void) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
4
- export declare const usePointBuffer: (size: number, modifier: (input: SkPoint, index: number) => void) => import("react-native-reanimated").SharedValue<SkPoint[]>;
5
- export declare const useColorBuffer: (size: number, modifier: (input: SkColor, index: number) => void) => import("react-native-reanimated").SharedValue<Float32Array[]>;
2
+ type Modifier<T> = (input: T, index: number) => void;
3
+ export declare const useRectBuffer: (size: number, modifier: Modifier<SkHostRect>) => import("react-native-reanimated").SharedValue<SkHostRect[]>;
4
+ export declare const useRSXformBuffer: (size: number, modifier: Modifier<SkRSXform>) => import("react-native-reanimated").SharedValue<SkRSXform[]>;
5
+ export declare const usePointBuffer: (size: number, modifier: Modifier<SkPoint>) => import("react-native-reanimated").SharedValue<SkPoint[]>;
6
+ export declare const useColorBuffer: (size: number, modifier: Modifier<SkColor>) => import("react-native-reanimated").SharedValue<Float32Array[]>;
7
+ export {};
@@ -1,5 +1,8 @@
1
1
  import type { ReactElement } from "react";
2
2
  import type { SharedValue } from "react-native-reanimated";
3
- import type { SkImage, SkPicture, SkSize } from "../../skia/types";
4
- export declare const useTextureValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
- export declare const useTextureValueFromPicture: (picture: SkPicture, size: SkSize) => SharedValue<SkImage | null>;
3
+ import type { DataSourceParam, SkImage, SkPicture, SkSize } from "../../skia/types";
4
+ export declare const useTexture: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
5
+ export declare const useTextureAsValue: (element: ReactElement, size: SkSize) => SharedValue<SkImage | null>;
6
+ export declare const useTextureValueFromPicture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
7
+ export declare const usePictureAsTexture: (picture: SkPicture | null, size: SkSize) => SharedValue<SkImage | null>;
8
+ export declare const useImageAsTexture: (source: DataSourceParam) => SharedValue<SkImage | null>;
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": "0.1.238",
10
+ "version": "0.1.240",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "files": [
@@ -7,6 +7,7 @@
7
7
  * In `@expo/webpack-config` this is `./web` (default for now).
8
8
  *
9
9
  * This script does the following:
10
+ * 0. Try to detect if it's an expo project and if the bundler is set to metro
10
11
  * 1. Resolve the public path relative to wherever the script is being run.
11
12
  * 2. Log out some useful info about the web setup, just in case anything goes wrong.
12
13
  * 3. Resolve the installed wasm file `canvaskit-wasm/bin/full/canvaskit.wasm`
@@ -15,14 +16,18 @@
15
16
  *
16
17
  *
17
18
  * Usage:
18
- * $ `npx <script> web`
19
+ * $ `npx <script>`
19
20
  *
21
+ * On webpack:
20
22
  * -> Copies the file to `<project>/web/static/js/canvaskit.wasm`
23
+ * on metro:
24
+ * -> Copies the file to `<project>/public/canvaskit.wasm`
21
25
  *
22
- * Tooling that uses `/public`:
23
- * $ `npx <script> public`
26
+ * Tooling that uses a custom static assets folder, like `/assets` for example:
27
+ * $ `npx <script> assets`
28
+ *
29
+ * -> Copies the file to `<project>/assets/canvaskit.wasm`
24
30
  *
25
- * -> Copies the file to `<project>/public/static/js/canvaskit.wasm`
26
31
  */
27
32
  const fs = require("fs");
28
33
  const path = require("path");
@@ -32,6 +37,29 @@ const args = process.argv.slice(2);
32
37
  const gray = (text) => `\x1b[90m${text}\x1b[0m`;
33
38
  const lime = (text) => `\x1b[32m${text}\x1b[0m`;
34
39
 
40
+ function getWetherItsAnExpoProjectWithMetro() {
41
+ try {
42
+ const appJsonPath = path.join(process.cwd(), 'app.json');
43
+
44
+ console.log(
45
+ `› Reading Expo settings from (if any):\n ${gray(appJsonPath)}`
46
+ );
47
+
48
+ const appJson = require(appJsonPath);
49
+ const isAnExpoProjectWithMetro = appJson.expo && appJson.expo.web && appJson.expo.web.bundler === 'metro';
50
+ if (isAnExpoProjectWithMetro) {
51
+ console.log(` ${gray(`Expo project with metro bundler detected`)}\n`);
52
+ return true;
53
+ } else {
54
+ console.log(` ${gray(`Metro bundler not detected. Assuming the project is using Webpack.`)}\n`);
55
+ return false;
56
+ }
57
+ } catch (error) {
58
+ console.log(` ${gray(`No Expo settings found`)}\n`);
59
+ return false;
60
+ }
61
+ }
62
+
35
63
  function getWasmFilePath() {
36
64
  try {
37
65
  return require.resolve("canvaskit-wasm/bin/full/canvaskit.wasm");
@@ -43,14 +71,14 @@ function getWasmFilePath() {
43
71
  }
44
72
  }
45
73
 
46
- function getOutputFilePath() {
74
+ function getOutputFilePath(isAnExpoProjectWithMetro) {
47
75
  // Default to using `web` public path.
48
- const publicFolder = path.resolve(args[0] || "web");
49
- const publicLocation = "./static/js/canvaskit.wasm";
76
+ const publicFolder = path.resolve(args[0] || (isAnExpoProjectWithMetro) ? "public" : "web/static/js");
77
+ const publicLocation = "./canvaskit.wasm";
50
78
  const output = path.join(publicFolder, publicLocation);
51
79
 
52
80
  console.log(
53
- `› Copying 'canvaskit.wasm' file to static folder:\n ${gray(output)}\n`
81
+ `› Copying 'canvaskit.wasm' file to public folder:\n ${gray(output)}\n`
54
82
  );
55
83
  return output;
56
84
  }
@@ -61,9 +89,12 @@ function copyFile(from, to) {
61
89
  fs.writeFileSync(to, data);
62
90
  }
63
91
 
64
- // Copy the WASM file to `<static>/static/js/canvaskit.wasm`
65
92
  (() => {
66
- copyFile(getWasmFilePath(), getOutputFilePath());
93
+ // Automatically detect if it's an expo project with a metro bundler
94
+ const isAnExpoProjectWithMetro = getWetherItsAnExpoProjectWithMetro();
95
+
96
+ // Copy the WASM file to `<static>/canvaskit.wasm`
97
+ copyFile(getWasmFilePath(), getOutputFilePath(isAnExpoProjectWithMetro));
67
98
 
68
99
  console.log(lime("› Success! You are almost there:"));
69
100
  console.log(
@@ -116,11 +116,19 @@ const View = (({ children, onLayout, style: rawStyle }: ViewProps) => {
116
116
 
117
117
  export const Platform: IPlatform = {
118
118
  OS: "web",
119
- PixelRatio: window.devicePixelRatio,
119
+ PixelRatio: typeof window !== "undefined" ? window.devicePixelRatio : 1, // window is not defined on node
120
120
  resolveAsset: (source: DataModule) => {
121
121
  if (isRNModule(source)) {
122
+ if (typeof source === "number" && typeof require === "function") {
123
+ const {
124
+ getAssetByID,
125
+ } = require("react-native/Libraries/Image/AssetRegistry");
126
+ const { httpServerLocation, name, type } = getAssetByID(source);
127
+ const uri = `${httpServerLocation}/${name}.${type}`;
128
+ return uri;
129
+ }
122
130
  throw new Error(
123
- "Image source is a number - this is not supported on the web"
131
+ "Asset source is a number - this is not supported on the web"
124
132
  );
125
133
  }
126
134
  return source.default;
@@ -1,53 +1,56 @@
1
- import { useMemo } from "react";
1
+ import { useEffect, useMemo } from "react";
2
+ import { startMapper, stopMapper } from "react-native-reanimated";
3
+ import type { WorkletFunction } from "react-native-reanimated/lib/typescript/reanimated2/commonTypes";
2
4
 
3
5
  import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
4
6
  import { Skia } from "../../skia";
5
7
 
6
- import { useDerivedValue, useSharedValue } from "./moduleWrapper";
8
+ import { useSharedValue } from "./moduleWrapper";
7
9
  import { notifyChange } from "./interpolators";
8
10
 
11
+ type Modifier<T> = (input: T, index: number) => void;
12
+
9
13
  const useBuffer = <T>(
10
14
  size: number,
11
15
  bufferInitializer: () => T,
12
- modifier: (input: T, index: number) => void
16
+ modifier: Modifier<T>
13
17
  ) => {
14
18
  const buffer = useMemo(
15
19
  () => new Array(size).fill(0).map(bufferInitializer),
16
20
  // eslint-disable-next-line react-hooks/exhaustive-deps
17
21
  [size]
18
22
  );
19
- const transforms = useSharedValue(buffer);
20
-
21
- useDerivedValue(() => {
23
+ const values = useSharedValue(buffer);
24
+ const mod = modifier as WorkletFunction;
25
+ const deps = Object.values(mod.__closure ?? {});
26
+ const mapperId = startMapper(() => {
27
+ "worklet";
22
28
  buffer.forEach((val, index) => {
23
29
  modifier(val, index);
24
30
  });
25
- // Assuming notifyChange is a function that notifies about the change in transforms.
26
- notifyChange(transforms);
27
- });
31
+ notifyChange(values);
32
+ }, deps);
28
33
 
29
- return transforms;
34
+ useEffect(() => {
35
+ return () => {
36
+ stopMapper(mapperId);
37
+ };
38
+ }, [mapperId]);
39
+
40
+ return values;
30
41
  };
31
42
 
32
- export const useRectBuffer = (
33
- size: number,
34
- modifier: (input: SkHostRect, index: number) => void
35
- ) => useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);
43
+ export const useRectBuffer = (size: number, modifier: Modifier<SkHostRect>) =>
44
+ useBuffer(size, () => Skia.XYWHRect(0, 0, 0, 0), modifier);
36
45
 
37
46
  // Usage for RSXform Buffer
38
- export const useRSXformBuffer = (
39
- size: number,
40
- modifier: (input: SkRSXform, index: number) => void
41
- ) => useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);
47
+ export const useRSXformBuffer = (size: number, modifier: Modifier<SkRSXform>) =>
48
+ useBuffer(size, () => Skia.RSXform(1, 0, 0, 0), modifier);
42
49
 
43
50
  // Usage for Point Buffer
44
- export const usePointBuffer = (
45
- size: number,
46
- modifier: (input: SkPoint, index: number) => void
47
- ) => useBuffer(size, () => Skia.Point(0, 0), modifier);
51
+ export const usePointBuffer = (size: number, modifier: Modifier<SkPoint>) =>
52
+ useBuffer(size, () => Skia.Point(0, 0), modifier);
48
53
 
49
54
  // Usage for Color Buffer
50
- export const useColorBuffer = (
51
- size: number,
52
- modifier: (input: SkColor, index: number) => void
53
- ) => useBuffer(size, () => Skia.Color("black"), modifier);
55
+ export const useColorBuffer = (size: number, modifier: Modifier<SkColor>) =>
56
+ useBuffer(size, () => Skia.Color("black"), modifier);
@@ -2,15 +2,21 @@ import { useEffect, useMemo } from "react";
2
2
  import type { ReactElement } from "react";
3
3
  import type { SharedValue } from "react-native-reanimated";
4
4
 
5
- import type { SkImage, SkPicture, SkSize } from "../../skia/types";
5
+ import type {
6
+ DataSourceParam,
7
+ SkImage,
8
+ SkPicture,
9
+ SkSize,
10
+ } from "../../skia/types";
6
11
  import {
7
12
  drawAsImageFromPicture,
8
13
  drawAsPicture,
9
14
  } from "../../renderer/Offscreen";
15
+ import { Skia, useImage } from "../../skia";
10
16
 
11
17
  import { runOnUI, useSharedValue } from "./moduleWrapper";
12
18
 
13
- const createTextureValue = (
19
+ const createTexture = (
14
20
  texture: SharedValue<SkImage | null>,
15
21
  picture: SkPicture,
16
22
  size: SkSize
@@ -19,20 +25,63 @@ const createTextureValue = (
19
25
  texture.value = drawAsImageFromPicture(picture, size);
20
26
  };
21
27
 
22
- export const useTextureValue = (element: ReactElement, size: SkSize) => {
28
+ export const useTexture = (element: ReactElement, size: SkSize) => {
23
29
  const picture = useMemo(() => {
24
30
  return drawAsPicture(element);
25
31
  }, [element]);
26
- return useTextureValueFromPicture(picture, size);
32
+ return usePictureAsTexture(picture, size);
33
+ };
34
+
35
+ export const useTextureAsValue = (element: ReactElement, size: SkSize) => {
36
+ console.warn("useTextureAsValue has been renamed to use useTexture");
37
+ return useTexture(element, size);
27
38
  };
28
39
 
29
40
  export const useTextureValueFromPicture = (
30
- picture: SkPicture,
41
+ picture: SkPicture | null,
42
+ size: SkSize
43
+ ) => {
44
+ console.warn(
45
+ "useTextureValueFromPicture has been renamed to use usePictureAsTexture"
46
+ );
47
+ return usePictureAsTexture(picture, size);
48
+ };
49
+
50
+ export const usePictureAsTexture = (
51
+ picture: SkPicture | null,
31
52
  size: SkSize
32
53
  ) => {
33
54
  const texture = useSharedValue<SkImage | null>(null);
34
55
  useEffect(() => {
35
- runOnUI(createTextureValue)(texture, picture, size);
56
+ if (picture !== null) {
57
+ runOnUI(createTexture)(texture, picture, size);
58
+ }
36
59
  }, [texture, picture, size]);
37
60
  return texture;
38
61
  };
62
+
63
+ export const useImageAsTexture = (source: DataSourceParam) => {
64
+ const image = useImage(source);
65
+ const size = useMemo(() => {
66
+ if (image) {
67
+ return { width: image.width(), height: image.height() };
68
+ }
69
+ return { width: 0, height: 0 };
70
+ }, [image]);
71
+ const picture = useMemo(() => {
72
+ if (image) {
73
+ const recorder = Skia.PictureRecorder();
74
+ const canvas = recorder.beginRecording({
75
+ x: 0,
76
+ y: 0,
77
+ width: size.width,
78
+ height: size.height,
79
+ });
80
+ canvas.drawImage(image, 0, 0);
81
+ return recorder.finishRecordingAsPicture();
82
+ } else {
83
+ return null;
84
+ }
85
+ }, [size, image]);
86
+ return usePictureAsTexture(picture, size);
87
+ };