{"version":3,"file":"CanvasObjectRendererSystem.mjs","sources":["../src/CanvasObjectRendererSystem.ts"],"sourcesContent":["import {\n    BLEND_MODES,\n    CanvasResource,\n    extensions,\n    ExtensionType,\n    utils,\n} from '@pixi/core';\n\nimport type {\n    BaseRenderTexture,\n    ExtensionMetadata,\n    IRenderableObject,\n    IRendererRenderOptions,\n    ISystem,\n    Matrix,\n    RenderTexture,\n} from '@pixi/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] as GlobalCompositeOperation;\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.backgroundColor.alpha;\n                    context2D.fillStyle = background.backgroundColor.toHex();\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                if (renderTexture.clear.alpha > 0)\n                {\n                    context2D.globalAlpha = renderTexture.clear.alpha;\n                    context2D.fillStyle = renderTexture.clear.toHex();\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":";AAyBO,MAAM,2BACb;AAAA;AAAA,EAaI,YAAY,UACZ;AACI,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,OAAO,eAAkC,SAChD;AACI,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,SAAS;AAEV;AAGJ,UAAM,WAAW,SAAS;AAEtB,QAAA,eACA,OACA,WACA;AAEA,gBAEA,gBAAgB,QAAQ,eACxB,QAAQ,QAAQ,OAChB,YAAY,QAAQ,WACpB,sBAAsB,QAAQ,sBAIlC,KAAK,oBAAoB,CAAC,eAE1B,SAAS,KAAK,WAAW;AAEzB,UAAM,iBAAiB,SAAS;AAE5B,qBAEA,gBAAgB,cAAc,qBAEzB,cAAc,wBAEf,cAAc,sBAAsB,IAAI,MAAM;AAAA,MAC1C,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAGlB,GAAA,cAAc,WAAW,IAAI,eAAe,cAAc,oBAAoB,MAAM,GACpF,cAAc,QAAQ,KAG1B,SAAS,gBAAgB,cAAc,oBAAoB,SAC3D,SAAS,cAAc,mBAAmB,cAAc,oBAAoB,eAI5E,SAAS,gBAAgB,SAAS,aAClC,SAAS,mBAAmB;AAGhC,UAAM,YAAY,SAAS;AAE3B,QAAA,SAAS,iBAAiB,aAAa,MAElC,kBAED,KAAK,qBAAqB,gBAG1B,CAAC,qBACL;AAEU,YAAA,cAAc,cAAc;AAElC,oBAAc,gBAAgB,GAC9B,cAAc,kBAAkB,WAAW;AAAA,IAC/C;AASA,QAPA,UAAU,KACV,GAAA,UAAU,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GACvC,UAAU,cAAc,GACxB,SAAS,mBAAmB,YAAY,QACxC,SAAS,cAAc,IACvB,UAAU,2BAA2B,SAAS,WAAW,YAAY,MAAM,GAEvE,SAAS,SAAS,WAAW;AAE7B,UAAI,KAAK,mBACT;AACI,kBAAU,UAAU,GAAG,GAAG,SAAS,OAAO,SAAS,MAAM;AAEzD,cAAM,aAAa,SAAS;AAExB,mBAAW,QAAQ,MAEnB,UAAU,cAAc,WAAW,gBAAgB,OACnD,UAAU,YAAY,WAAW,gBAAgB,SACjD,UAAU,SAAS,GAAG,GAAG,SAAS,OAAO,SAAS,MAAM,GACxD,UAAU,cAAc;AAAA,MAEhC;AAGI,wBAAiB,eACjB,cAAc,oBAAoB,MAAA,GAE9B,cAAc,MAAM,QAAQ,MAE5B,UAAU,cAAc,cAAc,MAAM,OAC5C,UAAU,YAAY,cAAc,MAAM,MAAA,GAC1C,UAAU,SAAS,GAAG,GAAG,cAAc,WAAW,cAAc,UAAU,GAC1E,UAAU,cAAc;AAMpC,UAAM,cAAc,SAAS;AAEpB,aAAA,gBAAgB,WACzB,cAAc,aAAa,QAAQ,GACnC,SAAS,gBAAgB,aAEzB,UAAU,WAEV,SAAS,mBAAmB,gBAC5B,SAAS,iBAAiB,MAE1B,SAAS,KAAK,YAAY;AAAA,EAC9B;AAAA,EAEO,UACP;AACS,SAAA,qBAAqB,MAC1B,KAAK,SAAS;AAAA,EAClB;AACJ;AA5Ja,2BAGF,YAA+B;AAAA,EAClC,MAAO,cAAc;AAAA,EACrB,MAAM;AACV;AAwJJ,WAAW,IAAI,0BAA0B;"}