@shopify/react-native-skia 2.11.1 → 2.11.2-next.1

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 (62) hide show
  1. package/cpp/api/JsiSkFont.h +3 -2
  2. package/cpp/api/recorder/Paint.h +6 -2
  3. package/cpp/dawn/include/dawn/dawn_proc.h +53 -0
  4. package/cpp/dawn/include/dawn/dawn_proc_table.h +330 -0
  5. package/cpp/dawn/include/dawn/dawn_thread_dispatch_proc.h +47 -0
  6. package/cpp/dawn/include/dawn/dawn_version.h +41 -0
  7. package/cpp/dawn/include/dawn/native/D3D11Backend.h +65 -0
  8. package/cpp/dawn/include/dawn/native/D3D12Backend.h +103 -0
  9. package/cpp/dawn/include/dawn/native/D3DBackend.h +56 -0
  10. package/cpp/dawn/include/dawn/native/DawnNative.h +368 -0
  11. package/cpp/dawn/include/dawn/native/MetalBackend.h +56 -0
  12. package/cpp/dawn/include/dawn/native/NullBackend.h +39 -0
  13. package/cpp/dawn/include/dawn/native/OpenGLBackend.h +89 -0
  14. package/cpp/dawn/include/dawn/native/VulkanBackend.h +183 -0
  15. package/cpp/dawn/include/dawn/native/WebGPUBackend.h +49 -0
  16. package/cpp/dawn/include/dawn/native/dawn_native_export.h +49 -0
  17. package/cpp/dawn/include/dawn/platform/DawnPlatform.h +207 -0
  18. package/cpp/dawn/include/dawn/platform/dawn_platform_export.h +49 -0
  19. package/cpp/dawn/include/dawn/replay/Replay.h +99 -0
  20. package/cpp/dawn/include/dawn/replay/dawn_replay_export.h +49 -0
  21. package/cpp/dawn/include/dawn/webgpu_cpp_print.h +2856 -0
  22. package/cpp/dawn/include/tint/tint.h +91 -0
  23. package/cpp/dawn/include/webgpu/webgpu.h +5029 -0
  24. package/cpp/dawn/include/webgpu/webgpu_cpp.h +10353 -0
  25. package/cpp/dawn/include/webgpu/webgpu_cpp_chained_struct.h +57 -0
  26. package/cpp/dawn/include/webgpu/webgpu_enum_class_bitmasks.h +162 -0
  27. package/cpp/dawn/include/webgpu/webgpu_glfw.h +88 -0
  28. package/cpp/jsi/NativeObject.h +50 -32
  29. package/cpp/jsi/RuntimeAwareCache.cpp +1 -0
  30. package/cpp/jsi/RuntimeAwareCache.h +29 -0
  31. package/cpp/rnskia/RNSkManager.cpp +5 -0
  32. package/cpp/skia/src/gpu/graphite/ContextOptionsPriv.h +45 -0
  33. package/cpp/skia/src/gpu/graphite/ResourceTypes.h +360 -0
  34. package/cpp/skia/src/gpu/graphite/TextureProxyView.h +105 -0
  35. package/lib/commonjs/dom/nodes/datatypes/Rect.js +5 -1
  36. package/lib/commonjs/dom/nodes/datatypes/Rect.js.map +1 -1
  37. package/lib/commonjs/external/reanimated/useVideo.js +8 -2
  38. package/lib/commonjs/external/reanimated/useVideo.js.map +1 -1
  39. package/lib/commonjs/skia/types/JsiInstance.d.ts +1 -0
  40. package/lib/commonjs/skia/types/JsiInstance.js.map +1 -1
  41. package/lib/commonjs/sksg/Recorder/DrawingContext.js +10 -5
  42. package/lib/commonjs/sksg/Recorder/DrawingContext.js.map +1 -1
  43. package/lib/commonjs/views/SkiaPictureView.web.js +19 -14
  44. package/lib/commonjs/views/SkiaPictureView.web.js.map +1 -1
  45. package/lib/module/dom/nodes/datatypes/Rect.js +5 -1
  46. package/lib/module/dom/nodes/datatypes/Rect.js.map +1 -1
  47. package/lib/module/external/reanimated/useVideo.js +8 -2
  48. package/lib/module/external/reanimated/useVideo.js.map +1 -1
  49. package/lib/module/skia/types/JsiInstance.d.ts +1 -0
  50. package/lib/module/skia/types/JsiInstance.js.map +1 -1
  51. package/lib/module/sksg/Recorder/DrawingContext.js +10 -5
  52. package/lib/module/sksg/Recorder/DrawingContext.js.map +1 -1
  53. package/lib/module/views/SkiaPictureView.web.js +19 -14
  54. package/lib/module/views/SkiaPictureView.web.js.map +1 -1
  55. package/lib/typescript/src/skia/types/JsiInstance.d.ts +1 -0
  56. package/libs/.graphite +1 -0
  57. package/package.json +6 -6
  58. package/src/dom/nodes/datatypes/Rect.ts +6 -1
  59. package/src/external/reanimated/useVideo.ts +7 -2
  60. package/src/skia/types/JsiInstance.ts +2 -0
  61. package/src/sksg/Recorder/DrawingContext.ts +10 -5
  62. package/src/views/SkiaPictureView.web.tsx +17 -14
