@shopify/react-native-skia 0.1.143 → 0.1.145

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 (67) hide show
  1. package/cpp/api/JsiSkPaint.h +6 -0
  2. package/lib/commonjs/renderer/Canvas.js +17 -7
  3. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  4. package/lib/commonjs/renderer/DependencyManager.js +144 -36
  5. package/lib/commonjs/renderer/DependencyManager.js.map +1 -1
  6. package/lib/commonjs/renderer/HostConfig.js +1 -1
  7. package/lib/commonjs/renderer/HostConfig.js.map +1 -1
  8. package/lib/commonjs/renderer/components/backdrop/BackdropFilter.js.map +1 -1
  9. package/lib/commonjs/renderer/nodes/Declaration.js +2 -3
  10. package/lib/commonjs/renderer/nodes/Declaration.js.map +1 -1
  11. package/lib/commonjs/renderer/nodes/Drawing.js +3 -7
  12. package/lib/commonjs/renderer/nodes/Drawing.js.map +1 -1
  13. package/lib/commonjs/renderer/nodes/Node.js +9 -7
  14. package/lib/commonjs/renderer/nodes/Node.js.map +1 -1
  15. package/lib/commonjs/renderer/processors/Animations/Animations.js +3 -22
  16. package/lib/commonjs/renderer/processors/Animations/Animations.js.map +1 -1
  17. package/lib/commonjs/skia/types/Paint/Paint.js.map +1 -1
  18. package/lib/commonjs/skia/web/Host.js.map +1 -1
  19. package/lib/commonjs/skia/web/JsiSkPaint.js +4 -0
  20. package/lib/commonjs/skia/web/JsiSkPaint.js.map +1 -1
  21. package/lib/module/renderer/Canvas.js +17 -6
  22. package/lib/module/renderer/Canvas.js.map +1 -1
  23. package/lib/module/renderer/DependencyManager.js +140 -33
  24. package/lib/module/renderer/DependencyManager.js.map +1 -1
  25. package/lib/module/renderer/HostConfig.js +1 -1
  26. package/lib/module/renderer/HostConfig.js.map +1 -1
  27. package/lib/module/renderer/components/backdrop/BackdropFilter.js.map +1 -1
  28. package/lib/module/renderer/nodes/Declaration.js +3 -4
  29. package/lib/module/renderer/nodes/Declaration.js.map +1 -1
  30. package/lib/module/renderer/nodes/Drawing.js +3 -6
  31. package/lib/module/renderer/nodes/Drawing.js.map +1 -1
  32. package/lib/module/renderer/nodes/Node.js +9 -7
  33. package/lib/module/renderer/nodes/Node.js.map +1 -1
  34. package/lib/module/renderer/processors/Animations/Animations.js +1 -16
  35. package/lib/module/renderer/processors/Animations/Animations.js.map +1 -1
  36. package/lib/module/skia/types/Paint/Paint.js.map +1 -1
  37. package/lib/module/skia/web/Host.js.map +1 -1
  38. package/lib/module/skia/web/JsiSkPaint.js +4 -0
  39. package/lib/module/skia/web/JsiSkPaint.js.map +1 -1
  40. package/lib/typescript/src/renderer/Canvas.d.ts +1 -1
  41. package/lib/typescript/src/renderer/DependencyManager.d.ts +40 -14
  42. package/lib/typescript/src/renderer/nodes/Declaration.d.ts +2 -2
  43. package/lib/typescript/src/renderer/nodes/Drawing.d.ts +2 -2
  44. package/lib/typescript/src/renderer/nodes/Node.d.ts +3 -2
  45. package/lib/typescript/src/renderer/processors/Animations/Animations.d.ts +0 -1
  46. package/lib/typescript/src/skia/types/Paint/Paint.d.ts +5 -0
  47. package/lib/typescript/src/skia/web/Host.d.ts +1 -1
  48. package/lib/typescript/src/skia/web/JsiSkPaint.d.ts +1 -0
  49. package/libs/ios/libskia.xcframework/Info.plist +5 -5
  50. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  51. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  52. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  53. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  54. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  55. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  56. package/package.json +1 -1
  57. package/src/renderer/Canvas.tsx +19 -7
  58. package/src/renderer/DependencyManager.tsx +170 -39
  59. package/src/renderer/HostConfig.ts +1 -1
  60. package/src/renderer/components/backdrop/BackdropFilter.tsx +1 -1
  61. package/src/renderer/nodes/Declaration.tsx +6 -8
  62. package/src/renderer/nodes/Drawing.tsx +5 -7
  63. package/src/renderer/nodes/Node.ts +11 -9
  64. package/src/renderer/processors/Animations/Animations.ts +2 -15
  65. package/src/skia/types/Paint/Paint.ts +6 -0
  66. package/src/skia/web/Host.ts +1 -1
  67. package/src/skia/web/JsiSkPaint.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["Node.ts"],"names":["NodeType","Node","constructor","depMgr","props","_props","unSubscribeNode","subscribeNode","visit","ctx","children","returnedValues","forEach","child","memoized","memoizable","push","ret","draw"],"mappings":";;;;;;;;;IAKYA,Q;;;WAAAA,Q;AAAAA,EAAAA,Q;AAAAA,EAAAA,Q;GAAAA,Q,wBAAAA,Q;;AAOL,MAAeC,IAAf,CAAiC;AAQtCC,EAAAA,WAAW,CAACC,MAAD,EAA4BC,KAA5B,EAAqD;AAAA,sCAPpC,EAOoC;;AAAA;;AAAA,wCALnD,KAKmD;;AAAA,sCAJ3B,IAI2B;;AAAA;;AAAA;;AAC9D,SAAKC,MAAL,GAAcD,KAAd;AACA,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKA,MAAL,CAAYG,eAAZ,CAA4B,IAA5B;AACA,SAAKH,MAAL,CAAYI,aAAZ,CAA0B,IAA1B,EAAgCH,KAAhC;AACD;;AAIQ,MAALA,KAAK,CAACA,KAAD,EAA0B;AACjC,SAAKD,MAAL,CAAYG,eAAZ,CAA4B,IAA5B;AACA,SAAKH,MAAL,CAAYI,aAAZ,CAA0B,IAA1B,EAAgCH,KAAhC;AACA,SAAKC,MAAL,GAAcD,KAAd;AACD;;AAEQ,MAALA,KAAK,GAAG;AACV,WAAO,KAAKC,MAAZ;AACD;;AAEDG,EAAAA,KAAK,CAACC,GAAD,EAAsBC,QAAtB,EAAyC;AAC5C,UAAMC,cAAkD,GAAG,EAA3D;AACA,KAACD,QAAD,aAACA,QAAD,cAACA,QAAD,GAAa,KAAKA,QAAlB,EAA4BE,OAA5B,CAAqCC,KAAD,IAAW;AAC7C,UAAIA,KAAK,CAACC,QAAN,IAAkBD,KAAK,CAACE,UAA5B,EAAwC;AACtCJ,QAAAA,cAAc,CAACK,IAAf,CAAoBH,KAAK,CAACC,QAA1B;AACD,OAFD,MAEO;AACL,cAAMG,GAAG,GAAGJ,KAAK,CAACK,IAAN,CAAWT,GAAX,CAAZ;;AACA,YAAIQ,GAAJ,EAAS;AACPN,UAAAA,cAAc,CAACK,IAAf,CAAoBC,GAApB;;AACA,cAAIJ,KAAK,CAACE,UAAV,EAAsB;AACpBF,YAAAA,KAAK,CAACC,QAAN,GAAiBG,GAAjB;AACD;AACF;AACF;AACF,KAZD;AAaA,WAAON,cAAP;AACD;;AA3CqC","sourcesContent":["import type { SkJSIInstance } from \"../../skia/types\";\nimport type { DependencyManager } from \"../DependencyManager\";\nimport type { DrawingContext } from \"../DrawingContext\";\nimport type { AnimatedProps } from \"../processors\";\n\nexport enum NodeType {\n Declaration = \"skDeclaration\",\n Drawing = \"skDrawing\",\n}\n\ntype DeclarationResult = SkJSIInstance<string> | null;\n\nexport abstract class Node<P = unknown> {\n readonly children: Node[] = [];\n _props: AnimatedProps<P>;\n memoizable = false;\n memoized: DeclarationResult | null = null;\n parent?: Node;\n depMgr: DependencyManager;\n\n constructor(depMgr: DependencyManager, props: AnimatedProps<P>) {\n this._props = props;\n this.depMgr = depMgr;\n this.depMgr.unSubscribeNode(this);\n this.depMgr.subscribeNode(this, props);\n }\n\n abstract draw(ctx: DrawingContext): void | DeclarationResult;\n\n set props(props: AnimatedProps<P>) {\n this.depMgr.unSubscribeNode(this);\n this.depMgr.subscribeNode(this, props);\n this._props = props;\n }\n\n get props() {\n return this._props;\n }\n\n visit(ctx: DrawingContext, children?: Node[]) {\n const returnedValues: Exclude<DeclarationResult, null>[] = [];\n (children ?? this.children).forEach((child) => {\n if (child.memoized && child.memoizable) {\n returnedValues.push(child.memoized);\n } else {\n const ret = child.draw(ctx);\n if (ret) {\n returnedValues.push(ret);\n if (child.memoizable) {\n child.memoized = ret;\n }\n }\n }\n });\n return returnedValues;\n }\n}\n"]}
1
+ {"version":3,"sources":["Node.ts"],"names":["NodeType","Node","constructor","depMgr","props","updatePropSubscriptions","subscribeNode","unsubscribeNode","resolvedProps","visit","ctx","children","returnedValues","forEach","child","memoized","memoizable","push","ret","draw"],"mappings":";;;;;;;;;IAKYA,Q;;;WAAAA,Q;AAAAA,EAAAA,Q;AAAAA,EAAAA,Q;GAAAA,Q,wBAAAA,Q;;AAOL,MAAeC,IAAf,CAAiC;AAEtC;AAOAC,EAAAA,WAAW,CAACC,MAAD,EAA4BC,KAA5B,EAAqD;AAAA,sCARpC,EAQoC;;AAAA,2CAN7C,EAM6C;;AAAA,wCALnD,KAKmD;;AAAA,sCAJ3B,IAI2B;;AAAA;;AAAA;;AAC9D,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKE,uBAAL,CAA6BD,KAA7B;AACD;;AAIDC,EAAAA,uBAAuB,CAACD,KAAD,EAA0B;AAC/C,SAAKD,MAAL,CAAYG,aAAZ,CAA0B,IAA1B,EAAgCF,KAAhC;AACD;;AAEQ,MAALA,KAAK,CAACA,KAAD,EAA0B;AACjC,SAAKD,MAAL,CAAYI,eAAZ,CAA4B,IAA5B;AACA,SAAKF,uBAAL,CAA6BD,KAA7B;AACD;;AAEQ,MAALA,KAAK,GAAM;AACb,WAAO,KAAKI,aAAZ;AACD;;AAEDC,EAAAA,KAAK,CAACC,GAAD,EAAsBC,QAAtB,EAAyC;AAC5C,UAAMC,cAAkD,GAAG,EAA3D;AACA,KAACD,QAAD,aAACA,QAAD,cAACA,QAAD,GAAa,KAAKA,QAAlB,EAA4BE,OAA5B,CAAqCC,KAAD,IAAW;AAC7C,UAAIA,KAAK,CAACC,QAAN,IAAkBD,KAAK,CAACE,UAA5B,EAAwC;AACtCJ,QAAAA,cAAc,CAACK,IAAf,CAAoBH,KAAK,CAACC,QAA1B;AACD,OAFD,MAEO;AACL,cAAMG,GAAG,GAAGJ,KAAK,CAACK,IAAN,CAAWT,GAAX,CAAZ;;AACA,YAAIQ,GAAJ,EAAS;AACPN,UAAAA,cAAc,CAACK,IAAf,CAAoBC,GAApB;;AACA,cAAIJ,KAAK,CAACE,UAAV,EAAsB;AACpBF,YAAAA,KAAK,CAACC,QAAN,GAAiBG,GAAjB;AACD;AACF;AACF;AACF,KAZD;AAaA,WAAON,cAAP;AACD;;AA7CqC","sourcesContent":["import type { SkJSIInstance } from \"../../skia/types\";\nimport type { DependencyManager } from \"../DependencyManager\";\nimport type { DrawingContext } from \"../DrawingContext\";\nimport type { AnimatedProps } from \"../processors\";\n\nexport enum NodeType {\n Declaration = \"skDeclaration\",\n Drawing = \"skDrawing\",\n}\n\ntype DeclarationResult = SkJSIInstance<string> | null;\n\nexport abstract class Node<P = unknown> {\n readonly children: Node[] = [];\n // This cast is ok because we understand that the dependency manager will setup the initial props\n resolvedProps: P = {} as P;\n memoizable = false;\n memoized: DeclarationResult | null = null;\n parent?: Node;\n depMgr: DependencyManager;\n\n constructor(depMgr: DependencyManager, props: AnimatedProps<P>) {\n this.depMgr = depMgr;\n this.updatePropSubscriptions(props);\n }\n\n abstract draw(ctx: DrawingContext): void | DeclarationResult;\n\n updatePropSubscriptions(props: AnimatedProps<P>) {\n this.depMgr.subscribeNode(this, props);\n }\n\n set props(props: AnimatedProps<P>) {\n this.depMgr.unsubscribeNode(this);\n this.updatePropSubscriptions(props);\n }\n\n get props(): P {\n return this.resolvedProps;\n }\n\n visit(ctx: DrawingContext, children?: Node[]) {\n const returnedValues: Exclude<DeclarationResult, null>[] = [];\n (children ?? this.children).forEach((child) => {\n if (child.memoized && child.memoizable) {\n returnedValues.push(child.memoized);\n } else {\n const ret = child.draw(ctx);\n if (ret) {\n returnedValues.push(ret);\n if (child.memoizable) {\n child.memoized = ret;\n }\n }\n }\n });\n return returnedValues;\n }\n}\n"]}
@@ -3,9 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.materialize = exports.isValue = exports.isSelector = exports.isAnimated = void 0;
7
-
8
- var _typeddash = require("../../typeddash");
6
+ exports.isValue = exports.isSelector = exports.isAnimated = void 0;
9
7
 
