importScripts('https://particles.skia.org/static/canvaskit.js');
importScripts('shared.js');

const CanvasKitPromise =
    CanvasKitInit({locateFile: (file) => 'https://particles.skia.org/static/'+file});

const path2dAnimator = new Animator();
const canvasKitAnimator = new Animator();
addEventListener('message', async ({ data: {svgData, offscreenCanvas, type, switchMethod} }) => {
    // The worker expect to receive 2 messages after initialization: One with an offscreenCanvas
    // for Path2D rendering, and one with an offscreenCanvas for CanvasKit rendering.
    if (svgData && offscreenCanvas && type) {
        if (type === 'Path2D') {
            path2dAnimator.renderer =
                new Path2dRenderer(svgData, offscreenCanvas);
        }
        if (type === 'CanvasKit') {
            const CanvasKit = await CanvasKitPromise;
            canvasKitAnimator.renderer =
                new CanvasKitRenderer(svgData, offscreenCanvas, CanvasKit);
        }
    }
    // The worker receives a "switchMethod" message whenever the user clicks a rendering
    // method button on the web page.
    if (switchMethod) {
        // Pause other renderers and start correct renderer
        canvasKitAnimator.stop();
        path2dAnimator.stop();

        if (switchMethod === 'Path2D') {
            path2dAnimator.start();
        } else if (switchMethod === 'CanvasKit') {
            canvasKitAnimator.start();
        }
    }
});

// Report framerates of Path2D and CanvasKit rendering back to main.js
setInterval(() => {
    if (path2dAnimator.framesCount > 0) {
        postMessage({
            renderMethod: 'Path2D',
            framesCount: path2dAnimator.framesCount,
            totalFramesMs: path2dAnimator.totalFramesMs
        });
    }
    if (canvasKitAnimator.framesCount > 0) {
        postMessage({
            renderMethod: 'CanvasKit',
            framesCount: canvasKitAnimator.framesCount,
            totalFramesMs: canvasKitAnimator.totalFramesMs
        });
    }
}, 1000);
