@shopify/react-native-skia 0.1.162 → 0.1.164

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 (194) hide show
  1. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +2 -0
  2. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +2 -2
  3. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +2 -2
  4. package/android/cpp/rnskia-android/SkiaOpenGLRenderer.h +5 -5
  5. package/cpp/api/JsiSkCanvas.h +8 -8
  6. package/cpp/api/JsiSkColor.h +1 -1
  7. package/cpp/api/JsiSkColorFilter.h +1 -1
  8. package/cpp/api/JsiSkColorFilterFactory.h +2 -2
  9. package/cpp/api/JsiSkContourMeasure.h +1 -1
  10. package/cpp/api/JsiSkContourMeasureIter.h +2 -2
  11. package/cpp/api/JsiSkData.h +2 -2
  12. package/cpp/api/JsiSkDataFactory.h +1 -1
  13. package/cpp/api/JsiSkFont.h +2 -2
  14. package/cpp/api/JsiSkImage.h +3 -3
  15. package/cpp/api/JsiSkImageFilter.h +1 -1
  16. package/cpp/api/JsiSkImageFilterFactory.h +1 -1
  17. package/cpp/api/JsiSkImageInfo.h +1 -1
  18. package/cpp/api/JsiSkMaskFilter.h +1 -1
  19. package/cpp/api/JsiSkMaskFilterFactory.h +1 -1
  20. package/cpp/api/JsiSkMatrix.h +1 -1
  21. package/cpp/api/JsiSkPaint.h +7 -1
  22. package/cpp/api/JsiSkPath.h +15 -15
  23. package/cpp/api/JsiSkPathEffect.h +1 -1
  24. package/cpp/api/JsiSkPathEffectFactory.h +4 -4
  25. package/cpp/api/JsiSkPathFactory.h +2 -2
  26. package/cpp/api/JsiSkPicture.h +1 -1
  27. package/cpp/api/JsiSkPictureFactory.h +2 -2
  28. package/cpp/api/JsiSkPictureRecorder.h +2 -2
  29. package/cpp/api/JsiSkPoint.h +1 -1
  30. package/cpp/api/JsiSkRRect.h +1 -1
  31. package/cpp/api/JsiSkRSXform.h +1 -1
  32. package/cpp/api/JsiSkRect.h +1 -1
  33. package/cpp/api/JsiSkRuntimeEffect.h +1 -1
  34. package/cpp/api/JsiSkRuntimeShaderBuilder.h +1 -1
  35. package/cpp/api/JsiSkSVGFactory.h +1 -1
  36. package/cpp/api/JsiSkShader.h +2 -2
  37. package/cpp/api/JsiSkShaderFactory.h +3 -3
  38. package/cpp/api/JsiSkSurface.h +1 -1
  39. package/cpp/api/JsiSkSurfaceFactory.h +2 -2
  40. package/cpp/api/JsiSkTextBlob.h +1 -1
  41. package/cpp/api/JsiSkTextBlobFactory.h +1 -1
  42. package/cpp/api/JsiSkTypeface.h +2 -2
  43. package/cpp/api/JsiSkVertices.h +1 -1
  44. package/cpp/jsi/JsiHostObject.h +25 -25
  45. package/cpp/rnskia/RNSkJsView.h +3 -3
  46. package/cpp/rnskia/RNSkPictureView.h +3 -3
  47. package/cpp/rnskia/RNSkPlatformContext.h +5 -3
  48. package/cpp/rnskia/RNSkView.h +2 -2
  49. package/cpp/rnskia/dom/base/DrawingContext.cpp +24 -9
  50. package/cpp/rnskia/dom/base/DrawingContext.h +3 -2
  51. package/cpp/rnskia/dom/base/JsiDomDeclarationNode.h +12 -2
  52. package/cpp/rnskia/dom/base/JsiDomDrawingNode.h +4 -4
  53. package/cpp/rnskia/dom/base/JsiDomNode.h +68 -10
  54. package/cpp/rnskia/dom/base/JsiDomRenderNode.h +26 -61
  55. package/cpp/rnskia/dom/base/NodeProp.h +2 -1
  56. package/cpp/rnskia/dom/base/NodePropsContainer.h +10 -0
  57. package/cpp/rnskia/dom/nodes/JsiBlendNode.h +7 -9
  58. package/cpp/rnskia/dom/nodes/JsiBlurMaskNode.h +3 -6
  59. package/cpp/rnskia/dom/nodes/JsiBoxNode.h +2 -4
  60. package/cpp/rnskia/dom/nodes/JsiBoxShadowNode.h +1 -2
  61. package/cpp/rnskia/dom/nodes/JsiCircleNode.h +2 -3
  62. package/cpp/rnskia/dom/nodes/JsiColorFilterNodes.h +4 -8
  63. package/cpp/rnskia/dom/nodes/JsiCustomDrawingNode.h +1 -2
  64. package/cpp/rnskia/dom/nodes/JsiDiffRectNode.h +2 -7
  65. package/cpp/rnskia/dom/nodes/JsiGlyphsNode.h +4 -8
  66. package/cpp/rnskia/dom/nodes/JsiImageFilterNodes.h +19 -37
  67. package/cpp/rnskia/dom/nodes/JsiImageNode.h +1 -1
  68. package/cpp/rnskia/dom/nodes/JsiImageSvgNode.h +2 -4
  69. package/cpp/rnskia/dom/nodes/JsiLineNode.h +2 -7
  70. package/cpp/rnskia/dom/nodes/JsiOvalNode.h +1 -3
  71. package/cpp/rnskia/dom/nodes/JsiPaintNode.h +2 -3
  72. package/cpp/rnskia/dom/nodes/JsiPatchNode.h +4 -8
  73. package/cpp/rnskia/dom/nodes/JsiPathEffectNodes.h +14 -28
  74. package/cpp/rnskia/dom/nodes/JsiPathNode.h +16 -24
  75. package/cpp/rnskia/dom/nodes/JsiPictureNode.h +1 -2
  76. package/cpp/rnskia/dom/nodes/JsiPointsNode.h +2 -5
  77. package/cpp/rnskia/dom/nodes/JsiRRectNode.h +1 -2
  78. package/cpp/rnskia/dom/nodes/JsiRectNode.h +1 -2
  79. package/cpp/rnskia/dom/nodes/JsiShaderNodes.h +37 -69
  80. package/cpp/rnskia/dom/nodes/JsiTextBlobNode.h +3 -6
  81. package/cpp/rnskia/dom/nodes/JsiTextNode.h +4 -8
  82. package/cpp/rnskia/dom/nodes/JsiTextPathNode.h +1 -2
  83. package/cpp/rnskia/dom/nodes/JsiVerticesNode.h +2 -4
  84. package/cpp/rnskia/dom/props/BlendModeProp.h +2 -2
  85. package/cpp/rnskia/dom/props/PaintProps.h +3 -0
  86. package/cpp/rnskia/dom/props/TransformProp.h +0 -2
  87. package/cpp/utils/RNSkLog.h +1 -1
  88. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +8 -7
  89. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +2 -1
  90. package/ios/RNSkia-iOS/SkiaDrawViewManager.mm +4 -4
  91. package/ios/RNSkia-iOS/SkiaManager.mm +5 -5
  92. package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +3 -3
  93. package/ios/RNSkia-iOS/SkiaUIView.mm +10 -10
  94. package/lib/commonjs/dom/nodes/RenderNode.js +12 -16
  95. package/lib/commonjs/dom/nodes/RenderNode.js.map +1 -1
  96. package/lib/commonjs/dom/nodes/datatypes/index.js +0 -13
  97. package/lib/commonjs/dom/nodes/datatypes/index.js.map +1 -1
  98. package/lib/commonjs/dom/nodes/drawings/Box.js +6 -6
  99. package/lib/commonjs/dom/nodes/drawings/Box.js.map +1 -1
  100. package/lib/commonjs/dom/nodes/drawings/PatchNode.js +3 -7
  101. package/lib/commonjs/dom/nodes/drawings/PatchNode.js.map +1 -1
  102. package/lib/commonjs/dom/nodes/drawings/VerticesNode.js +1 -1
  103. package/lib/commonjs/dom/nodes/drawings/VerticesNode.js.map +1 -1
  104. package/lib/commonjs/dom/nodes/paint/ColorFilters.js +1 -3
  105. package/lib/commonjs/dom/nodes/paint/ColorFilters.js.map +1 -1
  106. package/lib/commonjs/dom/nodes/paint/ImageFilters.js +1 -1
  107. package/lib/commonjs/dom/nodes/paint/ImageFilters.js.map +1 -1
  108. package/lib/commonjs/dom/nodes/paint/Shaders.js +1 -3
  109. package/lib/commonjs/dom/nodes/paint/Shaders.js.map +1 -1
  110. package/lib/commonjs/dom/types/DrawingContext.js.map +1 -1
  111. package/lib/commonjs/renderer/Canvas.js +2 -11
  112. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  113. package/lib/commonjs/renderer/Container.js +2 -1
  114. package/lib/commonjs/renderer/Container.js.map +1 -1
  115. package/lib/commonjs/renderer/DrawingContext.js.map +1 -1
  116. package/lib/commonjs/renderer/components/Mask.js +11 -25
  117. package/lib/commonjs/renderer/components/Mask.js.map +1 -1
  118. package/lib/commonjs/renderer/index.js +0 -13
  119. package/lib/commonjs/renderer/index.js.map +1 -1
  120. package/lib/commonjs/skia/types/Paint/Paint.js.map +1 -1
  121. package/lib/commonjs/skia/web/JsiSkPaint.js +4 -0
  122. package/lib/commonjs/skia/web/JsiSkPaint.js.map +1 -1
  123. package/lib/commonjs/web/LoadSkiaWeb.js +1 -1
  124. package/lib/commonjs/web/LoadSkiaWeb.js.map +1 -1
  125. package/lib/module/dom/nodes/RenderNode.js +12 -16
  126. package/lib/module/dom/nodes/RenderNode.js.map +1 -1
  127. package/lib/module/dom/nodes/datatypes/index.js +0 -1
  128. package/lib/module/dom/nodes/datatypes/index.js.map +1 -1
  129. package/lib/module/dom/nodes/drawings/Box.js +6 -5
  130. package/lib/module/dom/nodes/drawings/Box.js.map +1 -1
  131. package/lib/module/dom/nodes/drawings/PatchNode.js +4 -8
  132. package/lib/module/dom/nodes/drawings/PatchNode.js.map +1 -1
  133. package/lib/module/dom/nodes/drawings/VerticesNode.js +2 -2
  134. package/lib/module/dom/nodes/drawings/VerticesNode.js.map +1 -1
  135. package/lib/module/dom/nodes/paint/ColorFilters.js +1 -2
  136. package/lib/module/dom/nodes/paint/ColorFilters.js.map +1 -1
  137. package/lib/module/dom/nodes/paint/ImageFilters.js +2 -2
  138. package/lib/module/dom/nodes/paint/ImageFilters.js.map +1 -1
  139. package/lib/module/dom/nodes/paint/Shaders.js +1 -2
  140. package/lib/module/dom/nodes/paint/Shaders.js.map +1 -1
  141. package/lib/module/dom/types/DrawingContext.js.map +1 -1
  142. package/lib/module/renderer/Canvas.js +3 -10
  143. package/lib/module/renderer/Canvas.js.map +1 -1
  144. package/lib/module/renderer/Container.js +2 -1
  145. package/lib/module/renderer/Container.js.map +1 -1
  146. package/lib/module/renderer/DrawingContext.js.map +1 -1
  147. package/lib/module/renderer/components/Mask.js +9 -21
  148. package/lib/module/renderer/components/Mask.js.map +1 -1
  149. package/lib/module/renderer/index.js +0 -1
  150. package/lib/module/renderer/index.js.map +1 -1
  151. package/lib/module/skia/types/Paint/Paint.js.map +1 -1
  152. package/lib/module/skia/web/JsiSkPaint.js +4 -0
  153. package/lib/module/skia/web/JsiSkPaint.js.map +1 -1
  154. package/lib/module/web/LoadSkiaWeb.js +1 -1
  155. package/lib/module/web/LoadSkiaWeb.js.map +1 -1
  156. package/lib/typescript/src/dom/nodes/datatypes/index.d.ts +0 -1
  157. package/lib/typescript/src/dom/nodes/drawings/Box.d.ts +1 -1
  158. package/lib/typescript/src/dom/nodes/drawings/PatchNode.d.ts +1 -1
  159. package/lib/typescript/src/dom/types/DrawingContext.d.ts +0 -1
  160. package/lib/typescript/src/renderer/Container.d.ts +1 -1
  161. package/lib/typescript/src/renderer/DrawingContext.d.ts +3 -5
  162. package/lib/typescript/src/renderer/index.d.ts +0 -1
  163. package/lib/typescript/src/skia/types/Paint/Paint.d.ts +4 -0
  164. package/lib/typescript/src/skia/web/JsiSkPaint.d.ts +1 -0
  165. package/package.json +1 -1
  166. package/src/dom/nodes/RenderNode.ts +11 -21
  167. package/src/dom/nodes/datatypes/index.ts +0 -1
  168. package/src/dom/nodes/drawings/Box.ts +7 -4
  169. package/src/dom/nodes/drawings/PatchNode.ts +4 -18
  170. package/src/dom/nodes/drawings/VerticesNode.ts +2 -2
  171. package/src/dom/nodes/paint/ColorFilters.ts +1 -2
  172. package/src/dom/nodes/paint/ImageFilters.ts +2 -2
  173. package/src/dom/nodes/paint/Shaders.ts +1 -2
  174. package/src/dom/types/DrawingContext.ts +0 -1
  175. package/src/renderer/Canvas.tsx +2 -12
  176. package/src/renderer/Container.tsx +1 -1
  177. package/src/renderer/DrawingContext.ts +5 -5
  178. package/src/renderer/components/Mask.tsx +11 -20
  179. package/src/renderer/index.ts +0 -1
  180. package/src/skia/types/Paint/Paint.ts +5 -0
  181. package/src/skia/web/JsiSkPaint.ts +4 -0
  182. package/src/web/LoadSkiaWeb.tsx +1 -1
  183. package/lib/commonjs/dom/nodes/datatypes/Color.js +0 -27
  184. package/lib/commonjs/dom/nodes/datatypes/Color.js.map +0 -1
  185. package/lib/commonjs/renderer/useCanvas.js +0 -32
  186. package/lib/commonjs/renderer/useCanvas.js.map +0 -1
  187. package/lib/module/dom/nodes/datatypes/Color.js +0 -11
  188. package/lib/module/dom/nodes/datatypes/Color.js.map +0 -1
  189. package/lib/module/renderer/useCanvas.js +0 -15
  190. package/lib/module/renderer/useCanvas.js.map +0 -1
  191. package/lib/typescript/src/dom/nodes/datatypes/Color.d.ts +0 -7
  192. package/lib/typescript/src/renderer/useCanvas.d.ts +0 -9
  193. package/src/dom/nodes/datatypes/Color.ts +0 -15
  194. package/src/renderer/useCanvas.ts +0 -21