10
8
  const isValue = value => {
11
9
  if (value === undefined || value === null) {
@@ -35,31 +33,14 @@ exports.isSelector = isSelector;
35
33
 
36
34
  const isAnimated = props => {
37
35
  for (const value of Object.values(props)) {
38
- if (isValue(value)) {
36
+ if (isValue(value) || isSelector(value)) {
39
37
  return true;
40
38
  }
41
39
  }
42
40
 
43
41
  return false;
44
- };
45
-
46
- exports.isAnimated = isAnimated;
47
-
48
- const materialize = props => {
49
- const result = { ...props
50
- };
51
- (0, _typeddash.mapKeys)(props).forEach(key => {
52
- const prop = props[key];
53
-
54
- if (isValue(prop)) {
55
- result[key] = prop.current;
56
- } else if (isSelector(prop)) {
57
- result[key] = prop.selector(prop.value.current);
58
- }
59
- });
60
- return result;
61
42
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
43
 
63
44
 
64
- exports.materialize = materialize;
45
+ exports.isAnimated = isAnimated;
65
46
  //# sourceMappingURL=Animations.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["Animations.ts"],"names":["isValue","value","undefined","__typename__","isSelector","selector","isAnimated","props","Object","values","materialize","result","forEach","key","prop","current"],"mappings":";;;;;;;AACA;;AAEO,MAAMA,OAAO,GAAIC,KAAD,IAAiD;AACtE,MAAIA,KAAK,KAAKC,SAAV,IAAuBD,KAAK,KAAK,IAArC,EAA2C;AACzC,WAAO,KAAP;AACD;;AACD,MAAI;AACF,QACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,kBAAkBA,KADlB,IAECA,KAAD,CAAyCE,YAAzC,KAA0D,WAH5D,EAIE;AACA,aAAO,IAAP;AACD;AACF,GARD,CAQE,MAAM,CAAE;;AACV,SAAO,KAAP;AACD,CAdM;;;;AAgBA,MAAMC,UAAU,GACrBH,KADwB,IAKrB;AACH,MAAIA,KAAJ,EAAW;AACT,WACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,cAAcA,KADd,IAEA,WAAWA,KAFX,IAGCA,KAAD,CAAmCI,QAAnC,KAAgDH,SAHhD,IAICD,KAAD,CAAmCA,KAAnC,KAA6CC,SAL/C;AAOD;;AACD,SAAO,KAAP;AACD,CAhBM;;;;AAkBA,MAAMI,UAAU,GAAOC,KAAJ,IAAgC;AACxD,OAAK,MAAMN,KAAX,IAAoBO,MAAM,CAACC,MAAP,CAAcF,KAAd,CAApB,EAA0C;AACxC,QAAIP,OAAO,CAACC,KAAD,CAAX,EAAoB;AAClB,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD,CAPM;;;;AASA,MAAMS,WAAW,GAAOH,KAAJ,IAAgC;AACzD,QAAMI,MAAM,GAAG,EAAE,GAAGJ;AAAL,GAAf;AACA,0BAAQA,KAAR,EAAeK,OAAf,CAAwBC,GAAD,IAAS;AAC9B,UAAMC,IAAI,GAAGP,KAAK,CAACM,GAAD,CAAlB;;AACA,QAAIb,OAAO,CAACc,IAAD,CAAX,EAAmB;AACjBH,MAAAA,MAAM,CAACE,GAAD,CAAN,GAAeC,IAAD,CAAmCC,OAAjD;AACD,KAFD,MAEO,IAAIX,UAAU,CAACU,IAAD,CAAd,EAAsB;AAC3BH,MAAAA,MAAM,CAACE,GAAD,CAAN,GAAcC,IAAI,CAACT,QAAL,CAAcS,IAAI,CAACb,KAAL,CAAWc,OAAzB,CAAd;AACD;AACF,GAPD;AAQA,SAAOJ,MAAP;AACD,CAXM,C,CAaP","sourcesContent":["import type { SkiaSelector, SkiaValue } from \"../../../values\";\nimport { mapKeys } from \"../../typeddash\";\n\nexport const isValue = (value: unknown): value is SkiaValue<unknown> => {\n if (value === undefined || value === null) {\n return false;\n }\n try {\n if (\n typeof value === \"object\" &&\n \"__typename__\" in value &&\n (value as unknown as SkiaValue<unknown>).__typename__ === \"RNSkValue\"\n ) {\n return true;\n }\n } catch {}\n return false;\n};\n\nexport const isSelector = <T, R>(\n value: unknown\n): value is {\n selector: (v: T) => R;\n value: SkiaValue<T>;\n} => {\n if (value) {\n return (\n typeof value === \"object\" &&\n \"selector\" in value &&\n \"value\" in value &&\n (value as Record<string, unknown>).selector !== undefined &&\n (value as Record<string, unknown>).value !== undefined\n );\n }\n return false;\n};\n\nexport const isAnimated = <T>(props: AnimatedProps<T>) => {\n for (const value of Object.values(props)) {\n if (isValue(value)) {\n return true;\n }\n }\n return false;\n};\n\nexport const materialize = <T>(props: AnimatedProps<T>) => {\n const result = { ...props };\n mapKeys(props).forEach((key) => {\n const prop = props[key];\n if (isValue(prop)) {\n result[key] = (prop as SkiaValue<T[typeof key]>).current;\n } else if (isSelector(prop)) {\n result[key] = prop.selector(prop.value.current) as T[typeof key];\n }\n });\n return result as T;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P>;\nexport type AnimatedProps<T> = {\n [K in keyof T]: AnimatedProp<T[K]>;\n};\n"]}
1
+ {"version":3,"sources":["Animations.ts"],"names":["isValue","value","undefined","__typename__","isSelector","selector","isAnimated","props","Object","values"],"mappings":";;;;;;;AAEO,MAAMA,OAAO,GAAIC,KAAD,IAAiD;AACtE,MAAIA,KAAK,KAAKC,SAAV,IAAuBD,KAAK,KAAK,IAArC,EAA2C;AACzC,WAAO,KAAP;AACD;;AACD,MAAI;AACF,QACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,kBAAkBA,KADlB,IAECA,KAAD,CAAyCE,YAAzC,KAA0D,WAH5D,EAIE;AACA,aAAO,IAAP;AACD;AACF,GARD,CAQE,MAAM,CAAE;;AACV,SAAO,KAAP;AACD,CAdM;;;;AAgBA,MAAMC,UAAU,GACrBH,KADwB,IAKrB;AACH,MAAIA,KAAJ,EAAW;AACT,WACE,OAAOA,KAAP,KAAiB,QAAjB,IACA,cAAcA,KADd,IAEA,WAAWA,KAFX,IAGCA,KAAD,CAAmCI,QAAnC,KAAgDH,SAHhD,IAICD,KAAD,CAAmCA,KAAnC,KAA6CC,SAL/C;AAOD;;AACD,SAAO,KAAP;AACD,CAhBM;;;;AAkBA,MAAMI,UAAU,GAAOC,KAAJ,IAAgC;AACxD,OAAK,MAAMN,KAAX,IAAoBO,MAAM,CAACC,MAAP,CAAcF,KAAd,CAApB,EAA0C;AACxC,QAAIP,OAAO,CAACC,KAAD,CAAP,IAAkBG,UAAU,CAACH,KAAD,CAAhC,EAAyC;AACvC,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD,CAPM,C,CASP","sourcesContent":["import type { SkiaSelector, SkiaValue } from \"../../../values\";\n\nexport const isValue = (value: unknown): value is SkiaValue<unknown> => {\n if (value === undefined || value === null) {\n return false;\n }\n try {\n if (\n typeof value === \"object\" &&\n \"__typename__\" in value &&\n (value as unknown as SkiaValue<unknown>).__typename__ === \"RNSkValue\"\n ) {\n return true;\n }\n } catch {}\n return false;\n};\n\nexport const isSelector = <T, R>(\n value: unknown\n): value is {\n selector: (v: T) => R;\n value: SkiaValue<T>;\n} => {\n if (value) {\n return (\n typeof value === \"object\" &&\n \"selector\" in value &&\n \"value\" in value &&\n (value as Record<string, unknown>).selector !== undefined &&\n (value as Record<string, unknown>).value !== undefined\n );\n }\n return false;\n};\n\nexport const isAnimated = <T>(props: AnimatedProps<T>) => {\n for (const value of Object.values(props)) {\n if (isValue(value) || isSelector(value)) {\n return true;\n }\n }\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnimatedProp<T, P = any> = T | SkiaValue<T> | SkiaSelector<T, P>;\n\nexport type AnimatedProps<T> = {\n [K in keyof T]: AnimatedProp<T[K]>;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["Paint.ts"],"names":["PaintStyle","StrokeCap","StrokeJoin","isPaint","obj","__typename__"],"mappings":";;;;;;IAUYA,U;;;WAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;GAAAA,U,0BAAAA,U;;IAKAC,S;;;WAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;GAAAA,S,yBAAAA,S;;IAMAC,U;;;WAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;GAAAA,U,0BAAAA,U;;AAML,MAAMC,OAAO,GAAIC,GAAD,IACrBA,GAAG,KAAK,IAAR,IAAgBA,GAAG,CAACC,YAAJ,KAAqB,OADhC","sourcesContent":["import type { SkImageFilter } from \"../ImageFilter\";\nimport type { SkMaskFilter } from \"../MaskFilter\";\nimport type { SkColorFilter } from \"../ColorFilter\";\nimport type { SkColor } from \"../Color\";\nimport type { SkPathEffect } from \"../PathEffect\";\nimport type { SkJSIInstance } from \"../JsiInstance\";\nimport type { SkShader } from \"../Shader\";\n\nimport type { BlendMode } from \"./BlendMode\";\n\nexport enum PaintStyle {\n Fill,\n Stroke,\n}\n\nexport enum StrokeCap {\n Butt,\n Round,\n Square,\n}\n\nexport enum StrokeJoin {\n Miter,\n Round,\n Bevel,\n}\n\nexport const isPaint = (obj: SkJSIInstance<string> | null): obj is SkPaint =>\n obj !== null && obj.__typename__ === \"Paint\";\n\nexport interface SkPaint extends SkJSIInstance<\"Paint\"> {\n /**\n * Returns a copy of this paint.\n */\n copy(): SkPaint;\n\n /**\n * Retrieves the alpha and RGB unpremultiplied. RGB are extended sRGB values\n * (sRGB gamut, and encoded with the sRGB transfer function).\n */\n getColor(): SkColor;\n\n /**\n * Returns the geometry drawn at the beginning and end of strokes.\n */\n getStrokeCap(): StrokeCap;\n\n /**\n * Returns the geometry drawn at the corners of strokes.\n */\n getStrokeJoin(): StrokeJoin;\n\n /**\n * Returns the limit at which a sharp corner is drawn beveled.\n */\n getStrokeMiter(): number;\n\n /**\n * Returns the thickness of the pen used to outline the shape.\n */\n getStrokeWidth(): number;\n\n /**\n * Replaces alpha, leaving RGBA unchanged. 0 means fully transparent, 1.0 means opaque.\n * @param alpha\n */\n setAlphaf(alpha: number): void;\n\n /**\n * Requests, but does not require, that edge pixels draw opaque or with\n * partial transparency.\n * @param aa\n */\n setAntiAlias: (aa: boolean) => void;\n\n /**\n * Sets the blend mode that is, the mode used to combine source color\n * with destination color.\n * @param mode\n */\n setBlendMode: (blendMode: BlendMode) => void;\n\n /**\n * Sets alpha and RGB used when stroking and filling. The color is a 32-bit\n * value, unpremultiplied, packing 8-bit components for alpha, red, blue,\n * and green.\n *\n * @param color unpremultiplied ARGB\n *\n * example: https://fiddle.skia.org/c/@Paint_setColor\n */\n setColor(color: SkColor): void;\n\n /**\n * Sets the current color filter, replacing the existing one if there was one.\n * @param filter\n */\n setColorFilter(filter: SkColorFilter | null): void;\n\n /**\n * Sets the current image filter, replacing the existing one if there was one.\n * @param filter\n */\n setImageFilter(filter: SkImageFilter | null): void;\n\n /**\n * Sets the current mask filter, replacing the existing one if there was one.\n * @param filter\n */\n setMaskFilter(filter: SkMaskFilter | null): void;\n\n /**\n * Sets the current path effect, replacing the existing one if there was one.\n * @param effect\n */\n setPathEffect(effect: SkPathEffect | null): void;\n\n /**\n * Sets the current shader, replacing the existing one if there was one.\n * @param shader\n */\n setShader(shader: SkShader | null): void;\n\n /**\n * Sets the geometry drawn at the beginning and end of strokes.\n * @param cap\n */\n setStrokeCap(cap: StrokeCap): void;\n\n /**\n * Sets the geometry drawn at the corners of strokes.\n * @param join\n */\n setStrokeJoin(join: StrokeJoin): void;\n\n /**\n * Sets the limit at which a sharp corner is drawn beveled.\n * @param limit\n */\n setStrokeMiter(limit: number): void;\n\n /**\n * Sets the thickness of the pen used to outline the shape.\n * @param width\n */\n setStrokeWidth(width: number): void;\n\n /**\n * Sets whether the geometry is filled or stroked.\n * @param style\n */\n setStyle(style: PaintStyle): void;\n}\n"]}
1
+ {"version":3,"sources":["Paint.ts"],"names":["PaintStyle","StrokeCap","StrokeJoin","isPaint","obj","__typename__"],"mappings":";;;;;;IAUYA,U;;;WAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;GAAAA,U,0BAAAA,U;;IAKAC,S;;;WAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;GAAAA,S,yBAAAA,S;;IAMAC,U;;;WAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;GAAAA,U,0BAAAA,U;;AAML,MAAMC,OAAO,GAAIC,GAAD,IACrBA,GAAG,KAAK,IAAR,IAAgBA,GAAG,CAACC,YAAJ,KAAqB,OADhC","sourcesContent":["import type { SkImageFilter } from \"../ImageFilter\";\nimport type { SkMaskFilter } from \"../MaskFilter\";\nimport type { SkColorFilter } from \"../ColorFilter\";\nimport type { SkColor } from \"../Color\";\nimport type { SkPathEffect } from \"../PathEffect\";\nimport type { SkJSIInstance } from \"../JsiInstance\";\nimport type { SkShader } from \"../Shader\";\n\nimport type { BlendMode } from \"./BlendMode\";\n\nexport enum PaintStyle {\n Fill,\n Stroke,\n}\n\nexport enum StrokeCap {\n Butt,\n Round,\n Square,\n}\n\nexport enum StrokeJoin {\n Miter,\n Round,\n Bevel,\n}\n\nexport const isPaint = (obj: SkJSIInstance<string> | null): obj is SkPaint =>\n obj !== null && obj.__typename__ === \"Paint\";\n\nexport interface SkPaint extends SkJSIInstance<\"Paint\"> {\n /**\n * Returns a copy of this paint.\n */\n copy(): SkPaint;\n\n /**\n * Sets all SkPaint contents to their initial values. This is equivalent to replacing\n SkPaint with the result of SkPaint().\n */\n reset(): void;\n\n /**\n * Retrieves the alpha and RGB unpremultiplied. RGB are extended sRGB values\n * (sRGB gamut, and encoded with the sRGB transfer function).\n */\n getColor(): SkColor;\n\n /**\n * Returns the geometry drawn at the beginning and end of strokes.\n */\n getStrokeCap(): StrokeCap;\n\n /**\n * Returns the geometry drawn at the corners of strokes.\n */\n getStrokeJoin(): StrokeJoin;\n\n /**\n * Returns the limit at which a sharp corner is drawn beveled.\n */\n getStrokeMiter(): number;\n\n /**\n * Returns the thickness of the pen used to outline the shape.\n */\n getStrokeWidth(): number;\n\n /**\n * Replaces alpha, leaving RGBA unchanged. 0 means fully transparent, 1.0 means opaque.\n * @param alpha\n */\n setAlphaf(alpha: number): void;\n\n /**\n * Requests, but does not require, that edge pixels draw opaque or with\n * partial transparency.\n * @param aa\n */\n setAntiAlias: (aa: boolean) => void;\n\n /**\n * Sets the blend mode that is, the mode used to combine source color\n * with destination color.\n * @param mode\n */\n setBlendMode: (blendMode: BlendMode) => void;\n\n /**\n * Sets alpha and RGB used when stroking and filling. The color is a 32-bit\n * value, unpremultiplied, packing 8-bit components for alpha, red, blue,\n * and green.\n *\n * @param color unpremultiplied ARGB\n *\n * example: https://fiddle.skia.org/c/@Paint_setColor\n */\n setColor(color: SkColor): void;\n\n /**\n * Sets the current color filter, replacing the existing one if there was one.\n * @param filter\n */\n setColorFilter(filter: SkColorFilter | null): void;\n\n /**\n * Sets the current image filter, replacing the existing one if there was one.\n * @param filter\n */\n setImageFilter(filter: SkImageFilter | null): void;\n\n /**\n * Sets the current mask filter, replacing the existing one if there was one.\n * @param filter\n */\n setMaskFilter(filter: SkMaskFilter | null): void;\n\n /**\n * Sets the current path effect, replacing the existing one if there was one.\n * @param effect\n */\n setPathEffect(effect: SkPathEffect | null): void;\n\n /**\n * Sets the current shader, replacing the existing one if there was one.\n * @param shader\n */\n setShader(shader: SkShader | null): void;\n\n /**\n * Sets the geometry drawn at the beginning and end of strokes.\n * @param cap\n */\n setStrokeCap(cap: StrokeCap): void;\n\n /**\n * Sets the geometry drawn at the corners of strokes.\n * @param join\n */\n setStrokeJoin(join: StrokeJoin): void;\n\n /**\n * Sets the limit at which a sharp corner is drawn beveled.\n * @param limit\n */\n setStrokeMiter(limit: number): void;\n\n /**\n * Sets the thickness of the pen used to outline the shape.\n * @param width\n */\n setStrokeWidth(width: number): void;\n\n /**\n * Sets whether the geometry is filled or stroked.\n * @param style\n */\n setStyle(style: PaintStyle): void;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["Host.ts"],"names":["NotImplementedOnRNWeb","Error","constructor","msg","Host","CanvasKit","BaseHostObject","ref","typename","__typename__","HostObject","fromValue","value","ckEnum","optEnum","undefined"],"mappings":";;;;;;;;;AAIO,MAAMA,qBAAN,SAAoCC,KAApC,CAA0C;AAC/CC,EAAAA,WAAW,CAACC,GAAD,EAAe;AACxB,UAAMA,GAAN,aAAMA,GAAN,cAAMA,GAAN,GAAa,qCAAb;AACD;;AAH8C;;;;AAM1C,MAAeC,IAAf,CAAoB;AAGzBF,EAAAA,WAAW,CAACG,SAAD,EAAuB;AAAA;;AAChC,SAAKA,SAAL,GAAiBA,SAAjB;AACD;;AALwB;;;;AAQpB,MAAeC,cAAf,SACGF,IADH,CAGP;AAIEF,EAAAA,WAAW,CAACG,SAAD,EAAuBE,GAAvB,EAA+BC,QAA/B,EAA4C;AACrD,UAAMH,SAAN;;AADqD;;AAAA;;AAErD,SAAKE,GAAL,GAAWA,GAAX;AACA,SAAKE,YAAL,GAAoBD,QAApB;AACD;;AARH;;;;AAWO,MAAeE,UAAf,SAAuDJ,cAAvD,CAGL;AACgB,SAATK,SAAS,CAAIC,KAAJ,EAAkC;AAChD,WAAQA,KAAD,CAAiCL,GAAxC;AACD;;AAHD;;;;AAMK,MAAMM,MAAM,GAAID,KAAD,KAAsC;AAAEA,EAAAA;AAAF,CAAtC,CAAf;;;;AACA,MAAME,OAAO,GAClBF,KADqB,IAGrBA,KAAK,KAAKG,SAAV,GAAsBA,SAAtB,GAAkC;AAAEH,EAAAA;AAAF,CAH7B","sourcesContent":["import type { CanvasKit, EmbindEnumEntity } from \"canvaskit-wasm\";\n\nimport type { SkJSIInstance } from \"../types\";\n\nexport class NotImplementedOnRNWeb extends Error {\n constructor(msg?: string) {\n super(msg ?? \"Not implemented on React Native Web\");\n }\n}\n\nexport abstract class Host {\n readonly CanvasKit: CanvasKit;\n\n constructor(CanvasKit: CanvasKit) {\n this.CanvasKit = CanvasKit;\n }\n}\n\nexport abstract class BaseHostObject<T, N extends string>\n extends Host\n implements SkJSIInstance<N>\n{\n readonly __typename__: N;\n readonly ref: T;\n\n constructor(CanvasKit: CanvasKit, ref: T, typename: N) {\n super(CanvasKit);\n this.ref = ref;\n this.__typename__ = typename;\n }\n}\n\nexport abstract class HostObject<T, N extends string> extends BaseHostObject<\n T,\n N\n> {\n static fromValue<T>(value: SkJSIInstance<string>) {\n return (value as HostObject<T, string>).ref;\n }\n}\n\nexport const ckEnum = (value: number): EmbindEnumEntity => ({ value });\nexport const optEnum = (\n value: number | undefined\n): EmbindEnumEntity | undefined =>\n value === undefined ? undefined : { value };\n"]}
1
+ {"version":3,"sources":["Host.ts"],"names":["NotImplementedOnRNWeb","Error","constructor","msg","Host","CanvasKit","BaseHostObject","ref","typename","__typename__","HostObject","fromValue","value","ckEnum","optEnum","undefined"],"mappings":";;;;;;;;;AAIO,MAAMA,qBAAN,SAAoCC,KAApC,CAA0C;AAC/CC,EAAAA,WAAW,CAACC,GAAD,EAAe;AACxB,UAAMA,GAAN,aAAMA,GAAN,cAAMA,GAAN,GAAa,qCAAb;AACD;;AAH8C;;;;AAM1C,MAAeC,IAAf,CAAoB;AAGzBF,EAAAA,WAAW,CAACG,SAAD,EAAuB;AAAA;;AAChC,SAAKA,SAAL,GAAiBA,SAAjB;AACD;;AALwB;;;;AAQpB,MAAeC,cAAf,SACGF,IADH,CAGP;AAIEF,EAAAA,WAAW,CAACG,SAAD,EAAuBE,GAAvB,EAA+BC,QAA/B,EAA4C;AACrD,UAAMH,SAAN;;AADqD;;AAAA;;AAErD,SAAKE,GAAL,GAAWA,GAAX;AACA,SAAKE,YAAL,GAAoBD,QAApB;AACD;;AARH;;;;AAWO,MAAeE,UAAf,SAAuDJ,cAAvD,CAGL;AACgB,SAATK,SAAS,CAAIC,KAAJ,EAAkC;AAChD,WAAQA,KAAD,CAAiCL,GAAxC;AACD;;AAHD;;;;AAMK,MAAMM,MAAM,GAAID,KAAD,KAAsC;AAAEA,EAAAA;AAAF,CAAtC,CAAf;;;;AACA,MAAME,OAAO,GAClBF,KADqB,IAGrBA,KAAK,KAAKG,SAAV,GAAsBA,SAAtB,GAAkC;AAAEH,EAAAA;AAAF,CAH7B","sourcesContent":["import type { CanvasKit, EmbindEnumEntity } from \"canvaskit-wasm\";\n\nimport type { SkJSIInstance } from \"../types\";\n\nexport class NotImplementedOnRNWeb extends Error {\n constructor(msg?: string) {\n super(msg ?? \"Not implemented on React Native Web\");\n }\n}\n\nexport abstract class Host {\n readonly CanvasKit: CanvasKit;\n\n constructor(CanvasKit: CanvasKit) {\n this.CanvasKit = CanvasKit;\n }\n}\n\nexport abstract class BaseHostObject<T, N extends string>\n extends Host\n implements SkJSIInstance<N>\n{\n readonly __typename__: N;\n ref: T;\n\n constructor(CanvasKit: CanvasKit, ref: T, typename: N) {\n super(CanvasKit);\n this.ref = ref;\n this.__typename__ = typename;\n }\n}\n\nexport abstract class HostObject<T, N extends string> extends BaseHostObject<\n T,\n N\n> {\n static fromValue<T>(value: SkJSIInstance<string>) {\n return (value as HostObject<T, string>).ref;\n }\n}\n\nexport const ckEnum = (value: number): EmbindEnumEntity => ({ value });\nexport const optEnum = (\n value: number | undefined\n): EmbindEnumEntity | undefined =>\n value === undefined ? undefined : { value };\n"]}
@@ -26,6 +26,10 @@ class JsiSkPaint extends _Host.HostObject {
26
26
  return new JsiSkPaint(this.CanvasKit, this.ref.copy());
27
27
  }
28
28
 
29
+ reset() {
30
+ this.ref = new this.CanvasKit.Paint();
31
+ }
32
+
29
33
  getColor() {
30
34
  return this.ref.getColor();
31
35
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["JsiSkPaint.ts"],"names":["JsiSkPaint","HostObject","constructor","CanvasKit","ref","copy","getColor","getStrokeCap","value","getStrokeJoin","getStrokeMiter","getStrokeWidth","setAlphaf","alpha","setAntiAlias","aa","setBlendMode","blendMode","setColor","color","setColorFilter","filter","JsiSkColorFilter","fromValue","setImageFilter","JsiSkImageFilter","setMaskFilter","JsiSkMaskFilter","setPathEffect","effect","JsiSkPathEffect","setShader","shader","JsiSkShader","setStrokeCap","cap","setStrokeJoin","join","setStrokeMiter","limit","setStrokeWidth","width","setStyle","style"],"mappings":"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","sourcesContent":["import type { CanvasKit, Paint } from \"canvaskit-wasm\";\n\nimport type {\n StrokeJoin,\n BlendMode,\n SkColor,\n SkColorFilter,\n SkImageFilter,\n SkPaint,\n SkShader,\n StrokeCap,\n PaintStyle,\n SkMaskFilter,\n SkPathEffect,\n} from \"../types\";\n\nimport { HostObject, ckEnum } from \"./Host\";\nimport { JsiSkColorFilter } from \"./JsiSkColorFilter\";\nimport { JsiSkImageFilter } from \"./JsiSkImageFilter\";\nimport { JsiSkMaskFilter } from \"./JsiSkMaskFilter\";\nimport { JsiSkPathEffect } from \"./JsiSkPathEffect\";\nimport { JsiSkShader } from \"./JsiSkShader\";\n\nexport class JsiSkPaint extends HostObject<Paint, \"Paint\"> implements SkPaint {\n constructor(CanvasKit: CanvasKit, ref: Paint) {\n super(CanvasKit, ref, \"Paint\");\n }\n\n copy() {\n return new JsiSkPaint(this.CanvasKit, this.ref.copy());\n }\n\n getColor() {\n return this.ref.getColor();\n }\n\n getStrokeCap() {\n return this.ref.getStrokeCap().value;\n }\n\n getStrokeJoin() {\n return this.ref.getStrokeJoin().value;\n }\n\n getStrokeMiter() {\n return this.ref.getStrokeMiter();\n }\n\n getStrokeWidth() {\n return this.ref.getStrokeWidth();\n }\n\n setAlphaf(alpha: number) {\n this.ref.setAlphaf(alpha);\n }\n\n setAntiAlias(aa: boolean) {\n this.ref.setAntiAlias(aa);\n }\n\n setBlendMode(blendMode: BlendMode) {\n this.ref.setBlendMode(ckEnum(blendMode));\n }\n\n setColor(color: SkColor) {\n this.ref.setColor(color);\n }\n\n setColorFilter(filter: SkColorFilter | null) {\n this.ref.setColorFilter(filter ? JsiSkColorFilter.fromValue(filter) : null);\n }\n\n setImageFilter(filter: SkImageFilter | null) {\n this.ref.setImageFilter(filter ? JsiSkImageFilter.fromValue(filter) : null);\n }\n\n setMaskFilter(filter: SkMaskFilter | null) {\n this.ref.setMaskFilter(filter ? JsiSkMaskFilter.fromValue(filter) : null);\n }\n\n setPathEffect(effect: SkPathEffect | null) {\n this.ref.setPathEffect(effect ? JsiSkPathEffect.fromValue(effect) : null);\n }\n\n setShader(shader: SkShader | null) {\n this.ref.setShader(shader ? JsiSkShader.fromValue(shader) : null);\n }\n\n setStrokeCap(cap: StrokeCap) {\n this.ref.setStrokeCap(ckEnum(cap));\n }\n\n setStrokeJoin(join: StrokeJoin) {\n this.ref.setStrokeJoin(ckEnum(join));\n }\n\n setStrokeMiter(limit: number) {\n this.ref.setStrokeMiter(limit);\n }\n\n setStrokeWidth(width: number) {\n this.ref.setStrokeWidth(width);\n }\n\n setStyle(style: PaintStyle) {\n this.ref.setStyle({ value: style });\n }\n}\n"]}
1
+ {"version":3,"sources":["JsiSkPaint.ts"],"names":["JsiSkPaint","HostObject","constructor","CanvasKit","ref","copy","reset","Paint","getColor","getStrokeCap","value","getStrokeJoin","getStrokeMiter","getStrokeWidth","setAlphaf","alpha","setAntiAlias","aa","setBlendMode","blendMode","setColor","color","setColorFilter","filter","JsiSkColorFilter","fromValue","setImageFilter","JsiSkImageFilter","setMaskFilter","JsiSkMaskFilter","setPathEffect","effect","JsiSkPathEffect","setShader","shader","JsiSkShader","setStrokeCap","cap","setStrokeJoin","join","setStrokeMiter","limit","setStrokeWidth","width","setStyle","style"],"mappings":"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","sourcesContent":["import type { CanvasKit, Paint } from \"canvaskit-wasm\";\n\nimport type {\n StrokeJoin,\n BlendMode,\n SkColor,\n SkColorFilter,\n SkImageFilter,\n SkPaint,\n SkShader,\n StrokeCap,\n PaintStyle,\n SkMaskFilter,\n SkPathEffect,\n} from \"../types\";\n\nimport { HostObject, ckEnum } from \"./Host\";\nimport { JsiSkColorFilter } from \"./JsiSkColorFilter\";\nimport { JsiSkImageFilter } from \"./JsiSkImageFilter\";\nimport { JsiSkMaskFilter } from \"./JsiSkMaskFilter\";\nimport { JsiSkPathEffect } from \"./JsiSkPathEffect\";\nimport { JsiSkShader } from \"./JsiSkShader\";\n\nexport class JsiSkPaint extends HostObject<Paint, \"Paint\"> implements SkPaint {\n constructor(CanvasKit: CanvasKit, ref: Paint) {\n super(CanvasKit, ref, \"Paint\");\n }\n\n copy() {\n return new JsiSkPaint(this.CanvasKit, this.ref.copy());\n }\n\n reset() {\n this.ref = new this.CanvasKit.Paint();\n }\n\n getColor() {\n return this.ref.getColor();\n }\n\n getStrokeCap() {\n return this.ref.getStrokeCap().value;\n }\n\n getStrokeJoin() {\n return this.ref.getStrokeJoin().value;\n }\n\n getStrokeMiter() {\n return this.ref.getStrokeMiter();\n }\n\n getStrokeWidth() {\n return this.ref.getStrokeWidth();\n }\n\n setAlphaf(alpha: number) {\n this.ref.setAlphaf(alpha);\n }\n\n setAntiAlias(aa: boolean) {\n this.ref.setAntiAlias(aa);\n }\n\n setBlendMode(blendMode: BlendMode) {\n this.ref.setBlendMode(ckEnum(blendMode));\n }\n\n setColor(color: SkColor) {\n this.ref.setColor(color);\n }\n\n setColorFilter(filter: SkColorFilter | null) {\n this.ref.setColorFilter(filter ? JsiSkColorFilter.fromValue(filter) : null);\n }\n\n setImageFilter(filter: SkImageFilter | null) {\n this.ref.setImageFilter(filter ? JsiSkImageFilter.fromValue(filter) : null);\n }\n\n setMaskFilter(filter: SkMaskFilter | null) {\n this.ref.setMaskFilter(filter ? JsiSkMaskFilter.fromValue(filter) : null);\n }\n\n setPathEffect(effect: SkPathEffect | null) {\n this.ref.setPathEffect(effect ? JsiSkPathEffect.fromValue(effect) : null);\n }\n\n setShader(shader: SkShader | null) {\n this.ref.setShader(shader ? JsiSkShader.fromValue(shader) : null);\n }\n\n setStrokeCap(cap: StrokeCap) {\n this.ref.setStrokeCap(ckEnum(cap));\n }\n\n setStrokeJoin(join: StrokeJoin) {\n this.ref.setStrokeJoin(ckEnum(join));\n }\n\n setStrokeMiter(limit: number) {\n this.ref.setStrokeMiter(limit);\n }\n\n setStrokeWidth(width: number) {\n this.ref.setStrokeWidth(width);\n }\n\n setStyle(style: PaintStyle) {\n this.ref.setStyle({ value: style });\n }\n}\n"]}
@@ -18,7 +18,7 @@ skiaReconciler.injectIntoDevTools({
18
18
  const render = (element, root, container) => {
19
19
  skiaReconciler.updateContainer(element, root, null, () => {
20
20
  hostDebug("updateContainer");
21
- container.depMgr.subscribe();
21
+ container.depMgr.update();
22
22
  });
23
23
  };
24
24
 
@@ -43,14 +43,22 @@ export const Canvas = /*#__PURE__*/forwardRef((_ref, forwardedRef) => {
43
43
  const ref = useCombinedRefs(forwardedRef, innerRef);
44
44
  const [tick, setTick] = useState(0);
45
45
  const redraw = useCallback(() => setTick(t => t + 1), []);
46
- const container = useMemo(() => new Container(new DependencyManager(ref), redraw), [redraw, ref]);
46
+ const registerValues = useCallback(values => {
47
+ if (ref.current === null) {
48
+ throw new Error("Canvas ref is not set");
49
+ }
50
+
51
+ return ref.current.registerValues(values);
52
+ }, [ref]);
53
+ const container = useMemo(() => new Container(new DependencyManager(registerValues), redraw), [redraw, registerValues]);
47
54
  const root = useMemo(() => skiaReconciler.createContainer(container, 0, false, null), [container]); // Render effect
48
55
 
49
56
  useEffect(() => {
50
57
  render( /*#__PURE__*/React.createElement(CanvasProvider, {
51
58
  value: canvasCtx
52
59
  }, children), root, container);
53
- }, [children, root, redraw, container, canvasCtx]); // Draw callback
60
+ }, [children, root, redraw, container, canvasCtx]);
61
+ const paint = useMemo(() => Skia.Paint(), []); // Draw callback
54
62
 
55
63
  const onDraw = useDrawCallback((canvas, info) => {
56
64
  // TODO: if tree is empty (count === 1) maybe we should not render?
@@ -71,7 +79,7 @@ export const Canvas = /*#__PURE__*/forwardRef((_ref, forwardedRef) => {
71
79
  };
72
80
  }
73
81
 
74
- const paint = Skia.Paint();
82
+ paint.reset();
75
83
  const ctx = {
76
84
  width,
77
85
  height,
@@ -80,7 +88,10 @@ export const Canvas = /*#__PURE__*/forwardRef((_ref, forwardedRef) => {
80
88
  paint,
81
89
  opacity: 1,
82
90
  ref,
83
- center: Skia.Point(width / 2, height / 2),
91
+ center: {
92
+ x: width / 2,
93
+ y: height / 2
94
+ },
84
95
  Skia
85
96
  };
86
97
  container.draw(ctx);
@@ -88,7 +99,7 @@ export const Canvas = /*#__PURE__*/forwardRef((_ref, forwardedRef) => {
88
99
  useEffect(() => {
89
100
  return () => {
90
101
  skiaReconciler.updateContainer(null, root, null, () => {
91
- container.depMgr.unsubscribe();
102
+ container.depMgr.remove();
92
103
  });
93
104
  };
94
105
  }, [container, root]);
@@ -1 +1 @@
1
- {"version":3,"sources":["Canvas.tsx"],"names":["React","useEffect","useState","useCallback","useMemo","forwardRef","useRef","ReactReconciler","SkiaView","useDrawCallback","useValue","Skia","debug","hostDebug","skHostConfig","Container","DependencyManager","CanvasProvider","skiaReconciler","injectIntoDevTools","bundleType","version","rendererPackageName","render","element","root","container","updateContainer","depMgr","subscribe","useCanvasRef","Canvas","forwardedRef","children","style","mode","onTouch","size","width","height","canvasCtx","innerRef","ref","useCombinedRefs","tick","setTick","redraw","t","createContainer","onDraw","canvas","info","timestamp","touches","current","paint","Paint","ctx","opacity","center","Point","draw","unsubscribe","refs","targetRef","forEach"],"mappings":"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","sourcesContent":["import React, {\n useEffect,\n useState,\n useCallback,\n useMemo,\n forwardRef,\n useRef,\n} from \"react\";\nimport type {\n RefObject,\n ReactNode,\n ComponentProps,\n MutableRefObject,\n ForwardedRef,\n} from \"react\";\nimport type { OpaqueRoot } from \"react-reconciler\";\nimport ReactReconciler from \"react-reconciler\";\n\nimport { SkiaView, useDrawCallback } from \"../views\";\nimport type { TouchHandler } from \"../views\";\nimport { useValue } from \"../values/hooks/useValue\";\nimport { Skia } from \"../skia/Skia\";\n\nimport { debug as hostDebug, skHostConfig } from \"./HostConfig\";\n// import { debugTree } from \"./nodes\";\nimport { Container } from \"./nodes\";\nimport { DependencyManager } from \"./DependencyManager\";\nimport { CanvasProvider } from \"./useCanvas\";\n\nexport const skiaReconciler = ReactReconciler(skHostConfig);\n\nskiaReconciler.injectIntoDevTools({\n bundleType: 1,\n version: \"0.0.1\",\n rendererPackageName: \"react-native-skia\",\n});\n\nconst render = (element: ReactNode, root: OpaqueRoot, container: Container) => {\n skiaReconciler.updateContainer(element, root, null, () => {\n hostDebug(\"updateContainer\");\n\n container.depMgr.subscribe();\n });\n};\n\nexport const useCanvasRef = () => useRef<SkiaView>(null);\n\nexport interface CanvasProps extends ComponentProps<typeof SkiaView> {\n ref?: RefObject<SkiaView>;\n children: ReactNode;\n onTouch?: TouchHandler;\n}\n\nexport const Canvas = forwardRef<SkiaView, CanvasProps>(\n ({ children, style, debug, mode, onTouch }, forwardedRef) => {\n const size = useValue({ width: 0, height: 0 });\n const canvasCtx = useMemo(() => ({ Skia, size }), [size]);\n const innerRef = useCanvasRef();\n const ref = useCombinedRefs(forwardedRef, innerRef);\n const [tick, setTick] = useState(0);\n const redraw = useCallback(() => setTick((t) => t + 1), []);\n\n const container = useMemo(\n () => new Container(new DependencyManager(ref), redraw),\n [redraw, ref]\n );\n\n const root = useMemo(\n () => skiaReconciler.createContainer(container, 0, false, null),\n [container]\n );\n // Render effect\n useEffect(() => {\n render(\n <CanvasProvider value={canvasCtx}>{children}</CanvasProvider>,\n root,\n container\n );\n }, [children, root, redraw, container, canvasCtx]);\n\n // Draw callback\n const onDraw = useDrawCallback(\n (canvas, info) => {\n // TODO: if tree is empty (count === 1) maybe we should not render?\n const { width, height, timestamp } = info;\n if (onTouch) {\n onTouch(info.touches);\n }\n if (\n width !== canvasCtx.size.current.width ||\n height !== canvasCtx.size.current.height\n ) {\n canvasCtx.size.current = { width, height };\n }\n const paint = Skia.Paint();\n const ctx = {\n width,\n height,\n timestamp,\n canvas,\n paint,\n opacity: 1,\n ref,\n center: Skia.Point(width / 2, height / 2),\n Skia,\n };\n container.draw(ctx);\n },\n [tick, onTouch]\n );\n\n useEffect(() => {\n return () => {\n skiaReconciler.updateContainer(null, root, null, () => {\n container.depMgr.unsubscribe();\n });\n };\n }, [container, root]);\n\n return (\n <SkiaView\n ref={ref}\n style={style}\n onDraw={onDraw}\n mode={mode}\n debug={debug}\n />\n );\n }\n);\n\n/**\n * Combines a list of refs into a single ref. This can be used to provide\n * both a forwarded ref and an internal ref keeping the same functionality\n * on both of the refs.\n * @param refs Array of refs to combine\n * @returns A single ref that can be used in a ref prop.\n */\nconst useCombinedRefs = <T,>(\n ...refs: Array<MutableRefObject<T> | ForwardedRef<T>>\n) => {\n const targetRef = React.useRef<T>(null);\n React.useEffect(() => {\n refs.forEach((ref) => {\n if (ref) {\n if (typeof ref === \"function\") {\n ref(targetRef.current);\n } else {\n ref.current = targetRef.current;\n }\n }\n });\n }, [refs]);\n return targetRef;\n};\n"]}
1
+ {"version":3,"sources":["Canvas.tsx"],"names":["React","useEffect","useState","useCallback","useMemo","forwardRef","useRef","ReactReconciler","SkiaView","useDrawCallback","useValue","Skia","debug","hostDebug","skHostConfig","Container","DependencyManager","CanvasProvider","skiaReconciler","injectIntoDevTools","bundleType","version","rendererPackageName","render","element","root","container","updateContainer","depMgr","update","useCanvasRef","Canvas","forwardedRef","children","style","mode","onTouch","size","width","height","canvasCtx","innerRef","ref","useCombinedRefs","tick","setTick","redraw","t","registerValues","values","current","Error","createContainer","paint","Paint","onDraw","canvas","info","timestamp","touches","reset","ctx","opacity","center","x","y","draw","remove","refs","targetRef","forEach"],"mappings":"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","sourcesContent":["import React, {\n useEffect,\n useState,\n useCallback,\n useMemo,\n forwardRef,\n useRef,\n} from \"react\";\nimport type {\n RefObject,\n ReactNode,\n ComponentProps,\n MutableRefObject,\n ForwardedRef,\n} from \"react\";\nimport type { OpaqueRoot } from \"react-reconciler\";\nimport ReactReconciler from \"react-reconciler\";\n\nimport { SkiaView, useDrawCallback } from \"../views\";\nimport type { TouchHandler } from \"../views\";\nimport { useValue } from \"../values/hooks/useValue\";\nimport { Skia } from \"../skia/Skia\";\nimport type { SkiaValue } from \"../values\";\n\nimport { debug as hostDebug, skHostConfig } from \"./HostConfig\";\n// import { debugTree } from \"./nodes\";\nimport { Container } from \"./nodes\";\nimport { DependencyManager } from \"./DependencyManager\";\nimport { CanvasProvider } from \"./useCanvas\";\n\nexport const skiaReconciler = ReactReconciler(skHostConfig);\n\nskiaReconciler.injectIntoDevTools({\n bundleType: 1,\n version: \"0.0.1\",\n rendererPackageName: \"react-native-skia\",\n});\n\nconst render = (element: ReactNode, root: OpaqueRoot, container: Container) => {\n skiaReconciler.updateContainer(element, root, null, () => {\n hostDebug(\"updateContainer\");\n container.depMgr.update();\n });\n};\n\nexport const useCanvasRef = () => useRef<SkiaView>(null);\n\nexport interface CanvasProps extends ComponentProps<typeof SkiaView> {\n ref?: RefObject<SkiaView>;\n children: ReactNode;\n onTouch?: TouchHandler;\n}\n\nexport const Canvas = forwardRef<SkiaView, CanvasProps>(\n ({ children, style, debug, mode, onTouch }, forwardedRef) => {\n const size = useValue({ width: 0, height: 0 });\n const canvasCtx = useMemo(() => ({ Skia, size }), [size]);\n const innerRef = useCanvasRef();\n const ref = useCombinedRefs(forwardedRef, innerRef);\n const [tick, setTick] = useState(0);\n const redraw = useCallback(() => setTick((t) => t + 1), []);\n\n const registerValues = useCallback(\n (values: Array<SkiaValue<unknown>>) => {\n if (ref.current === null) {\n throw new Error(\"Canvas ref is not set\");\n }\n return ref.current.registerValues(values);\n },\n [ref]\n );\n\n const container = useMemo(\n () => new Container(new DependencyManager(registerValues), redraw),\n [redraw, registerValues]\n );\n\n const root = useMemo(\n () => skiaReconciler.createContainer(container, 0, false, null),\n [container]\n );\n // Render effect\n useEffect(() => {\n render(\n <CanvasProvider value={canvasCtx}>{children}</CanvasProvider>,\n root,\n container\n );\n }, [children, root, redraw, container, canvasCtx]);\n\n const paint = useMemo(() => Skia.Paint(), []);\n\n // Draw callback\n const onDraw = useDrawCallback(\n (canvas, info) => {\n // TODO: if tree is empty (count === 1) maybe we should not render?\n const { width, height, timestamp } = info;\n if (onTouch) {\n onTouch(info.touches);\n }\n if (\n width !== canvasCtx.size.current.width ||\n height !== canvasCtx.size.current.height\n ) {\n canvasCtx.size.current = { width, height };\n }\n paint.reset();\n const ctx = {\n width,\n height,\n timestamp,\n canvas,\n paint,\n opacity: 1,\n ref,\n center: { x: width / 2, y: height / 2 },\n Skia,\n };\n container.draw(ctx);\n },\n [tick, onTouch]\n );\n\n useEffect(() => {\n return () => {\n skiaReconciler.updateContainer(null, root, null, () => {\n container.depMgr.remove();\n });\n };\n }, [container, root]);\n\n return (\n <SkiaView\n ref={ref}\n style={style}\n onDraw={onDraw}\n mode={mode}\n debug={debug}\n />\n );\n }\n);\n\n/**\n * Combines a list of refs into a single ref. This can be used to provide\n * both a forwarded ref and an internal ref keeping the same functionality\n * on both of the refs.\n * @param refs Array of refs to combine\n * @returns A single ref that can be used in a ref prop.\n */\nconst useCombinedRefs = <T,>(\n ...refs: Array<MutableRefObject<T> | ForwardedRef<T>>\n) => {\n const targetRef = React.useRef<T>(null);\n React.useEffect(() => {\n refs.forEach((ref) => {\n if (ref) {\n if (typeof ref === \"function\") {\n ref(targetRef.current);\n } else {\n ref.current = targetRef.current;\n }\n }\n });\n }, [refs]);\n return targetRef;\n};\n"]}
@@ -1,60 +1,167 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  import { isSelector, isValue } from "./processors";
4
+ import { mapKeys } from "./typeddash";
4
5
  export class DependencyManager {
5
- constructor(ref) {
6
- _defineProperty(this, "ref", void 0);
6
+ constructor(registerValues) {
7
+ _defineProperty(this, "registerValues", void 0);
7
8
 
8
9
  _defineProperty(this, "subscriptions", new Map());
9
10
 
10
- this.ref = ref;
11
+ _defineProperty(this, "unregisterDependantValues", null);
12
+
13
+ this.registerValues = registerValues;
11
14
  }
15
+ /**
16
+ * Call to unsubscribe all value listeners from the given node based
17
+ * on the current list of subscriptions for the node. This function
18
+ * is typically called when the node is unmounted or when one or more
19
+ * properties have changed.
20
+ * @param node Node to unsubscribe value listeners from
21
+ */
12
22
 
13
- unSubscribeNode(node) {
14
- const subscription = this.subscriptions.get(node);
15
23
 
16
- if (subscription && subscription.unsubscribe) {
17
- subscription.unsubscribe();
18
- }
24
+ unsubscribeNode(node) {
25
+ const subscriptions = Array.from(this.subscriptions.values()).filter(p => p.nodes.has(node));
19
26
 
20
- this.subscriptions.delete(node);
21
- }
27
+ if (subscriptions) {
28
+ subscriptions.forEach(si => {
29
+ // Delete node from subscription
30
+ si.nodes.delete(node); // Remove subscription if there are no listeneres left on the value
22
31
 
23
- subscribeNode(node, props) {
24
- const values = Object.values(props).filter(v => isValue(v) || isSelector(v)).map(v => isSelector(v) ? v.value : v);
32
+ if (si.nodes.size === 0) {
33
+ // There are no more nodes subscribing to this value, we can call
34
+ // unsubscribe on it.
35
+ if (!si.unsubscribe) {
36
+ throw new Error("Failed to unsubscribe to value subscription");
37
+ }
25
38
 
26
- if (values.length > 0) {
27
- this.subscriptions.set(node, {
28
- values,
29
- unsubscribe: null
39
+ si.unsubscribe && si.unsubscribe(); // Remove from subscription states as well
40
+
41
+ const element = Array.from(this.subscriptions.entries()).find(_ref => {
42
+ let [_, sub] = _ref;
43
+ return sub === si;
44
+ });
45
+
46
+ if (!element) {
47
+ throw new Error("Failed to find value subscription");
48
+ }
49
+
50
+ if (!this.subscriptions.delete(element[0])) {
51
+ throw new Error("Failed to delete value subscription");
52
+ }
53
+ }
30
54
  });
31
55
  }
32
56
  }
57
+ /**
58
+ * Adds listeners to the provided values so that the node is notified
59
+ * when a value changes. This is done in an optimized way so that this
60
+ * class only needs to listen to the value once and then forwards the
61
+ * change to the node and its listener. This method is typically called
62
+ * when the node is mounted and when one or more props on the node changes.
63
+ * @param node Node to subscribe to value changes for
64
+ * @param props Node's properties
65
+ * @param onResolveProp Callback when a property value changes
66
+ */
33
67
 
34
- subscribe() {
35
- if (this.ref.current === null) {
36
- throw new Error("Canvas ref is not set");
37
- }
38
68
 
39
- this.subscriptions.forEach(subscription => {
40
- if (subscription.unsubscribe === null) {
41
- subscription.unsubscribe = this.ref.current.registerValues(subscription.values);
42
- }
69
+ subscribeNode(node, props) {
70
+ // Get mutators from node's properties
71
+ const propSubscriptions = initializePropertySubscriptions(node, props);
72
+
73
+ if (propSubscriptions.length === 0) {
74
+ return;
75
+ } // Install all mutators for the node
76
+
77
+
78
+ propSubscriptions.forEach(ps => {
79
+ // Do we already have a state for this SkiaValue
80
+ let subscriptionState = this.subscriptions.get(ps.value);
81
+
82
+ if (!subscriptionState) {
83
+ // Let's create a new subscription state for the skia value
84
+ subscriptionState = {
85
+ nodes: new Map(),
86
+ unsubscribe: null
87
+ }; // Add single subscription to the new value
88
+
89
+ subscriptionState.unsubscribe = ps.value.addListener(v => {
90
+ subscriptionState.nodes.forEach(mutators => mutators.forEach(m => m(v)));
91
+ });
92
+ this.subscriptions.set(ps.value, subscriptionState);
93
+ } // subscription mutators
94
+
95
+
96
+ subscriptionState.nodes.set(node, propSubscriptions.filter(m => m.value === ps.value).map(m => m.mutator));
43
97
  });
44
98
  }
99
+ /**
100
+ * Called when the hosting container is mounted or updated. This ensures that we have
101
+ * a ref to the underlying SkiaView so that we can registers redraw listeners
102
+ * on values used in the current View automatically.
103
+ */
45
104
 
46
- unsubscribe() {
47
- this.subscriptions.forEach(_ref => {
48
- let {
49
- unsubscribe
50
- } = _ref;
51
105
 
52
- if (unsubscribe) {
53
- unsubscribe();
54
- }
55
- });
106
+ update() {
107
+ // Remove any previous registrations
108
+ if (this.unregisterDependantValues) {
109
+ this.unregisterDependantValues();
110
+ } // Register redraw requests on the SkiaView for each unique value
111
+
112
+
113
+ this.unregisterDependantValues = this.registerValues(Array.from(this.subscriptions.keys()));
114
+ }
115
+ /**
116
+ * Called when the hosting container is unmounted or recreated. This ensures that we remove
117
+ * all subscriptions to Skia values so that we don't have any listeners left after
118
+ * the component is removed.
119
+ */
120
+
121
+
122
+ remove() {
123
+ // 1) Unregister redraw requests
124
+ if (this.unregisterDependantValues) {
125
+ this.unregisterDependantValues();
126
+ this.unregisterDependantValues = null;
127
+ } // 2) Unregister nodes
128
+
129
+
130
+ Array.from(this.subscriptions.values()).forEach(si => {
131
+ Array.from(si.nodes.keys()).forEach(node => this.unsubscribeNode(node));
132
+ }); // 3) Clear the rest of the subscriptions
133
+
56
134
  this.subscriptions.clear();
57
135
  }
58
136
 
59
137
  }
138
+
139
+ const initializePropertySubscriptions = (node, props) => {
140
+ const nodePropSubscriptions = [];
141
+ mapKeys(props).forEach(key => {
142
+ const propvalue = props[key];
143
+
144
+ if (isValue(propvalue)) {
145
+ // Subscribe to changes
146
+ nodePropSubscriptions.push({
147
+ value: propvalue,
148
+ mutator: v => node.resolvedProps[key] = v
149
+ }); // Set initial value
150
+
151
+ node.resolvedProps[key] = propvalue.current;
152
+ } else if (isSelector(propvalue)) {
153
+ // Subscribe to changes
154
+ nodePropSubscriptions.push({
155
+ value: propvalue.value,
156
+ mutator: v => node.resolvedProps[key] = propvalue.selector(v)
157
+ }); // Set initial value
158
+
159
+ node.resolvedProps[key] = propvalue.selector(propvalue.value.current);
160
+ } else {
161
+ // Set initial value
162
+ node.resolvedProps[key] = propvalue;
163
+ }
164
+ });
165
+ return nodePropSubscriptions;
166
+ };
60
167
  //# sourceMappingURL=DependencyManager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["DependencyManager.tsx"],"names":["isSelector","isValue","DependencyManager","constructor","ref","Map","unSubscribeNode","node","subscription","subscriptions","get","unsubscribe","delete","subscribeNode","props","values","Object","filter","v","map","value","length","set","subscribe","current","Error","forEach","registerValues","clear"],"mappings":";;AAKA,SAASA,UAAT,EAAqBC,OAArB,QAAoC,cAApC;AAMA,OAAO,MAAMC,iBAAN,CAAwB;AAO7BC,EAAAA,WAAW,CAACC,GAAD,EAA2B;AAAA;;AAAA,2CAFlC,IAAIC,GAAJ,EAEkC;;AACpC,SAAKD,GAAL,GAAWA,GAAX;AACD;;AAEDE,EAAAA,eAAe,CAACC,IAAD,EAAa;AAC1B,UAAMC,YAAY,GAAG,KAAKC,aAAL,CAAmBC,GAAnB,CAAuBH,IAAvB,CAArB;;AACA,QAAIC,YAAY,IAAIA,YAAY,CAACG,WAAjC,EAA8C;AAC5CH,MAAAA,YAAY,CAACG,WAAb;AACD;;AACD,SAAKF,aAAL,CAAmBG,MAAnB,CAA0BL,IAA1B;AACD;;AAEDM,EAAAA,aAAa,CAACN,IAAD,EAAaO,KAAb,EAA2B;AACtC,UAAMC,MAAM,GAAGC,MAAM,CAACD,MAAP,CAAcD,KAAd,EACZG,MADY,CACJC,CAAD,IAAOjB,OAAO,CAACiB,CAAD,CAAP,IAAclB,UAAU,CAACkB,CAAD,CAD1B,EAEZC,GAFY,CAEPD,CAAD,IAAQlB,UAAU,CAACkB,CAAD,CAAV,GAAgBA,CAAC,CAACE,KAAlB,GAA2BF,CAF3B,CAAf;;AAIA,QAAIH,MAAM,CAACM,MAAP,GAAgB,CAApB,EAAuB;AACrB,WAAKZ,aAAL,CAAmBa,GAAnB,CAAuBf,IAAvB,EAA6B;AAAEQ,QAAAA,MAAF;AAAUJ,QAAAA,WAAW,EAAE;AAAvB,OAA7B;AACD;AACF;;AAEDY,EAAAA,SAAS,GAAG;AACV,QAAI,KAAKnB,GAAL,CAASoB,OAAT,KAAqB,IAAzB,EAA+B;AAC7B,YAAM,IAAIC,KAAJ,CAAU,uBAAV,CAAN;AACD;;AACD,SAAKhB,aAAL,CAAmBiB,OAAnB,CAA4BlB,YAAD,IAAkB;AAC3C,UAAIA,YAAY,CAACG,WAAb,KAA6B,IAAjC,EAAuC;AACrCH,QAAAA,YAAY,CAACG,WAAb,GAA2B,KAAKP,GAAL,CAASoB,OAAT,CAAkBG,cAAlB,CACzBnB,YAAY,CAACO,MADY,CAA3B;AAGD;AACF,KAND;AAOD;;AAEDJ,EAAAA,WAAW,GAAG;AACZ,SAAKF,aAAL,CAAmBiB,OAAnB,CAA2B,QAAqB;AAAA,UAApB;AAAEf,QAAAA;AAAF,OAAoB;;AAC9C,UAAIA,WAAJ,EAAiB;AACfA,QAAAA,WAAW;AACZ;AACF,KAJD;AAKA,SAAKF,aAAL,CAAmBmB,KAAnB;AACD;;AAjD4B","sourcesContent":["import type { RefObject } from \"react\";\n\nimport type { SkiaView } from \"../views\";\nimport type { SkiaValue } from \"../values\";\n\nimport { isSelector, isValue } from \"./processors\";\nimport type { Node } from \"./nodes\";\n\ntype Unsubscribe = () => void;\ntype Props = { [key: string]: unknown };\n\nexport class DependencyManager {\n ref: RefObject<SkiaView>;\n subscriptions: Map<\n Node,\n { values: SkiaValue<unknown>[]; unsubscribe: null | Unsubscribe }\n > = new Map();\n\n constructor(ref: RefObject<SkiaView>) {\n this.ref = ref;\n }\n\n unSubscribeNode(node: Node) {\n const subscription = this.subscriptions.get(node);\n if (subscription && subscription.unsubscribe) {\n subscription.unsubscribe();\n }\n this.subscriptions.delete(node);\n }\n\n subscribeNode(node: Node, props: Props) {\n const values = Object.values(props)\n .filter((v) => isValue(v) || isSelector(v))\n .map((v) => (isSelector(v) ? v.value : (v as SkiaValue<unknown>)));\n\n if (values.length > 0) {\n this.subscriptions.set(node, { values, unsubscribe: null });\n }\n }\n\n subscribe() {\n if (this.ref.current === null) {\n throw new Error(\"Canvas ref is not set\");\n }\n this.subscriptions.forEach((subscription) => {\n if (subscription.unsubscribe === null) {\n subscription.unsubscribe = this.ref.current!.registerValues(\n subscription.values\n );\n }\n });\n }\n\n unsubscribe() {\n this.subscriptions.forEach(({ unsubscribe }) => {\n if (unsubscribe) {\n unsubscribe();\n }\n });\n this.subscriptions.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["DependencyManager.tsx"],"names":["isSelector","isValue","mapKeys","DependencyManager","constructor","registerValues","Map","unsubscribeNode","node","subscriptions","Array","from","values","filter","p","nodes","has","forEach","si","delete","size","unsubscribe","Error","element","entries","find","_","sub","subscribeNode","props","propSubscriptions","initializePropertySubscriptions","length","ps","subscriptionState","get","value","addListener","v","mutators","m","set","map","mutator","update","unregisterDependantValues","keys","remove","clear","nodePropSubscriptions","key","propvalue","push","resolvedProps","current","selector"],"mappings":"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","sourcesContent":["import type { SkiaValue } from \"../values\";\n\nimport type { Node } from \"./nodes\";\nimport type { AnimatedProps } from \"./processors\";\nimport { isSelector, isValue } from \"./processors\";\nimport { mapKeys } from \"./typeddash\";\n\ntype Unsubscribe = () => void;\ntype Mutator = (value: unknown) => void;\n\ntype SubscriptionState = {\n nodes: Map<Node, Mutator[]>;\n unsubscribe: null | Unsubscribe;\n};\n\nexport class DependencyManager {\n registerValues: (values: Array<SkiaValue<unknown>>) => () => void;\n subscriptions: Map<SkiaValue<unknown>, SubscriptionState> = new Map();\n unregisterDependantValues: null | Unsubscribe = null;\n\n constructor(\n registerValues: (values: Array<SkiaValue<unknown>>) => () => void\n ) {\n this.registerValues = registerValues;\n }\n\n /**\n * Call to unsubscribe all value listeners from the given node based\n * on the current list of subscriptions for the node. This function\n * is typically called when the node is unmounted or when one or more\n * properties have changed.\n * @param node Node to unsubscribe value listeners from\n */\n unsubscribeNode(node: Node) {\n const subscriptions = Array.from(this.subscriptions.values()).filter((p) =>\n p.nodes.has(node)\n );\n\n if (subscriptions) {\n subscriptions.forEach((si) => {\n // Delete node from subscription\n si.nodes.delete(node);\n\n // Remove subscription if there are no listeneres left on the value\n if (si.nodes.size === 0) {\n // There are no more nodes subscribing to this value, we can call\n // unsubscribe on it.\n if (!si.unsubscribe) {\n throw new Error(\"Failed to unsubscribe to value subscription\");\n }\n si.unsubscribe && si.unsubscribe();\n\n // Remove from subscription states as well\n const element = Array.from(this.subscriptions.entries()).find(\n ([_, sub]) => sub === si\n );\n if (!element) {\n throw new Error(\"Failed to find value subscription\");\n }\n if (!this.subscriptions.delete(element[0])) {\n throw new Error(\"Failed to delete value subscription\");\n }\n }\n });\n }\n }\n\n /**\n * Adds listeners to the provided values so that the node is notified\n * when a value changes. This is done in an optimized way so that this\n * class only needs to listen to the value once and then forwards the\n * change to the node and its listener. This method is typically called\n * when the node is mounted and when one or more props on the node changes.\n * @param node Node to subscribe to value changes for\n * @param props Node's properties\n * @param onResolveProp Callback when a property value changes\n */\n subscribeNode<P extends Record<string, unknown>>(\n node: Node,\n props: AnimatedProps<P>\n ) {\n // Get mutators from node's properties\n const propSubscriptions = initializePropertySubscriptions(node, props);\n if (propSubscriptions.length === 0) {\n return;\n }\n\n // Install all mutators for the node\n propSubscriptions.forEach((ps) => {\n // Do we already have a state for this SkiaValue\n let subscriptionState = this.subscriptions.get(ps.value);\n if (!subscriptionState) {\n // Let's create a new subscription state for the skia value\n subscriptionState = {\n nodes: new Map(),\n unsubscribe: null,\n };\n // Add single subscription to the new value\n subscriptionState.unsubscribe = ps.value.addListener((v) => {\n subscriptionState!.nodes.forEach((mutators) =>\n mutators.forEach((m) => m(v))\n );\n });\n this.subscriptions.set(ps.value, subscriptionState);\n }\n // subscription mutators\n subscriptionState.nodes.set(\n node,\n propSubscriptions\n .filter((m) => m.value === ps.value)\n .map((m) => m.mutator)\n );\n });\n }\n\n /**\n * Called when the hosting container is mounted or updated. This ensures that we have\n * a ref to the underlying SkiaView so that we can registers redraw listeners\n * on values used in the current View automatically.\n */\n update() {\n // Remove any previous registrations\n if (this.unregisterDependantValues) {\n this.unregisterDependantValues();\n }\n\n // Register redraw requests on the SkiaView for each unique value\n this.unregisterDependantValues = this.registerValues(\n Array.from(this.subscriptions.keys())\n );\n }\n\n /**\n * Called when the hosting container is unmounted or recreated. This ensures that we remove\n * all subscriptions to Skia values so that we don't have any listeners left after\n * the component is removed.\n */\n remove() {\n // 1) Unregister redraw requests\n if (this.unregisterDependantValues) {\n this.unregisterDependantValues();\n this.unregisterDependantValues = null;\n }\n\n // 2) Unregister nodes\n Array.from(this.subscriptions.values()).forEach((si) => {\n Array.from(si.nodes.keys()).forEach((node) => this.unsubscribeNode(node));\n });\n\n // 3) Clear the rest of the subscriptions\n this.subscriptions.clear();\n }\n}\n\nconst initializePropertySubscriptions = <P,>(\n node: Node<P>,\n props: AnimatedProps<P>\n) => {\n const nodePropSubscriptions: Array<{\n value: SkiaValue<unknown>;\n mutator: Mutator;\n }> = [];\n\n mapKeys(props).forEach((key) => {\n const propvalue = props[key];\n\n if (isValue(propvalue)) {\n // Subscribe to changes\n nodePropSubscriptions.push({\n value: propvalue,\n mutator: (v) => (node.resolvedProps[key] = v as P[typeof key]),\n });\n // Set initial value\n node.resolvedProps[key] = (propvalue as SkiaValue<P[typeof key]>).current;\n } else if (isSelector(propvalue)) {\n // Subscribe to changes\n nodePropSubscriptions.push({\n value: propvalue.value,\n mutator: (v) =>\n (node.resolvedProps[key] = propvalue.selector(v) as P[typeof key]),\n });\n // Set initial value\n node.resolvedProps[key] = propvalue.selector(\n propvalue.value.current\n ) as P[typeof key];\n } else {\n // Set initial value\n node.resolvedProps[key] = propvalue as P[typeof key];\n }\n });\n\n return nodePropSubscriptions;\n};\n"]}
@@ -63,7 +63,7 @@ const removeNode = (parent, child) => {
63
63
  bustBranchMemoization(parent);
64
64
  const index = parent.children.indexOf(child);
65
65
  parent.children.splice(index, 1);
66
- child.depMgr.unSubscribeNode(child); // unsubscribe to all children as well
66
+ child.depMgr.unsubscribeNode(child); // unsubscribe to all children as well
67
67
 
68
68
  for (const c of child.children) {
69
69
  removeNode(child, c);
@@ -1 +1 @@
1
- {"version":3,"sources":["HostConfig.ts"],"names":["DeclarationNode","DrawingNode","NodeType","exhaustiveCheck","shallowEq","DEBUG","debug","console","log","allChildrenAreMemoized","node","memoizable","child","children","memoized","bustBranchMemoization","parent","ancestor","bustBranchMemoizable","appendNode","push","removeNode","index","indexOf","splice","depMgr","unSubscribeNode","c","insertBefore","before","beforeIndex","createNode","container","type","props","Drawing","onDraw","skipProcessing","p1","Declaration","onDeclare","p2","skHostConfig","now","Date","supportsMutation","isPrimaryRenderer","supportsPersistence","supportsHydration","scheduleTimeout","setTimeout","cancelTimeout","clearTimeout","noTimeout","appendChildToContainer","appendChild","getRootHostContext","_rootContainerInstance","getChildHostContext","_parentHostContext","_type","shouldSetTextContent","_props","createTextInstance","_text","_hostContext","_internalInstanceHandle","Error","createInstance","appendInitialChild","parentInstance","finalizeInitialChildren","commitMount","prepareForCommit","_containerInfo","finalizeContainerChildren","resetAfterCommit","redraw","getPublicInstance","prepareUpdate","instance","oldProps","newProps","propsAreEqual","commitUpdate","_updatePayload","prevProps","nextProps","_internalHandle","commitTextUpdate","_textInstance","_oldText","_newText","clearContainer","preparePortalMount","removeChild","removeChildFromContainer","insertInContainerBefore"],"mappings":"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","sourcesContent":["/*global NodeJS*/\nimport type { HostConfig } from \"react-reconciler\";\n\nimport type { Node, Container, DeclarationProps, DrawingProps } from \"./nodes\";\nimport { DeclarationNode, DrawingNode, NodeType } from \"./nodes\";\nimport { exhaustiveCheck, shallowEq } from \"./typeddash\";\n\nconst DEBUG = false;\nexport const debug = (...args: Parameters<typeof console.log>) => {\n if (DEBUG) {\n console.log(...args);\n }\n};\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n skDeclaration: DeclarationProps<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n skDrawing: DrawingProps<any>;\n }\n }\n}\n\ntype Instance = Node;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Props = any;\ntype TextInstance = Node;\ntype SuspenseInstance = Instance;\ntype HydratableInstance = Instance;\ntype PublicInstance = Instance;\ntype HostContext = null;\ntype UpdatePayload = true;\ntype ChildSet = unknown;\ntype TimeoutHandle = NodeJS.Timeout;\ntype NoTimeout = -1;\n\ntype SkiaHostConfig = HostConfig<\n NodeType,\n Props,\n Container,\n Instance,\n TextInstance,\n SuspenseInstance,\n HydratableInstance,\n PublicInstance,\n HostContext,\n UpdatePayload,\n ChildSet,\n TimeoutHandle,\n NoTimeout\n>;\n\nconst allChildrenAreMemoized = (node: Instance) => {\n if (!node.memoizable) {\n return false;\n }\n for (const child of node.children) {\n if (!child.memoized) {\n return false;\n }\n }\n return true;\n};\n\nconst bustBranchMemoization = (parent: Node) => {\n if (parent.memoizable) {\n let ancestor: Node | undefined = parent;\n while (ancestor) {\n ancestor.memoized = null;\n ancestor = ancestor.parent;\n }\n }\n};\n\nconst bustBranchMemoizable = (parent: Node) => {\n if (parent.memoizable) {\n let ancestor: Node | undefined = parent;\n while (ancestor) {\n ancestor.memoizable = false;\n ancestor = ancestor.parent;\n }\n }\n};\n\nconst appendNode = (parent: Node, child: Node) => {\n child.parent = parent;\n bustBranchMemoization(parent);\n if (!child.memoizable) {\n bustBranchMemoizable(parent);\n }\n if (!parent.memoizable) {\n child.memoizable = false;\n }\n parent.children.push(child);\n};\n\nconst removeNode = (parent: Node, child: Node) => {\n bustBranchMemoization(parent);\n const index = parent.children.indexOf(child);\n parent.children.splice(index, 1);\n child.depMgr.unSubscribeNode(child);\n // unsubscribe to all children as well\n for (const c of child.children) {\n removeNode(child, c);\n }\n};\n\nconst insertBefore = (parent: Node, child: Node, before: Node) => {\n bustBranchMemoization(parent);\n const index = parent.children.indexOf(child);\n if (index !== -1) {\n parent.children.splice(index, 1);\n }\n const beforeIndex = parent.children.indexOf(before);\n parent.children.splice(beforeIndex, 0, child);\n};\n\nconst createNode = (container: Container, type: NodeType, props: Props) => {\n switch (type) {\n case NodeType.Drawing:\n const { onDraw, skipProcessing, ...p1 } = props;\n return new DrawingNode(container.depMgr, onDraw, skipProcessing, p1);\n case NodeType.Declaration:\n const { onDeclare, ...p2 } = props;\n return new DeclarationNode(container.depMgr, onDeclare, p2);\n default:\n // TODO: here we need to throw a nice error message\n // This is the error that will show up when the user uses nodes not supported by Skia (View, Audio, etc)\n return exhaustiveCheck(type);\n }\n};\n\nexport const skHostConfig: SkiaHostConfig = {\n /**\n * This function is used by the reconciler in order to calculate current time for prioritising work.\n */\n now: Date.now,\n\n supportsMutation: true,\n isPrimaryRenderer: false,\n supportsPersistence: false,\n supportsHydration: false,\n //supportsMicrotask: true,\n\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n\n appendChildToContainer(container, child) {\n debug(\"appendChildToContainer\", container, child);\n appendNode(container, child);\n },\n\n appendChild(parent, child) {\n debug(\"appendChild\", parent, child);\n appendNode(parent, child);\n },\n\n getRootHostContext: (_rootContainerInstance: Node) => {\n debug(\"getRootHostContext\");\n return null;\n },\n\n getChildHostContext(_parentHostContext, _type, _rootContainerInstance) {\n debug(\"getChildHostContext\");\n return null;\n },\n\n shouldSetTextContent(_type, _props) {\n return false;\n },\n\n createTextInstance(\n _text,\n _rootContainerInstance,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createTextInstance\");\n // return SpanNode({}, text) as SkNode;\n throw new Error(\"Text nodes are not supported yet\");\n },\n\n createInstance(\n type,\n props,\n container,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createInstance\", type);\n return createNode(container, type, props) as Node;\n },\n\n appendInitialChild(parentInstance, child) {\n debug(\"appendInitialChild\");\n appendNode(parentInstance, child);\n },\n\n finalizeInitialChildren(\n parentInstance,\n _type,\n _props,\n _rootContainerInstance,\n _hostContext\n ) {\n debug(\"finalizeInitialChildren\", parentInstance);\n return false;\n },\n\n commitMount() {\n // if finalizeInitialChildren = true\n debug(\"commitMount\");\n },\n\n prepareForCommit(_containerInfo) {\n debug(\"prepareForCommit\");\n return null;\n },\n\n finalizeContainerChildren: () => {\n debug(\"finalizeContainerChildren\");\n },\n\n resetAfterCommit(container) {\n debug(\"resetAfterCommit\");\n container.redraw();\n },\n\n getPublicInstance(node: Instance) {\n debug(\"getPublicInstance\");\n return node;\n },\n\n prepareUpdate: (\n instance,\n type,\n oldProps,\n newProps,\n _rootContainerInstance,\n _hostContext\n ) => {\n debug(\"prepareUpdate\");\n const propsAreEqual = shallowEq(oldProps, newProps);\n if (propsAreEqual && !instance.memoizable) {\n return null;\n }\n debug(\"update \", type);\n return true;\n },\n\n commitUpdate(\n instance,\n _updatePayload,\n type,\n prevProps,\n nextProps,\n _internalHandle\n ) {\n debug(\"commitUpdate: \", type);\n if (shallowEq(prevProps, nextProps) && allChildrenAreMemoized(instance)) {\n return;\n }\n bustBranchMemoization(instance);\n instance.props = nextProps;\n },\n\n commitTextUpdate: (\n _textInstance: TextInstance,\n _oldText: string,\n _newText: string\n ) => {\n // textInstance.instance = newText;\n },\n\n clearContainer: (container) => {\n debug(\"clearContainer\");\n container.children.splice(0);\n },\n\n preparePortalMount: () => {\n debug(\"preparePortalMount\");\n },\n\n removeChild: (parent, child) => {\n removeNode(parent, child);\n },\n\n removeChildFromContainer: (parent, child) => {\n removeNode(parent, child);\n },\n\n insertInContainerBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n\n insertBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n};\n"]}
1
+ {"version":3,"sources":["HostConfig.ts"],"names":["DeclarationNode","DrawingNode","NodeType","exhaustiveCheck","shallowEq","DEBUG","debug","console","log","allChildrenAreMemoized","node","memoizable","child","children","memoized","bustBranchMemoization","parent","ancestor","bustBranchMemoizable","appendNode","push","removeNode","index","indexOf","splice","depMgr","unsubscribeNode","c","insertBefore","before","beforeIndex","createNode","container","type","props","Drawing","onDraw","skipProcessing","p1","Declaration","onDeclare","p2","skHostConfig","now","Date","supportsMutation","isPrimaryRenderer","supportsPersistence","supportsHydration","scheduleTimeout","setTimeout","cancelTimeout","clearTimeout","noTimeout","appendChildToContainer","appendChild","getRootHostContext","_rootContainerInstance","getChildHostContext","_parentHostContext","_type","shouldSetTextContent","_props","createTextInstance","_text","_hostContext","_internalInstanceHandle","Error","createInstance","appendInitialChild","parentInstance","finalizeInitialChildren","commitMount","prepareForCommit","_containerInfo","finalizeContainerChildren","resetAfterCommit","redraw","getPublicInstance","prepareUpdate","instance","oldProps","newProps","propsAreEqual","commitUpdate","_updatePayload","prevProps","nextProps","_internalHandle","commitTextUpdate","_textInstance","_oldText","_newText","clearContainer","preparePortalMount","removeChild","removeChildFromContainer","insertInContainerBefore"],"mappings":"AAAA;AAIA,SAASA,eAAT,EAA0BC,WAA1B,EAAuCC,QAAvC,QAAuD,SAAvD;AACA,SAASC,eAAT,EAA0BC,SAA1B,QAA2C,aAA3C;AAEA,MAAMC,KAAK,GAAG,KAAd;AACA,OAAO,MAAMC,KAAK,GAAG,YAA6C;AAChE,MAAID,KAAJ,EAAW;AACTE,IAAAA,OAAO,CAACC,GAAR,CAAY,YAAZ;AACD;AACF,CAJM;;AA+CP,MAAMC,sBAAsB,GAAIC,IAAD,IAAoB;AACjD,MAAI,CAACA,IAAI,CAACC,UAAV,EAAsB;AACpB,WAAO,KAAP;AACD;;AACD,OAAK,MAAMC,KAAX,IAAoBF,IAAI,CAACG,QAAzB,EAAmC;AACjC,QAAI,CAACD,KAAK,CAACE,QAAX,EAAqB;AACnB,aAAO,KAAP;AACD;AACF;;AACD,SAAO,IAAP;AACD,CAVD;;AAYA,MAAMC,qBAAqB,GAAIC,MAAD,IAAkB;AAC9C,MAAIA,MAAM,CAACL,UAAX,EAAuB;AACrB,QAAIM,QAA0B,GAAGD,MAAjC;;AACA,WAAOC,QAAP,EAAiB;AACfA,MAAAA,QAAQ,CAACH,QAAT,GAAoB,IAApB;AACAG,MAAAA,QAAQ,GAAGA,QAAQ,CAACD,MAApB;AACD;AACF;AACF,CARD;;AAUA,MAAME,oBAAoB,GAAIF,MAAD,IAAkB;AAC7C,MAAIA,MAAM,CAACL,UAAX,EAAuB;AACrB,QAAIM,QAA0B,GAAGD,MAAjC;;AACA,WAAOC,QAAP,EAAiB;AACfA,MAAAA,QAAQ,CAACN,UAAT,GAAsB,KAAtB;AACAM,MAAAA,QAAQ,GAAGA,QAAQ,CAACD,MAApB;AACD;AACF;AACF,CARD;;AAUA,MAAMG,UAAU,GAAG,CAACH,MAAD,EAAeJ,KAAf,KAA+B;AAChDA,EAAAA,KAAK,CAACI,MAAN,GAAeA,MAAf;AACAD,EAAAA,qBAAqB,CAACC,MAAD,CAArB;;AACA,MAAI,CAACJ,KAAK,CAACD,UAAX,EAAuB;AACrBO,IAAAA,oBAAoB,CAACF,MAAD,CAApB;AACD;;AACD,MAAI,CAACA,MAAM,CAACL,UAAZ,EAAwB;AACtBC,IAAAA,KAAK,CAACD,UAAN,GAAmB,KAAnB;AACD;;AACDK,EAAAA,MAAM,CAACH,QAAP,CAAgBO,IAAhB,CAAqBR,KAArB;AACD,CAVD;;AAYA,MAAMS,UAAU,GAAG,CAACL,MAAD,EAAeJ,KAAf,KAA+B;AAChDG,EAAAA,qBAAqB,CAACC,MAAD,CAArB;AACA,QAAMM,KAAK,GAAGN,MAAM,CAACH,QAAP,CAAgBU,OAAhB,CAAwBX,KAAxB,CAAd;AACAI,EAAAA,MAAM,CAACH,QAAP,CAAgBW,MAAhB,CAAuBF,KAAvB,EAA8B,CAA9B;AACAV,EAAAA,KAAK,CAACa,MAAN,CAAaC,eAAb,CAA6Bd,KAA7B,EAJgD,CAKhD;;AACA,OAAK,MAAMe,CAAX,IAAgBf,KAAK,CAACC,QAAtB,EAAgC;AAC9BQ,IAAAA,UAAU,CAACT,KAAD,EAAQe,CAAR,CAAV;AACD;AACF,CATD;;AAWA,MAAMC,YAAY,GAAG,CAACZ,MAAD,EAAeJ,KAAf,EAA4BiB,MAA5B,KAA6C;AAChEd,EAAAA,qBAAqB,CAACC,MAAD,CAArB;AACA,QAAMM,KAAK,GAAGN,MAAM,CAACH,QAAP,CAAgBU,OAAhB,CAAwBX,KAAxB,CAAd;;AACA,MAAIU,KAAK,KAAK,CAAC,CAAf,EAAkB;AAChBN,IAAAA,MAAM,CAACH,QAAP,CAAgBW,MAAhB,CAAuBF,KAAvB,EAA8B,CAA9B;AACD;;AACD,QAAMQ,WAAW,GAAGd,MAAM,CAACH,QAAP,CAAgBU,OAAhB,CAAwBM,MAAxB,CAApB;AACAb,EAAAA,MAAM,CAACH,QAAP,CAAgBW,MAAhB,CAAuBM,WAAvB,EAAoC,CAApC,EAAuClB,KAAvC;AACD,CARD;;AAUA,MAAMmB,UAAU,GAAG,CAACC,SAAD,EAAuBC,IAAvB,EAAuCC,KAAvC,KAAwD;AACzE,UAAQD,IAAR;AACE,SAAK/B,QAAQ,CAACiC,OAAd;AACE,YAAM;AAAEC,QAAAA,MAAF;AAAUC,QAAAA,cAAV;AAA0B,WAAGC;AAA7B,UAAoCJ,KAA1C;AACA,aAAO,IAAIjC,WAAJ,CAAgB+B,SAAS,CAACP,MAA1B,EAAkCW,MAAlC,EAA0CC,cAA1C,EAA0DC,EAA1D,CAAP;;AACF,SAAKpC,QAAQ,CAACqC,WAAd;AACE,YAAM;AAAEC,QAAAA,SAAF;AAAa,WAAGC;AAAhB,UAAuBP,KAA7B;AACA,aAAO,IAAIlC,eAAJ,CAAoBgC,SAAS,CAACP,MAA9B,EAAsCe,SAAtC,EAAiDC,EAAjD,CAAP;;AACF;AACE;AACA;AACA,aAAOtC,eAAe,CAAC8B,IAAD,CAAtB;AAVJ;AAYD,CAbD;;AAeA,OAAO,MAAMS,YAA4B,GAAG;AAC1C;AACF;AACA;AACEC,EAAAA,GAAG,EAAEC,IAAI,CAACD,GAJgC;AAM1CE,EAAAA,gBAAgB,EAAE,IANwB;AAO1CC,EAAAA,iBAAiB,EAAE,KAPuB;AAQ1CC,EAAAA,mBAAmB,EAAE,KARqB;AAS1CC,EAAAA,iBAAiB,EAAE,KATuB;AAU1C;AAEAC,EAAAA,eAAe,EAAEC,UAZyB;AAa1CC,EAAAA,aAAa,EAAEC,YAb2B;AAc1CC,EAAAA,SAAS,EAAE,CAAC,CAd8B;;AAgB1CC,EAAAA,sBAAsB,CAACtB,SAAD,EAAYpB,KAAZ,EAAmB;AACvCN,IAAAA,KAAK,CAAC,wBAAD,EAA2B0B,SAA3B,EAAsCpB,KAAtC,CAAL;AACAO,IAAAA,UAAU,CAACa,SAAD,EAAYpB,KAAZ,CAAV;AACD,GAnByC;;AAqB1C2C,EAAAA,WAAW,CAACvC,MAAD,EAASJ,KAAT,EAAgB;AACzBN,IAAAA,KAAK,CAAC,aAAD,EAAgBU,MAAhB,EAAwBJ,KAAxB,CAAL;AACAO,IAAAA,UAAU,CAACH,MAAD,EAASJ,KAAT,CAAV;AACD,GAxByC;;AA0B1C4C,EAAAA,kBAAkB,EAAGC,sBAAD,IAAkC;AACpDnD,IAAAA,KAAK,CAAC,oBAAD,CAAL;AACA,WAAO,IAAP;AACD,GA7ByC;;AA+B1CoD,EAAAA,mBAAmB,CAACC,kBAAD,EAAqBC,KAArB,EAA4BH,sBAA5B,EAAoD;AACrEnD,IAAAA,KAAK,CAAC,qBAAD,CAAL;AACA,WAAO,IAAP;AACD,GAlCyC;;AAoC1CuD,EAAAA,oBAAoB,CAACD,KAAD,EAAQE,MAAR,EAAgB;AAClC,WAAO,KAAP;AACD,GAtCyC;;AAwC1CC,EAAAA,kBAAkB,CAChBC,KADgB,EAEhBP,sBAFgB,EAGhBQ,YAHgB,EAIhBC,uBAJgB,EAKhB;AACA5D,IAAAA,KAAK,CAAC,oBAAD,CAAL,CADA,CAEA;;AACA,UAAM,IAAI6D,KAAJ,CAAU,kCAAV,CAAN;AACD,GAjDyC;;AAmD1CC,EAAAA,cAAc,CACZnC,IADY,EAEZC,KAFY,EAGZF,SAHY,EAIZiC,YAJY,EAKZC,uBALY,EAMZ;AACA5D,IAAAA,KAAK,CAAC,gBAAD,EAAmB2B,IAAnB,CAAL;AACA,WAAOF,UAAU,CAACC,SAAD,EAAYC,IAAZ,EAAkBC,KAAlB,CAAjB;AACD,GA5DyC;;AA8D1CmC,EAAAA,kBAAkB,CAACC,cAAD,EAAiB1D,KAAjB,EAAwB;AACxCN,IAAAA,KAAK,CAAC,oBAAD,CAAL;AACAa,IAAAA,UAAU,CAACmD,cAAD,EAAiB1D,KAAjB,CAAV;AACD,GAjEyC;;AAmE1C2D,EAAAA,uBAAuB,CACrBD,cADqB,EAErBV,KAFqB,EAGrBE,MAHqB,EAIrBL,sBAJqB,EAKrBQ,YALqB,EAMrB;AACA3D,IAAAA,KAAK,CAAC,yBAAD,EAA4BgE,cAA5B,CAAL;AACA,WAAO,KAAP;AACD,GA5EyC;;AA8E1CE,EAAAA,WAAW,GAAG;AACZ;AACAlE,IAAAA,KAAK,CAAC,aAAD,CAAL;AACD,GAjFyC;;AAmF1CmE,EAAAA,gBAAgB,CAACC,cAAD,EAAiB;AAC/BpE,IAAAA,KAAK,CAAC,kBAAD,CAAL;AACA,WAAO,IAAP;AACD,GAtFyC;;AAwF1CqE,EAAAA,yBAAyB,EAAE,MAAM;AAC/BrE,IAAAA,KAAK,CAAC,2BAAD,CAAL;AACD,GA1FyC;;AA4F1CsE,EAAAA,gBAAgB,CAAC5C,SAAD,EAAY;AAC1B1B,IAAAA,KAAK,CAAC,kBAAD,CAAL;AACA0B,IAAAA,SAAS,CAAC6C,MAAV;AACD,GA/FyC;;AAiG1CC,EAAAA,iBAAiB,CAACpE,IAAD,EAAiB;AAChCJ,IAAAA,KAAK,CAAC,mBAAD,CAAL;AACA,WAAOI,IAAP;AACD,GApGyC;;AAsG1CqE,EAAAA,aAAa,EAAE,CACbC,QADa,EAEb/C,IAFa,EAGbgD,QAHa,EAIbC,QAJa,EAKbzB,sBALa,EAMbQ,YANa,KAOV;AACH3D,IAAAA,KAAK,CAAC,eAAD,CAAL;AACA,UAAM6E,aAAa,GAAG/E,SAAS,CAAC6E,QAAD,EAAWC,QAAX,CAA/B;;AACA,QAAIC,aAAa,IAAI,CAACH,QAAQ,CAACrE,UAA/B,EAA2C;AACzC,aAAO,IAAP;AACD;;AACDL,IAAAA,KAAK,CAAC,SAAD,EAAY2B,IAAZ,CAAL;AACA,WAAO,IAAP;AACD,GArHyC;;AAuH1CmD,EAAAA,YAAY,CACVJ,QADU,EAEVK,cAFU,EAGVpD,IAHU,EAIVqD,SAJU,EAKVC,SALU,EAMVC,eANU,EAOV;AACAlF,IAAAA,KAAK,CAAC,gBAAD,EAAmB2B,IAAnB,CAAL;;AACA,QAAI7B,SAAS,CAACkF,SAAD,EAAYC,SAAZ,CAAT,IAAmC9E,sBAAsB,CAACuE,QAAD,CAA7D,EAAyE;AACvE;AACD;;AACDjE,IAAAA,qBAAqB,CAACiE,QAAD,CAArB;AACAA,IAAAA,QAAQ,CAAC9C,KAAT,GAAiBqD,SAAjB;AACD,GArIyC;;AAuI1CE,EAAAA,gBAAgB,EAAE,CAChBC,aADgB,EAEhBC,QAFgB,EAGhBC,QAHgB,KAIb,CACH;AACD,GA7IyC;AA+I1CC,EAAAA,cAAc,EAAG7D,SAAD,IAAe;AAC7B1B,IAAAA,KAAK,CAAC,gBAAD,CAAL;AACA0B,IAAAA,SAAS,CAACnB,QAAV,CAAmBW,MAAnB,CAA0B,CAA1B;AACD,GAlJyC;AAoJ1CsE,EAAAA,kBAAkB,EAAE,MAAM;AACxBxF,IAAAA,KAAK,CAAC,oBAAD,CAAL;AACD,GAtJyC;AAwJ1CyF,EAAAA,WAAW,EAAE,CAAC/E,MAAD,EAASJ,KAAT,KAAmB;AAC9BS,IAAAA,UAAU,CAACL,MAAD,EAASJ,KAAT,CAAV;AACD,GA1JyC;AA4J1CoF,EAAAA,wBAAwB,EAAE,CAAChF,MAAD,EAASJ,KAAT,KAAmB;AAC3CS,IAAAA,UAAU,CAACL,MAAD,EAASJ,KAAT,CAAV;AACD,GA9JyC;AAgK1CqF,EAAAA,uBAAuB,EAAE,CAACjF,MAAD,EAASJ,KAAT,EAAgBiB,MAAhB,KAA2B;AAClDD,IAAAA,YAAY,CAACZ,MAAD,EAASJ,KAAT,EAAgBiB,MAAhB,CAAZ;AACD,GAlKyC;AAoK1CD,EAAAA,YAAY,EAAE,CAACZ,MAAD,EAASJ,KAAT,EAAgBiB,MAAhB,KAA2B;AACvCD,IAAAA,YAAY,CAACZ,MAAD,EAASJ,KAAT,EAAgBiB,MAAhB,CAAZ;AACD;AAtKyC,CAArC","sourcesContent":["/*global NodeJS*/\nimport type { HostConfig } from \"react-reconciler\";\n\nimport type { Node, Container, DeclarationProps, DrawingProps } from \"./nodes\";\nimport { DeclarationNode, DrawingNode, NodeType } from \"./nodes\";\nimport { exhaustiveCheck, shallowEq } from \"./typeddash\";\n\nconst DEBUG = false;\nexport const debug = (...args: Parameters<typeof console.log>) => {\n if (DEBUG) {\n console.log(...args);\n }\n};\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n skDeclaration: DeclarationProps<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n skDrawing: DrawingProps<any>;\n }\n }\n}\n\ntype Instance = Node;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Props = any;\ntype TextInstance = Node;\ntype SuspenseInstance = Instance;\ntype HydratableInstance = Instance;\ntype PublicInstance = Instance;\ntype HostContext = null;\ntype UpdatePayload = true;\ntype ChildSet = unknown;\ntype TimeoutHandle = NodeJS.Timeout;\ntype NoTimeout = -1;\n\ntype SkiaHostConfig = HostConfig<\n NodeType,\n Props,\n Container,\n Instance,\n TextInstance,\n SuspenseInstance,\n HydratableInstance,\n PublicInstance,\n HostContext,\n UpdatePayload,\n ChildSet,\n TimeoutHandle,\n NoTimeout\n>;\n\nconst allChildrenAreMemoized = (node: Instance) => {\n if (!node.memoizable) {\n return false;\n }\n for (const child of node.children) {\n if (!child.memoized) {\n return false;\n }\n }\n return true;\n};\n\nconst bustBranchMemoization = (parent: Node) => {\n if (parent.memoizable) {\n let ancestor: Node | undefined = parent;\n while (ancestor) {\n ancestor.memoized = null;\n ancestor = ancestor.parent;\n }\n }\n};\n\nconst bustBranchMemoizable = (parent: Node) => {\n if (parent.memoizable) {\n let ancestor: Node | undefined = parent;\n while (ancestor) {\n ancestor.memoizable = false;\n ancestor = ancestor.parent;\n }\n }\n};\n\nconst appendNode = (parent: Node, child: Node) => {\n child.parent = parent;\n bustBranchMemoization(parent);\n if (!child.memoizable) {\n bustBranchMemoizable(parent);\n }\n if (!parent.memoizable) {\n child.memoizable = false;\n }\n parent.children.push(child);\n};\n\nconst removeNode = (parent: Node, child: Node) => {\n bustBranchMemoization(parent);\n const index = parent.children.indexOf(child);\n parent.children.splice(index, 1);\n child.depMgr.unsubscribeNode(child);\n // unsubscribe to all children as well\n for (const c of child.children) {\n removeNode(child, c);\n }\n};\n\nconst insertBefore = (parent: Node, child: Node, before: Node) => {\n bustBranchMemoization(parent);\n const index = parent.children.indexOf(child);\n if (index !== -1) {\n parent.children.splice(index, 1);\n }\n const beforeIndex = parent.children.indexOf(before);\n parent.children.splice(beforeIndex, 0, child);\n};\n\nconst createNode = (container: Container, type: NodeType, props: Props) => {\n switch (type) {\n case NodeType.Drawing:\n const { onDraw, skipProcessing, ...p1 } = props;\n return new DrawingNode(container.depMgr, onDraw, skipProcessing, p1);\n case NodeType.Declaration:\n const { onDeclare, ...p2 } = props;\n return new DeclarationNode(container.depMgr, onDeclare, p2);\n default:\n // TODO: here we need to throw a nice error message\n // This is the error that will show up when the user uses nodes not supported by Skia (View, Audio, etc)\n return exhaustiveCheck(type);\n }\n};\n\nexport const skHostConfig: SkiaHostConfig = {\n /**\n * This function is used by the reconciler in order to calculate current time for prioritising work.\n */\n now: Date.now,\n\n supportsMutation: true,\n isPrimaryRenderer: false,\n supportsPersistence: false,\n supportsHydration: false,\n //supportsMicrotask: true,\n\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n\n appendChildToContainer(container, child) {\n debug(\"appendChildToContainer\", container, child);\n appendNode(container, child);\n },\n\n appendChild(parent, child) {\n debug(\"appendChild\", parent, child);\n appendNode(parent, child);\n },\n\n getRootHostContext: (_rootContainerInstance: Node) => {\n debug(\"getRootHostContext\");\n return null;\n },\n\n getChildHostContext(_parentHostContext, _type, _rootContainerInstance) {\n debug(\"getChildHostContext\");\n return null;\n },\n\n shouldSetTextContent(_type, _props) {\n return false;\n },\n\n createTextInstance(\n _text,\n _rootContainerInstance,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createTextInstance\");\n // return SpanNode({}, text) as SkNode;\n throw new Error(\"Text nodes are not supported yet\");\n },\n\n createInstance(\n type,\n props,\n container,\n _hostContext,\n _internalInstanceHandle\n ) {\n debug(\"createInstance\", type);\n return createNode(container, type, props) as Node;\n },\n\n appendInitialChild(parentInstance, child) {\n debug(\"appendInitialChild\");\n appendNode(parentInstance, child);\n },\n\n finalizeInitialChildren(\n parentInstance,\n _type,\n _props,\n _rootContainerInstance,\n _hostContext\n ) {\n debug(\"finalizeInitialChildren\", parentInstance);\n return false;\n },\n\n commitMount() {\n // if finalizeInitialChildren = true\n debug(\"commitMount\");\n },\n\n prepareForCommit(_containerInfo) {\n debug(\"prepareForCommit\");\n return null;\n },\n\n finalizeContainerChildren: () => {\n debug(\"finalizeContainerChildren\");\n },\n\n resetAfterCommit(container) {\n debug(\"resetAfterCommit\");\n container.redraw();\n },\n\n getPublicInstance(node: Instance) {\n debug(\"getPublicInstance\");\n return node;\n },\n\n prepareUpdate: (\n instance,\n type,\n oldProps,\n newProps,\n _rootContainerInstance,\n _hostContext\n ) => {\n debug(\"prepareUpdate\");\n const propsAreEqual = shallowEq(oldProps, newProps);\n if (propsAreEqual && !instance.memoizable) {\n return null;\n }\n debug(\"update \", type);\n return true;\n },\n\n commitUpdate(\n instance,\n _updatePayload,\n type,\n prevProps,\n nextProps,\n _internalHandle\n ) {\n debug(\"commitUpdate: \", type);\n if (shallowEq(prevProps, nextProps) && allChildrenAreMemoized(instance)) {\n return;\n }\n bustBranchMemoization(instance);\n instance.props = nextProps;\n },\n\n commitTextUpdate: (\n _textInstance: TextInstance,\n _oldText: string,\n _newText: string\n ) => {\n // textInstance.instance = newText;\n },\n\n clearContainer: (container) => {\n debug(\"clearContainer\");\n container.children.splice(0);\n },\n\n preparePortalMount: () => {\n debug(\"preparePortalMount\");\n },\n\n removeChild: (parent, child) => {\n removeNode(parent, child);\n },\n\n removeChildFromContainer: (parent, child) => {\n removeNode(parent, child);\n },\n\n insertInContainerBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n\n insertBefore: (parent, child, before) => {\n insertBefore(parent, child, before);\n },\n};\n"]}