@shopify/react-native-skia 2.4.2 → 2.4.4

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 (52) hide show
  1. package/android/CMakeLists.txt +21 -21
  2. package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +30 -7
  3. package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureViewManager.java +3 -3
  4. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerDelegate.java +2 -2
  5. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerInterface.java +1 -1
  6. package/apple/RNSkMetalCanvasProvider.mm +1 -1
  7. package/lib/commonjs/renderer/Canvas.d.ts +2 -2
  8. package/lib/commonjs/renderer/Canvas.js +19 -7
  9. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  10. package/lib/commonjs/sksg/Recorder/Player.js +0 -1
  11. package/lib/commonjs/sksg/Recorder/Player.js.map +1 -1
  12. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +1 -1
  13. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  14. package/lib/commonjs/views/SkiaPictureView.d.ts +1 -1
  15. package/lib/commonjs/views/SkiaPictureView.js +2 -2
  16. package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
  17. package/lib/commonjs/views/SkiaPictureView.web.d.ts +2 -0
  18. package/lib/commonjs/views/SkiaPictureView.web.js +40 -4
  19. package/lib/commonjs/views/SkiaPictureView.web.js.map +1 -1
  20. package/lib/commonjs/views/types.d.ts +1 -0
  21. package/lib/commonjs/views/types.js.map +1 -1
  22. package/lib/module/renderer/Canvas.d.ts +2 -2
  23. package/lib/module/renderer/Canvas.js +19 -7
  24. package/lib/module/renderer/Canvas.js.map +1 -1
  25. package/lib/module/sksg/Recorder/Player.js +0 -1
  26. package/lib/module/sksg/Recorder/Player.js.map +1 -1
  27. package/lib/module/specs/SkiaPictureViewNativeComponent.d.ts +1 -1
  28. package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  29. package/lib/module/views/SkiaPictureView.d.ts +1 -1
  30. package/lib/module/views/SkiaPictureView.js +2 -2
  31. package/lib/module/views/SkiaPictureView.js.map +1 -1
  32. package/lib/module/views/SkiaPictureView.web.d.ts +2 -0
  33. package/lib/module/views/SkiaPictureView.web.js +40 -4
  34. package/lib/module/views/SkiaPictureView.web.js.map +1 -1
  35. package/lib/module/views/types.d.ts +1 -0
  36. package/lib/module/views/types.js.map +1 -1
  37. package/lib/typescript/lib/commonjs/renderer/Canvas.d.ts +2 -2
  38. package/lib/typescript/lib/module/renderer/Canvas.d.ts +2 -2
  39. package/lib/typescript/src/renderer/Canvas.d.ts +2 -2
  40. package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +1 -1
  41. package/lib/typescript/src/views/SkiaPictureView.d.ts +1 -1
  42. package/lib/typescript/src/views/SkiaPictureView.web.d.ts +2 -0
  43. package/lib/typescript/src/views/types.d.ts +1 -0
  44. package/package.json +1 -1
  45. package/react-native-skia.podspec +17 -35
  46. package/scripts/install-skia.mjs +19 -0
  47. package/src/renderer/Canvas.tsx +14 -4
  48. package/src/sksg/Recorder/Player.ts +0 -1
  49. package/src/specs/SkiaPictureViewNativeComponent.ts +1 -1
  50. package/src/views/SkiaPictureView.tsx +3 -3
  51. package/src/views/SkiaPictureView.web.tsx +80 -2
  52. package/src/views/types.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"names":["React","useRef","useEffect","useCallback","useImperativeHandle","forwardRef","JsiSkSurface","Platform","SkiaViewNativeId","dp2Pixel","pd","rect","undefined","x","y","width","height","WebGLRenderer","constructor","canvas","_defineProperty","onResize","makeImageSnapshot","picture","surface","getCanvas","clear","CanvasKit","TRANSPARENT","draw","ref","flush","clientWidth","clientHeight","MakeWebGLCanvasSurface","ctx","getContext","drawingBufferColorSpace","Error","Float32Array","of","save","scale","drawPicture","restore","dispose","_this$canvas","getExtension","loseContext","delete","StaticWebGLRenderer","cachedImage","renderPictureToSurface","tempCanvas","OffscreenCanvas","webglSurface","skiaCanvas","error","cleanupWebGLContext","renderResult","ctx2d","drawImage","console","_this$cachedImage","PixelRatio","SkiaPictureView","props","canvasRef","renderer","redrawRequestsRef","requestIdRef","pictureRef","onLayout","redraw","current","getSize","_canvasRef$current","_canvasRef$current2","setPicture","newPicture","tick","requestAnimationFrame","onLayoutEvent","evt","__destroyWebGLContextAfterRender","_props$nativeID","nativeID","global","SkiaViewApi","registerView","cancelAnimationFrame","debug","viewProps","createElement","View","_extends","style","display","flex"],"sources":["SkiaPictureView.web.tsx"],"sourcesContent":["/* global HTMLCanvasElement */\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport type { LayoutChangeEvent } from \"react-native\";\n\nimport type { SkRect, SkPicture, SkImage } from \"../skia/types\";\nimport { JsiSkSurface } from \"../skia/web/JsiSkSurface\";\nimport { Platform } from \"../Platform\";\nimport type { ISkiaViewApiWeb } from \"../specs/NativeSkiaModule.web\";\n\nimport type { SkiaPictureViewNativeProps } from \"./types\";\nimport { SkiaViewNativeId } from \"./SkiaViewNativeId\";\n\nconst dp2Pixel = (pd: number, rect?: SkRect) => {\n if (!rect) {\n return undefined;\n }\n return {\n x: rect.x * pd,\n y: rect.y * pd,\n width: rect.width * pd,\n height: rect.height * pd,\n };\n};\n\ninterface Renderer {\n onResize(): void;\n draw(picture: SkPicture): void;\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null;\n dispose(): void;\n}\n\nclass WebGLRenderer implements Renderer {\n private surface: JsiSkSurface | null = null;\n\n constructor(\n private canvas: HTMLCanvasElement,\n private pd: number\n ) {\n this.onResize();\n }\n\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null {\n if (!this.surface) {\n return null;\n }\n const canvas = this.surface.getCanvas();\n canvas!.clear(CanvasKit.TRANSPARENT);\n this.draw(picture);\n this.surface.ref.flush();\n return this.surface.makeImageSnapshot(dp2Pixel(this.pd, rect));\n }\n\n onResize() {\n const { canvas, pd } = this;\n canvas.width = canvas.clientWidth * pd;\n canvas.height = canvas.clientHeight * pd;\n const surface = CanvasKit.MakeWebGLCanvasSurface(canvas);\n const ctx = canvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n if (!surface) {\n throw new Error(\"Could not create surface\");\n }\n this.surface = new JsiSkSurface(CanvasKit, surface);\n }\n\n draw(picture: SkPicture) {\n if (this.surface) {\n const canvas = this.surface.getCanvas();\n canvas.clear(Float32Array.of(0, 0, 0, 0));\n canvas.save();\n canvas.scale(pd, pd);\n canvas.drawPicture(picture);\n canvas.restore();\n this.surface.ref.flush();\n }\n }\n\n dispose(): void {\n if (this.surface) {\n this.canvas\n ?.getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n this.surface.ref.delete();\n this.surface = null;\n }\n }\n}\n\nclass StaticWebGLRenderer implements Renderer {\n private cachedImage: SkImage | null = null;\n\n constructor(\n private canvas: HTMLCanvasElement,\n private pd: number\n ) {}\n\n onResize(): void {\n this.cachedImage = null;\n }\n\n private renderPictureToSurface(\n picture: SkPicture\n ): { surface: JsiSkSurface; tempCanvas: OffscreenCanvas } | null {\n const tempCanvas = new OffscreenCanvas(\n this.canvas.clientWidth * this.pd,\n this.canvas.clientHeight * this.pd\n );\n\n let surface: JsiSkSurface | null = null;\n\n try {\n const webglSurface = CanvasKit.MakeWebGLCanvasSurface(tempCanvas);\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n\n if (!webglSurface) {\n throw new Error(\"Could not create WebGL surface\");\n }\n\n surface = new JsiSkSurface(CanvasKit, webglSurface);\n\n const skiaCanvas = surface.getCanvas();\n skiaCanvas.clear(Float32Array.of(0, 0, 0, 0));\n skiaCanvas.save();\n skiaCanvas.scale(this.pd, this.pd);\n skiaCanvas.drawPicture(picture);\n skiaCanvas.restore();\n surface.ref.flush();\n\n return { surface, tempCanvas };\n } catch (error) {\n if (surface) {\n surface.ref.delete();\n }\n this.cleanupWebGLContext(tempCanvas);\n return null;\n }\n }\n\n private cleanupWebGLContext(tempCanvas: OffscreenCanvas): void {\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n const loseContext = ctx.getExtension(\"WEBGL_lose_context\");\n if (loseContext) {\n loseContext.loseContext();\n }\n }\n }\n\n draw(picture: SkPicture): void {\n const renderResult = this.renderPictureToSurface(picture);\n if (!renderResult) {\n return;\n }\n const { tempCanvas } = renderResult;\n const ctx2d = this.canvas.getContext(\"2d\");\n if (!ctx2d) {\n throw new Error(\"Could not get 2D context\");\n }\n\n // Set canvas dimensions to match pixel density\n this.canvas.width = this.canvas.clientWidth * this.pd;\n this.canvas.height = this.canvas.clientHeight * this.pd;\n\n // Draw the tempCanvas scaled down to the display size\n ctx2d.drawImage(\n tempCanvas,\n 0,\n 0,\n tempCanvas.width,\n tempCanvas.height,\n 0,\n 0,\n this.canvas.clientWidth * this.pd,\n this.canvas.clientHeight * this.pd\n );\n\n this.cleanupWebGLContext(tempCanvas);\n }\n\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null {\n if (!this.cachedImage) {\n const renderResult = this.renderPictureToSurface(picture);\n if (!renderResult) {\n return null;\n }\n\n const { surface, tempCanvas } = renderResult;\n\n try {\n this.cachedImage = surface.makeImageSnapshot(dp2Pixel(this.pd, rect));\n } catch (error) {\n console.error(\"Error creating image snapshot:\", error);\n } finally {\n surface.ref.delete();\n this.cleanupWebGLContext(tempCanvas);\n }\n }\n\n return this.cachedImage;\n }\n\n dispose(): void {\n this.cachedImage?.dispose();\n this.cachedImage = null;\n }\n}\n\nconst pd = Platform.PixelRatio;\n\nexport interface SkiaPictureViewHandle {\n setPicture(picture: SkPicture): void;\n getSize(): { width: number; height: number };\n redraw(): void;\n makeImageSnapshot(rect?: SkRect): SkImage | null;\n}\n\nexport const SkiaPictureView = forwardRef<\n SkiaPictureViewHandle,\n SkiaPictureViewNativeProps\n>((props, ref) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const renderer = useRef<Renderer | null>(null);\n const redrawRequestsRef = useRef(0);\n const requestIdRef = useRef(0);\n const pictureRef = useRef<SkPicture | null>(null);\n\n const { picture, onLayout } = props;\n\n const redraw = useCallback(() => {\n redrawRequestsRef.current++;\n }, []);\n\n const getSize = useCallback(() => {\n return {\n width: canvasRef.current?.clientWidth || 0,\n height: canvasRef.current?.clientHeight || 0,\n };\n }, []);\n\n const setPicture = useCallback(\n (newPicture: SkPicture) => {\n pictureRef.current = newPicture;\n redraw();\n },\n [redraw]\n );\n\n const makeImageSnapshot = useCallback((rect?: SkRect) => {\n if (renderer.current && pictureRef.current) {\n return renderer.current.makeImageSnapshot(pictureRef.current, rect);\n }\n return null;\n }, []);\n\n const tick = useCallback(() => {\n if (redrawRequestsRef.current > 0) {\n redrawRequestsRef.current = 0;\n if (renderer.current && pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }\n requestIdRef.current = requestAnimationFrame(tick);\n }, []);\n\n const onLayoutEvent = useCallback(\n (evt: LayoutChangeEvent) => {\n const canvas = canvasRef.current;\n if (canvas) {\n renderer.current =\n props.__destroyWebGLContextAfterRender === true\n ? new StaticWebGLRenderer(canvas, pd)\n : new WebGLRenderer(canvas, pd);\n if (pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }\n if (onLayout) {\n onLayout(evt);\n }\n },\n [onLayout, props.__destroyWebGLContextAfterRender]\n );\n\n useImperativeHandle(\n ref,\n () => ({\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n }),\n [setPicture, getSize, redraw, makeImageSnapshot]\n );\n\n useEffect(() => {\n const nativeID = props.nativeID ?? `${SkiaViewNativeId.current++}`;\n (global.SkiaViewApi as ISkiaViewApiWeb).registerView(nativeID, {\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n } as SkiaPictureViewHandle);\n }, [setPicture, getSize, redraw, makeImageSnapshot, props.nativeID]);\n\n useEffect(() => {\n if (props.picture) {\n setPicture(props.picture);\n }\n }, [setPicture, props.picture]);\n\n useEffect(() => {\n tick();\n return () => {\n cancelAnimationFrame(requestIdRef.current);\n if (renderer.current) {\n renderer.current.dispose();\n renderer.current = null;\n }\n };\n }, [tick]);\n\n useEffect(() => {\n if (renderer.current && pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }, [picture, redraw]);\n\n const { debug = false, ...viewProps } = props;\n return (\n <Platform.View {...viewProps} onLayout={onLayoutEvent}>\n <canvas ref={canvasRef} style={{ display: \"flex\", flex: 1 }} />\n </Platform.View>\n );\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useRef","useEffect","useCallback","useImperativeHandle","forwardRef","JsiSkSurface","Platform","SkiaViewNativeId","dp2Pixel","pd","rect","undefined","x","y","width","height","WebGLRenderer","constructor","canvas","_defineProperty","onResize","makeImageSnapshot","picture","surface","getCanvas","clear","CanvasKit","TRANSPARENT","draw","ref","flush","clientWidth","clientHeight","MakeWebGLCanvasSurface","ctx","getContext","drawingBufferColorSpace","Error","Float32Array","of","save","scale","drawPicture","restore","dispose","_this$canvas","getExtension","loseContext","delete","StaticWebGLRenderer","cachedImage","renderPictureToSurface","tempCanvas","OffscreenCanvas","webglSurface","skiaCanvas","error","cleanupWebGLContext","renderResult","ctx2d","drawImage","console","_this$cachedImage","PixelRatio","SkiaPictureView","props","canvasRef","renderer","redrawRequestsRef","requestIdRef","pictureRef","onLayout","redraw","current","getSize","_canvasRef$current","_canvasRef$current2","setPicture","newPicture","measure","callback","getBoundingClientRect","parentElement","offsetParent","parentRect","left","top","pageX","window","scrollX","pageY","scrollY","measureInWindow","tick","requestAnimationFrame","onLayoutEvent","evt","__destroyWebGLContextAfterRender","_props$nativeID","nativeID","global","SkiaViewApi","registerView","cancelAnimationFrame","debug","viewProps","createElement","View","_extends","style","display","flex"],"sources":["SkiaPictureView.web.tsx"],"sourcesContent":["/* global HTMLCanvasElement */\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport type { LayoutChangeEvent } from \"react-native\";\n\nimport type { SkRect, SkPicture, SkImage } from \"../skia/types\";\nimport { JsiSkSurface } from \"../skia/web/JsiSkSurface\";\nimport { Platform } from \"../Platform\";\nimport type { ISkiaViewApiWeb } from \"../specs/NativeSkiaModule.web\";\n\nimport type { SkiaPictureViewNativeProps } from \"./types\";\nimport { SkiaViewNativeId } from \"./SkiaViewNativeId\";\n\nconst dp2Pixel = (pd: number, rect?: SkRect) => {\n if (!rect) {\n return undefined;\n }\n return {\n x: rect.x * pd,\n y: rect.y * pd,\n width: rect.width * pd,\n height: rect.height * pd,\n };\n};\n\ninterface Renderer {\n onResize(): void;\n draw(picture: SkPicture): void;\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null;\n dispose(): void;\n}\n\nclass WebGLRenderer implements Renderer {\n private surface: JsiSkSurface | null = null;\n\n constructor(\n private canvas: HTMLCanvasElement,\n private pd: number\n ) {\n this.onResize();\n }\n\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null {\n if (!this.surface) {\n return null;\n }\n const canvas = this.surface.getCanvas();\n canvas!.clear(CanvasKit.TRANSPARENT);\n this.draw(picture);\n this.surface.ref.flush();\n return this.surface.makeImageSnapshot(dp2Pixel(this.pd, rect));\n }\n\n onResize() {\n const { canvas, pd } = this;\n canvas.width = canvas.clientWidth * pd;\n canvas.height = canvas.clientHeight * pd;\n const surface = CanvasKit.MakeWebGLCanvasSurface(canvas);\n const ctx = canvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n if (!surface) {\n throw new Error(\"Could not create surface\");\n }\n this.surface = new JsiSkSurface(CanvasKit, surface);\n }\n\n draw(picture: SkPicture) {\n if (this.surface) {\n const canvas = this.surface.getCanvas();\n canvas.clear(Float32Array.of(0, 0, 0, 0));\n canvas.save();\n canvas.scale(pd, pd);\n canvas.drawPicture(picture);\n canvas.restore();\n this.surface.ref.flush();\n }\n }\n\n dispose(): void {\n if (this.surface) {\n this.canvas\n ?.getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n this.surface.ref.delete();\n this.surface = null;\n }\n }\n}\n\nclass StaticWebGLRenderer implements Renderer {\n private cachedImage: SkImage | null = null;\n\n constructor(\n private canvas: HTMLCanvasElement,\n private pd: number\n ) {}\n\n onResize(): void {\n this.cachedImage = null;\n }\n\n private renderPictureToSurface(\n picture: SkPicture\n ): { surface: JsiSkSurface; tempCanvas: OffscreenCanvas } | null {\n const tempCanvas = new OffscreenCanvas(\n this.canvas.clientWidth * this.pd,\n this.canvas.clientHeight * this.pd\n );\n\n let surface: JsiSkSurface | null = null;\n\n try {\n const webglSurface = CanvasKit.MakeWebGLCanvasSurface(tempCanvas);\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n\n if (!webglSurface) {\n throw new Error(\"Could not create WebGL surface\");\n }\n\n surface = new JsiSkSurface(CanvasKit, webglSurface);\n\n const skiaCanvas = surface.getCanvas();\n skiaCanvas.clear(Float32Array.of(0, 0, 0, 0));\n skiaCanvas.save();\n skiaCanvas.scale(this.pd, this.pd);\n skiaCanvas.drawPicture(picture);\n skiaCanvas.restore();\n surface.ref.flush();\n\n return { surface, tempCanvas };\n } catch (error) {\n if (surface) {\n surface.ref.delete();\n }\n this.cleanupWebGLContext(tempCanvas);\n return null;\n }\n }\n\n private cleanupWebGLContext(tempCanvas: OffscreenCanvas): void {\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n const loseContext = ctx.getExtension(\"WEBGL_lose_context\");\n if (loseContext) {\n loseContext.loseContext();\n }\n }\n }\n\n draw(picture: SkPicture): void {\n const renderResult = this.renderPictureToSurface(picture);\n if (!renderResult) {\n return;\n }\n const { tempCanvas } = renderResult;\n const ctx2d = this.canvas.getContext(\"2d\");\n if (!ctx2d) {\n throw new Error(\"Could not get 2D context\");\n }\n\n // Set canvas dimensions to match pixel density\n this.canvas.width = this.canvas.clientWidth * this.pd;\n this.canvas.height = this.canvas.clientHeight * this.pd;\n\n // Draw the tempCanvas scaled down to the display size\n ctx2d.drawImage(\n tempCanvas,\n 0,\n 0,\n tempCanvas.width,\n tempCanvas.height,\n 0,\n 0,\n this.canvas.clientWidth * this.pd,\n this.canvas.clientHeight * this.pd\n );\n\n this.cleanupWebGLContext(tempCanvas);\n }\n\n makeImageSnapshot(picture: SkPicture, rect?: SkRect): SkImage | null {\n if (!this.cachedImage) {\n const renderResult = this.renderPictureToSurface(picture);\n if (!renderResult) {\n return null;\n }\n\n const { surface, tempCanvas } = renderResult;\n\n try {\n this.cachedImage = surface.makeImageSnapshot(dp2Pixel(this.pd, rect));\n } catch (error) {\n console.error(\"Error creating image snapshot:\", error);\n } finally {\n surface.ref.delete();\n this.cleanupWebGLContext(tempCanvas);\n }\n }\n\n return this.cachedImage;\n }\n\n dispose(): void {\n this.cachedImage?.dispose();\n this.cachedImage = null;\n }\n}\n\nconst pd = Platform.PixelRatio;\n\nexport interface SkiaPictureViewHandle {\n setPicture(picture: SkPicture): void;\n getSize(): { width: number; height: number };\n redraw(): void;\n makeImageSnapshot(rect?: SkRect): SkImage | null;\n measure(\n callback: (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n ) => void\n ): void;\n measureInWindow(\n callback: (x: number, y: number, width: number, height: number) => void\n ): void;\n}\n\nexport const SkiaPictureView = forwardRef<\n SkiaPictureViewHandle,\n SkiaPictureViewNativeProps\n>((props, ref) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const renderer = useRef<Renderer | null>(null);\n const redrawRequestsRef = useRef(0);\n const requestIdRef = useRef(0);\n const pictureRef = useRef<SkPicture | null>(null);\n\n const { picture, onLayout } = props;\n\n const redraw = useCallback(() => {\n redrawRequestsRef.current++;\n }, []);\n\n const getSize = useCallback(() => {\n return {\n width: canvasRef.current?.clientWidth || 0,\n height: canvasRef.current?.clientHeight || 0,\n };\n }, []);\n\n const setPicture = useCallback(\n (newPicture: SkPicture) => {\n pictureRef.current = newPicture;\n redraw();\n },\n [redraw]\n );\n\n const makeImageSnapshot = useCallback((rect?: SkRect) => {\n if (renderer.current && pictureRef.current) {\n return renderer.current.makeImageSnapshot(pictureRef.current, rect);\n }\n return null;\n }, []);\n\n const measure = useCallback(\n (\n callback: (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n ) => void\n ) => {\n if (canvasRef.current) {\n const rect = canvasRef.current.getBoundingClientRect();\n const parentElement = canvasRef.current.offsetParent as HTMLElement;\n const parentRect = parentElement?.getBoundingClientRect() || {\n left: 0,\n top: 0,\n };\n\n // x, y are relative to the parent\n const x = rect.left - parentRect.left;\n const y = rect.top - parentRect.top;\n\n // pageX, pageY are absolute screen coordinates\n const pageX = rect.left + window.scrollX;\n const pageY = rect.top + window.scrollY;\n\n callback(x, y, rect.width, rect.height, pageX, pageY);\n }\n },\n []\n );\n\n const measureInWindow = useCallback(\n (\n callback: (x: number, y: number, width: number, height: number) => void\n ) => {\n if (canvasRef.current) {\n const rect = canvasRef.current.getBoundingClientRect();\n\n // x, y are the absolute coordinates in the window\n const x = rect.left;\n const y = rect.top;\n\n callback(x, y, rect.width, rect.height);\n }\n },\n []\n );\n\n const tick = useCallback(() => {\n if (redrawRequestsRef.current > 0) {\n redrawRequestsRef.current = 0;\n if (renderer.current && pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }\n requestIdRef.current = requestAnimationFrame(tick);\n }, []);\n\n const onLayoutEvent = useCallback(\n (evt: LayoutChangeEvent) => {\n const canvas = canvasRef.current;\n if (canvas) {\n renderer.current =\n props.__destroyWebGLContextAfterRender === true\n ? new StaticWebGLRenderer(canvas, pd)\n : new WebGLRenderer(canvas, pd);\n if (pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }\n if (onLayout) {\n onLayout(evt);\n }\n },\n [onLayout, props.__destroyWebGLContextAfterRender]\n );\n\n useImperativeHandle(\n ref,\n () => ({\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n get canvasRef() {\n return () => canvasRef.current;\n },\n }),\n [setPicture, getSize, redraw, makeImageSnapshot, measure, measureInWindow]\n );\n\n useEffect(() => {\n const nativeID = props.nativeID ?? `${SkiaViewNativeId.current++}`;\n (global.SkiaViewApi as ISkiaViewApiWeb).registerView(nativeID, {\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n } as SkiaPictureViewHandle);\n }, [\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n props.nativeID,\n ]);\n\n useEffect(() => {\n if (props.picture) {\n setPicture(props.picture);\n }\n }, [setPicture, props.picture]);\n\n useEffect(() => {\n tick();\n return () => {\n cancelAnimationFrame(requestIdRef.current);\n if (renderer.current) {\n renderer.current.dispose();\n renderer.current = null;\n }\n };\n }, [tick]);\n\n useEffect(() => {\n if (renderer.current && pictureRef.current) {\n renderer.current.draw(pictureRef.current);\n }\n }, [picture, redraw]);\n\n const { debug = false, ...viewProps } = props;\n return (\n <Platform.View {...viewProps} onLayout={onLayoutEvent}>\n <canvas ref={canvasRef} style={{ display: \"flex\", flex: 1 }} />\n </Platform.View>\n );\n});\n"],"mappings":"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","ignoreList":[]}