@@ -21,9 +21,9 @@
21
21
  #pragma clang diagnostic push
22
22
  #pragma clang diagnostic ignored "-Wdocumentation"
23
23
 
24
- #include <SkBBHFactory.h>
25
- #include <SkCanvas.h>
26
- #include <SkPictureRecorder.h>
24
+ #include "SkBBHFactory.h"
25
+ #include "SkCanvas.h"
26
+ #include "SkPictureRecorder.h"
27
27
 
28
28
  #pragma clang diagnostic pop
29
29
 
@@ -21,9 +21,9 @@
21
21
  #pragma clang diagnostic push
22
22
  #pragma clang diagnostic ignored "-Wdocumentation"
23
23
 
24
- #include <SkBBHFactory.h>
25
- #include <SkCanvas.h>
26
- #include <SkPictureRecorder.h>
24
+ #include "SkBBHFactory.h"
25
+ #include "SkCanvas.h"
26
+ #include "SkPictureRecorder.h"
27
27
 
28
28
  #pragma clang diagnostic pop
29
29
 
@@ -14,7 +14,7 @@
14
14
  #pragma clang diagnostic push
15
15
  #pragma clang diagnostic ignored "-Wdocumentation"
16
16
 
17
- #include <SkStream.h>
17
+ #include "SkStream.h"
18
18
 
