{"version":3,"file":"CanvasObjectRendererSystem.mjs","sources":["../src/CanvasObjectRendererSystem.ts"],"sourcesContent":["import {\n    BLEND_MODES,\n    CanvasResource,\n    extensions,\n    ExtensionType,\n    utils,\n} from 'pixijs/core';\n\nimport type {\n    BaseRenderTexture,\n    ExtensionMetadata,\n    IRenderableObject,\n    IRendererRenderOptions,\n    ISystem,\n    Matrix,\n    RenderTexture,\n} from 'pixijs/core';\nimport type { CrossPlatformCanvasRenderingContext2D } from './CanvasContextSystem';\nimport type { CanvasRenderer } from './CanvasRenderer';\n\n/**\n * system that provides a render function that focussing on rendering Pixi Scene Graph objects\n * to either the main view or to a renderTexture. Used for Canvas `2d` contexts\n * @memberof PIXI\n */\nexport class CanvasObjectRendererSystem implements ISystem\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        type:  ExtensionType.CanvasRendererSystem,\n        name: 'objectRenderer',\n    };\n\n    /** A reference to the current renderer */\n    private renderer: CanvasRenderer;\n    renderingToScreen: boolean;\n    lastObjectRendered: IRenderableObject;\n\n    /** @param renderer - A reference to the current renderer */\n    constructor(renderer: CanvasRenderer)\n    {\n        this.renderer = renderer;\n    }\n\n    /**\n     * Renders the object to its Canvas view.\n     * @param displayObject - The object to be rendered.\n     * @param options - the options to be passed to the renderer\n     */\n    public render(displayObject: IRenderableObject, options?: IRendererRenderOptions): void\n    {\n        const renderer = this.renderer;\n\n        if (!renderer.view)\n        {\n            return;\n        }\n\n        const _context = renderer.canvasContext;\n\n        let renderTexture: BaseRenderTexture | RenderTexture;\n        let clear: boolean;\n        let transform: Matrix;\n        let skipUpdateTransform: boolean;\n\n        if (options)\n        {\n            renderTexture = options.renderTexture;\n            clear = options.clear;\n            transform = options.transform;\n            skipUpdateTransform = options.skipUpdateTransform;\n        }\n\n        // can be handy to know!\n        this.renderingToScreen = !renderTexture;\n\n        renderer.emit('prerender');\n\n        const rootResolution = renderer.resolution;\n\n        if (renderTexture)\n        {\n            renderTexture = renderTexture.castToBaseTexture() as BaseRenderTexture;\n\n            if (!renderTexture._canvasRenderTarget)\n            {\n                renderTexture._canvasRenderTarget = new utils.CanvasRenderTarget(\n                    renderTexture.width,\n                    renderTexture.height,\n                    renderTexture.resolution\n                );\n\n                renderTexture.resource = new CanvasResource(renderTexture._canvasRenderTarget.canvas);\n                renderTexture.valid = true;\n            }\n\n            _context.activeContext = renderTexture._canvasRenderTarget.context as CrossPlatformCanvasRenderingContext2D;\n            renderer.canvasContext.activeResolution = renderTexture._canvasRenderTarget.resolution;\n        }\n        else\n        {\n            _context.activeContext = _context.rootContext;\n            _context.activeResolution = rootResolution;\n        }\n\n        const context2D = _context.activeContext;\n\n        _context._projTransform = transform || null;\n\n        if (!renderTexture)\n        {\n            this.lastObjectRendered = displayObject;\n        }\n\n        if (!skipUpdateTransform)\n        {\n            // update the scene graph\n            const cacheParent = displayObject.enableTempParent();\n\n            displayObject.updateTransform();\n            displayObject.disableTempParent(cacheParent);\n        }\n\n        context2D.save();\n        context2D.setTransform(1, 0, 0, 1, 0, 0);\n        context2D.globalAlpha = 1;\n        _context._activeBlendMode = BLEND_MODES.NORMAL;\n        _context._outerBlend = false;\n        context2D.globalCompositeOperation = _context.blendModes[BLEND_MODES.NORMAL];\n\n        if (clear ?? renderer.background.clearBeforeRender)\n        {\n            if (this.renderingToScreen)\n            {\n                context2D.clearRect(0, 0, renderer.width, renderer.height);\n\n                const background = renderer.background;\n\n                if (background.alpha > 0)\n                {\n                    context2D.globalAlpha = background.alpha;\n                    context2D.fillStyle = background.colorString;\n                    context2D.fillRect(0, 0, renderer.width, renderer.height);\n                    context2D.globalAlpha = 1;\n                }\n            }\n            else\n            {\n                renderTexture = (renderTexture as BaseRenderTexture);\n                renderTexture._canvasRenderTarget.clear();\n\n                const clearColor = renderTexture.clearColor;\n\n                if (clearColor[3] > 0)\n                {\n                    context2D.globalAlpha = clearColor[3] ?? 1;\n                    context2D.fillStyle = utils.hex2string(utils.rgb2hex(clearColor));\n                    context2D.fillRect(0, 0, renderTexture.realWidth, renderTexture.realHeight);\n                    context2D.globalAlpha = 1;\n                }\n            }\n        }\n\n        // TODO RENDER TARGET STUFF HERE..\n        const tempContext = _context.activeContext;\n\n        _context.activeContext = context2D;\n        displayObject.renderCanvas(renderer);\n        _context.activeContext = tempContext;\n\n        context2D.restore();\n\n        _context.activeResolution = rootResolution;\n        _context._projTransform = null;\n\n        renderer.emit('postrender');\n    }\n\n    public destroy(): void\n    {\n        this.lastObjectRendered = null;\n        this.render = null;\n    }\n}\n\nextensions.add(CanvasObjectRendererSystem);\n"],"names":[],"mappings":"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"}