@shopify/react-native-skia 0.1.162 → 0.1.164

Sign up to get free protection for your applications and to get access to all the features.
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();