@@ -30,6 +30,7 @@ export interface SkiaBaseViewProps extends ViewProps {
30
30
  }
31
31
  export interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {
32
32
  picture?: SkPicture;
33
+ androidWarmup?: boolean;
33
34
  }
34
35
  export interface SkiaDomViewNativeProps extends SkiaBaseViewProps {
35
36
  root?: Node<unknown>;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { ViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type { Node } from \"../dom/types\";\nimport type { SkImage, SkPicture, SkRect, SkSize } from \"../skia/types\";\n\nexport type NativeSkiaViewProps = ViewProps & {\n debug?: boolean;\n opaque?: boolean;\n};\n\nexport interface ISkiaViewApi {\n web?: boolean;\n setJsiProperty: <T>(nativeId: number, name: string, value: T) => void;\n requestRedraw: (nativeId: number) => void;\n makeImageSnapshot: (nativeId: number, rect?: SkRect) => SkImage;\n makeImageSnapshotAsync: (nativeId: number, rect?: SkRect) => Promise<SkImage>;\n size: (nativeId: number) => SkSize;\n}\n\nexport interface SkiaBaseViewProps extends ViewProps {\n /**\n * When set to true the view will display information about the\n * average time it takes to render.\n */\n debug?: boolean;\n /**\n * Pass an animated value to the onSize property to get updates when\n * the Skia view is resized.\n */\n onSize?: SharedValue<SkSize>;\n\n opaque?: boolean;\n\n // On web, only 16 WebGL contextes are allowed. If the drawing is non-animated, set\n // __destroyWebGLContextAfterRender to true to release the context after each draw.\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {\n picture?: SkPicture;\n}\n\nexport interface SkiaDomViewNativeProps extends SkiaBaseViewProps {\n root?: Node<unknown>;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { ViewProps } from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport type { Node } from \"../dom/types\";\nimport type { SkImage, SkPicture, SkRect, SkSize } from \"../skia/types\";\n\nexport type NativeSkiaViewProps = ViewProps & {\n debug?: boolean;\n opaque?: boolean;\n};\n\nexport interface ISkiaViewApi {\n web?: boolean;\n setJsiProperty: <T>(nativeId: number, name: string, value: T) => void;\n requestRedraw: (nativeId: number) => void;\n makeImageSnapshot: (nativeId: number, rect?: SkRect) => SkImage;\n makeImageSnapshotAsync: (nativeId: number, rect?: SkRect) => Promise<SkImage>;\n size: (nativeId: number) => SkSize;\n}\n\nexport interface SkiaBaseViewProps extends ViewProps {\n /**\n * When set to true the view will display information about the\n * average time it takes to render.\n */\n debug?: boolean;\n /**\n * Pass an animated value to the onSize property to get updates when\n * the Skia view is resized.\n */\n onSize?: SharedValue<SkSize>;\n\n opaque?: boolean;\n\n // On web, only 16 WebGL contextes are allowed. If the drawing is non-animated, set\n // __destroyWebGLContextAfterRender to true to release the context after each draw.\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {\n picture?: SkPicture;\n androidWarmup?: boolean;\n}\n\nexport interface SkiaDomViewNativeProps extends SkiaBaseViewProps {\n root?: Node<unknown>;\n}\n"],"mappings":"","ignoreList":[]}
