UNPKG

@shopify/react-native-skia

Version:

High-performance React Native Graphics using Skia

260 lines (254 loc) 7.91 kB
import type { CanvasKit, ManagedSkottieAnimation, SlottableTextProperty as CKSlottableTextProperty, } from "canvaskit-wasm"; import type { SkSkottieAnimation, SlotInfo, SlottableTextProperty, } from "../types/Skottie"; import type { SkColor, SkPoint, SkRect } from "../types"; import { HostObject } from "./Host"; import type { JsiSkCanvas } from "./JsiSkCanvas"; import { JsiSkTypeface } from "./JsiSkTypeface"; import { Color } from "./JsiSkColor"; import { JsiSkRect } from "./JsiSkRect"; export class JsiSkottieAnimation extends HostObject<ManagedSkottieAnimation, "SkottieAnimation"> implements SkSkottieAnimation { constructor(CanvasKit: CanvasKit, ref: ManagedSkottieAnimation) { super(CanvasKit, ref, "SkottieAnimation"); } getOpacityProps() { return this.ref.getOpacityProps(); } getTextProps() { return this.ref.getTextProps(); } getColorProps() { return this.ref .getColorProps() .map(({ key, value }) => ({ key, value: Color(value) })); } getTransformProps() { return this.ref.getTransformProps().map(({ key, value }) => ({ key, value: { anchor: { x: value.anchor[0], y: value.anchor[1] }, position: { x: value.position[0], y: value.position[1] }, scale: { x: value.scale[0], y: value.scale[1] }, rotation: value.rotation, skew: value.skew, skewAxis: value.skew_axis, }, })); } setColor(key: string, color: SkColor) { return this.ref.setColor(key, color); } setText(key: string, text: string, size: number) { return this.ref.setText(key, text, size); } setOpacity(key: string, opacity: number) { return this.ref.setOpacity(key, opacity); } setTransform( key: string, anchor: SkPoint, position: SkPoint, scale: SkPoint, rotation: number, skew: number, skewAxis: number ) { const a = Float32Array.of(anchor.x, anchor.y); const p = Float32Array.of(position.x, position.y); const s = Float32Array.of(scale.x, scale.y); return this.ref.setTransform(key, a, p, s, rotation, skew, skewAxis); } getSlotInfo(): SlotInfo { return this.ref.getSlotInfo(); } setColorSlot(key: string, color: SkColor) { return this.ref.setColorSlot(key, color); } setScalarSlot(key: string, scalar: number) { return this.ref.setScalarSlot(key, scalar); } setVec2Slot(key: string, vec2: SkPoint) { return this.ref.setVec2Slot(key, Float32Array.of(vec2.x, vec2.y)); } setTextSlot(key: string, text: SlottableTextProperty): boolean { const txt: CKSlottableTextProperty = { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error typeface: text.typeface && text.typeface instanceof JsiSkTypeface ? text.typeface.ref : null, text: text.text ?? "", textSize: text.textSize ?? 0, minTextSize: text.minTextSize ?? 0, maxTextSize: text.maxTextSize ?? Number.MAX_VALUE, strokeWidth: text.strokeWidth ?? 0, lineHeight: text.lineHeight ?? 0, lineShift: text.lineShift ?? 0, ascent: text.ascent, maxLines: text.maxLines, // TODO: implement // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-expect-error horizAlign: this.CanvasKit.TextAlign.Left, // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-expect-error vertAlign: this.CanvasKit.VerticalTextAlign.Top, // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-expect-error strokeJoin: this.CanvasKit.StrokeJoin.Miter, // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-expect-error direction: this.CanvasKit.TextDirection.LTR, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error linebreak: this.CanvasKit.LineBreakType.HardLineBreak, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error resize: this.CanvasKit.ResizePolicy.None, boundingBox: text.boundingBox ? this.CanvasKit.XYWHRect( text.boundingBox.x, text.boundingBox.y, text.boundingBox.width, text.boundingBox.height ) : [0, 0, 0, 0], fillColor: text.fillColor ? Color(text.fillColor) : this.CanvasKit.TRANSPARENT, strokeColor: text.strokeColor ? Color(text.strokeColor) : this.CanvasKit.TRANSPARENT, }; return this.ref.setTextSlot(key, txt); } setImageSlot(key: string, assetName: string) { return this.ref.setImageSlot(key, assetName); } getColorSlot(key: string): SkColor | null { const color = this.ref.getColorSlot(key); return color; } getScalarSlot(key: string) { return this.ref.getScalarSlot(key); } getVec2Slot(key: string): SkPoint | null { const vec2 = this.ref.getVec2Slot(key); if (!vec2) { return null; } return { x: vec2[0], y: vec2[1] }; } getTextSlot(key: string): SlottableTextProperty | null { const result = this.ref.getTextSlot(key); const textSlot: SlottableTextProperty = {}; if (result) { if (result.typeface) { textSlot.typeface = new JsiSkTypeface(this.CanvasKit, result.typeface); } if (result.text) { textSlot.text = result.text; } if (result.textSize) { textSlot.textSize = result.textSize; } if (result.minTextSize) { textSlot.minTextSize = result.minTextSize; } if (result.maxTextSize) { textSlot.maxTextSize = result.maxTextSize; } if (result.strokeWidth) { textSlot.strokeWidth = result.strokeWidth; } if (result.lineHeight) { textSlot.lineHeight = result.lineHeight; } if (result.lineShift) { textSlot.lineShift = result.lineShift; } if (result.ascent) { textSlot.ascent = result.ascent; } if (result.maxLines) { textSlot.maxLines = result.maxLines; } // if (result.horizAlign) { // textSlot.horizAlign = result.horizAlign; // } // if (result.vertAlign) { // textSlot.vertAlign = result.vertAlign; // } // if (result.strokeJoin) { // textSlot.strokeJoin = result.strokeJoin; // } // if (result.direction) { // textSlot.direction = result.direction; // } // if (result.linebreak) { // textSlot.linebreak = result.linebreak; // } // if (result.resize) { // textSlot.resize = result.resize; // } // if (result.boundingBox) { // textSlot.boundingBox = new JsiSkRect( // this.CanvasKit, // result.boundingBox // ); // } // if (result.fillColor) { // textSlot.fillColor = Color(result.fillColor); // } // if (result.strokeColor) { // textSlot.strokeColor = Color(result.strokeColor); // } } return textSlot; } duration() { return this.ref.duration(); } fps() { return this.ref.fps(); } render(canvas: JsiSkCanvas, dstRect?: SkRect) { const [width, height] = this.ref.size(); this.ref.render( canvas.ref, dstRect && dstRect instanceof JsiSkRect ? dstRect.ref : Float32Array.of(0, 0, width, height) ); } seekFrame(frame: number, damageRect?: JsiSkRect) { const result = this.ref.seekFrame(frame); if (damageRect && damageRect instanceof JsiSkRect) { damageRect.ref[0] = result[0]; damageRect.ref[1] = result[1]; damageRect.ref[2] = result[2]; damageRect.ref[3] = result[3]; } } size() { const [width, height] = this.ref.size(); return { width, height }; } version() { return this.ref.version(); } dispose() { this.ref.delete(); } }