{"version":3,"file":"filter-drop-shadow.mjs","sources":["../src/DropShadowFilter.ts"],"sourcesContent":["import { KawaseBlurFilter } from '@pixi/filter-kawase-blur';\nimport { vertex } from '@tools/fragments';\nimport fragment from './dropshadow.frag';\nimport { Filter, settings, DEG_TO_RAD, ObservablePoint, utils } from '@pixi/core';\nimport type { IPoint, CLEAR_MODES, FilterSystem, RenderTexture, IPointData } from '@pixi/core';\n\ntype PixelSizeValue = number | number[] | IPoint;\n\ninterface DropShadowFilterOptions\n{\n    /** @deprecated */\n    rotation?: number;\n    /** @deprecated */\n    distance?: number;\n    offset: IPointData;\n    color: number;\n    alpha: number;\n    shadowOnly: boolean;\n    blur: number;\n    quality: number;\n    kernels: number[] | null;\n    pixelSize: PixelSizeValue;\n    resolution: number;\n}\n\n/**\n * Drop shadow filter.<br>\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/drop-shadow.png)\n * @class\n * @extends PIXI.Filter\n * @see {@link https://www.npmjs.com/package/@pixi/filter-drop-shadow|@pixi/filter-drop-shadow}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n */\nclass DropShadowFilter extends Filter\n{\n    /** Default constructor options. */\n    public static readonly defaults: DropShadowFilterOptions = {\n        offset: { x: 4, y: 4 },\n        color: 0x000000,\n        alpha: 0.5,\n        shadowOnly: false,\n        kernels: null,\n        blur: 2,\n        quality: 3,\n        pixelSize: 1,\n        resolution: settings.FILTER_RESOLUTION,\n    };\n\n    /** Hide the contents, only show the shadow. */\n    public shadowOnly: boolean;\n\n    /**\n     * Angle of the shadow in degrees\n     * @deprecated since 5.3.0\n     * @see DropShadowFilter#offset\n     */\n    public angle = 45;\n\n    private _offset: ObservablePoint;\n    private _distance = 5;\n    private _tintFilter: Filter;\n    private _blurFilter: KawaseBlurFilter;\n    protected _resolution: number = settings.FILTER_RESOLUTION;\n\n    /**\n     * @param {object} [options] - Filter options\n     * @param {number} [options.offset={x: 4, y: 4}] - Offset of the shadow\n     * @param {number} [options.color=0x000000] - Color of the shadow\n     * @param {number} [options.alpha=0.5] - Alpha of the shadow\n     * @param {boolean} [options.shadowOnly=false] - Whether render shadow only\n     * @param {number} [options.blur=2] - Sets the strength of the Blur properties simultaneously\n     * @param {number} [options.quality=3] - The quality of the Blur filter.\n     * @param {number[]} [options.kernels=null] - The kernels of the Blur filter.\n     * @param {number|number[]|PIXI.Point} [options.pixelSize=1] - the pixelSize of the Blur filter.\n     * @param {number} [options.resolution=PIXI.settings.FILTER_RESOLUTION] - The resolution of the Blur filter.\n     */\n    constructor(options?: Partial<DropShadowFilterOptions>)\n    {\n        super();\n\n        const opt: DropShadowFilterOptions = options\n            ? { ...DropShadowFilter.defaults, ...options }\n            : DropShadowFilter.defaults;\n\n        const { kernels, blur, quality, pixelSize, resolution } = opt;\n\n        this._offset = new ObservablePoint(this._updatePadding, this);\n        this._tintFilter = new Filter(vertex, fragment);\n        this._tintFilter.uniforms.color = new Float32Array(4);\n        this._tintFilter.uniforms.shift = this._offset;\n        this._tintFilter.resolution = resolution;\n        this._blurFilter = kernels\n            ? new KawaseBlurFilter(kernels)\n            : new KawaseBlurFilter(blur, quality);\n\n        this.pixelSize = pixelSize;\n        this.resolution = resolution;\n\n        const { shadowOnly, rotation, distance, offset, alpha, color } = opt;\n\n        this.shadowOnly = shadowOnly;\n\n        // Check for deprecated options first\n        if (rotation !== undefined && distance !== undefined)\n        {\n            this.rotation = rotation;\n            this.distance = distance;\n        }\n        else\n        {\n            this.offset = offset;\n        }\n\n        this.alpha = alpha;\n        this.color = color;\n    }\n\n    apply(filterManager: FilterSystem, input: RenderTexture, output: RenderTexture, clear: CLEAR_MODES): void\n    {\n        const target = filterManager.getFilterTexture();\n\n        this._tintFilter.apply(filterManager, input, target, 1);\n        this._blurFilter.apply(filterManager, target, output, clear);\n\n        if (this.shadowOnly !== true)\n        {\n            filterManager.applyFilter(this, input, output, 0);\n        }\n\n        filterManager.returnFilterTexture(target);\n    }\n\n    /**\n     * Recalculate the proper padding amount.\n     * @private\n     */\n    private _updatePadding()\n    {\n        const offsetPadding = Math.max(\n            Math.abs(this._offset.x),\n            Math.abs(this._offset.y)\n        );\n\n        this.padding = offsetPadding + (this.blur * 2);\n    }\n\n    /**\n     * Update the transform matrix of offset angle.\n     * @private\n     * @deprecated\n     */\n    private _updateShift()\n    {\n        this._tintFilter.uniforms.shift.set(\n            this.distance * Math.cos(this.angle),\n            this.distance * Math.sin(this.angle),\n        );\n    }\n\n    /**\n     * Set the offset position of the drop-shadow relative to the original image.\n     * @type {PIXI.IPointData}\n     * @default {x: 4, y: 4}\n     */\n    public set offset(value: IPointData)\n    {\n        this._offset.copyFrom(value);\n        this._updatePadding();\n    }\n    public get offset(): ObservablePoint\n    {\n        return this._offset;\n    }\n\n    /**\n     * The resolution of the filter.\n     * @default PIXI.settings.FILTER_RESOLUTION\n     */\n    get resolution(): number\n    {\n        return this._resolution;\n    }\n    set resolution(value: number)\n    {\n        this._resolution = value;\n\n        if (this._tintFilter)\n        {\n            this._tintFilter.resolution = value;\n        }\n        if (this._blurFilter)\n        {\n            this._blurFilter.resolution = value;\n        }\n    }\n\n    /**\n     * Distance offset of the shadow\n     * @default 5\n     * @deprecated since 5.3.0\n     * @see DropShadowFilter#offset\n     */\n    get distance(): number\n    {\n        return this._distance;\n    }\n    set distance(value: number)\n    {\n        utils.deprecation('5.3.0', 'DropShadowFilter distance is deprecated, use offset');\n        this._distance = value;\n        this._updatePadding();\n        this._updateShift();\n    }\n\n    /**\n     * The angle of the shadow in degrees\n     * @deprecated since 5.3.0\n     * @see DropShadowFilter#offset\n     */\n    get rotation(): number\n    {\n        return this.angle / DEG_TO_RAD;\n    }\n    set rotation(value: number)\n    {\n        utils.deprecation('5.3.0', 'DropShadowFilter rotation is deprecated, use offset');\n        this.angle = value * DEG_TO_RAD;\n        this._updateShift();\n    }\n\n    /**\n     * The alpha of the shadow\n     * @default 1\n     */\n    get alpha(): number\n    {\n        return this._tintFilter.uniforms.alpha;\n    }\n    set alpha(value: number)\n    {\n        this._tintFilter.uniforms.alpha = value;\n    }\n\n    /**\n     * The color of the shadow.\n     * @default 0x000000\n     */\n    get color(): number\n    {\n        return utils.rgb2hex(this._tintFilter.uniforms.color);\n    }\n    set color(value: number)\n    {\n        utils.hex2rgb(value, this._tintFilter.uniforms.color);\n    }\n\n    /**\n     * Sets the kernels of the Blur Filter\n     */\n    get kernels(): number[]\n    {\n        return this._blurFilter.kernels;\n    }\n    set kernels(value: number[])\n    {\n        this._blurFilter.kernels = value;\n    }\n\n    /**\n     * The blur of the shadow\n     * @default 2\n     */\n    get blur(): number\n    {\n        return this._blurFilter.blur;\n    }\n    set blur(value: number)\n    {\n        this._blurFilter.blur = value;\n        this._updatePadding();\n    }\n\n    /**\n     * Sets the quality of the Blur Filter\n     * @default 4\n     */\n    get quality(): number\n    {\n        return this._blurFilter.quality;\n    }\n    set quality(value: number)\n    {\n        this._blurFilter.quality = value;\n    }\n\n    /**\n     * Sets the pixelSize of the Kawase Blur filter\n     *\n     * @member {number|number[]|PIXI.Point}\n     * @default 1\n     */\n    get pixelSize(): PixelSizeValue\n    {\n        return this._blurFilter.pixelSize;\n    }\n    set pixelSize(value: PixelSizeValue)\n    {\n        this._blurFilter.pixelSize = value;\n    }\n}\n\nexport { DropShadowFilter };\nexport type { DropShadowFilterOptions };\n"],"names":["_DropShadowFilter","Filter","options","settings","opt","__spreadValues","kernels","blur","quality","pixelSize","resolution","ObservablePoint","vertex","fragment","KawaseBlurFilter","shadowOnly","rotation","distance","offset","alpha","color","filterManager","input","output","clear","target","offsetPadding","value","utils","DEG_TO_RAD","DropShadowFilter"],"mappings":"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"}