@@ -5,14 +5,14 @@ export function useCanvasSize(userRef: any): {
5
5
  ref: any;
6
6
  size: any;
7
7
  };
8
- export function Canvas({ debug, opaque, children, onSize, colorSpace, coldStart, ref, onLayout, ...viewProps }: {
8
+ export function Canvas({ debug, opaque, children, onSize, colorSpace, androidWarmup, ref, onLayout, ...viewProps }: {
9
9
  [x: string]: any;
10
10
  debug: any;
11
11
  opaque: any;
12
12
  children: any;
13
13
  onSize: any;
14
14
  colorSpace?: string | undefined;
15
- coldStart?: boolean | undefined;
15
+ androidWarmup?: boolean | undefined;
16
16
  ref: any;
17
17
  onLayout: any;
18
18
  }): any;
@@ -7,14 +7,14 @@ export function useCanvasSize(userRef: any): {
7
7
  };
8
8
  };
9
9
  export const isFabric: boolean;
10
- export function Canvas({ debug, opaque, children, onSize, colorSpace, coldStart, ref, onLayout, ...viewProps }: {
10
+ export function Canvas({ debug, opaque, children, onSize, colorSpace, androidWarmup, ref, onLayout, ...viewProps }: {
11
11
  [x: string]: any;
12
12
  debug: any;
13
13
  opaque: any;
14
14
  children: any;
15
15
  onSize: any;
16
16
  colorSpace?: string | undefined;
17
- coldStart?: boolean | undefined;
17
+ androidWarmup?: boolean | undefined;
18
18
  ref: any;
19
19
  onLayout: any;
20
20
  }): React.CElement<object, React.Component<object, {}, any> & import("react-native").NativeMethods>;
@@ -23,7 +23,7 @@ export interface CanvasProps extends Omit<ViewProps, "onLayout"> {
23
23
  onSize?: SharedValue<SkSize>;
24
24
  colorSpace?: "p3" | "srgb";
25
25
  ref?: React.Ref<CanvasRef>;
26
- coldStart?: boolean;
26
+ androidWarmup?: boolean;
27
27
  __destroyWebGLContextAfterRender?: boolean;
28
28
  }
29
- export declare const Canvas: ({ debug, opaque, children, onSize, colorSpace, coldStart, ref, onLayout, ...viewProps }: CanvasProps) => React.JSX.Element;
29
+ export declare const Canvas: ({ debug, opaque, children, onSize, colorSpace, androidWarmup, ref, onLayout, ...viewProps }: CanvasProps) => React.JSX.Element;
@@ -3,7 +3,7 @@ export interface NativeProps extends ViewProps {
3
3
  debug?: boolean;
4
4
  opaque?: boolean;
5
5
  colorSpace?: string;
6
- coldStart?: boolean;
6
+ androidWarmup?: boolean;
7
7
  }
8
8
  declare const _default: import("react-native/Libraries/Utilities/codegenNativeComponent").NativeComponentType<NativeProps>;
9
9
  export default _default;
@@ -3,7 +3,7 @@ import type { SkRect } from "../skia/types";
3
3
  import type { SkiaPictureViewNativeProps } from "./types";
4
4
  interface SkiaPictureViewProps extends SkiaPictureViewNativeProps {
5
5
  mode?: "default" | "continuous";
6
- coldStart?: boolean;
6
+ androidWarmup?: boolean;
7
7
  }
8
8
  export declare class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
9
9
  private requestId;
@@ -9,5 +9,7 @@ export interface SkiaPictureViewHandle {
9
9
  };
10
10
  redraw(): void;
11
11
  makeImageSnapshot(rect?: SkRect): SkImage | null;
12
+ measure(callback: (x: number, y: number, width: number, height: number, pageX: number, pageY: number) => void): void;
13
+ measureInWindow(callback: (x: number, y: number, width: number, height: number) => void): void;
12
14
  }
13
15
  export declare const SkiaPictureView: React.ForwardRefExoticComponent<SkiaPictureViewNativeProps & React.RefAttributes<SkiaPictureViewHandle>>;
@@ -30,6 +30,7 @@ export interface SkiaBaseViewProps extends ViewProps {
30
30
  }
31
31
  export interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {
32
32
  picture?: SkPicture;
33
+ androidWarmup?: boolean;
33
34
  }
34
35
  export interface SkiaDomViewNativeProps extends SkiaBaseViewProps {
35
36
  root?: Node<unknown>;
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "setup-skia-web": "scripts/setup-canvaskit.js"
9
9
  },
10
10
  "title": "React Native Skia",
11
- "version": "2.4.2",
11
+ "version": "2.4.4",
12
12
  "skia": {
13
13
  "version": "m142",
14
14
  "checksums": {
@@ -4,47 +4,29 @@ require "json"
4
4
 
5
5
  package = JSON.parse(File.read(File.join(__dir__, "package.json")))
6
6
 
7
- # Check if Graphite symbols are available in libskia
8
- libskia_path = File.join(__dir__, "libs/apple/libskia.xcframework")
7
+ # Check if Graphite is available
8
+ # Detection method priority:
9
+ # 1. SK_GRAPHITE environment variable (explicit override, fastest)
10
+ # 2. Marker file in libs directory (set during Skia build)
11
+ # 3. Default to OFF (no slow nm symbol detection)
9
12
  use_graphite = false
10
13
 
11
- if File.exist?(libskia_path)
12
- # Look for any arm64 or x86_64 framework inside the xcframework
13
- framework_paths = Dir.glob(File.join(libskia_path, "**/libskia.framework/libskia"))
14
-
15
- # Also try looking for static libraries if frameworks aren't found
16
- if framework_paths.empty?
17
- framework_paths = Dir.glob(File.join(libskia_path, "**/libskia.a"))
18
- end
19
-
20
- framework_paths.each do |framework_path|
21
- if File.exist?(framework_path)
22
- # Look for specific Dawn function symbols that indicate Graphite support
23
- dawn_symbols = [
24
- 'dawn::',
25
- 'wgpu',
26
- '_ZN4dawn',
27
- 'DawnDevice',
28
- 'dawn_native'
29
- ]
30
-
31
- dawn_symbols.each do |symbol|
32
- nm_output = `nm "#{framework_path}" 2>/dev/null | grep "#{symbol}"`
33
- if $?.success? && !nm_output.empty?
34
- use_graphite = true
35
- break
36
- end
37
- end
38
-
39
- break if use_graphite
40
- end
41
- end
14
+ if ENV['SK_GRAPHITE']
15
+ # Explicit override via environment variable
16
+ use_graphite = ENV['SK_GRAPHITE'] == '1' || ENV['SK_GRAPHITE'].downcase == 'true'
17
+ puts "-- SK_GRAPHITE detection: using environment variable (#{use_graphite ? 'ON' : 'OFF'})"
18
+ elsif File.exist?(File.join(__dir__, "libs/apple/graphite.enabled"))
19
+ # Marker file indicates Graphite-enabled build
20
+ use_graphite = true
21
+ puts "-- SK_GRAPHITE detection: marker file found"
22
+ else
23
+ puts "-- SK_GRAPHITE detection: no marker file, assuming OFF"
42
24
  end
43
25
 
44
26
  if use_graphite
45
- puts "SK_GRAPHITE: ON (Graphite symbols found in libskia)"
27
+ puts "-- SK_GRAPHITE: ON"
46
28
  else
47
- puts "SK_GRAPHITE: OFF (Graphite symbols not found in libskia)"
29
+ puts "-- SK_GRAPHITE: OFF"
48
30
  end
49
31
 
50
32
  # Set preprocessor definitions based on GRAPHITE flag
@@ -487,6 +487,25 @@ const main = async () => {
487
487
  });
488
488
  }
489
489
 
490
+ // Create or remove Graphite marker files based on build type
491
+ const androidMarkerFile = path.join(androidDir, "graphite.enabled");
492
+ const appleMarkerFile = path.join(appleDir, "graphite.enabled");
493
+
494
+ if (GRAPHITE) {
495
+ // Create marker files for Graphite builds
496
+ fs.writeFileSync(androidMarkerFile, "");
497
+ fs.writeFileSync(appleMarkerFile, "");
498
+ console.log("✓ Created Graphite marker files");
499
+ } else {
500
+ // Ensure marker files don't exist for non-Graphite builds
501
+ if (fs.existsSync(androidMarkerFile)) {
502
+ fs.unlinkSync(androidMarkerFile);
503
+ }
504
+ if (fs.existsSync(appleMarkerFile)) {
505
+ fs.unlinkSync(appleMarkerFile);
506
+ }
507
+ }
508
+
490
509
  // Copy Graphite headers if using Graphite
491
510
  if (GRAPHITE) {
492
511
  console.log("📦 Copying Graphite headers...");
@@ -68,7 +68,7 @@ export interface CanvasProps extends Omit<ViewProps, "onLayout"> {
68
68
  onSize?: SharedValue<SkSize>;
69
69
  colorSpace?: "p3" | "srgb";
70
70
  ref?: React.Ref<CanvasRef>;
71
- coldStart?: boolean;
71
+ androidWarmup?: boolean;
72
72
  __destroyWebGLContextAfterRender?: boolean;
73
73
  }
74
74
 
@@ -78,7 +78,7 @@ export const Canvas = ({
78
78
  children,
79
79
  onSize,
80
80
  colorSpace = "p3",
81
- coldStart = false,
81
+ androidWarmup = false,
82
82
  ref,
83
83
  // Here know this is a type error but this is done on purpose to check it at runtime
84
84
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -103,7 +103,17 @@ export const Canvas = ({
103
103
  useReanimatedFrame(() => {
104
104
  "worklet";
105
105
  if (onSize && measure) {
106
- const result = measure(viewRef as AnimatedRef<View>);
106
+ const result =
107
+ // eslint-disable-next-line no-nested-ternary
108
+ Platform.OS === "web"
109
+ ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
110
+ // @ts-expect-error
111
+ viewRef.current?.canvasRef
112
+ ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
113
+ // @ts-expect-error
114
+ measure(viewRef.current.canvasRef)
115
+ : { width: 0, height: 0 }
116
+ : measure(viewRef as AnimatedRef<View>);
107
117
  if (result) {
108
118
  const { width, height } = result;
109
119
  if (onSize.value.width !== width || onSize.value.height !== height) {
@@ -170,7 +180,7 @@ export const Canvas = ({
170
180
  debug={debug}
171
181
  opaque={opaque}
172
182
  colorSpace={colorSpace}
173
- coldStart={coldStart}
183
+ androidWarmup={androidWarmup}
174
184
  onLayout={
175
185
  Platform.OS === "web" && (onSize || onLayout) ? onLayoutWeb : onLayout
176
186
  }
@@ -106,7 +106,6 @@ const play = (ctx: DrawingContext, _command: Command) => {
106
106
  flushPendingGroups(ctx, pending);
107
107
  };
108
108
 
109
- ("worklet");
110
109
  if (isGroup(_command)) {
111
110
  playGroup(ctx, _command);
112
111
  return;
@@ -5,7 +5,7 @@ export interface NativeProps extends ViewProps {
5
5
  debug?: boolean;
6
6
  opaque?: boolean;
7
7
  colorSpace?: string;
8
- coldStart?: boolean;
8
+ androidWarmup?: boolean;
9
9
  }
10
10
 
11
11
  // eslint-disable-next-line import/no-default-export
@@ -11,7 +11,7 @@ const NativeSkiaPictureView = SkiaPictureViewNativeComponent;
11
11
 
12
12
  interface SkiaPictureViewProps extends SkiaPictureViewNativeProps {
13
13
  mode?: "default" | "continuous";
14
- coldStart?: boolean;
14
+ androidWarmup?: boolean;
15
15
  }
16
16
 
17
17
  export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
@@ -87,7 +87,7 @@ export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
87
87
  mode,
88
88
  debug = false,
89
89
  opaque = false,
90
- coldStart = false,
90
+ androidWarmup = false,
91
91
  ...viewProps
92
92
  } = this.props;
93
93
  return (
@@ -96,7 +96,7 @@ export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
96
96
  nativeID={`${this._nativeId}`}
97
97
  debug={debug}
98
98
  opaque={opaque}
99
- coldStart={coldStart}
99
+ androidWarmup={androidWarmup}
100
100
  {...viewProps}
101
101
  />
102
102
  );
@@ -224,6 +224,19 @@ export interface SkiaPictureViewHandle {
224
224
  getSize(): { width: number; height: number };
225
225
  redraw(): void;
226
226
  makeImageSnapshot(rect?: SkRect): SkImage | null;
227
+ measure(
228
+ callback: (
229
+ x: number,
230
+ y: number,
231
+ width: number,
232
+ height: number,
233
+ pageX: number,
234
+ pageY: number
235
+ ) => void
236
+ ): void;
237
+ measureInWindow(
238
+ callback: (x: number, y: number, width: number, height: number) => void
239
+ ): void;
227
240
  }
228
241
 
229
242
  export const SkiaPictureView = forwardRef<
@@ -264,6 +277,56 @@ export const SkiaPictureView = forwardRef<
264
277
  return null;
265
278
  }, []);
266
279
 
280
+ const measure = useCallback(
281
+ (
282
+ callback: (
283
+ x: number,
284
+ y: number,
285
+ width: number,
286
+ height: number,
287
+ pageX: number,
288
+ pageY: number
289
+ ) => void
290
+ ) => {
291
+ if (canvasRef.current) {
292
+ const rect = canvasRef.current.getBoundingClientRect();
293
+ const parentElement = canvasRef.current.offsetParent as HTMLElement;
294
+ const parentRect = parentElement?.getBoundingClientRect() || {
295
+ left: 0,
296
+ top: 0,
297
+ };
298
+
299
+ // x, y are relative to the parent
300
+ const x = rect.left - parentRect.left;
301
+ const y = rect.top - parentRect.top;
302
+
303
+ // pageX, pageY are absolute screen coordinates
304
+ const pageX = rect.left + window.scrollX;
305
+ const pageY = rect.top + window.scrollY;
306
+
307
+ callback(x, y, rect.width, rect.height, pageX, pageY);
308
+ }
309
+ },
310
+ []
311
+ );
312
+
313
+ const measureInWindow = useCallback(
314
+ (
315
+ callback: (x: number, y: number, width: number, height: number) => void
316
+ ) => {
317
+ if (canvasRef.current) {
318
+ const rect = canvasRef.current.getBoundingClientRect();
319
+
320
+ // x, y are the absolute coordinates in the window
321
+ const x = rect.left;
322
+ const y = rect.top;
323
+
324
+ callback(x, y, rect.width, rect.height);
325
+ }
326
+ },
327
+ []
328
+ );
329
+
267
330
  const tick = useCallback(() => {
268
331
  if (redrawRequestsRef.current > 0) {
269
332
  redrawRequestsRef.current = 0;
@@ -300,8 +363,13 @@ export const SkiaPictureView = forwardRef<
300
363
  getSize,
301
364
  redraw,
302
365
  makeImageSnapshot,
366
+ measure,
367
+ measureInWindow,
368
+ get canvasRef() {
369
+ return () => canvasRef.current;
370
+ },
303
371
  }),
304
- [setPicture, getSize, redraw, makeImageSnapshot]
372
+ [setPicture, getSize, redraw, makeImageSnapshot, measure, measureInWindow]
305
373
  );
306
374
 
307
375
  useEffect(() => {
@@ -311,8 +379,18 @@ export const SkiaPictureView = forwardRef<
311
379
  getSize,
312
380
  redraw,
313
381
  makeImageSnapshot,
382
+ measure,
383
+ measureInWindow,
314
384
  } as SkiaPictureViewHandle);
315
- }, [setPicture, getSize, redraw, makeImageSnapshot, props.nativeID]);
385
+ }, [
386
+ setPicture,
387
+ getSize,
388
+ redraw,
389
+ makeImageSnapshot,
390
+ measure,
391
+ measureInWindow,
392
+ props.nativeID,
393
+ ]);
316
394
 
317
395
  useEffect(() => {
318
396
  if (props.picture) {
@@ -39,6 +39,7 @@ export interface SkiaBaseViewProps extends ViewProps {
39
39
 
40
40
  export interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {
41
41
  picture?: SkPicture;
42
+ androidWarmup?: boolean;
42
43
  }
43
44
 
44
45
  export interface SkiaDomViewNativeProps extends SkiaBaseViewProps {