19
19
  #pragma clang diagnostic pop
20
20
 
@@ -188,8 +188,10 @@ public:
188
188
  }
189
189
  }
190
190
 
191
- virtual void startDrawLoop() = 0;
192
- virtual void stopDrawLoop() = 0;
191
+ // default implementation does nothing, so it can be called from virtual
192
+ // destructor.
193
+ virtual void startDrawLoop() {}
194
+ virtual void stopDrawLoop() {}
193
195
 
194
196
  private:
195
197
  float _pixelDensity;
@@ -17,8 +17,8 @@
17
17
  #pragma clang diagnostic push
18
18
  #pragma clang diagnostic ignored "-Wdocumentation"
19
19
 
20
- #include <SkCanvas.h>
21
- #include <SkSurface.h>
20
+ #include "SkCanvas.h"
21
+ #include "SkSurface.h"
22
22
 
23
23
  #pragma clang diagnostic pop
24
24
 
@@ -20,13 +20,6 @@ DrawingContext::inheritContext(const char *source) {
20
20
  return result;
21
21
  }
22
22
 
23
- size_t DrawingContext::getLevel() {
24
- if (_parent != nullptr) {
25
- return _parent->getLevel() + 1;
26
- }
27
- return 0;
28
- }
29
-
30
23
  std::string DrawingContext::getDebugDescription() {
31
24
  std::string v = "ctx for " + std::string(_source) + ":";
32
25
 
@@ -51,9 +44,27 @@ std::string DrawingContext::getDebugDescription() {
51
44
  }
52
45
 
53
46
  v += " opacity:" + std::to_string(_opacity);
47
+
54
48
  if (_paint->getPathEffect() != nullptr) {
55
49
  v += " [PathEffect]";
56
50
  }
51
+
52
+ if (_paint->getShader() != nullptr) {
53
+ v += " [Shader]";
54
+ }
55
+
56
+ if (_paint->getImageFilter() != nullptr) {
57
+ v += " [ImageFilter]";
58
+ }
59
+
60
+ if (_paint->getMaskFilter() != nullptr) {
61
+ v += " [MaskFilter]";
62
+ }
63
+
64
+ if (_paint->getColorFilter() != nullptr) {
65
+ v += " [ColorFilter]";
66
+ }
67
+
57
68
  } else {
58
69
  v = v + "[inherited] " +
59
70
  (_parent != nullptr ? _parent->getDebugDescription() : "");
@@ -168,8 +179,12 @@ double DrawingContext::getOpacity() {
168
179
  Sets the opacity value
169
180
  */
170
181
  void DrawingContext::setOpacity(double opacity) {
171
- getMutablePaint()->setAlphaf(_opacity);
172
- _opacity = opacity;
182
+ auto currentOpacity = opacity;
183
+ if (_parent != nullptr) {
184
+ currentOpacity *= _parent->getOpacity();
185
+ }
186
+ getMutablePaint()->setAlphaf(currentOpacity);
187
+ _opacity = currentOpacity;
173
188
  }
174
189
 
175
190
  /**
@@ -34,8 +34,9 @@ public:
34
34
  */
35
35
  std::shared_ptr<DrawingContext> inheritContext(const char *source);
36
36
 
37
- size_t getLevel();
38
-
37
+ /**
38
+ Returns the debug description for the context
39
+ */
39
40
  std::string getDebugDescription();
40
41
 
41
42
  /**
@@ -36,7 +36,7 @@ public:
36
36
  */
37
37
  virtual void decorateContext(DrawingContext *context) {
38
38
  #if SKIA_DOM_DEBUG
39
- printDebugInfo(context, "Begin Materialize");
39
+ printDebugInfo("Begin Materialize " + std::string(getType()));
40
40
  #endif
41
41
  // Materialize children first so that any inner nodes get the opportunity
42
42
  // to calculate their state before this node continues.
@@ -51,11 +51,21 @@ public:
51
51
  decorate(context);
52
52
 
53
53
  #if SKIA_DOM_DEBUG
54
- printDebugInfo(context, "End Materialize");
54
+ printDebugInfo("End / Commit Materialize " + std::string(getType()));
55
55
  #endif
56
56
  }
57
57
 
58
58
  protected:
59
+ /**
60
+ Invalidates and marks then context as changed. The implementation in the
61
+ declaration node is to pass the call upwards to the parent node
62
+ */
63
+ void invalidateContext() override {
64
+ if (getParent() != nullptr) {
65
+ getParent()->invalidateContext();
66
+ }
67
+ }
68
+
59
69
  /**
60
70
  Override to implement materialization
61
71
  */
@@ -16,7 +16,7 @@ public:
16
16
  protected:
17
17
  void defineProperties(NodePropsContainer *container) override {
18
18
  JsiDomRenderNode::defineProperties(container);
19
- container->defineProperty(std::make_shared<PaintProp>());
19
+ container->defineProperty<PaintProp>();
20
20
  }
21
21
 
22
22
  /**
@@ -26,11 +26,11 @@ protected:
26
26
 
27
27
  void renderNode(DrawingContext *context) override {
28
28
  #if SKIA_DOM_DEBUG
29
- printDebugInfo(context, "Begin Draw", 1);
29
+ printDebugInfo("Begin Draw", 1);
30
30
  #endif
31
31
 
32
32
  #if SKIA_DOM_DEBUG
33
- printDebugInfo(context, context->getDebugDescription(), 2);
33
+ printDebugInfo(context->getDebugDescription(), 2);
34
34
  #endif
35
35
  draw(context);
36
36
 
@@ -42,7 +42,7 @@ protected:
42
42
  }
43
43
  }
44
44
  #if SKIA_DOM_DEBUG
45
- printDebugInfo(context, "End Draw", 1);
45
+ printDebugInfo("End Draw", 1);
46
46
  #endif
47
47
  }
48
48
  };
@@ -168,6 +168,12 @@ public:
168
168
  _disposeCallback = disposeCallback;
169
169
  }
170
170
 
171
+ /**
172
+ Invalidates and marks then context as changed. The default behaviour is an
173
+ empty implementation
174
+ */
175
+ virtual void invalidateContext() = 0;
176
+
171
177
  /**
172
178
  Updates any pending property changes in all nodes and child nodes. This
173
179
  function will swap any pending property changes in this and children with any
@@ -188,6 +194,11 @@ public:
188
194
  op();
189
195
  }
190
196
 
197
+ // If there are any ops here we should invalidate the cached context
198
+ if (_queuedNodeOps.size() > 0) {
199
+ invalidateContext();
200
+ }
201
+
191
202
  _queuedNodeOps.clear();
192
203
  }
193
204
 
@@ -209,7 +220,11 @@ public:
209
220
  }
210
221
 
211
222
  // Now let's dispose if needed
212
- if (_isDisposed) {
223
+ if (_isDisposing && !_isDisposed) {
224
+ _isDisposed = true;
225
+
226
+ this->setParent(nullptr);
227
+
213
228
  // Callback signaling that we're done
214
229
  if (_disposeCallback != nullptr) {
215
230
  _disposeCallback();
@@ -266,6 +281,9 @@ protected:
266
281
  always call the onPropsSet method as a signal that things have changed.
267
282
  */
268
283
  void setProps(jsi::Runtime &runtime, jsi::Object &&props) {
284
+ #if SKIA_DOM_DEBUG
285
+ printDebugInfo("JS:setProps(nodeId: " + std::to_string(_nodeId) + ")");
286
+ #endif
269
287
  if (_propsContainer == nullptr) {
270
288
 
271
289
  // Initialize properties container
@@ -276,12 +294,18 @@ protected:
276
294
  }
277
295
  // Update properties container
278
296
  _propsContainer->setProps(runtime, std::move(props));
297
+
298
+ // Invalidate context
299
+ invalidateContext();
279
300
  }
280
301
 
281
302
  /**
282
303
  Called for components that has no properties
283
304
  */
284
305
  void setEmptyProps() {
306
+ #if SKIA_DOM_DEBUG
307
+ printDebugInfo("JS:setEmptyProps(nodeId: " + std::to_string(_nodeId) + ")");
308
+ #endif
285
309
  if (_propsContainer == nullptr) {
286
310
 
287
311
  // Initialize properties container
@@ -304,8 +328,15 @@ protected:
304
328
  Adds a child node to the array of children for this node
305
329
  */
306
330
  virtual void addChild(std::shared_ptr<JsiDomNode> child) {
331
+ #if SKIA_DOM_DEBUG
332
+ printDebugInfo("JS:addChild(childId: " + std::to_string(child->_nodeId) +
333
+ ")");
334
+ #endif
307
335
  std::lock_guard<std::mutex> lock(_childrenLock);
308
- _queuedNodeOps.push_back([child, this]() { _children.push_back(child); });
336
+ _queuedNodeOps.push_back([child, this]() {
337
+ _children.push_back(child);
338
+ child->setParent(this);
339
+ });
309
340
  }
310
341
 
311
342
  /**
@@ -314,10 +345,16 @@ protected:
314
345
  */
315
346
  virtual void insertChildBefore(std::shared_ptr<JsiDomNode> child,
316
347
  std::shared_ptr<JsiDomNode> before) {
348
+ #if SKIA_DOM_DEBUG
349
+ printDebugInfo(
350
+ "JS:insertChildBefore(childId: " + std::to_string(child->_nodeId) +
351
+ ", beforeId: " + std::to_string(before->_nodeId) + ")");
352
+ #endif
317
353
  std::lock_guard<std::mutex> lock(_childrenLock);
318
354
  _queuedNodeOps.push_back([child, before, this]() {
319
355
  auto position = std::find(_children.begin(), _children.end(), before);
320
356
  _children.insert(position, child);
357
+ child->setParent(this);
321
358
  });
322
359
  }
323
360
 
@@ -326,6 +363,10 @@ protected:
326
363
  children and call dispose on the child node.
327
364
  */
328
365
  virtual void removeChild(std::shared_ptr<JsiDomNode> child) {
366
+ #if SKIA_DOM_DEBUG
367
+ printDebugInfo("JS:removeChild(childId: " + std::to_string(child->_nodeId) +
368
+ ")");
369
+ #endif
329
370
  std::lock_guard<std::mutex> lock(_childrenLock);
330
371
  _queuedNodeOps.push_back([child, this]() {
331
372
  // Delete child itself
@@ -343,26 +384,40 @@ protected:
343
384
  up.
344
385
  */
345
386
  virtual void dispose() {
346
- if (_isDisposed) {
387
+ if (_isDisposing) {
347
388
  return;
348
389
  }
349
390
 
350
- _isDisposed = true;
391
+ _isDisposing = true;
351
392
  }
352
393
 
353
394
  #if SKIA_DOM_DEBUG
354
- std::string getLevelIndentation(DrawingContext *ctx, size_t indentation = 0) {
355
- return std::string((ctx->getLevel() + indentation), ' ');
395
+ std::string getLevelIndentation(size_t indentation = 0) {
396
+ JsiDomNode *curParent = _parent;
397
+ while (curParent != nullptr) {
398
+ indentation++;
399
+ curParent = curParent->getParent();
400
+ }
401
+ return std::string(indentation * 2, ' ');
356
402
  }
357
403
 
358
- void printDebugInfo(DrawingContext *context, const std::string &message,
359
- size_t indentation = 0) {
404
+ void printDebugInfo(const std::string &message, size_t indentation = 0) {
360
405
  RNSkLogger::logToConsole("%s%s %lu: %s",
361
- getLevelIndentation(context, indentation).c_str(),
406
+ getLevelIndentation(indentation).c_str(),
362
407
  getType(), getNodeId(), message.c_str());
363
408
  }
364
409
  #endif
365
410
 
411
+ /**
412
+ Sets the parent node
413
+ */
414
+ void setParent(JsiDomNode *parent) { _parent = parent; }
415
+
416
+ /**
417
+ Returns the parent node if set.
418
+ */
419
+ JsiDomNode *getParent() { return _parent; }
420
+
366
421
  private:
367
422
  const char *_type;
368
423
  std::shared_ptr<RNSkPlatformContext> _context;
@@ -374,11 +429,14 @@ private:
374
429
  std::vector<std::shared_ptr<JsiDomNode>> _children;
375
430
  std::mutex _childrenLock;
376
431
 
377
- std::atomic<bool> _isDisposed = {false};
432
+ std::atomic<bool> _isDisposing = {false};
433
+ bool _isDisposed = false;
378
434
 
379
435
  size_t _nodeId;
380
436
 
381
437
  std::vector<std::function<void()>> _queuedNodeOps;
438
+
439
+ JsiDomNode *_parent = nullptr;
382
440
  };
383
441
 
384
442
  } // namespace RNSkia
@@ -18,12 +18,6 @@
18
18
 
19
19
  namespace RNSkia {
20
20
 
21
- static PropId PropNameOrigin = JsiPropId::get("origin");
22
- static PropId PropNameOpacity = JsiPropId::get("opacity");
23
- static PropId PropNameClip = JsiPropId::get("clip");
24
- static PropId PropNameInvertClip = JsiPropId::get("invertClip");
25
- static PropId PropNameLayer = JsiPropId::get("layer");
26
-
27
21
  class JsiDomRenderNode : public JsiDomNode {
28
22
  public:
29
23
  JsiDomRenderNode(std::shared_ptr<RNSkPlatformContext> context,
@@ -32,7 +26,7 @@ public:
32
26
 
33
27
  void render(DrawingContext *context) {
34
28
  #if SKIA_DOM_DEBUG
35
- printDebugInfo(context, "Begin Render");
29
+ printDebugInfo("Begin Render");
36
30
  #endif
37
31
 
38
32
  // Ensure we have a local drawing context inheriting from the parent context
@@ -50,27 +44,27 @@ public:
50
44
  if (_layerProp->isSet()) {
51
45
  if (_layerProp->isBool()) {
52
46
  #if SKIA_DOM_DEBUG
53
- printDebugInfo(context, "canvas->saveLayer()");
47
+ printDebugInfo("canvas->saveLayer()");
54
48
  #endif
55
49
  _localContext->getCanvas()->saveLayer(
56
50
  SkCanvas::SaveLayerRec(nullptr, nullptr, nullptr, 0));
57
51
  } else {
58
52
  #if SKIA_DOM_DEBUG
59
- printDebugInfo(context, "canvas->saveLayer(paint)");
53
+ printDebugInfo("canvas->saveLayer(paint)");
60
54
  #endif
61
55
  _localContext->getCanvas()->saveLayer(SkCanvas::SaveLayerRec(
62
56
  nullptr, _layerProp->getDerivedValue().get(), nullptr, 0));
63
57
  }
64
58
  } else {
65
59
  #if SKIA_DOM_DEBUG
66
- printDebugInfo(context, "canvas->save()");
60
+ printDebugInfo("canvas->save()");
67
61
  #endif
68
62
  _localContext->getCanvas()->save();
69
63
  }
70
64
 
71
65
  if (_originProp->isSet()) {
72
66
  #if SKIA_DOM_DEBUG
73
- printDebugInfo(context, "canvas->translate(origin)");
67
+ printDebugInfo("canvas->translate(origin)");
74
68
  #endif
75
69
  // Handle origin
76
70
  _localContext->getCanvas()->translate(
@@ -81,10 +75,9 @@ public:
81
75
  if (shouldTransform) {
82
76
  #if SKIA_DOM_DEBUG
83
77
  printDebugInfo(
84
- context,
85
78
  "canvas->concat(" +
86
- std::string(_matrixProp->isSet() ? "matrix" : "transform") +
87
- std::string(")"));
79
+ std::string(_matrixProp->isSet() ? "matrix" : "transform") +
80
+ std::string(")"));
88
81
  #endif
89
82
  auto matrix = _matrixProp->isSet() ? _matrixProp->getDerivedValue()
90
83
  : _transformProp->getDerivedValue();
@@ -101,7 +94,7 @@ public:
101
94
 
102
95
  if (_originProp->isSet()) {
103
96
  #if SKIA_DOM_DEBUG
104
- printDebugInfo(context, "canvas->translate(-origin)");
97
+ printDebugInfo("canvas->translate(-origin)");
105
98
  #endif
106
99
  // Handle origin
107
100
  _localContext->getCanvas()->translate(
@@ -124,13 +117,13 @@ public:
124
117
  // Restore if needed
125
118
  if (shouldSave) {
126
119
  #if SKIA_DOM_DEBUG
127
- printDebugInfo(context, "canvas->restore()");
120
+ printDebugInfo("canvas->restore()");
128
121
  #endif
129
122
  _localContext->getCanvas()->restore();
130
123
  }
131
124
 
132
125
  #if SKIA_DOM_DEBUG
133
- printDebugInfo(context, "End Render");
126
+ printDebugInfo("End Render");
134
127
  #endif
135
128
  }
136
129
 
@@ -158,41 +151,19 @@ public:
158
151
 
159
152
  protected:
160
153
  /**
161
- Override to implement rendering where the current state of the drawing
162
- context is correctly set.
163
- */
164
- virtual void renderNode(DrawingContext *context) = 0;
165
-
166
- /**
167
- Removes a child
168
- */
169
- void removeChild(std::shared_ptr<JsiDomNode> child) override {
170
- JsiDomNode::removeChild(child);
171
- if (_localContext != nullptr) {
172
- _localContext->markAsChanged();
173
- }
174
- }
175
-
176
- /**
177
- Validates that only declaration nodes can be children
154
+ Invalidates and marks then context as changed.
178
155
  */
179
- void addChild(std::shared_ptr<JsiDomNode> child) override {
180
- JsiDomNode::addChild(child);
156
+ void invalidateContext() override {
181
157
  if (_localContext != nullptr) {
182
158
  _localContext->markAsChanged();
183
159
  }
184
160
  }
185
161
 
186
162
  /**
187
- Validates that only declaration nodes can be children
163
+ Override to implement rendering where the current state of the drawing
164
+ context is correctly set.
188
165
  */
189
- void insertChildBefore(std::shared_ptr<JsiDomNode> child,
190
- std::shared_ptr<JsiDomNode> before) override {
191
- JsiDomNode::insertChildBefore(child, before);
192
- if (_localContext != nullptr) {
193
- _localContext->markAsChanged();
194
- }
195
- }
166
+ virtual void renderNode(DrawingContext *context) = 0;
196
167
 
197
168
  /**
198
169
  Define common properties for all render nodes
@@ -200,20 +171,14 @@ protected:
200
171
  void defineProperties(NodePropsContainer *container) override {
201
172
  JsiDomNode::defineProperties(container);
202
173
 
203
- _paintProps = container->defineProperty(std::make_shared<PaintProps>());
204
-
205
- _matrixProp =
206
- container->defineProperty(std::make_shared<MatrixProp>(PropNameMatrix));
207
- _transformProp = container->defineProperty(
208
- std::make_shared<TransformProp>(PropNameTransform));
209
- _originProp =
210
- container->defineProperty(std::make_shared<PointProp>(PropNameOrigin));
211
- _clipProp =
212
- container->defineProperty(std::make_shared<ClipProp>(PropNameClip));
213
- _invertClip = container->defineProperty(
214
- std::make_shared<NodeProp>(PropNameInvertClip));
215
- _layerProp =
216
- container->defineProperty(std::make_shared<LayerProp>(PropNameLayer));
174
+ _paintProps = container->defineProperty<PaintProps>();
175
+
176
+ _matrixProp = container->defineProperty<MatrixProp>("matrix");
177
+ _transformProp = container->defineProperty<TransformProp>("transform");
178
+ _originProp = container->defineProperty<PointProp>("origin");
179
+ _clipProp = container->defineProperty<ClipProp>("clip");
180
+ _invertClip = container->defineProperty<NodeProp>("invertClip");
181
+ _layerProp = container->defineProperty<LayerProp>("layer");
217
182
  }
218
183
 
219
184
  private:
@@ -224,17 +189,17 @@ private:
224
189
  auto op = invert ? SkClipOp::kDifference : SkClipOp::kIntersect;
225
190
  if (_clipProp->getRect() != nullptr) {
226
191
  #if SKIA_DOM_DEBUG
227
- printDebugInfo(context, "canvas->clipRect()");
192
+ printDebugInfo("canvas->clipRect()");
228
193
  #endif
229
194
  canvas->clipRect(*_clipProp->getRect(), op, true);
230
195
  } else if (_clipProp->getRRect() != nullptr) {
231
196
  #if SKIA_DOM_DEBUG
232
- printDebugInfo(context, "canvas->clipRRect()");
197
+ printDebugInfo("canvas->clipRRect()");
233
198
  #endif
234
199
  canvas->clipRRect(*_clipProp->getRRect(), op, true);
235
200
  } else if (_clipProp->getPath() != nullptr) {
236
201
  #if SKIA_DOM_DEBUG
237
- printDebugInfo(context, "canvas->clipPath()");
202
+ printDebugInfo("canvas->clipPath()");
238
203
  #endif
239
204
  canvas->clipPath(*_clipProp->getPath(), op, true);
240
205
  }
@@ -19,7 +19,8 @@ public:
19
19
  /**
20
20
  Constructs a new optional dom node properrty
21
21
  */
22
- explicit NodeProp(PropId name) : _name(name), BaseNodeProp() {}
22
+ explicit NodeProp(const std::string &name)
23
+ : _name(JsiPropId::get(name)), BaseNodeProp() {}
23
24
 
24
25
  /**
25
26
  Reads JS value and swaps out with a new value
@@ -110,6 +110,16 @@ public:
110
110
  return prop.get();
111
111
  }
112
112
 
113
+ /**
114
+ Defines a property that will be updated with the container changes.
115
+ */
116
+ template <class _Tp, class... _Args,
117
+ class = std::_EnableIf<!std::is_array<_Tp>::value>>
118
+ _Tp *defineProperty(_Args &&...__args) {
119
+ return defineProperty(
120
+ std::make_shared<_Tp>(std::forward<_Args>(__args)...));
121
+ }
122
+
113
123
  private:
114
124
  std::vector<std::shared_ptr<BaseNodeProp>> _properties;
115
125
  std::map<PropId, std::vector<NodeProp *>> _mappedProperties;
@@ -41,19 +41,18 @@ protected:
41
41
  auto maybeImageFilter =
42
42
  std::dynamic_pointer_cast<JsiBaseImageFilterNode>(child);
43
43
 
44
- if (asShader) {
44
+ if (maybeShader) {
45
45
  sk_sp<SkShader> outer = maybeShader->getCurrent();
46
46
  if (innerShader != nullptr) {
47
- innerShader = SkShaders::Blend(blendMode, innerShader, outer);
47
+ innerShader = SkShaders::Blend(blendMode, outer, innerShader);
48
48
  } else {
49
49
  innerShader = outer;
50
50
  }
51
-
52
- } else {
51
+ } else if (maybeImageFilter) {
53
52
  sk_sp<SkImageFilter> outer = maybeImageFilter->getCurrent();
54
- if (innerImageFilter != nullptr) {
55
- innerImageFilter = SkImageFilters::Blend(
56
- blendMode, innerImageFilter, outer, nullptr);
53
+ if (outer != nullptr) {
54
+ innerImageFilter = SkImageFilters::Blend(blendMode, outer,
55
+ innerImageFilter, nullptr);
57
56
  } else {
58
57
  innerImageFilter = outer;
59
58
  }
@@ -71,8 +70,7 @@ protected:
71
70
 
72
71
  void defineProperties(NodePropsContainer *container) override {
73
72
  JsiBaseDomDeclarationNode::defineProperties(container);
74
- _blendProp = container->defineProperty(
75
- std::make_shared<BlendModeProp>(JsiPropId::get("mode")));
73
+ _blendProp = container->defineProperty<BlendModeProp>("mode");
76
74
  _blendProp->require();
77
75
  }
78
76
 
@@ -44,12 +44,9 @@ protected:
44
44
  void defineProperties(NodePropsContainer *container) override {
45
45
  JsiBaseDomDeclarationNode::defineProperties(container);
46
46
 
47
- _style = container->defineProperty(
48
- std::make_shared<NodeProp>(JsiPropId::get("style")));
49
- _respectCTM = container->defineProperty(
50
- std::make_shared<NodeProp>(JsiPropId::get("respectCTM")));
51
- _blur = container->defineProperty(
52
- std::make_shared<NodeProp>(JsiPropId::get("blur")));
47
+ _style = container->defineProperty<NodeProp>("style");
48
+ _respectCTM = container->defineProperty<NodeProp>("respectCTM");
49
+ _blur = container->defineProperty<NodeProp>("blur");
53
50
 
54
51
  _blur->require();
55
52
  }
@@ -76,10 +76,8 @@ protected:
76
76
 
77
77
  void defineProperties(NodePropsContainer *container) override {
78
78
  JsiDomRenderNode::defineProperties(container);
79
- _rrectProp = container->defineProperty(
80
- std::make_shared<RRectProp>(JsiPropId::get("box")));
81
- _rectProp = container->defineProperty(
82
- std::make_shared<RectProp>(JsiPropId::get("box")));
79
+ _rrectProp = container->defineProperty<RRectProp>("box");
80
+ _rectProp = container->defineProperty<RectProp>("box");
83
81
  }
84
82
 
85
83
  private:
@@ -22,8 +22,7 @@ protected:
22
22
 
23
23
  void defineProperties(NodePropsContainer *container) override {
24
24
  JsiBaseDomDeclarationNode::defineProperties(container);
25
- _boxShadowProps =
26
- container->defineProperty(std::make_shared<BoxShadowProps>());
25
+ _boxShadowProps = container->defineProperty<BoxShadowProps>();
27
26
  }
28
27
 
29
28
  private:
@@ -22,9 +22,8 @@ protected:
22
22
 
23
23
  void defineProperties(NodePropsContainer *container) override {
24
24
  JsiDomDrawingNode::defineProperties(container);
25
- _circleProp = container->defineProperty(std::make_shared<CircleProp>());
26
- _radiusProp =
27
- container->defineProperty(std::make_shared<NodeProp>(PropNameR));
25
+ _circleProp = container->defineProperty<CircleProp>();
26
+ _radiusProp = container->defineProperty<NodeProp>("r");
28
27
 
29
28
  _circleProp->require();
30
29
  _radiusProp->require();