@shopify/react-native-skia 2.3.8 → 2.3.9

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 (94) hide show
  1. package/cpp/api/JsiNativeBuffer.h +4 -0
  2. package/cpp/api/JsiSkAnimatedImage.h +71 -1
  3. package/cpp/api/JsiSkAnimatedImageFactory.h +4 -0
  4. package/cpp/api/JsiSkApi.h +2 -0
  5. package/cpp/api/JsiSkCanvas.h +2 -0
  6. package/cpp/api/JsiSkColorFilter.h +2 -0
  7. package/cpp/api/JsiSkColorFilterFactory.h +4 -0
  8. package/cpp/api/JsiSkContourMeasure.h +2 -0
  9. package/cpp/api/JsiSkContourMeasureIter.h +4 -0
  10. package/cpp/api/JsiSkData.h +2 -0
  11. package/cpp/api/JsiSkDataFactory.h +2 -0
  12. package/cpp/api/JsiSkFont.h +2 -0
  13. package/cpp/api/JsiSkFontMgr.h +2 -0
  14. package/cpp/api/JsiSkFontMgrFactory.h +2 -0
  15. package/cpp/api/JsiSkFontStyle.h +2 -0
  16. package/cpp/api/JsiSkHostObjects.h +50 -0
  17. package/cpp/api/JsiSkImage.h +3 -1
  18. package/cpp/api/JsiSkImageFactory.h +2 -0
  19. package/cpp/api/JsiSkImageFilter.h +3 -1
  20. package/cpp/api/JsiSkImageFilterFactory.h +4 -0
  21. package/cpp/api/JsiSkImageInfo.h +2 -0
  22. package/cpp/api/JsiSkMaskFilter.h +2 -0
  23. package/cpp/api/JsiSkMaskFilterFactory.h +4 -0
  24. package/cpp/api/JsiSkMatrix.h +2 -0
  25. package/cpp/api/JsiSkPaint.h +2 -0
  26. package/cpp/api/JsiSkParagraph.h +3 -1
  27. package/cpp/api/JsiSkParagraphBuilder.h +3 -1
  28. package/cpp/api/JsiSkParagraphBuilderFactory.h +5 -1
  29. package/cpp/api/JsiSkPath.h +2 -0
  30. package/cpp/api/JsiSkPathEffect.h +2 -0
  31. package/cpp/api/JsiSkPathEffectFactory.h +4 -0
  32. package/cpp/api/JsiSkPathFactory.h +2 -0
  33. package/cpp/api/JsiSkPicture.h +2 -0
  34. package/cpp/api/JsiSkPictureFactory.h +10 -0
  35. package/cpp/api/JsiSkPictureRecorder.h +3 -3
  36. package/cpp/api/JsiSkPoint.h +2 -0
  37. package/cpp/api/JsiSkRRect.h +2 -0
  38. package/cpp/api/JsiSkRSXform.h +2 -0
  39. package/cpp/api/JsiSkRect.h +2 -0
  40. package/cpp/api/JsiSkRuntimeEffect.h +2 -0
  41. package/cpp/api/JsiSkRuntimeEffectFactory.h +4 -0
  42. package/cpp/api/JsiSkRuntimeShaderBuilder.h +4 -0
  43. package/cpp/api/JsiSkSVG.h +2 -0
  44. package/cpp/api/JsiSkSVGFactory.h +2 -0
  45. package/cpp/api/JsiSkShader.h +3 -1
  46. package/cpp/api/JsiSkShaderFactory.h +2 -0
  47. package/cpp/api/JsiSkSkottie.h +2 -0
  48. package/cpp/api/JsiSkSurface.h +50 -7
  49. package/cpp/api/JsiSkSurfaceFactory.h +2 -0
  50. package/cpp/api/JsiSkTextBlob.h +2 -0
  51. package/cpp/api/JsiSkTextBlobFactory.h +2 -0
  52. package/cpp/api/JsiSkTypeface.h +2 -0
  53. package/cpp/api/JsiSkTypefaceFactory.h +2 -0
  54. package/cpp/api/JsiSkTypefaceFontProvider.h +4 -0
  55. package/cpp/api/JsiSkTypefaceFontProviderFactory.h +4 -0
  56. package/cpp/api/JsiSkVertices.h +2 -0
  57. package/cpp/api/JsiSkiaContext.h +3 -1
  58. package/cpp/api/JsiSkottieFactory.h +2 -0
  59. package/cpp/api/JsiVideo.h +2 -0
  60. package/cpp/api/recorder/JsiRecorder.h +42 -7
  61. package/cpp/jsi/ViewProperty.h +1 -3
  62. package/lib/commonjs/skia/types/Picture/PictureFactory.d.ts +1 -1
  63. package/lib/commonjs/skia/types/Picture/PictureFactory.js.map +1 -1
  64. package/lib/commonjs/skia/types/Recorder.d.ts +2 -1
  65. package/lib/commonjs/skia/types/Recorder.js.map +1 -1
  66. package/lib/commonjs/sksg/Container.native.d.ts +4 -0
  67. package/lib/commonjs/sksg/Container.native.js +18 -6
  68. package/lib/commonjs/sksg/Container.native.js.map +1 -1
  69. package/lib/commonjs/sksg/Recorder/ReanimatedRecorder.d.ts +1 -0
  70. package/lib/commonjs/sksg/Recorder/ReanimatedRecorder.js +4 -0
  71. package/lib/commonjs/sksg/Recorder/ReanimatedRecorder.js.map +1 -1
  72. package/lib/module/skia/types/Picture/PictureFactory.d.ts +1 -1
  73. package/lib/module/skia/types/Picture/PictureFactory.js.map +1 -1
  74. package/lib/module/skia/types/Recorder.d.ts +2 -1
  75. package/lib/module/skia/types/Recorder.js.map +1 -1
  76. package/lib/module/sksg/Container.native.d.ts +4 -0
  77. package/lib/module/sksg/Container.native.js +18 -6
  78. package/lib/module/sksg/Container.native.js.map +1 -1
  79. package/lib/module/sksg/Recorder/ReanimatedRecorder.d.ts +1 -0
  80. package/lib/module/sksg/Recorder/ReanimatedRecorder.js +4 -0
  81. package/lib/module/sksg/Recorder/ReanimatedRecorder.js.map +1 -1
  82. package/lib/typescript/lib/commonjs/sksg/Container.native.d.ts +5 -0
  83. package/lib/typescript/lib/commonjs/sksg/Recorder/ReanimatedRecorder.d.ts +1 -0
  84. package/lib/typescript/lib/module/sksg/Container.native.d.ts +5 -0
  85. package/lib/typescript/lib/module/sksg/Recorder/ReanimatedRecorder.d.ts +1 -0
  86. package/lib/typescript/src/skia/types/Picture/PictureFactory.d.ts +1 -1
  87. package/lib/typescript/src/skia/types/Recorder.d.ts +2 -1
  88. package/lib/typescript/src/sksg/Container.native.d.ts +4 -0
  89. package/lib/typescript/src/sksg/Recorder/ReanimatedRecorder.d.ts +1 -0
  90. package/package.json +1 -1
  91. package/src/skia/types/Picture/PictureFactory.ts +1 -1
  92. package/src/skia/types/Recorder.ts +2 -1
  93. package/src/sksg/Container.native.ts +25 -7
  94. package/src/sksg/Recorder/ReanimatedRecorder.ts +5 -0