@@ -1 +1 @@
1
- {"version":3,"names":["_FrameScope","require","createDrawingContext","Skia","paintPool","canvas","frameSkia","track","dispose","createFrameScope","paints","colorFilters","shaders","imageFilters","pathEffects","paintDeclarations","opacities","nextPaintIndex","length","push","Paint","reset","savePaint","nextPaint","assign","getCurrentPaint","pushPaint","paint","getOpacity","setOpacity","newOpacity","Math","max","min","saveBackdropFilter","imageFilter","imgf","pop","cf","ImageFilter","MakeColorFilter","saveLayer","undefined","restore","restorePaint","materializePaint","setColorFilter","reduceRight","inner","outer","ColorFilter","MakeCompose","setShader","setImageFilter","setPathEffect","PathEffect","exports"],"sources":["DrawingContext.ts"],"sourcesContent":["import type {\n Skia,\n SkCanvas,\n SkColorFilter,\n SkPaint,\n SkShader,\n SkImageFilter,\n SkPathEffect,\n} from \"../../skia/types\";\n\nimport { createFrameScope } from \"./FrameScope\";\n\nexport const createDrawingContext = (\n Skia: Skia,\n paintPool: SkPaint[],\n canvas: SkCanvas\n) => {\n \"worklet\";\n\n // Everything the renderer creates through frameSkia is frame-scoped and\n // deleted by dispose() once the frame has been recorded. The paint pool is\n // recording-scoped and deliberately allocated with the raw Skia instance.\n const { Skia: frameSkia, track, dispose } = createFrameScope(Skia);\n\n // State (formerly class fields)\n const paints: SkPaint[] = [];\n const colorFilters: SkColorFilter[] = [];\n const shaders: SkShader[] = [];\n const imageFilters: SkImageFilter[] = [];\n const pathEffects: SkPathEffect[] = [];\n const paintDeclarations: SkPaint[] = [];\n const opacities: number[] = [];\n\n let nextPaintIndex = 1;\n\n // Initialize first paint and opacity\n if (paintPool.length === 0) {\n paintPool.push(Skia.Paint());\n } else {\n paintPool[0].reset();\n }\n paints.push(paintPool[0]);\n opacities.push(1);\n\n // Methods (formerly class methods)\n const savePaint = () => {\n // Get next available paint from pool or create new one if needed\n if (nextPaintIndex >= paintPool.length) {\n paintPool.push(Skia.Paint());\n }\n\n const nextPaint = paintPool[nextPaintIndex];\n nextPaint.assign(getCurrentPaint()); // Reuse allocation by copying properties\n paints.push(nextPaint);\n opacities.push(opacities[opacities.length - 1]);\n nextPaintIndex++;\n };\n\n // Pushes an externally owned paint (the `paint` prop) onto the stack. It must\n // push an opacity alongside it: restorePaint() pops both, so pushing only the\n // paint would underflow the opacity stack and leak the enclosing group's\n // opacity onto everything drawn afterwards.\n const pushPaint = (paint: SkPaint) => {\n paints.push(paint);\n opacities.push(opacities[opacities.length - 1]);\n };\n\n const getOpacity = () => {\n return opacities[opacities.length - 1];\n };\n\n const setOpacity = (newOpacity: number) => {\n opacities[opacities.length - 1] = Math.max(0, Math.min(1, newOpacity));\n };\n\n const saveBackdropFilter = () => {\n let imageFilter: SkImageFilter | null = null;\n const imgf = imageFilters.pop();\n if (imgf) {\n imageFilter = imgf;\n } else {\n const cf = colorFilters.pop();\n if (cf) {\n imageFilter = frameSkia.ImageFilter.MakeColorFilter(cf, null);\n }\n }\n canvas.saveLayer(undefined, null, imageFilter);\n canvas.restore();\n };\n\n // Equivalent to the `get paint()` getter in the original class\n const getCurrentPaint = () => {\n return paints[paints.length - 1];\n };\n\n const restorePaint = () => {\n opacities.pop();\n return paints.pop();\n };\n\n const materializePaint = () => {\n // Color Filters\n if (colorFilters.length > 0) {\n getCurrentPaint().setColorFilter(\n colorFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ColorFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n // Shaders\n if (shaders.length > 0) {\n getCurrentPaint().setShader(shaders[shaders.length - 1]);\n }\n // Image Filters\n if (imageFilters.length > 0) {\n getCurrentPaint().setImageFilter(\n imageFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ImageFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Path Effects\n if (pathEffects.length > 0) {\n getCurrentPaint().setPathEffect(\n pathEffects.reduceRight((inner, outer) =>\n inner ? frameSkia.PathEffect.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Clear arrays\n colorFilters.length = 0;\n shaders.length = 0;\n imageFilters.length = 0;\n pathEffects.length = 0;\n };\n\n // Return an object containing the Skia reference, the canvas, and the methods\n return {\n // Public fields\n Skia: frameSkia,\n canvas,\n track,\n dispose,\n paints,\n colorFilters,\n shaders,\n imageFilters,\n pathEffects,\n paintDeclarations,\n paintPool,\n\n // Public methods\n savePaint,\n pushPaint,\n saveBackdropFilter,\n get paint() {\n return paints[paints.length - 1];\n }, // the \"getter\" for the current paint\n restorePaint,\n materializePaint,\n getOpacity,\n setOpacity,\n };\n};\n\nexport type DrawingContext = ReturnType<typeof createDrawingContext>;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_FrameScope","require","createDrawingContext","Skia","paintPool","canvas","frameSkia","track","dispose","createFrameScope","paints","colorFilters","shaders","imageFilters","pathEffects","paintDeclarations","opacities","nextPaintIndex","length","push","Paint","reset","setAntiAlias","savePaint","nextPaint","assign","getCurrentPaint","pushPaint","paint","copy","getOpacity","setOpacity","newOpacity","Math","max","min","saveBackdropFilter","imageFilter","imgf","pop","cf","ImageFilter","MakeColorFilter","saveLayer","undefined","restore","restorePaint","materializePaint","setColorFilter","reduceRight","inner","outer","ColorFilter","MakeCompose","setShader","setImageFilter","setPathEffect","PathEffect","exports"],"sources":["DrawingContext.ts"],"sourcesContent":["import type {\n Skia,\n SkCanvas,\n SkColorFilter,\n SkPaint,\n SkShader,\n SkImageFilter,\n SkPathEffect,\n} from \"../../skia/types\";\n\nimport { createFrameScope } from \"./FrameScope\";\n\nexport const createDrawingContext = (\n Skia: Skia,\n paintPool: SkPaint[],\n canvas: SkCanvas\n) => {\n \"worklet\";\n\n // Everything the renderer creates through frameSkia is frame-scoped and\n // deleted by dispose() once the frame has been recorded. The paint pool is\n // recording-scoped and deliberately allocated with the raw Skia instance.\n const { Skia: frameSkia, track, dispose } = createFrameScope(Skia);\n\n // State (formerly class fields)\n const paints: SkPaint[] = [];\n const colorFilters: SkColorFilter[] = [];\n const shaders: SkShader[] = [];\n const imageFilters: SkImageFilter[] = [];\n const pathEffects: SkPathEffect[] = [];\n const paintDeclarations: SkPaint[] = [];\n const opacities: number[] = [];\n\n let nextPaintIndex = 1;\n\n // Initialize first paint and opacity\n if (paintPool.length === 0) {\n paintPool.push(Skia.Paint());\n } else {\n // reset() produces an anti-alias false paint, unlike the Skia.Paint()\n // factory: restore the default so reused pools render like the first frame.\n paintPool[0].reset();\n paintPool[0].setAntiAlias(true);\n }\n paints.push(paintPool[0]);\n opacities.push(1);\n\n // Methods (formerly class methods)\n const savePaint = () => {\n // Get next available paint from pool or create new one if needed\n if (nextPaintIndex >= paintPool.length) {\n paintPool.push(Skia.Paint());\n }\n\n const nextPaint = paintPool[nextPaintIndex];\n nextPaint.assign(getCurrentPaint()); // Reuse allocation by copying properties\n paints.push(nextPaint);\n opacities.push(opacities[opacities.length - 1]);\n nextPaintIndex++;\n };\n\n // Pushes an externally owned paint (the `paint` prop) onto the stack. It\n // pushes a frame-scoped copy, like the C++ DrawingCtx: materializePaint()\n // mutates the top of the stack, and those mutations must not leak into the\n // user-owned paint. It must also push an opacity alongside it: restorePaint()\n // pops both, so pushing only the paint would underflow the opacity stack and\n // leak the enclosing group's opacity onto everything drawn afterwards.\n const pushPaint = (paint: SkPaint) => {\n paints.push(track(paint.copy()));\n opacities.push(opacities[opacities.length - 1]);\n };\n\n const getOpacity = () => {\n return opacities[opacities.length - 1];\n };\n\n const setOpacity = (newOpacity: number) => {\n opacities[opacities.length - 1] = Math.max(0, Math.min(1, newOpacity));\n };\n\n const saveBackdropFilter = () => {\n let imageFilter: SkImageFilter | null = null;\n const imgf = imageFilters.pop();\n if (imgf) {\n imageFilter = imgf;\n } else {\n const cf = colorFilters.pop();\n if (cf) {\n imageFilter = frameSkia.ImageFilter.MakeColorFilter(cf, null);\n }\n }\n canvas.saveLayer(undefined, null, imageFilter);\n canvas.restore();\n };\n\n // Equivalent to the `get paint()` getter in the original class\n const getCurrentPaint = () => {\n return paints[paints.length - 1];\n };\n\n const restorePaint = () => {\n opacities.pop();\n return paints.pop();\n };\n\n const materializePaint = () => {\n // Color Filters\n if (colorFilters.length > 0) {\n getCurrentPaint().setColorFilter(\n colorFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ColorFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n // Shaders\n if (shaders.length > 0) {\n getCurrentPaint().setShader(shaders[shaders.length - 1]);\n }\n // Image Filters\n if (imageFilters.length > 0) {\n getCurrentPaint().setImageFilter(\n imageFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ImageFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Path Effects\n if (pathEffects.length > 0) {\n getCurrentPaint().setPathEffect(\n pathEffects.reduceRight((inner, outer) =>\n inner ? frameSkia.PathEffect.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Clear arrays\n colorFilters.length = 0;\n shaders.length = 0;\n imageFilters.length = 0;\n pathEffects.length = 0;\n };\n\n // Return an object containing the Skia reference, the canvas, and the methods\n return {\n // Public fields\n Skia: frameSkia,\n canvas,\n track,\n dispose,\n paints,\n colorFilters,\n shaders,\n imageFilters,\n pathEffects,\n paintDeclarations,\n paintPool,\n\n // Public methods\n savePaint,\n pushPaint,\n saveBackdropFilter,\n get paint() {\n return paints[paints.length - 1];\n }, // the \"getter\" for the current paint\n restorePaint,\n materializePaint,\n getOpacity,\n setOpacity,\n };\n};\n\nexport type DrawingContext = ReturnType<typeof createDrawingContext>;\n"],"mappings":"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","ignoreList":[]}
@@ -289,21 +289,26 @@ const SkiaPictureView = props => {
289
289
  // - The renderer is created synchronously on mount (the canvas element is
290
290
  // guaranteed to exist in useLayoutEffect; a zero size at that point is
291
291
  // fine, the surface is created once the canvas is measurable).
292
- // - Redraw requests coalesce into a single animation frame. A picture
293
- // dispatched before the canvas has a size stays in pictureRef (drawing
294
- // while unmeasured is a no-op) and is painted by the resize path below
295
- // once the canvas becomes measurable, so it is never lost.
292
+ // - Redraw requests coalesce into a single microtask. A microtask (not an
293
+ // animation frame) so that a picture produced inside a rAF callback (the
294
+ // Reanimated mapper) is drawn before the current frame paints: deferring
295
+ // to the next rAF alternates between "flush pending in this frame" and
296
+ // "flush scheduled for the next frame", drawing on every other frame
297
+ // only and halving the effective frame rate. A picture dispatched before
298
+ // the canvas has a size stays in pictureRef (drawing while unmeasured is
299
+ // a no-op) and is painted by the resize path below once the canvas
300
+ // becomes measurable, so it is never lost.
296
301
  // - A ResizeObserver on the canvas itself recreates the surface and repaints
297
302
  // synchronously (its callbacks run after layout, before paint), and is
298
303
  // also the source of the user-facing onLayout event.
299
304
  const redrawPendingRef = (0, _react.useRef)(false);
300
- const frameRef = (0, _react.useRef)(0);
305
+ const flushScheduledRef = (0, _react.useRef)(false);
301
306
  const onLayoutRef = (0, _react.useRef)(onLayout);
302
307
  (0, _react.useLayoutEffect)(() => {
303
308
  onLayoutRef.current = onLayout;
304
309
  }, [onLayout]);
305
310
  const flushRedraw = (0, _react.useCallback)(() => {
306
- frameRef.current = 0;
311
+ flushScheduledRef.current = false;
307
312
  if (redrawPendingRef.current && rendererRef.current && pictureRef.current) {
308
313
  redrawPendingRef.current = false;
309
314
  rendererRef.current.draw(pictureRef.current);
@@ -313,8 +318,9 @@ const SkiaPictureView = props => {
313
318
  }, []);
314
319
  const redraw = (0, _react.useCallback)(() => {
315
320
  redrawPendingRef.current = true;
316
- if (frameRef.current === 0) {
317
- frameRef.current = requestAnimationFrame(flushRedraw);
321
+ if (!flushScheduledRef.current) {
322
+ flushScheduledRef.current = true;
323
+ queueMicrotask(flushRedraw);
318
324
  }
319
325
  }, [flushRedraw]);
320
326
  const getSize = (0, _react.useCallback)(() => {
@@ -449,12 +455,11 @@ const SkiaPictureView = props => {
449
455
  renderer.dispose();
450
456
  };
451
457
  }, [isStatic]);
452
- (0, _react.useEffect)(() => {
453
- return () => {
454
- cancelAnimationFrame(frameRef.current);
455
- frameRef.current = 0;
456
- };
457
- }, []);
458
+
459
+ // No flush cancellation is needed on unmount: a microtask queued before
460
+ // unmount runs within the same task, and flushRedraw no-ops once the
461
+ // layout-effect cleanup has nulled rendererRef.
462
+
458
463
  (0, _react.useImperativeHandle)(ref, () => ({
459
464
  setPicture,
460
465
  getSize,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_JsiSkSurface","_Platform","_SkiaViewNativeId","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","dp2Pixel","pd","rect","undefined","x","y","width","height","WebGLRenderer","constructor","canvas","contextHandle","CanvasKit","GetWebGLContext","Error","grContext","MakeWebGLContext","deleteContext","ctx","getContext","drawingBufferColorSpace","onResize","makeImageSnapshot","picture","surface","getCanvas","clear","TRANSPARENT","draw","ref","flush","_this$surface","window","devicePixelRatio","clientWidth","clientHeight","delete","MakeOnScreenGLSurface","ColorSpace","SRGB","JsiSkSurface","Float32Array","of","save","scale","drawPicture","restore","dispose","_this$surface2","_this$canvas","releaseResourcesAndAbandonContext","getExtension","loseContext","StaticWebGLRenderer","cachedImage","renderPictureToSurface","tempCanvas","OffscreenCanvas","webglSurface","skiaCanvas","error","cleanupRenderResult","result","_result$surface","_result$tempCanvas$ge","renderResult","ctx2d","drawImage","console","_this$cachedImage","makeLayoutEvent","timeStamp","Date","now","nativeEvent","layout","currentTarget","target","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","SkiaPictureView","props","onLayout","canvasRef","useRef","rendererRef","pictureRef","redrawPendingRef","frameRef","onLayoutRef","useLayoutEffect","current","flushRedraw","useCallback","redraw","requestAnimationFrame","getSize","_canvasRef$current","_canvasRef$current2","setPicture","newPicture","measure","callback","getBoundingClientRect","parentElement","offsetParent","parentRect","left","top","pageX","scrollX","pageY","scrollY","measureInWindow","isStatic","__destroyWebGLContextAfterRender","renderer","lastWidth","lastHeight","lastPixelDensity","resizeIfNeeded","pixelDensity","observer","ResizeObserver","entries","layoutHandler","contentRect","setTimeout","observe","media","onPixelDensityChange","watchPixelDensity","_media","removeEventListener","matchMedia","query","addEventListener","_media2","disconnect","useEffect","cancelAnimationFrame","useImperativeHandle","_props$nativeID","nativeID","SkiaViewNativeId","api","global","SkiaViewApi","registerView","unregisterView","debug","_debug","_ref","_onLayout","_picture","_isStatic","viewProps","createElement","Platform","View","style","display","exports"],"sources":["SkiaPictureView.web.tsx"],"sourcesContent":["/* global HTMLCanvasElement, ResizeObserver, MediaQueryList */\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useImperativeHandle,\n useLayoutEffect,\n} from \"react\";\nimport type { LayoutChangeEvent } from \"react-native\";\nimport type { GrDirectContext, WebGLContextHandle } from \"canvaskit-wasm\";\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 private grContext: GrDirectContext | null = null;\n private contextHandle: WebGLContextHandle = 0;\n private pd = 1;\n\n constructor(private canvas: HTMLCanvasElement) {\n this.contextHandle = CanvasKit.GetWebGLContext(canvas);\n if (!this.contextHandle) {\n throw new Error(\"Could not create a WebGL context\");\n }\n this.grContext = CanvasKit.MakeWebGLContext(this.contextHandle);\n if (!this.grContext) {\n CanvasKit.deleteContext(this.contextHandle);\n this.contextHandle = 0;\n throw new Error(\"Could not create a graphics context\");\n }\n const ctx = canvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\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 } = this;\n if (!this.grContext) {\n return;\n }\n this.pd = window.devicePixelRatio;\n canvas.width = canvas.clientWidth * this.pd;\n canvas.height = canvas.clientHeight * this.pd;\n this.surface?.ref.delete();\n this.surface = null;\n if (canvas.width === 0 || canvas.height === 0) {\n // The canvas hasn't been laid out yet (or is hidden). The view's\n // ResizeObserver calls us again as soon as it has a size.\n return;\n }\n // Reuse the existing WebGL context and GrDirectContext: only the surface\n // needs to be recreated when the canvas is resized.\n const surface = CanvasKit.MakeOnScreenGLSurface(\n this.grContext,\n canvas.width,\n canvas.height,\n CanvasKit.ColorSpace.SRGB\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(this.pd, this.pd);\n canvas.drawPicture(picture);\n canvas.restore();\n this.surface.ref.flush();\n }\n }\n\n dispose(): void {\n this.surface?.ref.delete();\n this.surface = null;\n if (this.grContext) {\n this.grContext.releaseResourcesAndAbandonContext();\n this.grContext.delete();\n this.grContext = null;\n }\n this.canvas\n ?.getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n if (this.contextHandle) {\n // Unregister the context from CanvasKit's internal registry, otherwise\n // it retains the canvas element (and its detached DOM tree) forever.\n CanvasKit.deleteContext(this.contextHandle);\n // Making the now-deleted handle current clears CanvasKit's\n // current-context globals (GLctx/Module.ctx), which would otherwise\n // keep referencing the context (and the canvas) until another surface\n // becomes current. With a deleted handle this is a no-op that returns\n // null without creating anything.\n CanvasKit.MakeWebGLContext(this.contextHandle);\n this.contextHandle = 0;\n }\n }\n}\n\ninterface TempRenderResult {\n surface: JsiSkSurface;\n tempCanvas: OffscreenCanvas;\n grContext: GrDirectContext;\n contextHandle: WebGLContextHandle;\n}\n\nclass StaticWebGLRenderer implements Renderer {\n private cachedImage: SkImage | null = null;\n private pd = 1;\n\n constructor(private canvas: HTMLCanvasElement) {}\n\n onResize(): void {\n this.cachedImage = null;\n }\n\n private renderPictureToSurface(picture: SkPicture): TempRenderResult | null {\n this.pd = window.devicePixelRatio;\n if (this.canvas.clientWidth === 0 || this.canvas.clientHeight === 0) {\n return null;\n }\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 let grContext: GrDirectContext | null = null;\n let contextHandle: WebGLContextHandle = 0;\n\n try {\n contextHandle = CanvasKit.GetWebGLContext(tempCanvas);\n if (!contextHandle) {\n throw new Error(\"Could not create a WebGL context\");\n }\n grContext = CanvasKit.MakeWebGLContext(contextHandle);\n if (!grContext) {\n throw new Error(\"Could not create a graphics context\");\n }\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n const webglSurface = CanvasKit.MakeOnScreenGLSurface(\n grContext,\n tempCanvas.width,\n tempCanvas.height,\n CanvasKit.ColorSpace.SRGB\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, grContext, contextHandle };\n } catch (error) {\n this.cleanupRenderResult({\n surface,\n tempCanvas,\n grContext,\n contextHandle,\n });\n return null;\n }\n }\n\n private cleanupRenderResult(result: {\n surface: JsiSkSurface | null;\n tempCanvas: OffscreenCanvas;\n grContext: GrDirectContext | null;\n contextHandle: WebGLContextHandle;\n }): void {\n result.surface?.ref.delete();\n if (result.grContext) {\n result.grContext.releaseResourcesAndAbandonContext();\n result.grContext.delete();\n }\n result.tempCanvas\n .getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n if (result.contextHandle) {\n // Unregister the context from CanvasKit's internal registry, otherwise\n // it retains the OffscreenCanvas forever.\n CanvasKit.deleteContext(result.contextHandle);\n // Clear CanvasKit's current-context globals (see WebGLRenderer.dispose).\n CanvasKit.MakeWebGLContext(result.contextHandle);\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 this.cleanupRenderResult(renderResult);\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.cleanupRenderResult(renderResult);\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 try {\n this.cachedImage = renderResult.surface.makeImageSnapshot(\n dp2Pixel(this.pd, rect)\n );\n } catch (error) {\n console.error(\"Error creating image snapshot:\", error);\n } finally {\n this.cleanupRenderResult(renderResult);\n }\n }\n\n return this.cachedImage;\n }\n\n dispose(): void {\n this.cachedImage?.dispose();\n this.cachedImage = null;\n }\n}\n\n// Mirrors the event react-native-web synthesizes for onLayout.\nconst makeLayoutEvent = (\n x: number,\n y: number,\n width: number,\n height: number\n): LayoutChangeEvent => ({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x, y, width, height } },\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n currentTarget: 0,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n});\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 interface SkiaPictureViewProps extends SkiaPictureViewNativeProps {\n ref?: React.Ref<SkiaPictureViewHandle>;\n}\n\nexport const SkiaPictureView = (props: SkiaPictureViewProps) => {\n const { ref, picture, onLayout } = props;\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rendererRef = useRef<Renderer | null>(null);\n const pictureRef = useRef<SkPicture | null>(null);\n // The rendering lifecycle deliberately does not depend on layout events:\n // - The renderer is created synchronously on mount (the canvas element is\n // guaranteed to exist in useLayoutEffect; a zero size at that point is\n // fine, the surface is created once the canvas is measurable).\n // - Redraw requests coalesce into a single animation frame. A picture\n // dispatched before the canvas has a size stays in pictureRef (drawing\n // while unmeasured is a no-op) and is painted by the resize path below\n // once the canvas becomes measurable, so it is never lost.\n // - A ResizeObserver on the canvas itself recreates the surface and repaints\n // synchronously (its callbacks run after layout, before paint), and is\n // also the source of the user-facing onLayout event.\n const redrawPendingRef = useRef(false);\n const frameRef = useRef(0);\n const onLayoutRef = useRef(onLayout);\n useLayoutEffect(() => {\n onLayoutRef.current = onLayout;\n }, [onLayout]);\n\n const flushRedraw = useCallback(() => {\n frameRef.current = 0;\n if (redrawPendingRef.current && rendererRef.current && pictureRef.current) {\n redrawPendingRef.current = false;\n rendererRef.current.draw(pictureRef.current);\n }\n // If the renderer or picture isn't available yet, the request stays\n // pending and is flushed by whichever arrives last.\n }, []);\n\n const redraw = useCallback(() => {\n redrawPendingRef.current = true;\n if (frameRef.current === 0) {\n frameRef.current = requestAnimationFrame(flushRedraw);\n }\n }, [flushRedraw]);\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 (rendererRef.current && pictureRef.current) {\n return rendererRef.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 isStatic = props.__destroyWebGLContextAfterRender === true;\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return undefined;\n }\n const renderer = isStatic\n ? new StaticWebGLRenderer(canvas)\n : new WebGLRenderer(canvas);\n rendererRef.current = renderer;\n\n const drawPicture = () => {\n if (pictureRef.current) {\n redrawPendingRef.current = false;\n renderer.draw(pictureRef.current);\n }\n };\n\n // The renderer constructor already sized the surface from the current\n // layout, so the observer's initial delivery only repaints if the size\n // changed in between.\n let lastWidth = canvas.clientWidth;\n let lastHeight = canvas.clientHeight;\n let lastPixelDensity = window.devicePixelRatio;\n const resizeIfNeeded = () => {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n const pixelDensity = window.devicePixelRatio;\n if (\n width === lastWidth &&\n height === lastHeight &&\n pixelDensity === lastPixelDensity\n ) {\n return;\n }\n lastWidth = width;\n lastHeight = height;\n lastPixelDensity = pixelDensity;\n renderer.onResize();\n drawPicture();\n };\n\n const observer = new ResizeObserver((entries) => {\n resizeIfNeeded();\n const layoutHandler = onLayoutRef.current;\n if (layoutHandler) {\n const { left, top, width, height } = entries[0].contentRect;\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () => layoutHandler(makeLayoutEvent(left, top, width, height)),\n 0\n );\n }\n });\n observer.observe(canvas);\n\n // A pixel-density change with no CSS size change (browser zoom, moving\n // the window to another display) doesn't trigger the ResizeObserver:\n // watch it via matchMedia, re-arming the query for each new density.\n // This degrades gracefully where unsupported: without matchMedia or\n // MediaQueryList.addEventListener (older Safari), or where the query\n // never matches because the resolution feature is unknown (Safari < 16),\n // density-only changes simply don't repaint — everything else still does.\n let media: MediaQueryList | null = null;\n const onPixelDensityChange = () => {\n resizeIfNeeded();\n watchPixelDensity();\n };\n const watchPixelDensity = () => {\n media?.removeEventListener(\"change\", onPixelDensityChange);\n media = null;\n if (typeof window.matchMedia === \"function\") {\n const query = window.matchMedia(\n `(resolution: ${window.devicePixelRatio}dppx)`\n );\n if (typeof query.addEventListener === \"function\") {\n media = query;\n media.addEventListener(\"change\", onPixelDensityChange);\n }\n }\n };\n watchPixelDensity();\n\n // Paint any picture that was dispatched before the renderer existed.\n drawPicture();\n\n return () => {\n observer.disconnect();\n media?.removeEventListener(\"change\", onPixelDensityChange);\n rendererRef.current = null;\n renderer.dispose();\n };\n }, [isStatic]);\n\n useEffect(() => {\n return () => {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = 0;\n };\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 const api = global.SkiaViewApi as ISkiaViewApiWeb;\n api.registerView(nativeID, {\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n } as SkiaPictureViewHandle);\n return () => {\n api.unregisterView(nativeID);\n };\n }, [\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n props.nativeID,\n ]);\n\n useEffect(() => {\n if (picture) {\n setPicture(picture);\n }\n }, [setPicture, picture]);\n\n const {\n debug: _debug,\n ref: _ref,\n onLayout: _onLayout,\n picture: _picture,\n __destroyWebGLContextAfterRender: _isStatic,\n ...viewProps\n } = props;\n return (\n <Platform.View {...viewProps}>\n <canvas\n ref={canvasRef}\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n />\n </Platform.View>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_JsiSkSurface","_Platform","_SkiaViewNativeId","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","dp2Pixel","pd","rect","undefined","x","y","width","height","WebGLRenderer","constructor","canvas","contextHandle","CanvasKit","GetWebGLContext","Error","grContext","MakeWebGLContext","deleteContext","ctx","getContext","drawingBufferColorSpace","onResize","makeImageSnapshot","picture","surface","getCanvas","clear","TRANSPARENT","draw","ref","flush","_this$surface","window","devicePixelRatio","clientWidth","clientHeight","delete","MakeOnScreenGLSurface","ColorSpace","SRGB","JsiSkSurface","Float32Array","of","save","scale","drawPicture","restore","dispose","_this$surface2","_this$canvas","releaseResourcesAndAbandonContext","getExtension","loseContext","StaticWebGLRenderer","cachedImage","renderPictureToSurface","tempCanvas","OffscreenCanvas","webglSurface","skiaCanvas","error","cleanupRenderResult","result","_result$surface","_result$tempCanvas$ge","renderResult","ctx2d","drawImage","console","_this$cachedImage","makeLayoutEvent","timeStamp","Date","now","nativeEvent","layout","currentTarget","target","bubbles","cancelable","defaultPrevented","eventPhase","isDefaultPrevented","isPropagationStopped","persist","preventDefault","stopPropagation","isTrusted","type","SkiaPictureView","props","onLayout","canvasRef","useRef","rendererRef","pictureRef","redrawPendingRef","flushScheduledRef","onLayoutRef","useLayoutEffect","current","flushRedraw","useCallback","redraw","queueMicrotask","getSize","_canvasRef$current","_canvasRef$current2","setPicture","newPicture","measure","callback","getBoundingClientRect","parentElement","offsetParent","parentRect","left","top","pageX","scrollX","pageY","scrollY","measureInWindow","isStatic","__destroyWebGLContextAfterRender","renderer","lastWidth","lastHeight","lastPixelDensity","resizeIfNeeded","pixelDensity","observer","ResizeObserver","entries","layoutHandler","contentRect","setTimeout","observe","media","onPixelDensityChange","watchPixelDensity","_media","removeEventListener","matchMedia","query","addEventListener","_media2","disconnect","useImperativeHandle","useEffect","_props$nativeID","nativeID","SkiaViewNativeId","api","global","SkiaViewApi","registerView","unregisterView","debug","_debug","_ref","_onLayout","_picture","_isStatic","viewProps","createElement","Platform","View","style","display","exports"],"sources":["SkiaPictureView.web.tsx"],"sourcesContent":["/* global HTMLCanvasElement, ResizeObserver, MediaQueryList */\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useImperativeHandle,\n useLayoutEffect,\n} from \"react\";\nimport type { LayoutChangeEvent } from \"react-native\";\nimport type { GrDirectContext, WebGLContextHandle } from \"canvaskit-wasm\";\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 private grContext: GrDirectContext | null = null;\n private contextHandle: WebGLContextHandle = 0;\n private pd = 1;\n\n constructor(private canvas: HTMLCanvasElement) {\n this.contextHandle = CanvasKit.GetWebGLContext(canvas);\n if (!this.contextHandle) {\n throw new Error(\"Could not create a WebGL context\");\n }\n this.grContext = CanvasKit.MakeWebGLContext(this.contextHandle);\n if (!this.grContext) {\n CanvasKit.deleteContext(this.contextHandle);\n this.contextHandle = 0;\n throw new Error(\"Could not create a graphics context\");\n }\n const ctx = canvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\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 } = this;\n if (!this.grContext) {\n return;\n }\n this.pd = window.devicePixelRatio;\n canvas.width = canvas.clientWidth * this.pd;\n canvas.height = canvas.clientHeight * this.pd;\n this.surface?.ref.delete();\n this.surface = null;\n if (canvas.width === 0 || canvas.height === 0) {\n // The canvas hasn't been laid out yet (or is hidden). The view's\n // ResizeObserver calls us again as soon as it has a size.\n return;\n }\n // Reuse the existing WebGL context and GrDirectContext: only the surface\n // needs to be recreated when the canvas is resized.\n const surface = CanvasKit.MakeOnScreenGLSurface(\n this.grContext,\n canvas.width,\n canvas.height,\n CanvasKit.ColorSpace.SRGB\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(this.pd, this.pd);\n canvas.drawPicture(picture);\n canvas.restore();\n this.surface.ref.flush();\n }\n }\n\n dispose(): void {\n this.surface?.ref.delete();\n this.surface = null;\n if (this.grContext) {\n this.grContext.releaseResourcesAndAbandonContext();\n this.grContext.delete();\n this.grContext = null;\n }\n this.canvas\n ?.getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n if (this.contextHandle) {\n // Unregister the context from CanvasKit's internal registry, otherwise\n // it retains the canvas element (and its detached DOM tree) forever.\n CanvasKit.deleteContext(this.contextHandle);\n // Making the now-deleted handle current clears CanvasKit's\n // current-context globals (GLctx/Module.ctx), which would otherwise\n // keep referencing the context (and the canvas) until another surface\n // becomes current. With a deleted handle this is a no-op that returns\n // null without creating anything.\n CanvasKit.MakeWebGLContext(this.contextHandle);\n this.contextHandle = 0;\n }\n }\n}\n\ninterface TempRenderResult {\n surface: JsiSkSurface;\n tempCanvas: OffscreenCanvas;\n grContext: GrDirectContext;\n contextHandle: WebGLContextHandle;\n}\n\nclass StaticWebGLRenderer implements Renderer {\n private cachedImage: SkImage | null = null;\n private pd = 1;\n\n constructor(private canvas: HTMLCanvasElement) {}\n\n onResize(): void {\n this.cachedImage = null;\n }\n\n private renderPictureToSurface(picture: SkPicture): TempRenderResult | null {\n this.pd = window.devicePixelRatio;\n if (this.canvas.clientWidth === 0 || this.canvas.clientHeight === 0) {\n return null;\n }\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 let grContext: GrDirectContext | null = null;\n let contextHandle: WebGLContextHandle = 0;\n\n try {\n contextHandle = CanvasKit.GetWebGLContext(tempCanvas);\n if (!contextHandle) {\n throw new Error(\"Could not create a WebGL context\");\n }\n grContext = CanvasKit.MakeWebGLContext(contextHandle);\n if (!grContext) {\n throw new Error(\"Could not create a graphics context\");\n }\n const ctx = tempCanvas.getContext(\"webgl2\");\n if (ctx) {\n ctx.drawingBufferColorSpace = \"display-p3\";\n }\n const webglSurface = CanvasKit.MakeOnScreenGLSurface(\n grContext,\n tempCanvas.width,\n tempCanvas.height,\n CanvasKit.ColorSpace.SRGB\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, grContext, contextHandle };\n } catch (error) {\n this.cleanupRenderResult({\n surface,\n tempCanvas,\n grContext,\n contextHandle,\n });\n return null;\n }\n }\n\n private cleanupRenderResult(result: {\n surface: JsiSkSurface | null;\n tempCanvas: OffscreenCanvas;\n grContext: GrDirectContext | null;\n contextHandle: WebGLContextHandle;\n }): void {\n result.surface?.ref.delete();\n if (result.grContext) {\n result.grContext.releaseResourcesAndAbandonContext();\n result.grContext.delete();\n }\n result.tempCanvas\n .getContext(\"webgl2\")\n ?.getExtension(\"WEBGL_lose_context\")\n ?.loseContext();\n if (result.contextHandle) {\n // Unregister the context from CanvasKit's internal registry, otherwise\n // it retains the OffscreenCanvas forever.\n CanvasKit.deleteContext(result.contextHandle);\n // Clear CanvasKit's current-context globals (see WebGLRenderer.dispose).\n CanvasKit.MakeWebGLContext(result.contextHandle);\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 this.cleanupRenderResult(renderResult);\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.cleanupRenderResult(renderResult);\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 try {\n this.cachedImage = renderResult.surface.makeImageSnapshot(\n dp2Pixel(this.pd, rect)\n );\n } catch (error) {\n console.error(\"Error creating image snapshot:\", error);\n } finally {\n this.cleanupRenderResult(renderResult);\n }\n }\n\n return this.cachedImage;\n }\n\n dispose(): void {\n this.cachedImage?.dispose();\n this.cachedImage = null;\n }\n}\n\n// Mirrors the event react-native-web synthesizes for onLayout.\nconst makeLayoutEvent = (\n x: number,\n y: number,\n width: number,\n height: number\n): LayoutChangeEvent => ({\n timeStamp: Date.now(),\n nativeEvent: { layout: { x, y, width, height } },\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n currentTarget: 0,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n target: 0,\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isDefaultPrevented() {\n throw new Error(\"Method not supported on web.\");\n },\n isPropagationStopped() {\n throw new Error(\"Method not supported on web.\");\n },\n persist() {\n throw new Error(\"Method not supported on web.\");\n },\n preventDefault() {\n throw new Error(\"Method not supported on web.\");\n },\n stopPropagation() {\n throw new Error(\"Method not supported on web.\");\n },\n isTrusted: true,\n type: \"\",\n});\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 interface SkiaPictureViewProps extends SkiaPictureViewNativeProps {\n ref?: React.Ref<SkiaPictureViewHandle>;\n}\n\nexport const SkiaPictureView = (props: SkiaPictureViewProps) => {\n const { ref, picture, onLayout } = props;\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rendererRef = useRef<Renderer | null>(null);\n const pictureRef = useRef<SkPicture | null>(null);\n // The rendering lifecycle deliberately does not depend on layout events:\n // - The renderer is created synchronously on mount (the canvas element is\n // guaranteed to exist in useLayoutEffect; a zero size at that point is\n // fine, the surface is created once the canvas is measurable).\n // - Redraw requests coalesce into a single microtask. A microtask (not an\n // animation frame) so that a picture produced inside a rAF callback (the\n // Reanimated mapper) is drawn before the current frame paints: deferring\n // to the next rAF alternates between \"flush pending in this frame\" and\n // \"flush scheduled for the next frame\", drawing on every other frame\n // only and halving the effective frame rate. A picture dispatched before\n // the canvas has a size stays in pictureRef (drawing while unmeasured is\n // a no-op) and is painted by the resize path below once the canvas\n // becomes measurable, so it is never lost.\n // - A ResizeObserver on the canvas itself recreates the surface and repaints\n // synchronously (its callbacks run after layout, before paint), and is\n // also the source of the user-facing onLayout event.\n const redrawPendingRef = useRef(false);\n const flushScheduledRef = useRef(false);\n const onLayoutRef = useRef(onLayout);\n useLayoutEffect(() => {\n onLayoutRef.current = onLayout;\n }, [onLayout]);\n\n const flushRedraw = useCallback(() => {\n flushScheduledRef.current = false;\n if (redrawPendingRef.current && rendererRef.current && pictureRef.current) {\n redrawPendingRef.current = false;\n rendererRef.current.draw(pictureRef.current);\n }\n // If the renderer or picture isn't available yet, the request stays\n // pending and is flushed by whichever arrives last.\n }, []);\n\n const redraw = useCallback(() => {\n redrawPendingRef.current = true;\n if (!flushScheduledRef.current) {\n flushScheduledRef.current = true;\n queueMicrotask(flushRedraw);\n }\n }, [flushRedraw]);\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 (rendererRef.current && pictureRef.current) {\n return rendererRef.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 isStatic = props.__destroyWebGLContextAfterRender === true;\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return undefined;\n }\n const renderer = isStatic\n ? new StaticWebGLRenderer(canvas)\n : new WebGLRenderer(canvas);\n rendererRef.current = renderer;\n\n const drawPicture = () => {\n if (pictureRef.current) {\n redrawPendingRef.current = false;\n renderer.draw(pictureRef.current);\n }\n };\n\n // The renderer constructor already sized the surface from the current\n // layout, so the observer's initial delivery only repaints if the size\n // changed in between.\n let lastWidth = canvas.clientWidth;\n let lastHeight = canvas.clientHeight;\n let lastPixelDensity = window.devicePixelRatio;\n const resizeIfNeeded = () => {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n const pixelDensity = window.devicePixelRatio;\n if (\n width === lastWidth &&\n height === lastHeight &&\n pixelDensity === lastPixelDensity\n ) {\n return;\n }\n lastWidth = width;\n lastHeight = height;\n lastPixelDensity = pixelDensity;\n renderer.onResize();\n drawPicture();\n };\n\n const observer = new ResizeObserver((entries) => {\n resizeIfNeeded();\n const layoutHandler = onLayoutRef.current;\n if (layoutHandler) {\n const { left, top, width, height } = entries[0].contentRect;\n // setTimeout 0 is taken from react-native-web (UIManager)\n setTimeout(\n () => layoutHandler(makeLayoutEvent(left, top, width, height)),\n 0\n );\n }\n });\n observer.observe(canvas);\n\n // A pixel-density change with no CSS size change (browser zoom, moving\n // the window to another display) doesn't trigger the ResizeObserver:\n // watch it via matchMedia, re-arming the query for each new density.\n // This degrades gracefully where unsupported: without matchMedia or\n // MediaQueryList.addEventListener (older Safari), or where the query\n // never matches because the resolution feature is unknown (Safari < 16),\n // density-only changes simply don't repaint — everything else still does.\n let media: MediaQueryList | null = null;\n const onPixelDensityChange = () => {\n resizeIfNeeded();\n watchPixelDensity();\n };\n const watchPixelDensity = () => {\n media?.removeEventListener(\"change\", onPixelDensityChange);\n media = null;\n if (typeof window.matchMedia === \"function\") {\n const query = window.matchMedia(\n `(resolution: ${window.devicePixelRatio}dppx)`\n );\n if (typeof query.addEventListener === \"function\") {\n media = query;\n media.addEventListener(\"change\", onPixelDensityChange);\n }\n }\n };\n watchPixelDensity();\n\n // Paint any picture that was dispatched before the renderer existed.\n drawPicture();\n\n return () => {\n observer.disconnect();\n media?.removeEventListener(\"change\", onPixelDensityChange);\n rendererRef.current = null;\n renderer.dispose();\n };\n }, [isStatic]);\n\n // No flush cancellation is needed on unmount: a microtask queued before\n // unmount runs within the same task, and flushRedraw no-ops once the\n // layout-effect cleanup has nulled rendererRef.\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 const api = global.SkiaViewApi as ISkiaViewApiWeb;\n api.registerView(nativeID, {\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n } as SkiaPictureViewHandle);\n return () => {\n api.unregisterView(nativeID);\n };\n }, [\n setPicture,\n getSize,\n redraw,\n makeImageSnapshot,\n measure,\n measureInWindow,\n props.nativeID,\n ]);\n\n useEffect(() => {\n if (picture) {\n setPicture(picture);\n }\n }, [setPicture, picture]);\n\n const {\n debug: _debug,\n ref: _ref,\n onLayout: _onLayout,\n picture: _picture,\n __destroyWebGLContextAfterRender: _isStatic,\n ...viewProps\n } = props;\n return (\n <Platform.View {...viewProps}>\n <canvas\n ref={canvasRef}\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n />\n </Platform.View>\n );\n};\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAWA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAIA,IAAAG,iBAAA,GAAAH,OAAA;AAAsD,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,CAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAkB,gBAAAnB,CAAA,EAAAG,CAAA,EAAAF,CAAA,YAAAE,CAAA,GAAAiB,cAAA,CAAAjB,CAAA,MAAAH,CAAA,GAAAgB,MAAA,CAAAC,cAAA,CAAAjB,CAAA,EAAAG,CAAA,IAAAkB,KAAA,EAAApB,CAAA,EAAAqB,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAxB,CAAA,CAAAG,CAAA,IAAAF,CAAA,EAAAD,CAAA;AAAA,SAAAoB,eAAAnB,CAAA,QAAAM,CAAA,GAAAkB,YAAA,CAAAxB,CAAA,uCAAAM,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAkB,aAAAxB,CAAA,EAAAE,CAAA,2BAAAF,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAD,CAAA,GAAAC,CAAA,CAAAyB,MAAA,CAAAC,WAAA,kBAAA3B,CAAA,QAAAO,CAAA,GAAAP,CAAA,CAAAe,IAAA,CAAAd,CAAA,EAAAE,CAAA,uCAAAI,CAAA,SAAAA,CAAA,YAAAqB,SAAA,yEAAAzB,CAAA,GAAA0B,MAAA,GAAAC,MAAA,EAAA7B,CAAA,KAjBtD;AAmBA,MAAM8B,QAAQ,GAAGA,CAACC,EAAU,EAAEC,IAAa,KAAK;EAC9C,IAAI,CAACA,IAAI,EAAE;IACT,OAAOC,SAAS;EAClB;EACA,OAAO;IACLC,CAAC,EAAEF,IAAI,CAACE,CAAC,GAAGH,EAAE;IACdI,CAAC,EAAEH,IAAI,CAACG,CAAC,GAAGJ,EAAE;IACdK,KAAK,EAAEJ,IAAI,CAACI,KAAK,GAAGL,EAAE;IACtBM,MAAM,EAAEL,IAAI,CAACK,MAAM,GAAGN;EACxB,CAAC;AACH,CAAC;AASD,MAAMO,aAAa,CAAqB;EAMtCC,WAAWA,CAASC,MAAyB,EAAE;IAAA,KAA3BA,MAAyB,GAAzBA,MAAyB;IAAAtB,eAAA,kBALN,IAAI;IAAAA,eAAA,oBACC,IAAI;IAAAA,eAAA,wBACJ,CAAC;IAAAA,eAAA,aAChC,CAAC;IAGZ,IAAI,CAACuB,aAAa,GAAGC,SAAS,CAACC,eAAe,CAACH,MAAM,CAAC;IACtD,IAAI,CAAC,IAAI,CAACC,aAAa,EAAE;MACvB,MAAM,IAAIG,KAAK,CAAC,kCAAkC,CAAC;IACrD;IACA,IAAI,CAACC,SAAS,GAAGH,SAAS,CAACI,gBAAgB,CAAC,IAAI,CAACL,aAAa,CAAC;IAC/D,IAAI,CAAC,IAAI,CAACI,SAAS,EAAE;MACnBH,SAAS,CAACK,aAAa,CAAC,IAAI,CAACN,aAAa,CAAC;MAC3C,IAAI,CAACA,aAAa,GAAG,CAAC;MACtB,MAAM,IAAIG,KAAK,CAAC,qCAAqC,CAAC;IACxD;IACA,MAAMI,GAAG,GAAGR,MAAM,CAACS,UAAU,CAAC,QAAQ,CAAC;IACvC,IAAID,GAAG,EAAE;MACPA,GAAG,CAACE,uBAAuB,GAAG,YAAY;IAC5C;IACA,IAAI,CAACC,QAAQ,CAAC,CAAC;EACjB;EAEAC,iBAAiBA,CAACC,OAAkB,EAAErB,IAAa,EAAkB;IACnE,IAAI,CAAC,IAAI,CAACsB,OAAO,EAAE;MACjB,OAAO,IAAI;IACb;IACA,MAAMd,MAAM,GAAG,IAAI,CAACc,OAAO,CAACC,SAAS,CAAC,CAAC;IACvCf,MAAM,CAAEgB,KAAK,CAACd,SAAS,CAACe,WAAW,CAAC;IACpC,IAAI,CAACC,IAAI,CAACL,OAAO,CAAC;IAClB,IAAI,CAACC,OAAO,CAACK,GAAG,CAACC,KAAK,CAAC,CAAC;IACxB,OAAO,IAAI,CAACN,OAAO,CAACF,iBAAiB,CAACtB,QAAQ,CAAC,IAAI,CAACC,EAAE,EAAEC,IAAI,CAAC,CAAC;EAChE;EAEAmB,QAAQA,CAAA,EAAG;IAAA,IAAAU,aAAA;IACT,MAAM;MAAErB;IAAO,CAAC,GAAG,IAAI;IACvB,IAAI,CAAC,IAAI,CAACK,SAAS,EAAE;MACnB;IACF;IACA,IAAI,CAACd,EAAE,GAAG+B,MAAM,CAACC,gBAAgB;IACjCvB,MAAM,CAACJ,KAAK,GAAGI,MAAM,CAACwB,WAAW,GAAG,IAAI,CAACjC,EAAE;IAC3CS,MAAM,CAACH,MAAM,GAAGG,MAAM,CAACyB,YAAY,GAAG,IAAI,CAAClC,EAAE;IAC7C,CAAA8B,aAAA,OAAI,CAACP,OAAO,cAAAO,aAAA,eAAZA,aAAA,CAAcF,GAAG,CAACO,MAAM,CAAC,CAAC;IAC1B,IAAI,CAACZ,OAAO,GAAG,IAAI;IACnB,IAAId,MAAM,CAACJ,KAAK,KAAK,CAAC,IAAII,MAAM,CAACH,MAAM,KAAK,CAAC,EAAE;MAC7C;MACA;MACA;IACF;IACA;IACA;IACA,MAAMiB,OAAO,GAAGZ,SAAS,CAACyB,qBAAqB,CAC7C,IAAI,CAACtB,SAAS,EACdL,MAAM,CAACJ,KAAK,EACZI,MAAM,CAACH,MAAM,EACbK,SAAS,CAAC0B,UAAU,CAACC,IACvB,CAAC;IACD,IAAI,CAACf,OAAO,EAAE;MACZ,MAAM,IAAIV,KAAK,CAAC,0BAA0B,CAAC;IAC7C;IACA,IAAI,CAACU,OAAO,GAAG,IAAIgB,0BAAY,CAAC5B,SAAS,EAAEY,OAAO,CAAC;EACrD;EAEAI,IAAIA,CAACL,OAAkB,EAAE;IACvB,IAAI,IAAI,CAACC,OAAO,EAAE;MAChB,MAAMd,MAAM,GAAG,IAAI,CAACc,OAAO,CAACC,SAAS,CAAC,CAAC;MACvCf,MAAM,CAACgB,KAAK,CAACe,YAAY,CAACC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;MACzChC,MAAM,CAACiC,IAAI,CAAC,CAAC;MACbjC,MAAM,CAACkC,KAAK,CAAC,IAAI,CAAC3C,EAAE,EAAE,IAAI,CAACA,EAAE,CAAC;MAC9BS,MAAM,CAACmC,WAAW,CAACtB,OAAO,CAAC;MAC3Bb,MAAM,CAACoC,OAAO,CAAC,CAAC;MAChB,IAAI,CAACtB,OAAO,CAACK,GAAG,CAACC,KAAK,CAAC,CAAC;IAC1B;EACF;EAEAiB,OAAOA,CAAA,EAAS;IAAA,IAAAC,cAAA,EAAAC,YAAA;IACd,CAAAD,cAAA,OAAI,CAACxB,OAAO,cAAAwB,cAAA,eAAZA,cAAA,CAAcnB,GAAG,CAACO,MAAM,CAAC,CAAC;IAC1B,IAAI,CAACZ,OAAO,GAAG,IAAI;IACnB,IAAI,IAAI,CAACT,SAAS,EAAE;MAClB,IAAI,CAACA,SAAS,CAACmC,iCAAiC,CAAC,CAAC;MAClD,IAAI,CAACnC,SAAS,CAACqB,MAAM,CAAC,CAAC;MACvB,IAAI,CAACrB,SAAS,GAAG,IAAI;IACvB;IACA,CAAAkC,YAAA,OAAI,CAACvC,MAAM,cAAAuC,YAAA,gBAAAA,YAAA,GAAXA,YAAA,CACI9B,UAAU,CAAC,QAAQ,CAAC,cAAA8B,YAAA,gBAAAA,YAAA,GADxBA,YAAA,CAEIE,YAAY,CAAC,oBAAoB,CAAC,cAAAF,YAAA,eAFtCA,YAAA,CAGIG,WAAW,CAAC,CAAC;IACjB,IAAI,IAAI,CAACzC,aAAa,EAAE;MACtB;MACA;MACAC,SAAS,CAACK,aAAa,CAAC,IAAI,CAACN,aAAa,CAAC;MAC3C;MACA;MACA;MACA;MACA;MACAC,SAAS,CAACI,gBAAgB,CAAC,IAAI,CAACL,aAAa,CAAC;MAC9C,IAAI,CAACA,aAAa,GAAG,CAAC;IACxB;EACF;AACF;AASA,MAAM0C,mBAAmB,CAAqB;EAI5C5C,WAAWA,CAASC,MAAyB,EAAE;IAAA,KAA3BA,MAAyB,GAAzBA,MAAyB;IAAAtB,eAAA,sBAHP,IAAI;IAAAA,eAAA,aAC7B,CAAC;EAEkC;EAEhDiC,QAAQA,CAAA,EAAS;IACf,IAAI,CAACiC,WAAW,GAAG,IAAI;EACzB;EAEQC,sBAAsBA,CAAChC,OAAkB,EAA2B;IAC1E,IAAI,CAACtB,EAAE,GAAG+B,MAAM,CAACC,gBAAgB;IACjC,IAAI,IAAI,CAACvB,MAAM,CAACwB,WAAW,KAAK,CAAC,IAAI,IAAI,CAACxB,MAAM,CAACyB,YAAY,KAAK,CAAC,EAAE;MACnE,OAAO,IAAI;IACb;IACA,MAAMqB,UAAU,GAAG,IAAIC,eAAe,CACpC,IAAI,CAAC/C,MAAM,CAACwB,WAAW,GAAG,IAAI,CAACjC,EAAE,EACjC,IAAI,CAACS,MAAM,CAACyB,YAAY,GAAG,IAAI,CAAClC,EAClC,CAAC;IAED,IAAIuB,OAA4B,GAAG,IAAI;IACvC,IAAIT,SAAiC,GAAG,IAAI;IAC5C,IAAIJ,aAAiC,GAAG,CAAC;IAEzC,IAAI;MACFA,aAAa,GAAGC,SAAS,CAACC,eAAe,CAAC2C,UAAU,CAAC;MACrD,IAAI,CAAC7C,aAAa,EAAE;QAClB,MAAM,IAAIG,KAAK,CAAC,kCAAkC,CAAC;MACrD;MACAC,SAAS,GAAGH,SAAS,CAACI,gBAAgB,CAACL,aAAa,CAAC;MACrD,IAAI,CAACI,SAAS,EAAE;QACd,MAAM,IAAID,KAAK,CAAC,qCAAqC,CAAC;MACxD;MACA,MAAMI,GAAG,GAAGsC,UAAU,CAACrC,UAAU,CAAC,QAAQ,CAAC;MAC3C,IAAID,GAAG,EAAE;QACPA,GAAG,CAACE,uBAAuB,GAAG,YAAY;MAC5C;MACA,MAAMsC,YAAY,GAAG9C,SAAS,CAACyB,qBAAqB,CAClDtB,SAAS,EACTyC,UAAU,CAAClD,KAAK,EAChBkD,UAAU,CAACjD,MAAM,EACjBK,SAAS,CAAC0B,UAAU,CAACC,IACvB,CAAC;MAED,IAAI,CAACmB,YAAY,EAAE;QACjB,MAAM,IAAI5C,KAAK,CAAC,gCAAgC,CAAC;MACnD;MAEAU,OAAO,GAAG,IAAIgB,0BAAY,CAAC5B,SAAS,EAAE8C,YAAY,CAAC;MAEnD,MAAMC,UAAU,GAAGnC,OAAO,CAACC,SAAS,CAAC,CAAC;MACtCkC,UAAU,CAACjC,KAAK,CAACe,YAAY,CAACC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;MAC7CiB,UAAU,CAAChB,IAAI,CAAC,CAAC;MACjBgB,UAAU,CAACf,KAAK,CAAC,IAAI,CAAC3C,EAAE,EAAE,IAAI,CAACA,EAAE,CAAC;MAClC0D,UAAU,CAACd,WAAW,CAACtB,OAAO,CAAC;MAC/BoC,UAAU,CAACb,OAAO,CAAC,CAAC;MACpBtB,OAAO,CAACK,GAAG,CAACC,KAAK,CAAC,CAAC;MAEnB,OAAO;QAAEN,OAAO;QAAEgC,UAAU;QAAEzC,SAAS;QAAEJ;MAAc,CAAC;IAC1D,CAAC,CAAC,OAAOiD,KAAK,EAAE;MACd,IAAI,CAACC,mBAAmB,CAAC;QACvBrC,OAAO;QACPgC,UAAU;QACVzC,SAAS;QACTJ;MACF,CAAC,CAAC;MACF,OAAO,IAAI;IACb;EACF;EAEQkD,mBAAmBA,CAACC,MAK3B,EAAQ;IAAA,IAAAC,eAAA,EAAAC,qBAAA;IACP,CAAAD,eAAA,GAAAD,MAAM,CAACtC,OAAO,cAAAuC,eAAA,eAAdA,eAAA,CAAgBlC,GAAG,CAACO,MAAM,CAAC,CAAC;IAC5B,IAAI0B,MAAM,CAAC/C,SAAS,EAAE;MACpB+C,MAAM,CAAC/C,SAAS,CAACmC,iCAAiC,CAAC,CAAC;MACpDY,MAAM,CAAC/C,SAAS,CAACqB,MAAM,CAAC,CAAC;IAC3B;IACA,CAAA4B,qBAAA,GAAAF,MAAM,CAACN,UAAU,CACdrC,UAAU,CAAC,QAAQ,CAAC,cAAA6C,qBAAA,gBAAAA,qBAAA,GADvBA,qBAAA,CAEIb,YAAY,CAAC,oBAAoB,CAAC,cAAAa,qBAAA,eAFtCA,qBAAA,CAGIZ,WAAW,CAAC,CAAC;IACjB,IAAIU,MAAM,CAACnD,aAAa,EAAE;MACxB;MACA;MACAC,SAAS,CAACK,aAAa,CAAC6C,MAAM,CAACnD,aAAa,CAAC;MAC7C;MACAC,SAAS,CAACI,gBAAgB,CAAC8C,MAAM,CAACnD,aAAa,CAAC;IAClD;EACF;EAEAiB,IAAIA,CAACL,OAAkB,EAAQ;IAC7B,MAAM0C,YAAY,GAAG,IAAI,CAACV,sBAAsB,CAAChC,OAAO,CAAC;IACzD,IAAI,CAAC0C,YAAY,EAAE;MACjB;IACF;IACA,MAAM;MAAET;IAAW,CAAC,GAAGS,YAAY;IACnC,MAAMC,KAAK,GAAG,IAAI,CAACxD,MAAM,CAACS,UAAU,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC+C,KAAK,EAAE;MACV,IAAI,CAACL,mBAAmB,CAACI,YAAY,CAAC;MACtC,MAAM,IAAInD,KAAK,CAAC,0BAA0B,CAAC;IAC7C;;IAEA;IACA,IAAI,CAACJ,MAAM,CAACJ,KAAK,GAAG,IAAI,CAACI,MAAM,CAACwB,WAAW,GAAG,IAAI,CAACjC,EAAE;IACrD,IAAI,CAACS,MAAM,CAACH,MAAM,GAAG,IAAI,CAACG,MAAM,CAACyB,YAAY,GAAG,IAAI,CAAClC,EAAE;;IAEvD;IACAiE,KAAK,CAACC,SAAS,CACbX,UAAU,EACV,CAAC,EACD,CAAC,EACDA,UAAU,CAAClD,KAAK,EAChBkD,UAAU,CAACjD,MAAM,EACjB,CAAC,EACD,CAAC,EACD,IAAI,CAACG,MAAM,CAACwB,WAAW,GAAG,IAAI,CAACjC,EAAE,EACjC,IAAI,CAACS,MAAM,CAACyB,YAAY,GAAG,IAAI,CAAClC,EAClC,CAAC;IAED,IAAI,CAAC4D,mBAAmB,CAACI,YAAY,CAAC;EACxC;EAEA3C,iBAAiBA,CAACC,OAAkB,EAAErB,IAAa,EAAkB;IACnE,IAAI,CAAC,IAAI,CAACoD,WAAW,EAAE;MACrB,MAAMW,YAAY,GAAG,IAAI,CAACV,sBAAsB,CAAChC,OAAO,CAAC;MACzD,IAAI,CAAC0C,YAAY,EAAE;QACjB,OAAO,IAAI;MACb;MAEA,IAAI;QACF,IAAI,CAACX,WAAW,GAAGW,YAAY,CAACzC,OAAO,CAACF,iBAAiB,CACvDtB,QAAQ,CAAC,IAAI,CAACC,EAAE,EAAEC,IAAI,CACxB,CAAC;MACH,CAAC,CAAC,OAAO0D,KAAK,EAAE;QACdQ,OAAO,CAACR,KAAK,CAAC,gCAAgC,EAAEA,KAAK,CAAC;MACxD,CAAC,SAAS;QACR,IAAI,CAACC,mBAAmB,CAACI,YAAY,CAAC;MACxC;IACF;IAEA,OAAO,IAAI,CAACX,WAAW;EACzB;EAEAP,OAAOA,CAAA,EAAS;IAAA,IAAAsB,iBAAA;IACd,CAAAA,iBAAA,OAAI,CAACf,WAAW,cAAAe,iBAAA,eAAhBA,iBAAA,CAAkBtB,OAAO,CAAC,CAAC;IAC3B,IAAI,CAACO,WAAW,GAAG,IAAI;EACzB;AACF;;AAEA;AACA,MAAMgB,eAAe,GAAGA,CACtBlE,CAAS,EACTC,CAAS,EACTC,KAAa,EACbC,MAAc,MACS;EACvBgE,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;EACrBC,WAAW,EAAE;IAAEC,MAAM,EAAE;MAAEvE,CAAC;MAAEC,CAAC;MAAEC,KAAK;MAAEC;IAAO;EAAE,CAAC;EAChD;EACA;EACAqE,aAAa,EAAE,CAAC;EAChB;EACA;EACAC,MAAM,EAAE,CAAC;EACTC,OAAO,EAAE,KAAK;EACdC,UAAU,EAAE,KAAK;EACjBC,gBAAgB,EAAE,KAAK;EACvBC,UAAU,EAAE,CAAC;EACbC,kBAAkBA,CAAA,EAAG;IACnB,MAAM,IAAIpE,KAAK,CAAC,8BAA8B,CAAC;EACjD,CAAC;EACDqE,oBAAoBA,CAAA,EAAG;IACrB,MAAM,IAAIrE,KAAK,CAAC,8BAA8B,CAAC;EACjD,CAAC;EACDsE,OAAOA,CAAA,EAAG;IACR,MAAM,IAAItE,KAAK,CAAC,8BAA8B,CAAC;EACjD,CAAC;EACDuE,cAAcA,CAAA,EAAG;IACf,MAAM,IAAIvE,KAAK,CAAC,8BAA8B,CAAC;EACjD,CAAC;EACDwE,eAAeA,CAAA,EAAG;IAChB,MAAM,IAAIxE,KAAK,CAAC,8BAA8B,CAAC;EACjD,CAAC;EACDyE,SAAS,EAAE,IAAI;EACfC,IAAI,EAAE;AACR,CAAC,CAAC;AA0BK,MAAMC,eAAe,GAAIC,KAA2B,IAAK;EAC9D,MAAM;IAAE7D,GAAG;IAAEN,OAAO;IAAEoE;EAAS,CAAC,GAAGD,KAAK;EACxC,MAAME,SAAS,GAAG,IAAAC,aAAM,EAA2B,IAAI,CAAC;EACxD,MAAMC,WAAW,GAAG,IAAAD,aAAM,EAAkB,IAAI,CAAC;EACjD,MAAME,UAAU,GAAG,IAAAF,aAAM,EAAmB,IAAI,CAAC;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMG,gBAAgB,GAAG,IAAAH,aAAM,EAAC,KAAK,CAAC;EACtC,MAAMI,iBAAiB,GAAG,IAAAJ,aAAM,EAAC,KAAK,CAAC;EACvC,MAAMK,WAAW,GAAG,IAAAL,aAAM,EAACF,QAAQ,CAAC;EACpC,IAAAQ,sBAAe,EAAC,MAAM;IACpBD,WAAW,CAACE,OAAO,GAAGT,QAAQ;EAChC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMU,WAAW,GAAG,IAAAC,kBAAW,EAAC,MAAM;IACpCL,iBAAiB,CAACG,OAAO,GAAG,KAAK;IACjC,IAAIJ,gBAAgB,CAACI,OAAO,IAAIN,WAAW,CAACM,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE;MACzEJ,gBAAgB,CAACI,OAAO,GAAG,KAAK;MAChCN,WAAW,CAACM,OAAO,CAACxE,IAAI,CAACmE,UAAU,CAACK,OAAO,CAAC;IAC9C;IACA;IACA;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,MAAM,GAAG,IAAAD,kBAAW,EAAC,MAAM;IAC/BN,gBAAgB,CAACI,OAAO,GAAG,IAAI;IAC/B,IAAI,CAACH,iBAAiB,CAACG,OAAO,EAAE;MAC9BH,iBAAiB,CAACG,OAAO,GAAG,IAAI;MAChCI,cAAc,CAACH,WAAW,CAAC;IAC7B;EACF,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;EAEjB,MAAMI,OAAO,GAAG,IAAAH,kBAAW,EAAC,MAAM;IAAA,IAAAI,kBAAA,EAAAC,mBAAA;IAChC,OAAO;MACLrG,KAAK,EAAE,EAAAoG,kBAAA,GAAAd,SAAS,CAACQ,OAAO,cAAAM,kBAAA,uBAAjBA,kBAAA,CAAmBxE,WAAW,KAAI,CAAC;MAC1C3B,MAAM,EAAE,EAAAoG,mBAAA,GAAAf,SAAS,CAACQ,OAAO,cAAAO,mBAAA,uBAAjBA,mBAAA,CAAmBxE,YAAY,KAAI;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMyE,UAAU,GAAG,IAAAN,kBAAW,EAC3BO,UAAqB,IAAK;IACzBd,UAAU,CAACK,OAAO,GAAGS,UAAU;IAC/BN,MAAM,CAAC,CAAC;EACV,CAAC,EACD,CAACA,MAAM,CACT,CAAC;EAED,MAAMjF,iBAAiB,GAAG,IAAAgF,kBAAW,EAAEpG,IAAa,IAAK;IACvD,IAAI4F,WAAW,CAACM,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE;MAC7C,OAAON,WAAW,CAACM,OAAO,CAAC9E,iBAAiB,CAACyE,UAAU,CAACK,OAAO,EAAElG,IAAI,CAAC;IACxE;IACA,OAAO,IAAI;EACb,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM4G,OAAO,GAAG,IAAAR,kBAAW,EAEvBS,QAOS,IACN;IACH,IAAInB,SAAS,CAACQ,OAAO,EAAE;MACrB,MAAMlG,IAAI,GAAG0F,SAAS,CAACQ,OAAO,CAACY,qBAAqB,CAAC,CAAC;MACtD,MAAMC,aAAa,GAAGrB,SAAS,CAACQ,OAAO,CAACc,YAA2B;MACnE,MAAMC,UAAU,GAAG,CAAAF,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAED,qBAAqB,CAAC,CAAC,KAAI;QAC3DI,IAAI,EAAE,CAAC;QACPC,GAAG,EAAE;MACP,CAAC;;MAED;MACA,MAAMjH,CAAC,GAAGF,IAAI,CAACkH,IAAI,GAAGD,UAAU,CAACC,IAAI;MACrC,MAAM/G,CAAC,GAAGH,IAAI,CAACmH,GAAG,GAAGF,UAAU,CAACE,GAAG;;MAEnC;MACA,MAAMC,KAAK,GAAGpH,IAAI,CAACkH,IAAI,GAAGpF,MAAM,CAACuF,OAAO;MACxC,MAAMC,KAAK,GAAGtH,IAAI,CAACmH,GAAG,GAAGrF,MAAM,CAACyF,OAAO;MAEvCV,QAAQ,CAAC3G,CAAC,EAAEC,CAAC,EAAEH,IAAI,CAACI,KAAK,EAAEJ,IAAI,CAACK,MAAM,EAAE+G,KAAK,EAAEE,KAAK,CAAC;IACvD;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAME,eAAe,GAAG,IAAApB,kBAAW,EAE/BS,QAAuE,IACpE;IACH,IAAInB,SAAS,CAACQ,OAAO,EAAE;MACrB,MAAMlG,IAAI,GAAG0F,SAAS,CAACQ,OAAO,CAACY,qBAAqB,CAAC,CAAC;;MAEtD;MACA,MAAM5G,CAAC,GAAGF,IAAI,CAACkH,IAAI;MACnB,MAAM/G,CAAC,GAAGH,IAAI,CAACmH,GAAG;MAElBN,QAAQ,CAAC3G,CAAC,EAAEC,CAAC,EAAEH,IAAI,CAACI,KAAK,EAAEJ,IAAI,CAACK,MAAM,CAAC;IACzC;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMoH,QAAQ,GAAGjC,KAAK,CAACkC,gCAAgC,KAAK,IAAI;EAEhE,IAAAzB,sBAAe,EAAC,MAAM;IACpB,MAAMzF,MAAM,GAAGkF,SAAS,CAACQ,OAAO;IAChC,IAAI,CAAC1F,MAAM,EAAE;MACX,OAAOP,SAAS;IAClB;IACA,MAAM0H,QAAQ,GAAGF,QAAQ,GACrB,IAAItE,mBAAmB,CAAC3C,MAAM,CAAC,GAC/B,IAAIF,aAAa,CAACE,MAAM,CAAC;IAC7BoF,WAAW,CAACM,OAAO,GAAGyB,QAAQ;IAE9B,MAAMhF,WAAW,GAAGA,CAAA,KAAM;MACxB,IAAIkD,UAAU,CAACK,OAAO,EAAE;QACtBJ,gBAAgB,CAACI,OAAO,GAAG,KAAK;QAChCyB,QAAQ,CAACjG,IAAI,CAACmE,UAAU,CAACK,OAAO,CAAC;MACnC;IACF,CAAC;;IAED;IACA;IACA;IACA,IAAI0B,SAAS,GAAGpH,MAAM,CAACwB,WAAW;IAClC,IAAI6F,UAAU,GAAGrH,MAAM,CAACyB,YAAY;IACpC,IAAI6F,gBAAgB,GAAGhG,MAAM,CAACC,gBAAgB;IAC9C,MAAMgG,cAAc,GAAGA,CAAA,KAAM;MAC3B,MAAM3H,KAAK,GAAGI,MAAM,CAACwB,WAAW;MAChC,MAAM3B,MAAM,GAAGG,MAAM,CAACyB,YAAY;MAClC,MAAM+F,YAAY,GAAGlG,MAAM,CAACC,gBAAgB;MAC5C,IACE3B,KAAK,KAAKwH,SAAS,IACnBvH,MAAM,KAAKwH,UAAU,IACrBG,YAAY,KAAKF,gBAAgB,EACjC;QACA;MACF;MACAF,SAAS,GAAGxH,KAAK;MACjByH,UAAU,GAAGxH,MAAM;MACnByH,gBAAgB,GAAGE,YAAY;MAC/BL,QAAQ,CAACxG,QAAQ,CAAC,CAAC;MACnBwB,WAAW,CAAC,CAAC;IACf,CAAC;IAED,MAAMsF,QAAQ,GAAG,IAAIC,cAAc,CAAEC,OAAO,IAAK;MAC/CJ,cAAc,CAAC,CAAC;MAChB,MAAMK,aAAa,GAAGpC,WAAW,CAACE,OAAO;MACzC,IAAIkC,aAAa,EAAE;QACjB,MAAM;UAAElB,IAAI;UAAEC,GAAG;UAAE/G,KAAK;UAAEC;QAAO,CAAC,GAAG8H,OAAO,CAAC,CAAC,CAAC,CAACE,WAAW;QAC3D;QACAC,UAAU,CACR,MAAMF,aAAa,CAAChE,eAAe,CAAC8C,IAAI,EAAEC,GAAG,EAAE/G,KAAK,EAAEC,MAAM,CAAC,CAAC,EAC9D,CACF,CAAC;MACH;IACF,CAAC,CAAC;IACF4H,QAAQ,CAACM,OAAO,CAAC/H,MAAM,CAAC;;IAExB;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAIgI,KAA4B,GAAG,IAAI;IACvC,MAAMC,oBAAoB,GAAGA,CAAA,KAAM;MACjCV,cAAc,CAAC,CAAC;MAChBW,iBAAiB,CAAC,CAAC;IACrB,CAAC;IACD,MAAMA,iBAAiB,GAAGA,CAAA,KAAM;MAAA,IAAAC,MAAA;MAC9B,CAAAA,MAAA,GAAAH,KAAK,cAAAG,MAAA,eAALA,MAAA,CAAOC,mBAAmB,CAAC,QAAQ,EAAEH,oBAAoB,CAAC;MAC1DD,KAAK,GAAG,IAAI;MACZ,IAAI,OAAO1G,MAAM,CAAC+G,UAAU,KAAK,UAAU,EAAE;QAC3C,MAAMC,KAAK,GAAGhH,MAAM,CAAC+G,UAAU,CAC7B,gBAAgB/G,MAAM,CAACC,gBAAgB,OACzC,CAAC;QACD,IAAI,OAAO+G,KAAK,CAACC,gBAAgB,KAAK,UAAU,EAAE;UAChDP,KAAK,GAAGM,KAAK;UACbN,KAAK,CAACO,gBAAgB,CAAC,QAAQ,EAAEN,oBAAoB,CAAC;QACxD;MACF;IACF,CAAC;IACDC,iBAAiB,CAAC,CAAC;;IAEnB;IACA/F,WAAW,CAAC,CAAC;IAEb,OAAO,MAAM;MAAA,IAAAqG,OAAA;MACXf,QAAQ,CAACgB,UAAU,CAAC,CAAC;MACrB,CAAAD,OAAA,GAAAR,KAAK,cAAAQ,OAAA,eAALA,OAAA,CAAOJ,mBAAmB,CAAC,QAAQ,EAAEH,oBAAoB,CAAC;MAC1D7C,WAAW,CAACM,OAAO,GAAG,IAAI;MAC1ByB,QAAQ,CAAC9E,OAAO,CAAC,CAAC;IACpB,CAAC;EACH,CAAC,EAAE,CAAC4E,QAAQ,CAAC,CAAC;;EAEd;EACA;EACA;;EAEA,IAAAyB,0BAAmB,EACjBvH,GAAG,EACH,OAAO;IACL+E,UAAU;IACVH,OAAO;IACPF,MAAM;IACNjF,iBAAiB;IACjBwF,OAAO;IACPY,eAAe;IACf,IAAI9B,SAASA,CAAA,EAAG;MACd,OAAO,MAAMA,SAAS,CAACQ,OAAO;IAChC;EACF,CAAC,CAAC,EACF,CAACQ,UAAU,EAAEH,OAAO,EAAEF,MAAM,EAAEjF,iBAAiB,EAAEwF,OAAO,EAAEY,eAAe,CAC3E,CAAC;EAED,IAAA2B,gBAAS,EAAC,MAAM;IAAA,IAAAC,eAAA;IACd,MAAMC,QAAQ,IAAAD,eAAA,GAAG5D,KAAK,CAAC6D,QAAQ,cAAAD,eAAA,cAAAA,eAAA,GAAI,GAAGE,kCAAgB,CAACpD,OAAO,EAAE,EAAE;IAClE,MAAMqD,GAAG,GAAGC,MAAM,CAACC,WAA8B;IACjDF,GAAG,CAACG,YAAY,CAACL,QAAQ,EAAE;MACzB3C,UAAU;MACVH,OAAO;MACPF,MAAM;MACNjF,iBAAiB;MACjBwF,OAAO;MACPY;IACF,CAA0B,CAAC;IAC3B,OAAO,MAAM;MACX+B,GAAG,CAACI,cAAc,CAACN,QAAQ,CAAC;IAC9B,CAAC;EACH,CAAC,EAAE,CACD3C,UAAU,EACVH,OAAO,EACPF,MAAM,EACNjF,iBAAiB,EACjBwF,OAAO,EACPY,eAAe,EACfhC,KAAK,CAAC6D,QAAQ,CACf,CAAC;EAEF,IAAAF,gBAAS,EAAC,MAAM;IACd,IAAI9H,OAAO,EAAE;MACXqF,UAAU,CAACrF,OAAO,CAAC;IACrB;EACF,CAAC,EAAE,CAACqF,UAAU,EAAErF,OAAO,CAAC,CAAC;EAEzB,MAAM;IACJuI,KAAK,EAAEC,MAAM;IACblI,GAAG,EAAEmI,IAAI;IACTrE,QAAQ,EAAEsE,SAAS;IACnB1I,OAAO,EAAE2I,QAAQ;IACjBtC,gCAAgC,EAAEuC,SAAS;IAC3C,GAAGC;EACL,CAAC,GAAG1E,KAAK;EACT,oBACE/H,MAAA,CAAAgB,OAAA,CAAA0L,aAAA,CAACtM,SAAA,CAAAuM,QAAQ,CAACC,IAAI,EAAKH,SAAS,eAC1BzM,MAAA,CAAAgB,OAAA,CAAA0L,aAAA;IACExI,GAAG,EAAE+D,SAAU;IACf4E,KAAK,EAAE;MAAEC,OAAO,EAAE,OAAO;MAAEnK,KAAK,EAAE,MAAM;MAAEC,MAAM,EAAE;IAAO;EAAE,CAC5D,CACY,CAAC;AAEpB,CAAC;AAACmK,OAAA,CAAAjF,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -4,7 +4,11 @@ import { processRadius } from "./Radius";
4
4
  export const isEdge = (pos, b) => {
5
5
  "worklet";
6
6
 
7
- return pos.x === b.x || pos.y === b.y || pos.x === b.width || pos.y === b.height;
7
+ const right = b.x + b.width;
8
+ const bottom = b.y + b.height;
9
+ const withinX = pos.x >= b.x && pos.x <= right;
10
+ const withinY = pos.y >= b.y && pos.y <= bottom;
11
+ return withinY && (pos.x === b.x || pos.x === right) || withinX && (pos.y === b.y || pos.y === bottom);
8
12
  };
9
13
 
10
14
  // We have an issue to check property existence on JSI backed instances
@@ -1 +1 @@
1
- {"version":3,"names":["processRadius","isEdge","pos","b","x","y","width","height","isRRectCtor","def","rect","undefined","isRectCtor","processRect","Skia","_def$x","_def$y","XYWHRect","processRRect","_def$r","_def$x2","_def$y2","r","RRectXY","inflate","box","dx","dy","tx","ty","rx","ry","deflate"],"sources":["Rect.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Skia, SkRect, SkRRect, Vector } from \"../../../skia/types\";\nimport type { RectCtor, RectDef, RRectCtor, RRectDef } from \"../../types\";\n\nimport { processRadius } from \"./Radius\";\n\nexport const isEdge = (pos: Vector, b: SkRect) => {\n \"worklet\";\n return (\n pos.x === b.x || pos.y === b.y || pos.x === b.width || pos.y === b.height\n );\n};\n\n// We have an issue to check property existence on JSI backed instances\nconst isRRectCtor = (def: RRectDef): def is RRectCtor => {\n \"worklet\";\n return (def as any).rect === undefined;\n};\n// We have an issue to check property existence on JSI backed instances\nconst isRectCtor = (def: RectDef): def is RectCtor => {\n \"worklet\";\n return (def as any).rect === undefined;\n};\n\nexport const processRect = (Skia: Skia, def: RectDef) => {\n \"worklet\";\n if (isRectCtor(def)) {\n return Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height);\n } else {\n return def.rect;\n }\n};\n\nexport const processRRect = (Skia: Skia, def: RRectDef) => {\n \"worklet\";\n if (isRRectCtor(def)) {\n const r = processRadius(Skia, def.r ?? 0);\n return Skia.RRectXY(\n Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height),\n r.x,\n r.y\n );\n } else {\n return def.rect;\n }\n};\n\nexport const inflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) => {\n \"worklet\";\n return Skia.RRectXY(\n Skia.XYWHRect(\n box.rect.x - dx + tx,\n box.rect.y - dy + ty,\n box.rect.width + 2 * dx,\n box.rect.height + 2 * dy\n ),\n box.rx + dx,\n box.ry + dy\n );\n};\n\nexport const deflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) => {\n \"worklet\";\n return inflate(Skia, box, -dx, -dy, tx, ty);\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["processRadius","isEdge","pos","b","right","x","width","bottom","y","height","withinX","withinY","isRRectCtor","def","rect","undefined","isRectCtor","processRect","Skia","_def$x","_def$y","XYWHRect","processRRect","_def$r","_def$x2","_def$y2","r","RRectXY","inflate","box","dx","dy","tx","ty","rx","ry","deflate"],"sources":["Rect.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Skia, SkRect, SkRRect, Vector } from \"../../../skia/types\";\nimport type { RectCtor, RectDef, RRectCtor, RRectDef } from \"../../types\";\n\nimport { processRadius } from \"./Radius\";\n\nexport const isEdge = (pos: Vector, b: SkRect) => {\n \"worklet\";\n const right = b.x + b.width;\n const bottom = b.y + b.height;\n const withinX = pos.x >= b.x && pos.x <= right;\n const withinY = pos.y >= b.y && pos.y <= bottom;\n return (\n (withinY && (pos.x === b.x || pos.x === right)) ||\n (withinX && (pos.y === b.y || pos.y === bottom))\n );\n};\n\n// We have an issue to check property existence on JSI backed instances\nconst isRRectCtor = (def: RRectDef): def is RRectCtor => {\n \"worklet\";\n return (def as any).rect === undefined;\n};\n// We have an issue to check property existence on JSI backed instances\nconst isRectCtor = (def: RectDef): def is RectCtor => {\n \"worklet\";\n return (def as any).rect === undefined;\n};\n\nexport const processRect = (Skia: Skia, def: RectDef) => {\n \"worklet\";\n if (isRectCtor(def)) {\n return Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height);\n } else {\n return def.rect;\n }\n};\n\nexport const processRRect = (Skia: Skia, def: RRectDef) => {\n \"worklet\";\n if (isRRectCtor(def)) {\n const r = processRadius(Skia, def.r ?? 0);\n return Skia.RRectXY(\n Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height),\n r.x,\n r.y\n );\n } else {\n return def.rect;\n }\n};\n\nexport const inflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) => {\n \"worklet\";\n return Skia.RRectXY(\n Skia.XYWHRect(\n box.rect.x - dx + tx,\n box.rect.y - dy + ty,\n box.rect.width + 2 * dx,\n box.rect.height + 2 * dy\n ),\n box.rx + dx,\n box.ry + dy\n );\n};\n\nexport const deflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) => {\n \"worklet\";\n return inflate(Skia, box, -dx, -dy, tx, ty);\n};\n"],"mappings":"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","ignoreList":[]}
@@ -9,8 +9,12 @@ const copyFrameOnAndroid = currentFrame => {
9
9
  if (Platform.OS === "android") {
10
10
  const tex = currentFrame.value;
11
11
  if (tex) {
12
- currentFrame.value = tex; //.makeNonTextureImage();
13
- tex.dispose();
12
+ const copy = tex.makeNonTextureImage();
13
+ if (copy) {
14
+ currentFrame.value = copy;
15
+ tex.dispose();
16
+ }
17
+ // If copy fails, keep the original frame rather than showing black
14
18
  }
15
19
  }
16
20
  };
@@ -19,6 +23,8 @@ const setFrame = (video, currentFrame) => {
19
23
 
20
24
  const img = video.nextImage();
21
25
  if (img) {
26
+ var _currentFrame$value;
27
+ (_currentFrame$value = currentFrame.value) === null || _currentFrame$value === void 0 || _currentFrame$value.dispose();
22
28
  currentFrame.value = img;
23
29
  copyFrameOnAndroid(currentFrame);
24
30
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useMemo","Platform","Rea","useVideoLoading","copyFrameOnAndroid","currentFrame","OS","tex","value","dispose","setFrame","video","img","nextImage","defaultOptions","looping","paused","seek","volume","useOption","defaultValue","useSharedValue","isSharedValue","disposeVideo","useVideo","source","userOptions","_userOptions$paused","_userOptions$looping","_userOptions$seek","_userOptions$volume","isPaused","currentTime","duration","_video$duration","framerate","_video$framerate","size","_video$size","width","height","rotation","_video$rotation","useAnimatedReaction","pause","play","setVolume","setLooping","useFrameCallback","_frameInfo","runOnUI"],"sources":["useVideo.ts"],"sourcesContent":["import type { SharedValue, FrameInfo } from \"react-native-reanimated\";\nimport { useEffect, useMemo } from \"react\";\n\nimport type { SkImage, Video } from \"../../skia/types\";\nimport { Platform } from \"../../Platform\";\n\nimport Rea from \"./ReanimatedProxy\";\nimport { useVideoLoading } from \"./useVideoLoading\";\n\ntype MaybeAnimated<T> = SharedValue<T> | T;\n\ninterface PlaybackOptions {\n looping: MaybeAnimated<boolean>;\n paused: MaybeAnimated<boolean>;\n seek: MaybeAnimated<number | null>;\n volume: MaybeAnimated<number>;\n}\n\nconst copyFrameOnAndroid = (currentFrame: SharedValue<SkImage | null>) => {\n \"worklet\";\n // on android we need to copy the texture before it's invalidated\n if (Platform.OS === \"android\") {\n const tex = currentFrame.value;\n if (tex) {\n currentFrame.value = tex; //.makeNonTextureImage();\n tex.dispose();\n }\n }\n};\n\nconst setFrame = (video: Video, currentFrame: SharedValue<SkImage | null>) => {\n \"worklet\";\n const img = video.nextImage();\n if (img) {\n currentFrame.value = img;\n copyFrameOnAndroid(currentFrame);\n }\n};\n\nconst defaultOptions = {\n looping: true,\n paused: false,\n seek: null,\n volume: 0,\n};\n\nconst useOption = <T>(value: MaybeAnimated<T>) => {\n \"worklet\";\n const defaultValue = Rea.useSharedValue(\n Rea.isSharedValue(value) ? value.value : value\n );\n return Rea.isSharedValue(value)\n ? (value as SharedValue<T>)\n : (defaultValue as SharedValue<T>);\n};\n\nconst disposeVideo = (video: Video | null) => {\n \"worklet\";\n video?.dispose();\n};\n\nexport const useVideo = (\n source: string | null,\n userOptions?: Partial<PlaybackOptions>\n) => {\n const video = useVideoLoading(source);\n const isPaused = useOption(userOptions?.paused ?? defaultOptions.paused);\n const looping = useOption(userOptions?.looping ?? defaultOptions.looping);\n const seek = useOption(userOptions?.seek ?? defaultOptions.seek);\n const volume = useOption(userOptions?.volume ?? defaultOptions.volume);\n const currentFrame = Rea.useSharedValue<null | SkImage>(null);\n const currentTime = Rea.useSharedValue(0);\n const duration = useMemo(() => video?.duration() ?? 0, [video]);\n const framerate = useMemo(\n () => (Platform.OS === \"web\" ? -1 : (video?.framerate() ?? 0)),\n [video]\n );\n const size = useMemo(() => video?.size() ?? { width: 0, height: 0 }, [video]);\n const rotation = useMemo(() => video?.rotation() ?? 0, [video]);\n\n // Handle pause/play state changes\n Rea.useAnimatedReaction(\n () => isPaused.value,\n (paused) => {\n if (paused) {\n video?.pause();\n } else {\n video?.play();\n }\n }\n );\n\n // Handle seek\n Rea.useAnimatedReaction(\n () => seek.value,\n (value) => {\n if (value !== null) {\n video?.seek(value);\n seek.value = null;\n }\n }\n );\n\n // Handle volume changes\n Rea.useAnimatedReaction(\n () => volume.value,\n (value) => {\n video?.setVolume(value);\n }\n );\n\n // Handle looping changes\n Rea.useAnimatedReaction(\n () => looping.value,\n (value) => {\n video?.setLooping(value);\n }\n );\n\n // Frame callback - simplified since native handles frame timing\n Rea.useFrameCallback((_frameInfo: FrameInfo) => {\n \"worklet\";\n if (!video) {\n return;\n }\n // Update current time from native player\n currentTime.value = video.currentTime();\n // Get the latest frame (native handles timing via CADisplayLink/etc)\n setFrame(video, currentFrame);\n });\n\n // Apply initial state when video becomes available\n useEffect(() => {\n if (video) {\n video.setLooping(looping.value);\n video.setVolume(volume.value);\n if (isPaused.value) {\n video.pause();\n } else {\n video.play();\n }\n }\n return () => {\n Rea.runOnUI(disposeVideo)(video);\n };\n }, [video, isPaused, looping, volume]);\n\n return {\n currentFrame,\n currentTime,\n duration,\n framerate,\n rotation,\n size,\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useMemo","Platform","Rea","useVideoLoading","copyFrameOnAndroid","currentFrame","OS","tex","value","copy","makeNonTextureImage","dispose","setFrame","video","img","nextImage","_currentFrame$value","defaultOptions","looping","paused","seek","volume","useOption","defaultValue","useSharedValue","isSharedValue","disposeVideo","useVideo","source","userOptions","_userOptions$paused","_userOptions$looping","_userOptions$seek","_userOptions$volume","isPaused","currentTime","duration","_video$duration","framerate","_video$framerate","size","_video$size","width","height","rotation","_video$rotation","useAnimatedReaction","pause","play","setVolume","setLooping","useFrameCallback","_frameInfo","runOnUI"],"sources":["useVideo.ts"],"sourcesContent":["import type { SharedValue, FrameInfo } from \"react-native-reanimated\";\nimport { useEffect, useMemo } from \"react\";\n\nimport type { SkImage, Video } from \"../../skia/types\";\nimport { Platform } from \"../../Platform\";\n\nimport Rea from \"./ReanimatedProxy\";\nimport { useVideoLoading } from \"./useVideoLoading\";\n\ntype MaybeAnimated<T> = SharedValue<T> | T;\n\ninterface PlaybackOptions {\n looping: MaybeAnimated<boolean>;\n paused: MaybeAnimated<boolean>;\n seek: MaybeAnimated<number | null>;\n volume: MaybeAnimated<number>;\n}\n\nconst copyFrameOnAndroid = (currentFrame: SharedValue<SkImage | null>) => {\n \"worklet\";\n // on android we need to copy the texture before it's invalidated\n if (Platform.OS === \"android\") {\n const tex = currentFrame.value;\n if (tex) {\n const copy = tex.makeNonTextureImage();\n if (copy) {\n currentFrame.value = copy;\n tex.dispose();\n }\n // If copy fails, keep the original frame rather than showing black\n }\n }\n};\n\nconst setFrame = (video: Video, currentFrame: SharedValue<SkImage | null>) => {\n \"worklet\";\n const img = video.nextImage();\n if (img) {\n currentFrame.value?.dispose();\n currentFrame.value = img;\n copyFrameOnAndroid(currentFrame);\n }\n};\n\nconst defaultOptions = {\n looping: true,\n paused: false,\n seek: null,\n volume: 0,\n};\n\nconst useOption = <T>(value: MaybeAnimated<T>) => {\n \"worklet\";\n const defaultValue = Rea.useSharedValue(\n Rea.isSharedValue(value) ? value.value : value\n );\n return Rea.isSharedValue(value)\n ? (value as SharedValue<T>)\n : (defaultValue as SharedValue<T>);\n};\n\nconst disposeVideo = (video: Video | null) => {\n \"worklet\";\n video?.dispose();\n};\n\nexport const useVideo = (\n source: string | null,\n userOptions?: Partial<PlaybackOptions>\n) => {\n const video = useVideoLoading(source);\n const isPaused = useOption(userOptions?.paused ?? defaultOptions.paused);\n const looping = useOption(userOptions?.looping ?? defaultOptions.looping);\n const seek = useOption(userOptions?.seek ?? defaultOptions.seek);\n const volume = useOption(userOptions?.volume ?? defaultOptions.volume);\n const currentFrame = Rea.useSharedValue<null | SkImage>(null);\n const currentTime = Rea.useSharedValue(0);\n const duration = useMemo(() => video?.duration() ?? 0, [video]);\n const framerate = useMemo(\n () => (Platform.OS === \"web\" ? -1 : (video?.framerate() ?? 0)),\n [video]\n );\n const size = useMemo(() => video?.size() ?? { width: 0, height: 0 }, [video]);\n const rotation = useMemo(() => video?.rotation() ?? 0, [video]);\n\n // Handle pause/play state changes\n Rea.useAnimatedReaction(\n () => isPaused.value,\n (paused) => {\n if (paused) {\n video?.pause();\n } else {\n video?.play();\n }\n }\n );\n\n // Handle seek\n Rea.useAnimatedReaction(\n () => seek.value,\n (value) => {\n if (value !== null) {\n video?.seek(value);\n seek.value = null;\n }\n }\n );\n\n // Handle volume changes\n Rea.useAnimatedReaction(\n () => volume.value,\n (value) => {\n video?.setVolume(value);\n }\n );\n\n // Handle looping changes\n Rea.useAnimatedReaction(\n () => looping.value,\n (value) => {\n video?.setLooping(value);\n }\n );\n\n // Frame callback - simplified since native handles frame timing\n Rea.useFrameCallback((_frameInfo: FrameInfo) => {\n \"worklet\";\n if (!video) {\n return;\n }\n // Update current time from native player\n currentTime.value = video.currentTime();\n // Get the latest frame (native handles timing via CADisplayLink/etc)\n setFrame(video, currentFrame);\n });\n\n // Apply initial state when video becomes available\n useEffect(() => {\n if (video) {\n video.setLooping(looping.value);\n video.setVolume(volume.value);\n if (isPaused.value) {\n video.pause();\n } else {\n video.play();\n }\n }\n return () => {\n Rea.runOnUI(disposeVideo)(video);\n };\n }, [video, isPaused, looping, volume]);\n\n return {\n currentFrame,\n currentTime,\n duration,\n framerate,\n rotation,\n size,\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.disposable" preserve="true" />
1
2
  export interface SkJSIInstance<T extends string> extends Disposable {
2
3
  __typename__: T;
3
4
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["JsiInstance.ts"],"sourcesContent":["export interface SkJSIInstance<T extends string> extends Disposable {\n __typename__: T;\n dispose(): void;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["JsiInstance.ts"],"sourcesContent":["/// <reference lib=\"esnext.disposable\" preserve=\"true\" />\n\nexport interface SkJSIInstance<T extends string> extends Disposable {\n __typename__: T;\n dispose(): void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -25,7 +25,10 @@ export const createDrawingContext = (Skia, paintPool, canvas) => {
25
25
  if (paintPool.length === 0) {
26
26
  paintPool.push(Skia.Paint());
27
27
  } else {
28
+ // reset() produces an anti-alias false paint, unlike the Skia.Paint()
29
+ // factory: restore the default so reused pools render like the first frame.
28
30
  paintPool[0].reset();
31
+ paintPool[0].setAntiAlias(true);
29
32
  }
30
33
  paints.push(paintPool[0]);
31
34
  opacities.push(1);
@@ -43,12 +46,14 @@ export const createDrawingContext = (Skia, paintPool, canvas) => {
43
46
  nextPaintIndex++;
44
47
  };
45
48
 
46
- // Pushes an externally owned paint (the `paint` prop) onto the stack. It must
47
- // push an opacity alongside it: restorePaint() pops both, so pushing only the
48
- // paint would underflow the opacity stack and leak the enclosing group's
49
- // opacity onto everything drawn afterwards.
49
+ // Pushes an externally owned paint (the `paint` prop) onto the stack. It
50
+ // pushes a frame-scoped copy, like the C++ DrawingCtx: materializePaint()
51
+ // mutates the top of the stack, and those mutations must not leak into the
52
+ // user-owned paint. It must also push an opacity alongside it: restorePaint()
53
+ // pops both, so pushing only the paint would underflow the opacity stack and
54
+ // leak the enclosing group's opacity onto everything drawn afterwards.
50
55
  const pushPaint = paint => {
51
- paints.push(paint);
56
+ paints.push(track(paint.copy()));
52
57
  opacities.push(opacities[opacities.length - 1]);
53
58
  };
54
59
  const getOpacity = () => {
@@ -1 +1 @@
1
- {"version":3,"names":["createFrameScope","createDrawingContext","Skia","paintPool","canvas","frameSkia","track","dispose","paints","colorFilters","shaders","imageFilters","pathEffects","paintDeclarations","opacities","nextPaintIndex","length","push","Paint","reset","savePaint","nextPaint","assign","getCurrentPaint","pushPaint","paint","getOpacity","setOpacity","newOpacity","Math","max","min","saveBackdropFilter","imageFilter","imgf","pop","cf","ImageFilter","MakeColorFilter","saveLayer","undefined","restore","restorePaint","materializePaint","setColorFilter","reduceRight","inner","outer","ColorFilter","MakeCompose","setShader","setImageFilter","setPathEffect","PathEffect"],"sources":["DrawingContext.ts"],"sourcesContent":["import type {\n Skia,\n SkCanvas,\n SkColorFilter,\n SkPaint,\n SkShader,\n SkImageFilter,\n SkPathEffect,\n} from \"../../skia/types\";\n\nimport { createFrameScope } from \"./FrameScope\";\n\nexport const createDrawingContext = (\n Skia: Skia,\n paintPool: SkPaint[],\n canvas: SkCanvas\n) => {\n \"worklet\";\n\n // Everything the renderer creates through frameSkia is frame-scoped and\n // deleted by dispose() once the frame has been recorded. The paint pool is\n // recording-scoped and deliberately allocated with the raw Skia instance.\n const { Skia: frameSkia, track, dispose } = createFrameScope(Skia);\n\n // State (formerly class fields)\n const paints: SkPaint[] = [];\n const colorFilters: SkColorFilter[] = [];\n const shaders: SkShader[] = [];\n const imageFilters: SkImageFilter[] = [];\n const pathEffects: SkPathEffect[] = [];\n const paintDeclarations: SkPaint[] = [];\n const opacities: number[] = [];\n\n let nextPaintIndex = 1;\n\n // Initialize first paint and opacity\n if (paintPool.length === 0) {\n paintPool.push(Skia.Paint());\n } else {\n paintPool[0].reset();\n }\n paints.push(paintPool[0]);\n opacities.push(1);\n\n // Methods (formerly class methods)\n const savePaint = () => {\n // Get next available paint from pool or create new one if needed\n if (nextPaintIndex >= paintPool.length) {\n paintPool.push(Skia.Paint());\n }\n\n const nextPaint = paintPool[nextPaintIndex];\n nextPaint.assign(getCurrentPaint()); // Reuse allocation by copying properties\n paints.push(nextPaint);\n opacities.push(opacities[opacities.length - 1]);\n nextPaintIndex++;\n };\n\n // Pushes an externally owned paint (the `paint` prop) onto the stack. It must\n // push an opacity alongside it: restorePaint() pops both, so pushing only the\n // paint would underflow the opacity stack and leak the enclosing group's\n // opacity onto everything drawn afterwards.\n const pushPaint = (paint: SkPaint) => {\n paints.push(paint);\n opacities.push(opacities[opacities.length - 1]);\n };\n\n const getOpacity = () => {\n return opacities[opacities.length - 1];\n };\n\n const setOpacity = (newOpacity: number) => {\n opacities[opacities.length - 1] = Math.max(0, Math.min(1, newOpacity));\n };\n\n const saveBackdropFilter = () => {\n let imageFilter: SkImageFilter | null = null;\n const imgf = imageFilters.pop();\n if (imgf) {\n imageFilter = imgf;\n } else {\n const cf = colorFilters.pop();\n if (cf) {\n imageFilter = frameSkia.ImageFilter.MakeColorFilter(cf, null);\n }\n }\n canvas.saveLayer(undefined, null, imageFilter);\n canvas.restore();\n };\n\n // Equivalent to the `get paint()` getter in the original class\n const getCurrentPaint = () => {\n return paints[paints.length - 1];\n };\n\n const restorePaint = () => {\n opacities.pop();\n return paints.pop();\n };\n\n const materializePaint = () => {\n // Color Filters\n if (colorFilters.length > 0) {\n getCurrentPaint().setColorFilter(\n colorFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ColorFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n // Shaders\n if (shaders.length > 0) {\n getCurrentPaint().setShader(shaders[shaders.length - 1]);\n }\n // Image Filters\n if (imageFilters.length > 0) {\n getCurrentPaint().setImageFilter(\n imageFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ImageFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Path Effects\n if (pathEffects.length > 0) {\n getCurrentPaint().setPathEffect(\n pathEffects.reduceRight((inner, outer) =>\n inner ? frameSkia.PathEffect.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Clear arrays\n colorFilters.length = 0;\n shaders.length = 0;\n imageFilters.length = 0;\n pathEffects.length = 0;\n };\n\n // Return an object containing the Skia reference, the canvas, and the methods\n return {\n // Public fields\n Skia: frameSkia,\n canvas,\n track,\n dispose,\n paints,\n colorFilters,\n shaders,\n imageFilters,\n pathEffects,\n paintDeclarations,\n paintPool,\n\n // Public methods\n savePaint,\n pushPaint,\n saveBackdropFilter,\n get paint() {\n return paints[paints.length - 1];\n }, // the \"getter\" for the current paint\n restorePaint,\n materializePaint,\n getOpacity,\n setOpacity,\n };\n};\n\nexport type DrawingContext = ReturnType<typeof createDrawingContext>;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createFrameScope","createDrawingContext","Skia","paintPool","canvas","frameSkia","track","dispose","paints","colorFilters","shaders","imageFilters","pathEffects","paintDeclarations","opacities","nextPaintIndex","length","push","Paint","reset","setAntiAlias","savePaint","nextPaint","assign","getCurrentPaint","pushPaint","paint","copy","getOpacity","setOpacity","newOpacity","Math","max","min","saveBackdropFilter","imageFilter","imgf","pop","cf","ImageFilter","MakeColorFilter","saveLayer","undefined","restore","restorePaint","materializePaint","setColorFilter","reduceRight","inner","outer","ColorFilter","MakeCompose","setShader","setImageFilter","setPathEffect","PathEffect"],"sources":["DrawingContext.ts"],"sourcesContent":["import type {\n Skia,\n SkCanvas,\n SkColorFilter,\n SkPaint,\n SkShader,\n SkImageFilter,\n SkPathEffect,\n} from \"../../skia/types\";\n\nimport { createFrameScope } from \"./FrameScope\";\n\nexport const createDrawingContext = (\n Skia: Skia,\n paintPool: SkPaint[],\n canvas: SkCanvas\n) => {\n \"worklet\";\n\n // Everything the renderer creates through frameSkia is frame-scoped and\n // deleted by dispose() once the frame has been recorded. The paint pool is\n // recording-scoped and deliberately allocated with the raw Skia instance.\n const { Skia: frameSkia, track, dispose } = createFrameScope(Skia);\n\n // State (formerly class fields)\n const paints: SkPaint[] = [];\n const colorFilters: SkColorFilter[] = [];\n const shaders: SkShader[] = [];\n const imageFilters: SkImageFilter[] = [];\n const pathEffects: SkPathEffect[] = [];\n const paintDeclarations: SkPaint[] = [];\n const opacities: number[] = [];\n\n let nextPaintIndex = 1;\n\n // Initialize first paint and opacity\n if (paintPool.length === 0) {\n paintPool.push(Skia.Paint());\n } else {\n // reset() produces an anti-alias false paint, unlike the Skia.Paint()\n // factory: restore the default so reused pools render like the first frame.\n paintPool[0].reset();\n paintPool[0].setAntiAlias(true);\n }\n paints.push(paintPool[0]);\n opacities.push(1);\n\n // Methods (formerly class methods)\n const savePaint = () => {\n // Get next available paint from pool or create new one if needed\n if (nextPaintIndex >= paintPool.length) {\n paintPool.push(Skia.Paint());\n }\n\n const nextPaint = paintPool[nextPaintIndex];\n nextPaint.assign(getCurrentPaint()); // Reuse allocation by copying properties\n paints.push(nextPaint);\n opacities.push(opacities[opacities.length - 1]);\n nextPaintIndex++;\n };\n\n // Pushes an externally owned paint (the `paint` prop) onto the stack. It\n // pushes a frame-scoped copy, like the C++ DrawingCtx: materializePaint()\n // mutates the top of the stack, and those mutations must not leak into the\n // user-owned paint. It must also push an opacity alongside it: restorePaint()\n // pops both, so pushing only the paint would underflow the opacity stack and\n // leak the enclosing group's opacity onto everything drawn afterwards.\n const pushPaint = (paint: SkPaint) => {\n paints.push(track(paint.copy()));\n opacities.push(opacities[opacities.length - 1]);\n };\n\n const getOpacity = () => {\n return opacities[opacities.length - 1];\n };\n\n const setOpacity = (newOpacity: number) => {\n opacities[opacities.length - 1] = Math.max(0, Math.min(1, newOpacity));\n };\n\n const saveBackdropFilter = () => {\n let imageFilter: SkImageFilter | null = null;\n const imgf = imageFilters.pop();\n if (imgf) {\n imageFilter = imgf;\n } else {\n const cf = colorFilters.pop();\n if (cf) {\n imageFilter = frameSkia.ImageFilter.MakeColorFilter(cf, null);\n }\n }\n canvas.saveLayer(undefined, null, imageFilter);\n canvas.restore();\n };\n\n // Equivalent to the `get paint()` getter in the original class\n const getCurrentPaint = () => {\n return paints[paints.length - 1];\n };\n\n const restorePaint = () => {\n opacities.pop();\n return paints.pop();\n };\n\n const materializePaint = () => {\n // Color Filters\n if (colorFilters.length > 0) {\n getCurrentPaint().setColorFilter(\n colorFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ColorFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n // Shaders\n if (shaders.length > 0) {\n getCurrentPaint().setShader(shaders[shaders.length - 1]);\n }\n // Image Filters\n if (imageFilters.length > 0) {\n getCurrentPaint().setImageFilter(\n imageFilters.reduceRight((inner, outer) =>\n inner ? frameSkia.ImageFilter.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Path Effects\n if (pathEffects.length > 0) {\n getCurrentPaint().setPathEffect(\n pathEffects.reduceRight((inner, outer) =>\n inner ? frameSkia.PathEffect.MakeCompose(outer, inner) : outer\n )\n );\n }\n\n // Clear arrays\n colorFilters.length = 0;\n shaders.length = 0;\n imageFilters.length = 0;\n pathEffects.length = 0;\n };\n\n // Return an object containing the Skia reference, the canvas, and the methods\n return {\n // Public fields\n Skia: frameSkia,\n canvas,\n track,\n dispose,\n paints,\n colorFilters,\n shaders,\n imageFilters,\n pathEffects,\n paintDeclarations,\n paintPool,\n\n // Public methods\n savePaint,\n pushPaint,\n saveBackdropFilter,\n get paint() {\n return paints[paints.length - 1];\n }, // the \"getter\" for the current paint\n restorePaint,\n materializePaint,\n getOpacity,\n setOpacity,\n };\n};\n\nexport type DrawingContext = ReturnType<typeof createDrawingContext>;\n"],"mappings":"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","ignoreList":[]}
@@ -283,21 +283,26 @@ export const SkiaPictureView = props => {
283
283
  // - The renderer is created synchronously on mount (the canvas element is
284
284
  // guaranteed to exist in useLayoutEffect; a zero size at that point is
285
285
  // fine, the surface is created once the canvas is measurable).
286
- // - Redraw requests coalesce into a single animation frame. A picture
287
- // dispatched before the canvas has a size stays in pictureRef (drawing
288
- // while unmeasured is a no-op) and is painted by the resize path below
289
- // once the canvas becomes measurable, so it is never lost.
286
+ // - Redraw requests coalesce into a single microtask. A microtask (not an
287
+ // animation frame) so that a picture produced inside a rAF callback (the
288
+ // Reanimated mapper) is drawn before the current frame paints: deferring
289
+ // to the next rAF alternates between "flush pending in this frame" and
290
+ // "flush scheduled for the next frame", drawing on every other frame
291
+ // only and halving the effective frame rate. A picture dispatched before
292
+ // the canvas has a size stays in pictureRef (drawing while unmeasured is
293
+ // a no-op) and is painted by the resize path below once the canvas
294
+ // becomes measurable, so it is never lost.
290
295
  // - A ResizeObserver on the canvas itself recreates the surface and repaints
291
296
  // synchronously (its callbacks run after layout, before paint), and is
292
297
  // also the source of the user-facing onLayout event.
293
298
  const redrawPendingRef = useRef(false);
294
- const frameRef = useRef(0);
299
+ const flushScheduledRef = useRef(false);
295
300
  const onLayoutRef = useRef(onLayout);
296
301
  useLayoutEffect(() => {
297
302
  onLayoutRef.current = onLayout;
298
303
  }, [onLayout]);
299
304
  const flushRedraw = useCallback(() => {
300
- frameRef.current = 0;
305
+ flushScheduledRef.current = false;
301
306
  if (redrawPendingRef.current && rendererRef.current && pictureRef.current) {
302
307
  redrawPendingRef.current = false;
303
308
  rendererRef.current.draw(pictureRef.current);
@@ -307,8 +312,9 @@ export const SkiaPictureView = props => {
307
312
  }, []);
308
313
  const redraw = useCallback(() => {
309
314
  redrawPendingRef.current = true;
310
- if (frameRef.current === 0) {
311
- frameRef.current = requestAnimationFrame(flushRedraw);
315
+ if (!flushScheduledRef.current) {
316
+ flushScheduledRef.current = true;
317
+ queueMicrotask(flushRedraw);
312
318
  }
313
319
  }, [flushRedraw]);
314
320
  const getSize = useCallback(() => {
@@ -443,12 +449,11 @@ export const SkiaPictureView = props => {
443
449
  renderer.dispose();
444
450
  };
445
451
  }, [isStatic]);
446
- useEffect(() => {
447
- return () => {
448
- cancelAnimationFrame(frameRef.current);
449
- frameRef.current = 0;
450
- };
451
- }, []);
452
+
453
+ // No flush cancellation is needed on unmount: a microtask queued before
454
+ // unmount runs within the same task, and flushRedraw no-ops once the
455
+ // layout-effect cleanup has nulled rendererRef.
456
+
452
457
  useImperativeHandle(ref, () => ({
453
458
  setPicture,
454
459
  getSize,