@shopify/react-native-skia
Version:
High-performance React Native Graphics using Skia
42 lines (35 loc) • 1.11 kB
text/typescript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit";
import type { ReactNode } from "react";
import type { SkSurface } from "../skia";
import { JsiSkApi } from "../skia/web";
import { SkiaSGRoot } from "../sksg/Reconciler";
export * from "../renderer/components";
export * from "../skia/types";
let Skia: ReturnType<typeof JsiSkApi>;
export const makeOffscreenSurface = (width: number, height: number) => {
if (!Skia) {
Skia = JsiSkApi(CanvasKit);
}
const surface = Skia.Surface.MakeOffscreen(width, height);
if (surface === null) {
throw new Error("Couldn't create surface!");
}
return surface;
};
export const getSkiaExports = () => {
if (!Skia) {
Skia = JsiSkApi(CanvasKit);
}
return { Skia };
};
export const drawOffscreen = async (surface: SkSurface, element: ReactNode) => {
const root = new SkiaSGRoot(Skia);
await root.render(element);
const canvas = surface.getCanvas();
root.drawOnCanvas(canvas);
root.unmount();
surface.flush();
return surface.makeImageSnapshot();
};