@@ -8,11 +8,11 @@ import { Container, StaticContainer } from "./StaticContainer";
8
8
  import { visit } from "./Recorder/Visitor";
9
9
  import "../skia/NativeSetup";
10
10
  import "../views/api";
11
- const nativeDrawOnscreen = (nativeId, recorder) => {
11
+ const nativeDrawOnscreen = (nativeId, recorder, picture) => {
12
12
  "worklet";
13
13
 
14
14
  //const start = performance.now();
15
- const picture = recorder.play();
15
+ recorder.play(picture);
16
16
  //const end = performance.now();
17
17
  //console.log("Recording time: ", end - start);
18
18
  SkiaViewApi.setJsiProperty(nativeId, "picture", picture);
@@ -22,6 +22,14 @@ class NativeReanimatedContainer extends Container {
22
22
  super(Skia);
23
23
  this.nativeId = nativeId;
24
24
  _defineProperty(this, "mapperId", null);
25
+ _defineProperty(this, "picture", void 0);
26
+ _defineProperty(this, "recorderA", void 0);
27
+ _defineProperty(this, "recorderB", void 0);
28
+ _defineProperty(this, "currentRecorder", void 0);
29
+ this.recorderA = new ReanimatedRecorder(Skia);
30
+ this.recorderB = new ReanimatedRecorder(Skia);
31
+ this.currentRecorder = this.recorderA;
32
+ this.picture = Skia.Picture.MakePicture(null);
25
33
  }
26
34
  redraw() {
27
35
  if (this.mapperId !== null) {
@@ -30,25 +38,29 @@ class NativeReanimatedContainer extends Container {
30
38
  if (this.unmounted) {
31
39
  return;
32
40
  }
41
+
42
+ // Swap to the next recorder (double buffering)
43
+ const recorder = this.currentRecorder;
44
+ this.currentRecorder = this.currentRecorder === this.recorderA ? this.recorderB : this.recorderA;
33
45
  const {
34
46
  nativeId,
35
- Skia
47
+ picture
36
48
  } = this;
37
- const recorder = new ReanimatedRecorder(Skia);
49
+ recorder.reset();
38
50
  visit(recorder, this.root);
39
51
  const sharedValues = recorder.getSharedValues();
40
52
  const sharedRecorder = recorder.getRecorder();
41
53
  Rea.runOnUI(() => {
42
54
  "worklet";
43
55
 
44
- nativeDrawOnscreen(nativeId, sharedRecorder);
56
+ nativeDrawOnscreen(nativeId, sharedRecorder, picture);
45
57
  })();
46
58
  if (sharedValues.length > 0) {
47
59
  this.mapperId = Rea.startMapper(() => {
48
60
  "worklet";
49
61
 
50
62
  sharedRecorder.applyUpdates(sharedValues);
51
- nativeDrawOnscreen(nativeId, sharedRecorder);
63
+ nativeDrawOnscreen(nativeId, sharedRecorder, picture);
52
64
  }, sharedValues);
53
65
  }
54
66
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Rea","HAS_REANIMATED_3","ReanimatedRecorder","Container","StaticContainer","visit","nativeDrawOnscreen","nativeId","recorder","picture","play","SkiaViewApi","setJsiProperty","NativeReanimatedContainer","constructor","Skia","_defineProperty","redraw","mapperId","stopMapper","unmounted","root","sharedValues","getSharedValues","sharedRecorder","getRecorder","runOnUI","length","startMapper","applyUpdates","createContainer"],"sources":["Container.native.ts"],"sourcesContent":["import Rea from \"../external/reanimated/ReanimatedProxy\";\nimport type { Skia } from \"../skia/types\";\nimport { HAS_REANIMATED_3 } from \"../external/reanimated/renderHelpers\";\nimport type { JsiRecorder } from \"../skia/types/Recorder\";\n\nimport { ReanimatedRecorder } from \"./Recorder/ReanimatedRecorder\";\nimport { Container, StaticContainer } from \"./StaticContainer\";\nimport { visit } from \"./Recorder/Visitor\";\n\nimport \"../skia/NativeSetup\";\nimport \"../views/api\";\n\nconst nativeDrawOnscreen = (nativeId: number, recorder: JsiRecorder) => {\n \"worklet\";\n\n //const start = performance.now();\n const picture = recorder.play();\n //const end = performance.now();\n //console.log(\"Recording time: \", end - start);\n SkiaViewApi.setJsiProperty(nativeId, \"picture\", picture);\n};\n\nclass NativeReanimatedContainer extends Container {\n private mapperId: number | null = null;\n\n constructor(\n Skia: Skia,\n private nativeId: number\n ) {\n super(Skia);\n }\n\n redraw() {\n if (this.mapperId !== null) {\n Rea.stopMapper(this.mapperId);\n }\n if (this.unmounted) {\n return;\n }\n const { nativeId, Skia } = this;\n const recorder = new ReanimatedRecorder(Skia);\n visit(recorder, this.root);\n const sharedValues = recorder.getSharedValues();\n const sharedRecorder = recorder.getRecorder();\n Rea.runOnUI(() => {\n \"worklet\";\n nativeDrawOnscreen(nativeId, sharedRecorder);\n })();\n if (sharedValues.length > 0) {\n this.mapperId = Rea.startMapper(() => {\n \"worklet\";\n sharedRecorder.applyUpdates(sharedValues);\n nativeDrawOnscreen(nativeId, sharedRecorder);\n }, sharedValues);\n }\n }\n}\n\nexport const createContainer = (Skia: Skia, nativeId: number) => {\n if (HAS_REANIMATED_3 && nativeId !== -1) {\n return new NativeReanimatedContainer(Skia, nativeId);\n } else {\n return new StaticContainer(Skia, nativeId);\n }\n};\n"],"mappings":";;;AAAA,OAAOA,GAAG,MAAM,wCAAwC;AAExD,SAASC,gBAAgB,QAAQ,sCAAsC;AAGvE,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,SAAS,EAAEC,eAAe,QAAQ,mBAAmB;AAC9D,SAASC,KAAK,QAAQ,oBAAoB;AAE1C,OAAO,qBAAqB;AAC5B,OAAO,cAAc;AAErB,MAAMC,kBAAkB,GAAGA,CAACC,QAAgB,EAAEC,QAAqB,KAAK;EACtE,SAAS;;EAET;EACA,MAAMC,OAAO,GAAGD,QAAQ,CAACE,IAAI,CAAC,CAAC;EAC/B;EACA;EACAC,WAAW,CAACC,cAAc,CAACL,QAAQ,EAAE,SAAS,EAAEE,OAAO,CAAC;AAC1D,CAAC;AAED,MAAMI,yBAAyB,SAASV,SAAS,CAAC;EAGhDW,WAAWA,CACTC,IAAU,EACFR,QAAgB,EACxB;IACA,KAAK,CAACQ,IAAI,CAAC;IAAC,KAFJR,QAAgB,GAAhBA,QAAgB;IAAAS,eAAA,mBAJQ,IAAI;EAOtC;EAEAC,MAAMA,CAAA,EAAG;IACP,IAAI,IAAI,CAACC,QAAQ,KAAK,IAAI,EAAE;MAC1BlB,GAAG,CAACmB,UAAU,CAAC,IAAI,CAACD,QAAQ,CAAC;IAC/B;IACA,IAAI,IAAI,CAACE,SAAS,EAAE;MAClB;IACF;IACA,MAAM;MAAEb,QAAQ;MAAEQ;IAAK,CAAC,GAAG,IAAI;IAC/B,MAAMP,QAAQ,GAAG,IAAIN,kBAAkB,CAACa,IAAI,CAAC;IAC7CV,KAAK,CAACG,QAAQ,EAAE,IAAI,CAACa,IAAI,CAAC;IAC1B,MAAMC,YAAY,GAAGd,QAAQ,CAACe,eAAe,CAAC,CAAC;IAC/C,MAAMC,cAAc,GAAGhB,QAAQ,CAACiB,WAAW,CAAC,CAAC;IAC7CzB,GAAG,CAAC0B,OAAO,CAAC,MAAM;MAChB,SAAS;;MACTpB,kBAAkB,CAACC,QAAQ,EAAEiB,cAAc,CAAC;IAC9C,CAAC,CAAC,CAAC,CAAC;IACJ,IAAIF,YAAY,CAACK,MAAM,GAAG,CAAC,EAAE;MAC3B,IAAI,CAACT,QAAQ,GAAGlB,GAAG,CAAC4B,WAAW,CAAC,MAAM;QACpC,SAAS;;QACTJ,cAAc,CAACK,YAAY,CAACP,YAAY,CAAC;QACzChB,kBAAkB,CAACC,QAAQ,EAAEiB,cAAc,CAAC;MAC9C,CAAC,EAAEF,YAAY,CAAC;IAClB;EACF;AACF;AAEA,OAAO,MAAMQ,eAAe,GAAGA,CAACf,IAAU,EAAER,QAAgB,KAAK;EAC/D,IAAIN,gBAAgB,IAAIM,QAAQ,KAAK,CAAC,CAAC,EAAE;IACvC,OAAO,IAAIM,yBAAyB,CAACE,IAAI,EAAER,QAAQ,CAAC;EACtD,CAAC,MAAM;IACL,OAAO,IAAIH,eAAe,CAACW,IAAI,EAAER,QAAQ,CAAC;EAC5C;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Rea","HAS_REANIMATED_3","ReanimatedRecorder","Container","StaticContainer","visit","nativeDrawOnscreen","nativeId","recorder","picture","play","SkiaViewApi","setJsiProperty","NativeReanimatedContainer","constructor","Skia","_defineProperty","recorderA","recorderB","currentRecorder","Picture","MakePicture","redraw","mapperId","stopMapper","unmounted","reset","root","sharedValues","getSharedValues","sharedRecorder","getRecorder","runOnUI","length","startMapper","applyUpdates","createContainer"],"sources":["Container.native.ts"],"sourcesContent":["import Rea from \"../external/reanimated/ReanimatedProxy\";\nimport type { Skia, SkPicture } from \"../skia/types\";\nimport { HAS_REANIMATED_3 } from \"../external/reanimated/renderHelpers\";\nimport type { JsiRecorder } from \"../skia/types/Recorder\";\n\nimport { ReanimatedRecorder } from \"./Recorder/ReanimatedRecorder\";\nimport { Container, StaticContainer } from \"./StaticContainer\";\nimport { visit } from \"./Recorder/Visitor\";\n\nimport \"../skia/NativeSetup\";\nimport \"../views/api\";\n\nconst nativeDrawOnscreen = (\n nativeId: number,\n recorder: JsiRecorder,\n picture: SkPicture\n) => {\n \"worklet\";\n\n //const start = performance.now();\n recorder.play(picture);\n //const end = performance.now();\n //console.log(\"Recording time: \", end - start);\n SkiaViewApi.setJsiProperty(nativeId, \"picture\", picture);\n};\n\nclass NativeReanimatedContainer extends Container {\n private mapperId: number | null = null;\n private picture: SkPicture;\n private recorderA: ReanimatedRecorder;\n private recorderB: ReanimatedRecorder;\n private currentRecorder: ReanimatedRecorder;\n\n constructor(\n Skia: Skia,\n private nativeId: number\n ) {\n super(Skia);\n this.recorderA = new ReanimatedRecorder(Skia);\n this.recorderB = new ReanimatedRecorder(Skia);\n this.currentRecorder = this.recorderA;\n this.picture = Skia.Picture.MakePicture(null)!;\n }\n\n redraw() {\n if (this.mapperId !== null) {\n Rea.stopMapper(this.mapperId);\n }\n if (this.unmounted) {\n return;\n }\n\n // Swap to the next recorder (double buffering)\n const recorder = this.currentRecorder;\n this.currentRecorder =\n this.currentRecorder === this.recorderA ? this.recorderB : this.recorderA;\n\n const { nativeId, picture } = this;\n recorder.reset();\n visit(recorder, this.root);\n const sharedValues = recorder.getSharedValues();\n const sharedRecorder = recorder.getRecorder();\n Rea.runOnUI(() => {\n \"worklet\";\n nativeDrawOnscreen(nativeId, sharedRecorder, picture);\n })();\n if (sharedValues.length > 0) {\n this.mapperId = Rea.startMapper(() => {\n \"worklet\";\n sharedRecorder.applyUpdates(sharedValues);\n nativeDrawOnscreen(nativeId, sharedRecorder, picture);\n }, sharedValues);\n }\n }\n}\n\nexport const createContainer = (Skia: Skia, nativeId: number) => {\n if (HAS_REANIMATED_3 && nativeId !== -1) {\n return new NativeReanimatedContainer(Skia, nativeId);\n } else {\n return new StaticContainer(Skia, nativeId);\n }\n};\n"],"mappings":";;;AAAA,OAAOA,GAAG,MAAM,wCAAwC;AAExD,SAASC,gBAAgB,QAAQ,sCAAsC;AAGvE,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,SAAS,EAAEC,eAAe,QAAQ,mBAAmB;AAC9D,SAASC,KAAK,QAAQ,oBAAoB;AAE1C,OAAO,qBAAqB;AAC5B,OAAO,cAAc;AAErB,MAAMC,kBAAkB,GAAGA,CACzBC,QAAgB,EAChBC,QAAqB,EACrBC,OAAkB,KACf;EACH,SAAS;;EAET;EACAD,QAAQ,CAACE,IAAI,CAACD,OAAO,CAAC;EACtB;EACA;EACAE,WAAW,CAACC,cAAc,CAACL,QAAQ,EAAE,SAAS,EAAEE,OAAO,CAAC;AAC1D,CAAC;AAED,MAAMI,yBAAyB,SAASV,SAAS,CAAC;EAOhDW,WAAWA,CACTC,IAAU,EACFR,QAAgB,EACxB;IACA,KAAK,CAACQ,IAAI,CAAC;IAAC,KAFJR,QAAgB,GAAhBA,QAAgB;IAAAS,eAAA,mBARQ,IAAI;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAWpC,IAAI,CAACC,SAAS,GAAG,IAAIf,kBAAkB,CAACa,IAAI,CAAC;IAC7C,IAAI,CAACG,SAAS,GAAG,IAAIhB,kBAAkB,CAACa,IAAI,CAAC;IAC7C,IAAI,CAACI,eAAe,GAAG,IAAI,CAACF,SAAS;IACrC,IAAI,CAACR,OAAO,GAAGM,IAAI,CAACK,OAAO,CAACC,WAAW,CAAC,IAAI,CAAE;EAChD;EAEAC,MAAMA,CAAA,EAAG;IACP,IAAI,IAAI,CAACC,QAAQ,KAAK,IAAI,EAAE;MAC1BvB,GAAG,CAACwB,UAAU,CAAC,IAAI,CAACD,QAAQ,CAAC;IAC/B;IACA,IAAI,IAAI,CAACE,SAAS,EAAE;MAClB;IACF;;IAEA;IACA,MAAMjB,QAAQ,GAAG,IAAI,CAACW,eAAe;IACrC,IAAI,CAACA,eAAe,GAClB,IAAI,CAACA,eAAe,KAAK,IAAI,CAACF,SAAS,GAAG,IAAI,CAACC,SAAS,GAAG,IAAI,CAACD,SAAS;IAE3E,MAAM;MAAEV,QAAQ;MAAEE;IAAQ,CAAC,GAAG,IAAI;IAClCD,QAAQ,CAACkB,KAAK,CAAC,CAAC;IAChBrB,KAAK,CAACG,QAAQ,EAAE,IAAI,CAACmB,IAAI,CAAC;IAC1B,MAAMC,YAAY,GAAGpB,QAAQ,CAACqB,eAAe,CAAC,CAAC;IAC/C,MAAMC,cAAc,GAAGtB,QAAQ,CAACuB,WAAW,CAAC,CAAC;IAC7C/B,GAAG,CAACgC,OAAO,CAAC,MAAM;MAChB,SAAS;;MACT1B,kBAAkB,CAACC,QAAQ,EAAEuB,cAAc,EAAErB,OAAO,CAAC;IACvD,CAAC,CAAC,CAAC,CAAC;IACJ,IAAImB,YAAY,CAACK,MAAM,GAAG,CAAC,EAAE;MAC3B,IAAI,CAACV,QAAQ,GAAGvB,GAAG,CAACkC,WAAW,CAAC,MAAM;QACpC,SAAS;;QACTJ,cAAc,CAACK,YAAY,CAACP,YAAY,CAAC;QACzCtB,kBAAkB,CAACC,QAAQ,EAAEuB,cAAc,EAAErB,OAAO,CAAC;MACvD,CAAC,EAAEmB,YAAY,CAAC;IAClB;EACF;AACF;AAEA,OAAO,MAAMQ,eAAe,GAAGA,CAACrB,IAAU,EAAER,QAAgB,KAAK;EAC/D,IAAIN,gBAAgB,IAAIM,QAAQ,KAAK,CAAC,CAAC,EAAE;IACvC,OAAO,IAAIM,yBAAyB,CAACE,IAAI,EAAER,QAAQ,CAAC;EACtD,CAAC,MAAM;IACL,OAAO,IAAIH,eAAe,CAACW,IAAI,EAAER,QAAQ,CAAC;EAC5C;AACF,CAAC","ignoreList":[]}
@@ -10,6 +10,7 @@ export declare class ReanimatedRecorder implements BaseRecorder {
10
10
  private values;
11
11
  private recorder;
12
12
  constructor(Skia: Skia);
13
+ reset(): void;
13
14
  private processAnimationValues;
14
15
  getRecorder(): JsiRecorder;
15
16
  getSharedValues(): SharedValue<unknown>[];
@@ -13,6 +13,10 @@ export class ReanimatedRecorder {
13
13
  _defineProperty(this, "recorder", void 0);
14
14
  this.recorder = Skia.Recorder();
15
15
  }
16
+ reset() {
17
+ this.values.clear();
18
+ this.recorder.reset();
19
+ }
16
20
  processAnimationValues(props) {
17
21
  if (!props) {
18
22
  return;
@@ -1 +1 @@
1
- {"version":3,"names":["isSharedValue","ReanimatedRecorder","constructor","Skia","_defineProperty","Set","recorder","Recorder","processAnimationValues","props","Object","values","forEach","value","has","name","size","add","getRecorder","getSharedValues","Array","from","saveGroup","restoreGroup","savePaint","standalone","restorePaint","restorePaintDeclaration","materializePaint","pushPathEffect","pathEffectType","pushImageFilter","imageFilterType","pushColorFilter","colorFilterType","pushShader","shaderType","children","pushBlurMaskFilter","composePathEffect","composeColorFilter","composeImageFilter","saveCTM","restoreCTM","drawPaint","saveLayer","saveBackdropFilter","drawBox","boxProps","shadows","shadow","map","s","drawImage","drawCircle","drawPoints","drawPath","drawRect","drawRRect","drawOval","drawLine","drawPatch","drawVertices","drawDiffRect","drawText","drawTextPath","drawTextBlob","drawGlyphs","drawPicture","drawImageSVG","drawParagraph","drawAtlas","drawSkottie"],"sources":["ReanimatedRecorder.ts"],"sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { BaseRecorder, JsiRecorder, Skia } from \"../../skia/types\";\nimport type {\n PaintProps,\n NodeType,\n BlurMaskFilterProps,\n CTMProps,\n BoxProps,\n BoxShadowProps,\n ImageProps,\n CircleProps,\n PointsProps,\n PathProps,\n RectProps,\n RoundedRectProps,\n OvalProps,\n LineProps,\n PatchProps,\n VerticesProps,\n DiffRectProps,\n TextProps,\n TextPathProps,\n TextBlobProps,\n GlyphsProps,\n PictureProps,\n ImageSVGProps,\n ParagraphProps,\n AtlasProps,\n SkottieProps,\n} from \"../../dom/types\";\nimport type { AnimatedProps } from \"../../renderer\";\nimport { isSharedValue } from \"../utils\";\n\n/**\n * Currently the recorder only work if the GPU resources (e.g Images) are owned by the main thread.\n * It will crash otherwise on Ganesh (iOS/Android).\n */\nexport class ReanimatedRecorder implements BaseRecorder {\n private values = new Set<SharedValue<unknown>>();\n private recorder: JsiRecorder;\n\n constructor(Skia: Skia) {\n this.recorder = Skia.Recorder();\n }\n\n private processAnimationValues(props?: Record<string, unknown>) {\n if (!props) {\n return;\n }\n Object.values(props).forEach((value) => {\n if (isSharedValue(value) && !this.values.has(value)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n value.name = `variable${this.values.size}`;\n this.values.add(value as SharedValue<unknown>);\n }\n });\n }\n\n getRecorder() {\n return this.recorder;\n }\n\n getSharedValues() {\n return Array.from(this.values);\n }\n\n saveGroup(): void {\n this.recorder.saveGroup();\n }\n\n restoreGroup(): void {\n this.recorder.restoreGroup();\n }\n\n savePaint(props: AnimatedProps<PaintProps>, standalone: boolean): void {\n this.processAnimationValues(props);\n this.recorder.savePaint(props, standalone);\n }\n\n restorePaint(): void {\n this.recorder.restorePaint();\n }\n\n restorePaintDeclaration(): void {\n this.recorder.restorePaintDeclaration();\n }\n\n materializePaint(): void {\n this.recorder.materializePaint();\n }\n\n pushPathEffect(\n pathEffectType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushPathEffect(pathEffectType, props);\n }\n\n pushImageFilter(\n imageFilterType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushImageFilter(imageFilterType, props);\n }\n\n pushColorFilter(\n colorFilterType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushColorFilter(colorFilterType, props);\n }\n\n pushShader(\n shaderType: NodeType,\n props: AnimatedProps<unknown>,\n children: number\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushShader(shaderType, props, children);\n }\n\n pushBlurMaskFilter(props: AnimatedProps<BlurMaskFilterProps>): void {\n this.processAnimationValues(props);\n this.recorder.pushBlurMaskFilter(props);\n }\n\n composePathEffect(): void {\n this.recorder.composePathEffect();\n }\n\n composeColorFilter(): void {\n this.recorder.composeColorFilter();\n }\n\n composeImageFilter(): void {\n this.recorder.composeImageFilter();\n }\n\n saveCTM(props: AnimatedProps<CTMProps>): void {\n this.processAnimationValues(props);\n this.recorder.saveCTM(props);\n }\n\n restoreCTM(): void {\n this.recorder.restoreCTM();\n }\n\n drawPaint(): void {\n this.recorder.drawPaint();\n }\n\n saveLayer(): void {\n this.recorder.saveLayer();\n }\n\n saveBackdropFilter(): void {\n this.recorder.saveBackdropFilter();\n }\n\n drawBox(\n boxProps: AnimatedProps<BoxProps>,\n shadows: {\n props: BoxShadowProps;\n }[]\n ): void {\n this.processAnimationValues(boxProps);\n shadows.forEach((shadow) => {\n this.processAnimationValues(\n shadow.props as AnimatedProps<BoxShadowProps>\n );\n });\n this.recorder.drawBox(\n boxProps,\n // TODO: Fix this type BaseRecorder.drawBox()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n shadows.map((s) => s.props)\n );\n }\n\n drawImage(props: AnimatedProps<ImageProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawImage(props);\n }\n\n drawCircle(props: AnimatedProps<CircleProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawCircle(props);\n }\n\n drawPoints(props: AnimatedProps<PointsProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPoints(props);\n }\n\n drawPath(props: AnimatedProps<PathProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPath(props);\n }\n\n drawRect(props: AnimatedProps<RectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawRect(props);\n }\n\n drawRRect(props: AnimatedProps<RoundedRectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawRRect(props);\n }\n\n drawOval(props: AnimatedProps<OvalProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawOval(props);\n }\n\n drawLine(props: AnimatedProps<LineProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawLine(props);\n }\n\n drawPatch(props: AnimatedProps<PatchProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPatch(props);\n }\n\n drawVertices(props: AnimatedProps<VerticesProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawVertices(props);\n }\n\n drawDiffRect(props: AnimatedProps<DiffRectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawDiffRect(props);\n }\n\n drawText(props: AnimatedProps<TextProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawText(props);\n }\n\n drawTextPath(props: AnimatedProps<TextPathProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawTextPath(props);\n }\n\n drawTextBlob(props: AnimatedProps<TextBlobProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawTextBlob(props);\n }\n\n drawGlyphs(props: AnimatedProps<GlyphsProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawGlyphs(props);\n }\n\n drawPicture(props: AnimatedProps<PictureProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPicture(props);\n }\n\n drawImageSVG(props: AnimatedProps<ImageSVGProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawImageSVG(props);\n }\n\n drawParagraph(props: AnimatedProps<ParagraphProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawParagraph(props);\n }\n\n drawAtlas(props: AnimatedProps<AtlasProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawAtlas(props);\n }\n\n drawSkottie(props: AnimatedProps<SkottieProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawSkottie(props);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isSharedValue","ReanimatedRecorder","constructor","Skia","_defineProperty","Set","recorder","Recorder","reset","values","clear","processAnimationValues","props","Object","forEach","value","has","name","size","add","getRecorder","getSharedValues","Array","from","saveGroup","restoreGroup","savePaint","standalone","restorePaint","restorePaintDeclaration","materializePaint","pushPathEffect","pathEffectType","pushImageFilter","imageFilterType","pushColorFilter","colorFilterType","pushShader","shaderType","children","pushBlurMaskFilter","composePathEffect","composeColorFilter","composeImageFilter","saveCTM","restoreCTM","drawPaint","saveLayer","saveBackdropFilter","drawBox","boxProps","shadows","shadow","map","s","drawImage","drawCircle","drawPoints","drawPath","drawRect","drawRRect","drawOval","drawLine","drawPatch","drawVertices","drawDiffRect","drawText","drawTextPath","drawTextBlob","drawGlyphs","drawPicture","drawImageSVG","drawParagraph","drawAtlas","drawSkottie"],"sources":["ReanimatedRecorder.ts"],"sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { BaseRecorder, JsiRecorder, Skia } from \"../../skia/types\";\nimport type {\n PaintProps,\n NodeType,\n BlurMaskFilterProps,\n CTMProps,\n BoxProps,\n BoxShadowProps,\n ImageProps,\n CircleProps,\n PointsProps,\n PathProps,\n RectProps,\n RoundedRectProps,\n OvalProps,\n LineProps,\n PatchProps,\n VerticesProps,\n DiffRectProps,\n TextProps,\n TextPathProps,\n TextBlobProps,\n GlyphsProps,\n PictureProps,\n ImageSVGProps,\n ParagraphProps,\n AtlasProps,\n SkottieProps,\n} from \"../../dom/types\";\nimport type { AnimatedProps } from \"../../renderer\";\nimport { isSharedValue } from \"../utils\";\n\n/**\n * Currently the recorder only work if the GPU resources (e.g Images) are owned by the main thread.\n * It will crash otherwise on Ganesh (iOS/Android).\n */\nexport class ReanimatedRecorder implements BaseRecorder {\n private values = new Set<SharedValue<unknown>>();\n private recorder: JsiRecorder;\n\n constructor(Skia: Skia) {\n this.recorder = Skia.Recorder();\n }\n\n reset() {\n this.values.clear();\n this.recorder.reset();\n }\n\n private processAnimationValues(props?: Record<string, unknown>) {\n if (!props) {\n return;\n }\n Object.values(props).forEach((value) => {\n if (isSharedValue(value) && !this.values.has(value)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n value.name = `variable${this.values.size}`;\n this.values.add(value as SharedValue<unknown>);\n }\n });\n }\n\n getRecorder() {\n return this.recorder;\n }\n\n getSharedValues() {\n return Array.from(this.values);\n }\n\n saveGroup(): void {\n this.recorder.saveGroup();\n }\n\n restoreGroup(): void {\n this.recorder.restoreGroup();\n }\n\n savePaint(props: AnimatedProps<PaintProps>, standalone: boolean): void {\n this.processAnimationValues(props);\n this.recorder.savePaint(props, standalone);\n }\n\n restorePaint(): void {\n this.recorder.restorePaint();\n }\n\n restorePaintDeclaration(): void {\n this.recorder.restorePaintDeclaration();\n }\n\n materializePaint(): void {\n this.recorder.materializePaint();\n }\n\n pushPathEffect(\n pathEffectType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushPathEffect(pathEffectType, props);\n }\n\n pushImageFilter(\n imageFilterType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushImageFilter(imageFilterType, props);\n }\n\n pushColorFilter(\n colorFilterType: NodeType,\n props: AnimatedProps<unknown>\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushColorFilter(colorFilterType, props);\n }\n\n pushShader(\n shaderType: NodeType,\n props: AnimatedProps<unknown>,\n children: number\n ): void {\n this.processAnimationValues(props);\n this.recorder.pushShader(shaderType, props, children);\n }\n\n pushBlurMaskFilter(props: AnimatedProps<BlurMaskFilterProps>): void {\n this.processAnimationValues(props);\n this.recorder.pushBlurMaskFilter(props);\n }\n\n composePathEffect(): void {\n this.recorder.composePathEffect();\n }\n\n composeColorFilter(): void {\n this.recorder.composeColorFilter();\n }\n\n composeImageFilter(): void {\n this.recorder.composeImageFilter();\n }\n\n saveCTM(props: AnimatedProps<CTMProps>): void {\n this.processAnimationValues(props);\n this.recorder.saveCTM(props);\n }\n\n restoreCTM(): void {\n this.recorder.restoreCTM();\n }\n\n drawPaint(): void {\n this.recorder.drawPaint();\n }\n\n saveLayer(): void {\n this.recorder.saveLayer();\n }\n\n saveBackdropFilter(): void {\n this.recorder.saveBackdropFilter();\n }\n\n drawBox(\n boxProps: AnimatedProps<BoxProps>,\n shadows: {\n props: BoxShadowProps;\n }[]\n ): void {\n this.processAnimationValues(boxProps);\n shadows.forEach((shadow) => {\n this.processAnimationValues(\n shadow.props as AnimatedProps<BoxShadowProps>\n );\n });\n this.recorder.drawBox(\n boxProps,\n // TODO: Fix this type BaseRecorder.drawBox()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n shadows.map((s) => s.props)\n );\n }\n\n drawImage(props: AnimatedProps<ImageProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawImage(props);\n }\n\n drawCircle(props: AnimatedProps<CircleProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawCircle(props);\n }\n\n drawPoints(props: AnimatedProps<PointsProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPoints(props);\n }\n\n drawPath(props: AnimatedProps<PathProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPath(props);\n }\n\n drawRect(props: AnimatedProps<RectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawRect(props);\n }\n\n drawRRect(props: AnimatedProps<RoundedRectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawRRect(props);\n }\n\n drawOval(props: AnimatedProps<OvalProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawOval(props);\n }\n\n drawLine(props: AnimatedProps<LineProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawLine(props);\n }\n\n drawPatch(props: AnimatedProps<PatchProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPatch(props);\n }\n\n drawVertices(props: AnimatedProps<VerticesProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawVertices(props);\n }\n\n drawDiffRect(props: AnimatedProps<DiffRectProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawDiffRect(props);\n }\n\n drawText(props: AnimatedProps<TextProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawText(props);\n }\n\n drawTextPath(props: AnimatedProps<TextPathProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawTextPath(props);\n }\n\n drawTextBlob(props: AnimatedProps<TextBlobProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawTextBlob(props);\n }\n\n drawGlyphs(props: AnimatedProps<GlyphsProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawGlyphs(props);\n }\n\n drawPicture(props: AnimatedProps<PictureProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawPicture(props);\n }\n\n drawImageSVG(props: AnimatedProps<ImageSVGProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawImageSVG(props);\n }\n\n drawParagraph(props: AnimatedProps<ParagraphProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawParagraph(props);\n }\n\n drawAtlas(props: AnimatedProps<AtlasProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawAtlas(props);\n }\n\n drawSkottie(props: AnimatedProps<SkottieProps>): void {\n this.processAnimationValues(props);\n this.recorder.drawSkottie(props);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,12 @@ import _StaticContainer = require("./StaticContainer");
4
4
  declare class NativeReanimatedContainer extends _StaticContainer.Container {
5
5
  constructor(Skia: any, nativeId: any);
6
6
  nativeId: any;
7
+ recorderA: _ReanimatedRecorder.ReanimatedRecorder;
8
+ recorderB: _ReanimatedRecorder.ReanimatedRecorder;
9
+ currentRecorder: _ReanimatedRecorder.ReanimatedRecorder;
10
+ picture: any;
7
11
  redraw(): void;
8
12
  mapperId: any;
9
13
  }
14
+ import _ReanimatedRecorder = require("./Recorder/ReanimatedRecorder");
10
15
  export {};
@@ -6,6 +6,7 @@ export const __esModule: boolean;
6
6
  export class ReanimatedRecorder {
7
7
  constructor(Skia: any);
8
8
  recorder: any;
9
+ reset(): void;
9
10
  processAnimationValues(props: any): void;
10
11
  getRecorder(): any;
11
12
  getSharedValues(): any[];
@@ -3,8 +3,13 @@ import { StaticContainer } from "./StaticContainer";
3
3
  declare class NativeReanimatedContainer extends Container {
4
4
  constructor(Skia: any, nativeId: any);
5
5
  nativeId: any;
6
+ recorderA: ReanimatedRecorder;
7
+ recorderB: ReanimatedRecorder;
8
+ currentRecorder: ReanimatedRecorder;
9
+ picture: any;
6
10
  redraw(): void;
7
11
  mapperId: any;
8
12
  }
9
13
  import { Container } from "./StaticContainer";
14
+ import { ReanimatedRecorder } from "./Recorder/ReanimatedRecorder";
10
15
  export {};
@@ -5,6 +5,7 @@
5
5
  export class ReanimatedRecorder {
6
6
  constructor(Skia: any);
7
7
  recorder: any;
8
+ reset(): void;
8
9
  processAnimationValues(props: any): void;
9
10
  getRecorder(): any;
10
11
  getSharedValues(): any[];
@@ -4,5 +4,5 @@ export interface PictureFactory {
4
4
  * Returns an SkPicture which has been serialized previously to the given bytes.
5
5
  * @param bytes
6
6
  */
7
- MakePicture(bytes: Uint8Array | ArrayBuffer): SkPicture | null;
7
+ MakePicture(bytes: Uint8Array | ArrayBuffer | null): SkPicture | null;
8
8
  }
@@ -48,6 +48,7 @@ export interface BaseRecorder {
48
48
  drawAtlas(props: AnimatedProps<AtlasProps>): void;
49
49
  }
50
50
  export interface JsiRecorder extends BaseRecorder {
51
- play(): SkPicture;
51
+ play(picture: SkPicture): void;
52
52
  applyUpdates(variables: SharedValue<unknown>[]): void;
53
+ reset(): void;
53
54
  }
@@ -5,6 +5,10 @@ import "../views/api";
5
5
  declare class NativeReanimatedContainer extends Container {
6
6
  private nativeId;
7
7
  private mapperId;
8
+ private picture;
9
+ private recorderA;
10
+ private recorderB;
11
+ private currentRecorder;
8
12
  constructor(Skia: Skia, nativeId: number);
9
13
  redraw(): void;
10
14
  }
@@ -10,6 +10,7 @@ export declare class ReanimatedRecorder implements BaseRecorder {
10
10
  private values;
11
11
  private recorder;
12
12
  constructor(Skia: Skia);
13
+ reset(): void;
13
14
  private processAnimationValues;
14
15
  getRecorder(): JsiRecorder;
15
16
  getSharedValues(): SharedValue<unknown>[];
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "setup-skia-web": "scripts/setup-canvaskit.js"
9
9
  },
10
10
  "title": "React Native Skia",
11
- "version": "2.3.8",
11
+ "version": "2.3.9",
12
12
  "skia": {
13
13
  "version": "m142",
14
14
  "checksums": {
@@ -5,5 +5,5 @@ export interface PictureFactory {
5
5
  * Returns an SkPicture which has been serialized previously to the given bytes.
6
6
  * @param bytes
7
7
  */
8
- MakePicture(bytes: Uint8Array | ArrayBuffer): SkPicture | null;
8
+ MakePicture(bytes: Uint8Array | ArrayBuffer | null): SkPicture | null;
9
9
  }
@@ -92,6 +92,7 @@ export interface BaseRecorder {
92
92
  }
93
93
 
94
94
  export interface JsiRecorder extends BaseRecorder {
95
- play(): SkPicture;
95
+ play(picture: SkPicture): void;
96
96
  applyUpdates(variables: SharedValue<unknown>[]): void;
97
+ reset(): void;
97
98
  }
@@ -1,5 +1,5 @@
1
1
  import Rea from "../external/reanimated/ReanimatedProxy";
2
- import type { Skia } from "../skia/types";
2
+ import type { Skia, SkPicture } from "../skia/types";
3
3
  import { HAS_REANIMATED_3 } from "../external/reanimated/renderHelpers";
4
4
  import type { JsiRecorder } from "../skia/types/Recorder";
5
5
 
@@ -10,11 +10,15 @@ import { visit } from "./Recorder/Visitor";
10
10
  import "../skia/NativeSetup";
11
11
  import "../views/api";
12
12
 
13
- const nativeDrawOnscreen = (nativeId: number, recorder: JsiRecorder) => {
13
+ const nativeDrawOnscreen = (
14
+ nativeId: number,
15
+ recorder: JsiRecorder,
16
+ picture: SkPicture
17
+ ) => {
14
18
  "worklet";
15
19
 
16
20
  //const start = performance.now();
17
- const picture = recorder.play();
21
+ recorder.play(picture);
18
22
  //const end = performance.now();
19
23
  //console.log("Recording time: ", end - start);
20
24
  SkiaViewApi.setJsiProperty(nativeId, "picture", picture);
@@ -22,12 +26,20 @@ const nativeDrawOnscreen = (nativeId: number, recorder: JsiRecorder) => {
22
26
 
23
27
  class NativeReanimatedContainer extends Container {
24
28
  private mapperId: number | null = null;
29
+ private picture: SkPicture;
30
+ private recorderA: ReanimatedRecorder;
31
+ private recorderB: ReanimatedRecorder;
32
+ private currentRecorder: ReanimatedRecorder;
25
33
 
26
34
  constructor(
27
35
  Skia: Skia,
28
36
  private nativeId: number
29
37
  ) {
30
38
  super(Skia);
39
+ this.recorderA = new ReanimatedRecorder(Skia);
40
+ this.recorderB = new ReanimatedRecorder(Skia);
41
+ this.currentRecorder = this.recorderA;
42
+ this.picture = Skia.Picture.MakePicture(null)!;
31
43
  }
32
44
 
33
45
  redraw() {
@@ -37,20 +49,26 @@ class NativeReanimatedContainer extends Container {
37
49
  if (this.unmounted) {
38
50
  return;
39
51
  }
40
- const { nativeId, Skia } = this;
41
- const recorder = new ReanimatedRecorder(Skia);
52
+
53
+ // Swap to the next recorder (double buffering)
54
+ const recorder = this.currentRecorder;
55
+ this.currentRecorder =
56
+ this.currentRecorder === this.recorderA ? this.recorderB : this.recorderA;
57
+
58
+ const { nativeId, picture } = this;
59
+ recorder.reset();
42
60
  visit(recorder, this.root);
43
61
  const sharedValues = recorder.getSharedValues();
44
62
  const sharedRecorder = recorder.getRecorder();
45
63
  Rea.runOnUI(() => {
46
64
  "worklet";
47
- nativeDrawOnscreen(nativeId, sharedRecorder);
65
+ nativeDrawOnscreen(nativeId, sharedRecorder, picture);
48
66
  })();
49
67
  if (sharedValues.length > 0) {
50
68
  this.mapperId = Rea.startMapper(() => {
51
69
  "worklet";
52
70
  sharedRecorder.applyUpdates(sharedValues);
53
- nativeDrawOnscreen(nativeId, sharedRecorder);
71
+ nativeDrawOnscreen(nativeId, sharedRecorder, picture);
54
72
  }, sharedValues);
55
73
  }
56
74
  }
@@ -44,6 +44,11 @@ export class ReanimatedRecorder implements BaseRecorder {
44
44
  this.recorder = Skia.Recorder();
45
45
  }
46
46
 
47
+ reset() {
48
+ this.values.clear();
49
+ this.recorder.reset();
50
+ }
51
+
47
52
  private processAnimationValues(props?: Record<string, unknown>) {
48
53
  if (!props) {
49
54
  return;