@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
@@ -2,5 +2,4 @@ import type { SkCanvas, SkPaint } from "../../skia/types";
2
2
  export interface DrawingContext {
3
3
  canvas: SkCanvas;
4
4
  paint: SkPaint;
5
- opacity: number;
6
5
  }
@@ -6,7 +6,7 @@ export declare class Container {
6
6
  redraw: () => void;
7
7
  private _root;
8
8
  Sk: SkDOM;
9
- constructor(Skia: Skia, depMgr: DependencyManager, redraw: () => void);
9
+ constructor(Skia: Skia, depMgr: DependencyManager, redraw?: () => void);
10
10
  draw(ctx: DrawingContext): void;
11
11
  get root(): RenderNode<GroupProps>;
12
12
  }
@@ -1,10 +1,8 @@
1
1
  import type { RefObject } from "react";
2
2
  import type { DrawingInfo, SkiaView } from "../views";
3
- import type { SkCanvas, SkPaint, Skia, Vector } from "../skia/types";
4
- export interface DrawingContext extends Omit<DrawingInfo, "touches"> {
5
- canvas: SkCanvas;
6
- paint: SkPaint;
7
- opacity: number;
3
+ import type { Skia, Vector } from "../skia/types";
4
+ import type { DrawingContext as DOMDrawingContext } from "../dom/types";
5
+ export interface DrawingContext extends Omit<DrawingInfo, "touches">, DOMDrawingContext {
8
6
  center: Vector;
9
7
  ref: RefObject<SkiaView>;
10
8
  Skia: Skia;
@@ -1,4 +1,3 @@
1
1
  export * from "./components";
2
2
  export * from "./useContextBridge";
3
3
  export * from "./DependencyManager";
4
- export * from "./useCanvas";
@@ -22,6 +22,10 @@ export declare enum StrokeJoin {
22
22
  }
23
23
  export declare const isPaint: (obj: SkJSIInstance<string> | null) => obj is SkPaint;
24
24
  export interface SkPaint extends SkJSIInstance<"Paint"> {
25
+ /**
26
+ * Retrieves alpha from the color used when stroking and filling.
27
+ */
28
+ getAlphaf(): number;
25
29
  /**
26
30
  * Returns a copy of this paint.
27
31
  */
@@ -5,6 +5,7 @@ export declare class JsiSkPaint extends HostObject<Paint, "Paint"> implements Sk
5
5
  constructor(CanvasKit: CanvasKit, ref: Paint);
6
6
  copy(): JsiSkPaint;
7
7
  reset(): void;
8
+ getAlphaf(): number;
8
9
  getColor(): Float32Array;
9
10
  getStrokeCap(): number;
10
11
  getStrokeJoin(): number;
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "setup-skia-web": "./scripts/setup-canvaskit.js"
8
8
  },
9
9
  "title": "React Native Skia",
10
- "version": "0.1.162",
10
+ "version": "0.1.164",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "files": [
@@ -141,7 +141,7 @@ export abstract class JsiRenderNode<P extends GroupProps>
141
141
  opacity !== undefined ||
142
142
  antiAlias !== undefined
143
143
  ) {
144
- ctx = {};
144
+ ctx = { opacity: 1 };
145
145
  if (color !== undefined) {
146
146
  ctx.color = this.Skia.Color(color);
147
147
  }
@@ -208,24 +208,19 @@ export abstract class JsiRenderNode<P extends GroupProps>
208
208
  const { invertClip, layer, matrix, transform } = this.props;
209
209
  const { canvas } = parentCtx;
210
210
 
211
- const opacity =
212
- this.props.opacity !== undefined
213
- ? parentCtx.opacity * this.props.opacity
214
- : parentCtx.opacity;
215
-
216
211
  if (
217
212
  this.paintCache === null ||
218
213
  this.paintCache.parent !== parentCtx.paint
219
214
  ) {
220
215
  const paintCtx = this.getPaintCtx();
221
216
  const child = paintCtx
222
- ? concatPaint(parentCtx.paint, paintCtx, parentCtx.opacity)
217
+ ? concatPaint(parentCtx.paint.copy(), paintCtx)
223
218
  : parentCtx.paint;
224
219
  this.paintCache = { parent: parentCtx.paint, child };
225
220
  }
226
221
  const paint = this.paintCache.child;
227
222
  // TODO: can we only recreate a new context here if needed?
228
- const ctx = { ...parentCtx, opacity, paint };
223
+ const ctx = { ...parentCtx, paint };
229
224
  const hasTransform = matrix !== undefined || transform !== undefined;
230
225
  const hasClip =
231
226
  this.clipRect !== undefined ||
@@ -267,7 +262,7 @@ export abstract class JsiRenderNode<P extends GroupProps>
267
262
  }
268
263
 
269
264
  const concatPaint = (
270
- parent: SkPaint,
265
+ paint: SkPaint,
271
266
  {
272
267
  color,
273
268
  strokeWidth,
@@ -278,23 +273,21 @@ const concatPaint = (
278
273
  imageFilter,
279
274
  maskFilter,
280
275
  pathEffect,
281
- opacity: alpha,
276
+ opacity,
282
277
  strokeCap,
283
278
  strokeJoin,
284
279
  strokeMiter,
285
280
  style,
286
- }: PaintContext,
287
- opacity: number
281
+ }: PaintContext
288
282
  ) => {
289
- const paint = parent.copy();
283
+ if (opacity !== undefined) {
284
+ paint.setAlphaf(paint.getAlphaf() * opacity);
285
+ }
290
286
  if (color !== undefined) {
287
+ const currentOpacity = paint.getAlphaf();
291
288
  paint.setShader(null);
292
- color[3] *= opacity;
293
289
  paint.setColor(color);
294
- } else {
295
- const cl = paint.getColor();
296
- cl[3] = opacity;
297
- paint.setColor(cl);
290
+ paint.setAlphaf(currentOpacity * paint.getAlphaf());
298
291
  }
299
292
  if (strokeWidth !== undefined) {
300
293
  paint.setStrokeWidth(strokeWidth);
@@ -320,9 +313,6 @@ const concatPaint = (
320
313
  if (pathEffect !== undefined) {
321
314
  paint.setPathEffect(pathEffect);
322
315
  }
323
- if (alpha !== undefined) {
324
- paint.setAlphaf(alpha * opacity);
325
- }
326
316
  if (strokeCap !== undefined) {
327
317
  paint.setStrokeCap(strokeCap);
328
318
  }
@@ -1,7 +1,6 @@
1
1
  export * from "./Enum";
2
2
  export * from "./Path";
3
3
  export * from "./Fitting";
4
- export * from "./Color";
5
4
  export * from "./Rect";
6
5
  export * from "./Radius";
7
6
  export * from "./Circle";
@@ -5,7 +5,6 @@ import { DeclarationType, NodeType } from "../../types";
5
5
  import type { BoxShadowProps, BoxProps } from "../../types/Drawings";
6
6
  import type { NodeContext } from "../Node";
7
7
  import { JsiDeclarationNode } from "../Node";
8
- import { processColor } from "../datatypes";
9
8
  import { JsiRenderNode } from "../RenderNode";
10
9
 
11
10
  const inflate = (
@@ -54,8 +53,9 @@ export class BoxNode extends JsiRenderNode<BoxProps> {
54
53
  super(ctx, NodeType.Box, props);
55
54
  }
56
55
 
57
- renderNode({ canvas, paint, opacity }: DrawingContext) {
56
+ renderNode({ canvas, paint }: DrawingContext) {
58
57
  const { box: defaultBox } = this.props;
58
+ const opacity = paint.getAlphaf();
59
59
  const box = isRRect(defaultBox)
60
60
  ? defaultBox
61
61
  : this.Skia.RRectXY(defaultBox, 0, 0);
@@ -72,7 +72,8 @@ export class BoxNode extends JsiRenderNode<BoxProps> {
72
72
  .map((shadow) => {
73
73
  const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
74
74
  const lPaint = this.Skia.Paint();
75
- lPaint.setColor(processColor(this.Skia, color, opacity));
75
+ lPaint.setColor(this.Skia.Color(color));
76
+ lPaint.setAlphaf(paint.getAlphaf() * opacity);
76
77
  lPaint.setMaskFilter(
77
78
  this.Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
78
79
  );
@@ -92,7 +93,9 @@ export class BoxNode extends JsiRenderNode<BoxProps> {
92
93
  canvas.save();
93
94
  canvas.clipRRect(box, ClipOp.Intersect, false);
94
95
  const lPaint = this.Skia.Paint();
95
- lPaint.setColor(processColor(this.Skia, color, opacity));
96
+ lPaint.setColor(this.Skia.Color(color));
97
+ lPaint.setAlphaf(paint.getAlphaf() * opacity);
98
+
96
99
  lPaint.setMaskFilter(
97
100
  this.Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
98
101
  );
@@ -2,7 +2,7 @@ import type { SkColor, SkPoint } from "../../../skia/types";
2
2
  import { BlendMode } from "../../../skia/types";
3
3
  import type { DrawingContext, PatchProps } from "../../types";
4
4
  import { NodeType } from "../../types";
5
- import { ALPHA, enumKey, processColor } from "../datatypes";
5
+ import { enumKey } from "../datatypes";
6
6
  import { JsiDrawingNode } from "../DrawingNode";
7
7
  import type { NodeContext } from "../Node";
8
8
 
@@ -39,30 +39,16 @@ export class PatchNode extends JsiDrawingNode<
39
39
  patch[3].c2,
40
40
  patch[0].c1,
41
41
  ],
42
- colors: colors
43
- ? colors.map((c) => processColor(this.Skia, c, 1))
44
- : undefined,
42
+ colors: colors ? colors.map((c) => this.Skia.Color(c)) : undefined,
45
43
  };
46
44
  }
47
45
 
48
- draw({ canvas, paint, opacity }: DrawingContext) {
46
+ draw({ canvas, paint }: DrawingContext) {
49
47
  if (!this.derived) {
50
48
  throw new Error("PatchNode: derived props not set");
51
49
  }
52
50
  const { texture } = this.props;
53
51
  const { colors, points, mode } = this.derived;
54
- canvas.drawPatch(
55
- points,
56
- opacity === 1
57
- ? colors
58
- : colors &&
59
- colors.map((c) => {
60
- c[ALPHA] = c[ALPHA] * opacity;
61
- return c;
62
- }),
63
- texture,
64
- mode,
65
- paint
66
- );
52
+ canvas.drawPatch(points, colors, texture, mode, paint);
67
53
  }
68
54
  }
@@ -2,7 +2,7 @@ import type { SkVertices } from "../../../skia/types";
2
2
  import { VertexMode, BlendMode } from "../../../skia/types";
3
3
  import type { DrawingContext, VerticesProps } from "../../types";
4
4
  import { NodeType } from "../../types";
5
- import { enumKey, processColor } from "../datatypes";
5
+ import { enumKey } from "../datatypes";
6
6
  import { JsiDrawingNode } from "../DrawingNode";
7
7
  import type { NodeContext } from "../Node";
8
8
 
@@ -18,7 +18,7 @@ export class VerticesNode extends JsiDrawingNode<VerticesProps, SkVertices> {
18
18
  vertexMode,
19
19
  vertices,
20
20
  textures,
21
- colors ? colors.map((c) => processColor(this.Skia, c, 1)) : undefined,
21
+ colors ? colors.map((c) => this.Skia.Color(c)) : undefined,
22
22
  indices
23
23
  );
24
24
  }
@@ -8,7 +8,6 @@ import type {
8
8
  Node,
9
9
  } from "../../types";
10
10
  import { DeclarationType, NodeType } from "../../types";
11
- import { processColor } from "../datatypes";
12
11
  import { enumKey } from "../datatypes/Enum";
13
12
  import type { LerpColorFilterProps } from "../../types/ColorFilters";
14
13
 
@@ -71,7 +70,7 @@ export class BlendColorFilterNode extends ColorFilterDeclaration<BlendColorFilte
71
70
 
72
71
  materialize() {
73
72
  const { mode } = this.props;
74
- const color = processColor(this.Skia, this.props.color, 1);
73
+ const color = this.Skia.Color(this.props.color);
75
74
  const cf = this.Skia.ColorFilter.MakeBlend(color, BlendMode[enumKey(mode)]);
76
75
  return this.compose(cf);
77
76
  }
@@ -15,7 +15,7 @@ import type {
15
15
  RuntimeShaderImageFilterProps,
16
16
  } from "../../types";
17
17
  import { DeclarationType, NodeType } from "../../types";
18
- import { processRadius, enumKey, processColor } from "../datatypes";
18
+ import { processRadius, enumKey } from "../datatypes";
19
19
  import type { NodeContext } from "../Node";
20
20
  import { JsiDeclarationNode } from "../Node";
21
21
 
@@ -145,7 +145,7 @@ export class DropShadowImageFilterNode extends ImageFilterDeclaration<DropShadow
145
145
 
146
146
  materialize() {
147
147
  const { dx, dy, blur, shadowOnly, color: cl, inner } = this.props;
148
- const color = processColor(this.Skia, cl, 1);
148
+ const color = this.Skia.Color(cl);
149
149
  const input = this.getOptionalChildInstance(0);
150
150
  let factory;
151
151
  if (inner) {
@@ -19,7 +19,6 @@ import type {
19
19
  TwoPointConicalGradientProps,
20
20
  } from "../../types";
21
21
  import { DeclarationType, NodeType } from "../../types";
22
- import { processColor } from "../datatypes/Color";
23
22
  import {
24
23
  enumKey,
25
24
  fitRects,
@@ -99,7 +98,7 @@ export class ColorNode extends ShaderDeclaration<ColorProps> {
99
98
 
100
99
  materialize() {
101
100
  const { color } = this.props;
102
- return this.Skia.Shader.MakeColor(processColor(this.Skia, color, 1));
101
+ return this.Skia.Shader.MakeColor(this.Skia.Color(color));
103
102
  }
104
103
  }
105
104
 
@@ -3,5 +3,4 @@ import type { SkCanvas, SkPaint } from "../../skia/types";
3
3
  export interface DrawingContext {
4
4
  canvas: SkCanvas;
5
5
  paint: SkPaint;
6
- opacity: number;
7
6
  }
@@ -4,7 +4,6 @@ import React, {
4
4
  useMemo,
5
5
  forwardRef,
6
6
  useRef,
7
- useState,
8
7
  } from "react";
9
8
  import type {
10
9
  RefObject,
@@ -15,7 +14,6 @@ import type {
15
14
  } from "react";
16
15
  import type { OpaqueRoot } from "react-reconciler";
17
16
  import ReactReconciler from "react-reconciler";
18
- import { Platform } from "react-native";
19
17
 
20
18
  import { SkiaDomView } from "../views";
21
19
  import type { TouchHandler } from "../views";
@@ -26,7 +24,6 @@ import { debug as hostDebug, skHostConfig } from "./HostConfig";
26
24
  // import { debugTree } from "./nodes";
27
25
  import { Container } from "./Container";
28
26
  import { DependencyManager } from "./DependencyManager";
29
- import { CanvasProvider } from "./useCanvas";
30
27
 
31
28
  export const skiaReconciler = ReactReconciler(skHostConfig);
32
29
 
@@ -65,11 +62,8 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
65
62
  ) => {
66
63
  const innerRef = useCanvasRef();
67
64
  const ref = useCombinedRefs(forwardedRef, innerRef);
68
- const [, setTick] = useState(0);
69
65
  const redraw = useCallback(() => {
70
- Platform.OS === "web"
71
- ? setTick((tick) => tick + 1)
72
- : innerRef.current?.redraw();
66
+ innerRef.current?.redraw();
73
67
  }, [innerRef]);
74
68
 
75
69
  const registerValues = useCallback(
@@ -107,11 +101,7 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
107
101
 
108
102
  // Render effect
109
103
  useEffect(() => {
110
- render(
111
- <CanvasProvider value={{ Skia }}>{children}</CanvasProvider>,
112
- root,
113
- container
114
- );
104
+ render(children, root, container);
115
105
  }, [children, root, redraw, container]);
116
106
 
117
107
  useEffect(() => {
@@ -15,7 +15,7 @@ export class Container {
15
15
  constructor(
16
16
  Skia: Skia,
17
17
  public depMgr: DependencyManager,
18
- public redraw: () => void
18
+ public redraw: () => void = () => {}
19
19
  ) {
20
20
  this.Sk = new JsiSkDOM({ Skia, depMgr });
21
21
  this._root = this.Sk.Group();
@@ -1,12 +1,12 @@
1
1
  import type { RefObject } from "react";
2
2
 
3
3
  import type { DrawingInfo, SkiaView } from "../views";
4
- import type { SkCanvas, SkPaint, Skia, Vector } from "../skia/types";
4
+ import type { Skia, Vector } from "../skia/types";
5
+ import type { DrawingContext as DOMDrawingContext } from "../dom/types";
5
6
 
6
- export interface DrawingContext extends Omit<DrawingInfo, "touches"> {
7
- canvas: SkCanvas;
8
- paint: SkPaint;
9
- opacity: number;
7
+ export interface DrawingContext
8
+ extends Omit<DrawingInfo, "touches">,
9
+ DOMDrawingContext {
10
10
  center: Vector;
11
11
  ref: RefObject<SkiaView>;
12
12
  Skia: Skia;
@@ -1,10 +1,9 @@
1
1
  import type { ReactNode } from "react";
2
- import React, { useMemo } from "react";
3
-
4
- import { BlendMode } from "../../skia/types";
5
- import { useSkiaPrivate } from "../useCanvas";
2
+ import React from "react";
6
3
 
7
4
  import { Group } from "./Group";
5
+ import { LumaColorFilter } from "./colorFilters/LumaColorFilter";
6
+ import { Paint } from "./Paint";
8
7
 
9
8
  interface MaskProps {
10
9
  mode: "luminance" | "alpha";
@@ -14,25 +13,17 @@ interface MaskProps {
14
13
  }
15
14
 
16
15
  export const Mask = ({ children, mask, mode, clip }: MaskProps) => {
17
- const Skia = useSkiaPrivate();
18
- const maskPaint = useMemo(() => {
19
- const paint = Skia.Paint();
20
- paint.setBlendMode(BlendMode.Src);
21
- if (mode === "luminance") {
22
- paint.setColorFilter(Skia.ColorFilter.MakeLumaColorFilter());
23
- }
24
- return paint;
25
- }, [Skia, mode]);
26
- const clippingPaint = useMemo(() => {
27
- const paint = Skia.Paint();
28
- paint.setBlendMode(BlendMode.DstIn);
29
- return paint;
30
- }, [Skia]);
31
16
  return (
32
17
  <Group layer>
33
- <Group layer={maskPaint}>
18
+ <Group
19
+ layer={
20
+ <Paint blendMode="src">
21
+ {mode === "luminance" && <LumaColorFilter />}
22
+ </Paint>
23
+ }
24
+ >
34
25
  {mask}
35
- {clip && <Group layer={clippingPaint}>{children}</Group>}
26
+ {clip && <Group layer={<Paint blendMode="dstIn" />}>{children}</Group>}
36
27
  </Group>
37
28
  <Group blendMode="srcIn">{children}</Group>
38
29
  </Group>
@@ -1,4 +1,3 @@
1
1
  export * from "./components";
2
2
  export * from "./useContextBridge";
3
3
  export * from "./DependencyManager";
4
- export * from "./useCanvas";
@@ -29,6 +29,11 @@ export const isPaint = (obj: SkJSIInstance<string> | null): obj is SkPaint =>
29
29
  obj !== null && obj.__typename__ === "Paint";
30
30
 
31
31
  export interface SkPaint extends SkJSIInstance<"Paint"> {
32
+ /**
33
+ * Retrieves alpha from the color used when stroking and filling.
34
+ */
35
+ getAlphaf(): number;
36
+
32
37
  /**
33
38
  * Returns a copy of this paint.
34
39
  */
@@ -34,6 +34,10 @@ export class JsiSkPaint extends HostObject<Paint, "Paint"> implements SkPaint {
34
34
  this.ref = new this.CanvasKit.Paint();
35
35
  }
36
36
 
37
+ getAlphaf() {
38
+ return this.getColor()[3];
39
+ }
40
+
37
41
  getColor() {
38
42
  return this.ref.getColor();
39
43
  }
@@ -1,5 +1,5 @@
1
1
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
- // @ts-expect-error
2
+ // @ts-ignore
3
3
  import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit";
4
4
  import type {
5
5
  CanvasKit as CanvasKitType,
@@ -1,27 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.rgbaColor = exports.processColor = exports.RED = exports.GREEN = exports.BLUE = exports.ALPHA = void 0;
7
- const RED = 0;
8
- exports.RED = RED;
9
- const GREEN = 1;
10
- exports.GREEN = GREEN;
11
- const BLUE = 2;
12
- exports.BLUE = BLUE;
13
- const ALPHA = 3;
14
- exports.ALPHA = ALPHA;
15
-
16
- const rgbaColor = (r, g, b, a) => new Float32Array([r, g, b, a]);
17
-
18
- exports.rgbaColor = rgbaColor;
19
-
20
- const processColor = (Skia, cl, currentOpacity) => {
21
- const color = Skia.Color(cl);
22
- color[ALPHA] *= currentOpacity;
23
- return color;
24
- };
25
-
26
- exports.processColor = processColor;
27
- //# sourceMappingURL=Color.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["RED","GREEN","BLUE","ALPHA","rgbaColor","r","g","b","a","Float32Array","processColor","Skia","cl","currentOpacity","color","Color"],"sources":["Color.ts"],"sourcesContent":["import type { Color, Skia } from \"../../../skia/types\";\n\nexport const RED = 0;\nexport const GREEN = 1;\nexport const BLUE = 2;\nexport const ALPHA = 3;\n\nexport const rgbaColor = (r: number, g: number, b: number, a: number) =>\n new Float32Array([r, g, b, a]);\n\nexport const processColor = (Skia: Skia, cl: Color, currentOpacity: number) => {\n const color = Skia.Color(cl);\n color[ALPHA] *= currentOpacity;\n return color;\n};\n"],"mappings":";;;;;;AAEO,MAAMA,GAAG,GAAG,CAAZ;;AACA,MAAMC,KAAK,GAAG,CAAd;;AACA,MAAMC,IAAI,GAAG,CAAb;;AACA,MAAMC,KAAK,GAAG,CAAd;;;AAEA,MAAMC,SAAS,GAAG,CAACC,CAAD,EAAYC,CAAZ,EAAuBC,CAAvB,EAAkCC,CAAlC,KACvB,IAAIC,YAAJ,CAAiB,CAACJ,CAAD,EAAIC,CAAJ,EAAOC,CAAP,EAAUC,CAAV,CAAjB,CADK;;;;AAGA,MAAME,YAAY,GAAG,CAACC,IAAD,EAAaC,EAAb,EAAwBC,cAAxB,KAAmD;EAC7E,MAAMC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAWH,EAAX,CAAd;EACAE,KAAK,CAACX,KAAD,CAAL,IAAgBU,cAAhB;EACA,OAAOC,KAAP;AACD,CAJM"}
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useSkiaPrivate = exports.CanvasProvider = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
11
-
12
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
-
14
- const CanvasContext = /*#__PURE__*/_react.default.createContext(null);
15
-
16
- const CanvasProvider = CanvasContext.Provider; // This private function will be removed once we remove the useCanvas hook and
17
- // implement the Mask component as a node (will be faster too)
18
-
19
- exports.CanvasProvider = CanvasProvider;
20
-
21
- const useSkiaPrivate = () => {
22
- const ctx = (0, _react.useContext)(CanvasContext);
23
-
24
- if (!ctx) {
25
- throw new Error("Skia Canvas context is not available");
26
- }
27
-
28
- return ctx.Skia;
29
- };
30
-
31
- exports.useSkiaPrivate = useSkiaPrivate;
32
- //# sourceMappingURL=useCanvas.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["CanvasContext","React","createContext","CanvasProvider","Provider","useSkiaPrivate","ctx","useContext","Error","Skia"],"sources":["useCanvas.ts"],"sourcesContent":["import React, { useContext } from \"react\";\n\nimport type { Skia } from \"../skia/types\";\n\ninterface CanvasContext {\n Skia: Skia;\n}\n\nconst CanvasContext = React.createContext<CanvasContext | null>(null);\n\nexport const CanvasProvider = CanvasContext.Provider;\n\n// This private function will be removed once we remove the useCanvas hook and\n// implement the Mask component as a node (will be faster too)\nexport const useSkiaPrivate = () => {\n const ctx = useContext(CanvasContext);\n if (!ctx) {\n throw new Error(\"Skia Canvas context is not available\");\n }\n return ctx.Skia;\n};\n"],"mappings":";;;;;;;AAAA;;;;;;AAQA,MAAMA,aAAa,gBAAGC,cAAA,CAAMC,aAAN,CAA0C,IAA1C,CAAtB;;AAEO,MAAMC,cAAc,GAAGH,aAAa,CAACI,QAArC,C,CAEP;AACA;;;;AACO,MAAMC,cAAc,GAAG,MAAM;EAClC,MAAMC,GAAG,GAAG,IAAAC,iBAAA,EAAWP,aAAX,CAAZ;;EACA,IAAI,CAACM,GAAL,EAAU;IACR,MAAM,IAAIE,KAAJ,CAAU,sCAAV,CAAN;EACD;;EACD,OAAOF,GAAG,CAACG,IAAX;AACD,CANM"}
@@ -1,11 +0,0 @@
1
- export const RED = 0;
2
- export const GREEN = 1;
3
- export const BLUE = 2;
4
- export const ALPHA = 3;
5
- export const rgbaColor = (r, g, b, a) => new Float32Array([r, g, b, a]);
6
- export const processColor = (Skia, cl, currentOpacity) => {
7
- const color = Skia.Color(cl);
8
- color[ALPHA] *= currentOpacity;
9
- return color;
10
- };
11
- //# sourceMappingURL=Color.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["RED","GREEN","BLUE","ALPHA","rgbaColor","r","g","b","a","Float32Array","processColor","Skia","cl","currentOpacity","color","Color"],"sources":["Color.ts"],"sourcesContent":["import type { Color, Skia } from \"../../../skia/types\";\n\nexport const RED = 0;\nexport const GREEN = 1;\nexport const BLUE = 2;\nexport const ALPHA = 3;\n\nexport const rgbaColor = (r: number, g: number, b: number, a: number) =>\n new Float32Array([r, g, b, a]);\n\nexport const processColor = (Skia: Skia, cl: Color, currentOpacity: number) => {\n const color = Skia.Color(cl);\n color[ALPHA] *= currentOpacity;\n return color;\n};\n"],"mappings":"AAEA,OAAO,MAAMA,GAAG,GAAG,CAAZ;AACP,OAAO,MAAMC,KAAK,GAAG,CAAd;AACP,OAAO,MAAMC,IAAI,GAAG,CAAb;AACP,OAAO,MAAMC,KAAK,GAAG,CAAd;AAEP,OAAO,MAAMC,SAAS,GAAG,CAACC,CAAD,EAAYC,CAAZ,EAAuBC,CAAvB,EAAkCC,CAAlC,KACvB,IAAIC,YAAJ,CAAiB,CAACJ,CAAD,EAAIC,CAAJ,EAAOC,CAAP,EAAUC,CAAV,CAAjB,CADK;AAGP,OAAO,MAAME,YAAY,GAAG,CAACC,IAAD,EAAaC,EAAb,EAAwBC,cAAxB,KAAmD;EAC7E,MAAMC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAWH,EAAX,CAAd;EACAE,KAAK,CAACX,KAAD,CAAL,IAAgBU,cAAhB;EACA,OAAOC,KAAP;AACD,CAJM"}
@@ -1,15 +0,0 @@
1
- import React, { useContext } from "react";
2
- const CanvasContext = /*#__PURE__*/React.createContext(null);
3
- export const CanvasProvider = CanvasContext.Provider; // This private function will be removed once we remove the useCanvas hook and
4
- // implement the Mask component as a node (will be faster too)
5
-
6
- export const useSkiaPrivate = () => {
7
- const ctx = useContext(CanvasContext);
8
-
9
- if (!ctx) {
10
- throw new Error("Skia Canvas context is not available");
11
- }
12
-
13
- return ctx.Skia;
14
- };
15
- //# sourceMappingURL=useCanvas.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","useContext","CanvasContext","createContext","CanvasProvider","Provider","useSkiaPrivate","ctx","Error","Skia"],"sources":["useCanvas.ts"],"sourcesContent":["import React, { useContext } from \"react\";\n\nimport type { Skia } from \"../skia/types\";\n\ninterface CanvasContext {\n Skia: Skia;\n}\n\nconst CanvasContext = React.createContext<CanvasContext | null>(null);\n\nexport const CanvasProvider = CanvasContext.Provider;\n\n// This private function will be removed once we remove the useCanvas hook and\n// implement the Mask component as a node (will be faster too)\nexport const useSkiaPrivate = () => {\n const ctx = useContext(CanvasContext);\n if (!ctx) {\n throw new Error(\"Skia Canvas context is not available\");\n }\n return ctx.Skia;\n};\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,UAAhB,QAAkC,OAAlC;AAQA,MAAMC,aAAa,gBAAGF,KAAK,CAACG,aAAN,CAA0C,IAA1C,CAAtB;AAEA,OAAO,MAAMC,cAAc,GAAGF,aAAa,CAACG,QAArC,C,CAEP;AACA;;AACA,OAAO,MAAMC,cAAc,GAAG,MAAM;EAClC,MAAMC,GAAG,GAAGN,UAAU,CAACC,aAAD,CAAtB;;EACA,IAAI,CAACK,GAAL,EAAU;IACR,MAAM,IAAIC,KAAJ,CAAU,sCAAV,CAAN;EACD;;EACD,OAAOD,GAAG,CAACE,IAAX;AACD,CANM"}
@@ -1,7 +0,0 @@
1
- import type { Color, Skia } from "../../../skia/types";
2
- export declare const RED = 0;
3
- export declare const GREEN = 1;
4
- export declare const BLUE = 2;
5
- export declare const ALPHA = 3;
6
- export declare const rgbaColor: (r: number, g: number, b: number, a: number) => Float32Array;
7
- export declare const processColor: (Skia: Skia, cl: Color, currentOpacity: number) => Float32Array;
@@ -1,9 +0,0 @@
1
- import React from "react";
2
- import type { Skia } from "../skia/types";
3
- interface CanvasContext {
4
- Skia: Skia;
5
- }
6
- declare const CanvasContext: React.Context<CanvasContext | null>;
7
- export declare const CanvasProvider: React.Provider<CanvasContext | null>;
8
- export declare const useSkiaPrivate: () => Skia;
9
- export {};
@@ -1,15 +0,0 @@
1
- import type { Color, Skia } from "../../../skia/types";
2
-
3
- export const RED = 0;
4
- export const GREEN = 1;
5
- export const BLUE = 2;
6
- export const ALPHA = 3;
7
-
8
- export const rgbaColor = (r: number, g: number, b: number, a: number) =>
9
- new Float32Array([r, g, b, a]);
10
-
11
- export const processColor = (Skia: Skia, cl: Color, currentOpacity: number) => {
12
- const color = Skia.Color(cl);
13
- color[ALPHA] *= currentOpacity;
14
- return color;
15
- };