{"version":3,"file":"filter-outline.mjs","sources":["../src/OutlineFilter.ts"],"sourcesContent":["import { vertex } from '@tools/fragments';\nimport fragment from './outline.frag';\nimport { Filter, utils } from '@pixi/core';\nimport type { FilterSystem, RenderTexture, CLEAR_MODES } from '@pixi/core';\n\n/**\n * OutlineFilter, originally by mishaa\n * http://www.html5gamedevs.com/topic/10640-outline-a-sprite-change-certain-colors/?p=69966\n * http://codepen.io/mishaa/pen/emGNRB<br>\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/outline.png)\n *\n * @class\n * @extends PIXI.Filter\n * @see {@link https://www.npmjs.com/package/@pixi/filter-outline|@pixi/filter-outline}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters} *\n * @example\n *  someSprite.filters = [new OutlineFilter(2, 0x99ff99)];\n */\nclass OutlineFilter extends Filter\n{\n    /** The minimum number of samples for rendering outline. */\n    public static MIN_SAMPLES = 1;\n\n    /** The maximum number of samples for rendering outline. */\n    public static MAX_SAMPLES = 100;\n\n    private _thickness = 1;\n    private _alpha = 1.0;\n    private _knockout = false;\n\n    /**\n     * @param {number} [thickness=1] - The tickness of the outline. Make it 2 times more for resolution 2\n     * @param {number} [color=0x000000] - The color of the outline.\n     * @param {number} [quality=0.1] - The quality of the outline from `0` to `1`, using a higher quality\n     *        setting will result in slower performance and more accuracy.\n     * @param {number} [alpha=1.0] - The alpha of the outline.\n     * @param {boolean} [knockout=false] - Only render outline, not the contents.\n     */\n    constructor(thickness = 1, color = 0x000000, quality = 0.1, alpha = 1.0, knockout = false)\n    {\n        super(vertex, fragment.replace(/\\$\\{angleStep\\}/, OutlineFilter.getAngleStep(quality)));\n\n        this.uniforms.uThickness = new Float32Array([0, 0]);\n        this.uniforms.uColor = new Float32Array([0, 0, 0, 1]);\n        this.uniforms.uAlpha = alpha;\n        this.uniforms.uKnockout = knockout;\n\n        Object.assign(this, { thickness, color, quality, alpha, knockout });\n    }\n\n    /**\n     * Get the angleStep by quality\n     * @private\n     */\n    private static getAngleStep(quality: number): string\n    {\n        const samples =  Math.max(\n            quality * OutlineFilter.MAX_SAMPLES,\n            OutlineFilter.MIN_SAMPLES,\n        );\n\n        return (Math.PI * 2 / samples).toFixed(7);\n    }\n\n    apply(filterManager: FilterSystem, input: RenderTexture, output: RenderTexture, clear: CLEAR_MODES): void\n    {\n        this.uniforms.uThickness[0] = this._thickness / input._frame.width;\n        this.uniforms.uThickness[1] = this._thickness / input._frame.height;\n        this.uniforms.uAlpha = this._alpha;\n        this.uniforms.uKnockout = this._knockout;\n\n        filterManager.applyFilter(this, input, output, clear);\n    }\n\n    /**\n     * The alpha of the outline.\n     * @default 1.0\n     */\n    get alpha(): number\n    {\n        return this._alpha;\n    }\n    set alpha(value: number)\n    {\n        this._alpha = value;\n    }\n\n    /**\n     * The color of the outline.\n     * @default 0x000000\n     */\n    get color(): number\n    {\n        return utils.rgb2hex(this.uniforms.uColor);\n    }\n    set color(value: number)\n    {\n        utils.hex2rgb(value, this.uniforms.uColor);\n    }\n\n    /**\n     * Only render outline, not the contents.\n     * @default false\n     */\n    get knockout(): boolean\n    {\n        return this._knockout;\n    }\n    set knockout(value: boolean)\n    {\n        this._knockout = value;\n    }\n\n    /**\n     * The thickness of the outline.\n     * @default 1\n     */\n    get thickness(): number\n    {\n        return this._thickness;\n    }\n    set thickness(value: number)\n    {\n        this._thickness = value;\n        this.padding = value;\n    }\n}\n\nexport { OutlineFilter };\n"],"names":["_OutlineFilter","Filter","thickness","color","quality","alpha","knockout","vertex","fragment","samples","filterManager","input","output","clear","value","utils","OutlineFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAMA,EAAN,cAA4BC,CAC5B,CAmBI,YAAYC,EAAY,EAAGC,EAAQ,EAAUC,EAAU,GAAKC,EAAQ,EAAKC,EAAW,GACpF,CACI,MAAMC,EAAQC,EAAS,QAAQ,kBAAmBR,EAAc,aAAaI,CAAO,CAAC,CAAC,EAd1F,KAAQ,WAAa,EACrB,KAAQ,OAAS,EACjB,KAAQ,UAAY,GAchB,KAAK,SAAS,WAAa,IAAI,aAAa,CAAC,EAAG,CAAC,CAAC,EAClD,KAAK,SAAS,OAAS,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EACpD,KAAK,SAAS,OAASC,EACvB,KAAK,SAAS,UAAYC,EAE1B,OAAO,OAAO,KAAM,CAAE,UAAAJ,EAAW,MAAAC,EAAO,QAAAC,EAAS,MAAAC,EAAO,SAAAC,CAAS,CAAC,CACtE,CAMA,OAAe,aAAaF,EAC5B,CACI,MAAMK,EAAW,KAAK,IAClBL,EAAUJ,EAAc,YACxBA,EAAc,WAClB,EAEA,OAAQ,KAAK,GAAK,EAAIS,GAAS,QAAQ,CAAC,CAC5C,CAEA,MAAMC,EAA6BC,EAAsBC,EAAuBC,EAChF,CACI,KAAK,SAAS,WAAW,GAAK,KAAK,WAAaF,EAAM,OAAO,MAC7D,KAAK,SAAS,WAAW,GAAK,KAAK,WAAaA,EAAM,OAAO,OAC7D,KAAK,SAAS,OAAS,KAAK,OAC5B,KAAK,SAAS,UAAY,KAAK,UAE/BD,EAAc,YAAY,KAAMC,EAAOC,EAAQC,CAAK,CACxD,CAMA,IAAI,OACJ,CACI,OAAO,KAAK,MAChB,CACA,IAAI,MAAMC,EACV,CACI,KAAK,OAASA,CAClB,CAMA,IAAI,OACJ,CACI,OAAOC,EAAM,QAAQ,KAAK,SAAS,MAAM,CAC7C,CACA,IAAI,MAAMD,EACV,CACIC,EAAM,QAAQD,EAAO,KAAK,SAAS,MAAM,CAC7C,CAMA,IAAI,UACJ,CACI,OAAO,KAAK,SAChB,CACA,IAAI,SAASA,EACb,CACI,KAAK,UAAYA,CACrB,CAMA,IAAI,WACJ,CACI,OAAO,KAAK,UAChB,CACA,IAAI,UAAUA,EACd,CACI,KAAK,WAAaA,EAClB,KAAK,QAAUA,CACnB,CACJ,EA5GME,IAAAA,EAANhB,EAAMgB,EAGY,YAAc,EAH1BA,EAMY,YAAc"}