// ================================================================================================= // // Starling Framework // Copyright Gamua GmbH. All Rights Reserved. // // This program is free software. You can redistribute and/or modify it // in accordance with the terms of the accompanying license agreement. // // ================================================================================================= package starling.filters { import starling.events.Event; import starling.rendering.Painter; import starling.textures.Texture; import starling.utils.Padding; /** The FilterChain allows you to combine several filters into one. The filters will be * processed in the given order, the number of draw calls per filter adding up. * Just like conventional filters, a chain may be attached to any display object. */ public class FilterChain extends FragmentFilter { private var _filters:Vector.; // helpers private static var sPadding:Padding = new Padding(); /** Creates a new chain with the given filters. */ public function FilterChain(...args) { _filters = new []; for (var i:int = 0, len:int = args.length; i < len; ++i) { var filter:FragmentFilter = args[i] as FragmentFilter; if (filter) addFilterAt(filter, i); else throw new ArgumentError("pass only fragment filters to the constructor"); } updatePadding(); addEventListener(Event.ENTER_FRAME, onEnterFrame); } /** Disposes the filter chain itself as well as all contained filters. */ override public function dispose():void { for each (var filter:FragmentFilter in _filters) filter.dispose(); _filters.length = 0; super.dispose(); } /** @private */ override protected function setRequiresRedraw():void { updatePadding(); super.setRequiresRedraw(); } /** @private */ override public function process(painter:Painter, helper:IFilterHelper, input0:Texture = null, input1:Texture = null, input2:Texture = null, input3:Texture = null):Texture { var numFilters:int = _filters.length; var outTexture:Texture = input0; var inTexture:Texture; for (var i:int=0; i sPadding.left) sPadding.left = padding.left; if (padding.right > sPadding.right) sPadding.right = padding.right; if (padding.top > sPadding.top) sPadding.top = padding.top; if (padding.bottom > sPadding.bottom) sPadding.bottom = padding.bottom; } this.padding.copyFrom(sPadding); } private function onEnterFrame(event:Event):void { var i:int, numFilters:int = _filters.length; for (i=0; i