import com.mosesSupposes.fuse.FuseKitCommon; import flash.filters.BevelFilter; import flash.filters.BitmapFilter; import flash.filters.BlurFilter; import flash.filters.ColorMatrixFilter; import flash.filters.ConvolutionFilter; import flash.filters.DisplacementMapFilter; import flash.filters.DropShadowFilter; import flash.filters.GlowFilter; import flash.filters.GradientBevelFilter; import flash.filters.GradientGlowFilter; /** * The Fuse Kit [beta1.1z3] * Copyright (c) 2006 Moses Gunesch, MosesSupposes.com * * Distributed under MIT Open Source License, see Fuse-Kit-License.html (in fuse package directory) * Easing Equations (c) 2003 Robert Penner used by permission, see PennerEasing * Visit http://www.mosessupposes.com/Fuse * * @ignore * * Provides easy Flash8 BitmapFilter handling. Can be used as a standalone utility or in conjunction with ZigoEngine & Fuse to animate filters.
*
* @usage * actionscript_video_com_mosesSupposes_fuse_FuseFMP uses a unique naming convention for addressing BitmapFilter properties:
* short-filtername+"_"+filterprop
* DropShadow_distance
* Bevel_angle
* etc.
*
* Such pseudonyms are used in various management methods like {@link #setFilterProps}.
*
For a complete list of actionscript_video_com_mosesSupposes_fuse_FuseFMP properties call {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#getAllShortcuts} or {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#traceAllFilters}.
*
* actionscript_video_com_mosesSupposes_fuse_FuseFMP also supports its own optional Shortcuts functionality, which writes all of these pseudo-props into targets or prototypes. * This enables the getting and setting of BitmapFilter properties directly on targets, such as my_mc.Blur_blurX = 10; and, * if using ZigoEngine, tween shortcuts like my_mc.Blur_blurXTo(10);.
* For a complete list of actionscript_video_com_mosesSupposes_fuse_FuseFMP tweening methods see {@link com.mosesSupposes.fuse.Shortcuts} documentation.
* If you're using actionscript_video_com_mosesSupposes_fuse_FuseFMP without ZigoEngine and want to extend prototypes use {@link #simpleSetup}, or if you want to add & remove * shortcuts on specific targets use {@link #initialize} & {@link #deinitialize}.
*
* actionscript_video_com_mosesSupposes_fuse_FuseFMP pseudo-properties are also directly tweenable in ZigoEngine and Fuse once registered:
* ZigoEngine.doTween(my_mc, "DropShadow_angle", "-25");
* Fuse.push({ DropShadow_angle:"-25" });
* * @author Moses Gunesch / MosesSupposes.com / Based on FMP 1.0 by Danilo Sandner & Björn Wibben * @version 2.0 */ class com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP { /** * @exclude * Unique identifier used by ZigoEngine.register */ public static var registryKey:String = 'fuseFMP'; /** * Enables kit version to be retrieved at runtime or when reviewing a decompiled swf. */ public static var VERSION:String = FuseKitCommon.VERSION; /** * Extends MC, Button & TF prototypes with actionscript_video_com_mosesSupposes_fuse_FuseFMP shortcuts. * @description This enables the getting and setting of BitmapFilter properties directly on targets, using the convention short-filtername+"_"+filterprop. *

For a complete list of shortcut properties call {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#getAllShortcuts} or {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#traceAllFilters}.

* Also sets _global references to actionscript_video_com_mosesSupposes_fuse_FuseFMP and all filter classes so timeline coders can avoid using import statements.

* Note that you do not need to call this method if you're using {@link com.mosesSupposes.fuse.ZigoEngine#simpleSetup}, it will be called automatically. * @see com.mosesSupposes.fuse.ZigoEngine#simpleSetup * @see com.mosesSupposes.fuse.ZigoEngine#register */ public static function simpleSetup() : Void { initialize(MovieClip.prototype, Button.prototype, TextField.prototype); _global.actionscript_video_com_mosesSupposes_fuse_FuseFMP = actionscript_video_com_mosesSupposes_fuse_FuseFMP; for (var i:String in $fclasses) { _global[i] = $fclasses[i]; } } /** * Internal; Ensures import */ private static var $fclasses:Object; /** * Internal; memory object for shortcut methods */ private static var $shortcuts:Object; /** * Internal; resolve object for shortcut getters */ private static var $gro:Object; /** * Internal; resolve object for shortcut setters */ private static var $sro:Object; /** * Adds shortcuts to all target objects passed. * @description This enables the getting and setting of BitmapFilter properties directly on targets, using the convention short-filtername+"_"+filterprop. *

For a complete list of shortcut properties call {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#getAllShortcuts} or {@link com.mosesSupposes.fuse.actionscript_video_com_mosesSupposes_fuse_FuseFMP#traceAllFilters}.

* @param accepts one or more MovieClips, TextFields, or Buttons to initialize with shortcuts. * @see #deinitialize */ public static function initialize(target:Object):Void { if ($fclasses == undefined) { $shortcuts = {getFilterName:function (f:BitmapFilter):String { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilterName(f); }, getFilterIndex:function (f:Object):Number { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilterIndex(this, f); }, getFilter:function (f:Object, createNew:Boolean):BitmapFilter { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilter(this, f, createNew); }, writeFilter:function (f:Object, pObj:Object):Number { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.writeFilter(this, f, pObj); }, removeFilter:function (f:Object):Boolean { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.removeFilter(this, f); }, getFilterProp:function (prop:String, createNew:Boolean) { return actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilterProp(this, prop, createNew); }, setFilterProp:function (prop:String, v:Object):Void { actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProp(this, prop, v); }, setFilterProps:function (fOrPObj:Object, pObj:Object):Void { actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProps(this, fOrPObj, pObj); }, traceAllFilters:function ():Void { actionscript_video_com_mosesSupposes_fuse_FuseFMP.traceAllFilters(); }}; $fclasses = {BevelFilter:BevelFilter, BlurFilter:BlurFilter, ColorMatrixFilter:ColorMatrixFilter, ConvolutionFilter:ConvolutionFilter, DisplacementMapFilter:DisplacementMapFilter, DropShadowFilter:DropShadowFilter, GlowFilter:GlowFilter, GradientBevelFilter:GradientBevelFilter, GradientGlowFilter:GradientGlowFilter}; // getter function template $gro = {__resolve:function (name:String):Function { var f:Function = function ():BitmapFilter { var local:Object = this; if (local['filters'] != undefined) { var $splitname:Array = name.split("_"); if ($splitname[1] == 'blur') { $splitname[1] = 'blurX'; } // new filter not created if missing (getFilterProp can, however) return actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilter(this, $splitname[0]+"Filter", false)[$splitname[1]]; } }; return f; }}; // setter function template $sro = {__resolve:function (name:String):Function { var f:Function = function (val:Object) { var local:Object = this; if (local['filters'] != undefined) { actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProp(this, name, val); } }; return f; }}; } if (arguments[0] == null) { return; } // make sure only filterable targets are initialized! var valid:Array = [MovieClip, Button, TextField]; for (var i:String in arguments) { var ok:Boolean = false; for (var j:String in valid) { if (arguments[i] instanceof valid[j] || arguments[i] == Function(valid[j]).prototype) { ok = true; break; } } if (!ok) { FuseKitCommon.error('201', i); continue; } for (var $filtername:String in $fclasses) { var $f:BitmapFilter = new ($fclasses[$filtername])(); for (var b:String in $f) { // excluding .clone and any other method encountered if (typeof $f[b] == 'function') { continue; } var eigenschaft:String = $filtername.substr(0, -6)+"_"+b; (arguments[i]).addProperty(eigenschaft, $gro[eigenschaft], $sro[eigenschaft]); // must remain overwritable for direct initialization of individual targets. _global.ASSetPropFlags(arguments[i], eigenschaft, 3, 1); if (b == 'blurX') { eigenschaft = eigenschaft.slice(0, -1); (arguments[i]).addProperty(eigenschaft, $gro[eigenschaft], $sro[eigenschaft]); _global.ASSetPropFlags(arguments[i], eigenschaft, 3, 1); } } } for (var s:String in $shortcuts) { (arguments[i])[s] = $shortcuts[s]; _global.ASSetPropFlags(arguments[i], s, 7, 1); } } } /** * Removes shortcuts from specific targets or from MC, Button & TF prototypes if no targets are passed. * @param accepts one or more MovieClips, TextFields, or Buttons to strip FusFMP shortcuts from, or pass nothing/null to undo {@link #simpleSetup}. * @see #initialize */ public static function deinitialize():Void { if ($fclasses == undefined) { return; } if (arguments.length == 0) { arguments.push(MovieClip.prototype, Button.prototype, TextField.prototype); } for (var i:String in arguments) { for (var $filtername:String in $fclasses) { var $f:BitmapFilter = new ($fclasses[$filtername])(); for (var b:String in $f) { // excluding .clone and any other method encountered if (typeof $f[b] == 'function') { continue; } var eigenschaft:String = $filtername.substr(0, -6)+"_"+b; // 0,2 is NOT a mistake, do not change _global.ASSetPropFlags(arguments[i], eigenschaft, 0, 2); // safety, might be unnecessary (arguments[i]).addProperty(eigenschaft, null, null); delete (arguments[i])[eigenschaft]; } } for (var s:String in $shortcuts) { // 0,2 is NOT a mistake, do not change _global.ASSetPropFlags(arguments[i], s, 0, 2); delete (arguments[i])[s]; } } } /** * Quick way to get a filter instance's class name. * @description *
// list filter in my_mc by name to output window
	* for (var i:String in my_mc.filters) {
	* 	trace( actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilterName(my_mc.filters[i]) );
	* }
* @param $myFilter BitmapFilter instance * @return BitmapFilter instance name * @see #getAllShortcuts * @see #traceAllFilters */ public static function getFilterName($myFilter:BitmapFilter):String { if ($fclasses == undefined) { initialize(null); } for (var a:String in $fclasses) { if ($myFilter.__proto__ == Function($fclasses[a]).prototype) { return a; } } return null; } /** * Gets current filter index. * @param $obj parent object of filters * @param $myFilter BitmapFilter instance, String (like "BlurFilter" or "Blur"), or class constructor * @return index of filter in filters Array or -1 if filter doesn't exist. * @see #getFilter */ public static function getFilterIndex($obj:Object, $myFilter:Object):Number { if ($fclasses == undefined) { initialize(null); } $myFilter = $getInstance($myFilter); if ($myFilter === null) { return -1; } var $filters_temp:Array = $obj.filters; for (var i:Number = 0; i<$filters_temp.length; i++) { if (($filters_temp[i]).__proto__ == $myFilter.__proto__) { return i; } } return -1; } /** * Returns an existing filter from targ's filters Array or null if doesn't exist, or use createNew if you want a new instance to be created regardless. * @param $obj target filter's parent * @param $myFilter BitmapFilter instance, String (like "BlurFilter" or "Blur"), or class constructor * @param $createNew Boolean variable to set whether or not to create new filter instance * @return existing filter from targ's filters array or null * @see #getFilterIndex */ public static function getFilter($obj:Object, $myFilter:Object, $createNew:Boolean):BitmapFilter { var $index:Number = getFilterIndex($obj, $myFilter); if ($index == -1) { if ($createNew != true) { return null; } $index = writeFilter($obj, $myFilter); if ($index == -1) { return null; } } return ($obj.filters[$index]); } /** * Applies or overwrites an existing filter. NOTE: Use setFilterProps to update existing filters. writeFilter overwrites existing. * @param $obj target filter's parent * @param $myFilter BitmapFilter instance, String (like "BlurFilter" or "Blur"), or class constructor * @param $propsObj optional, a generic object customizing the new filter, like {blurX:50,quality:1} * @return index in target's filters array (or -1 if fails) * @see #removeFilter * @see #getFilterProp * @see #setFilterProp * @see #setFilterProps */ public static function writeFilter($obj:Object, $myFilter:Object, $propsObj:Object):Number { if ($fclasses == undefined) { initialize(null); } $myFilter = $getInstance($myFilter); if ($myFilter === null) { return -1; } var $filters_temp:Array = $obj.filters; var $index:Number = getFilterIndex($obj, $myFilter); if ($index == -1) { $filters_temp.push($myFilter); } else { $filters_temp[$index] = $myFilter; } $obj.filters = $filters_temp; if (typeof $propsObj == 'object') { setFilterProps($obj, $myFilter, $propsObj); } $index = getFilterIndex($obj, $myFilter); return ($index); } /** * Clears filter. * @param $obj target filter's parent * @param $myFilter BitmapFilter instance, String (like "BlurFilter" or "Blur"), or class constructor * @return true or false for success. * @see #writeFilter * @see #getFilterProp * @see #setFilterProp * @see #setFilterProps */ public static function removeFilter($obj:Object, $myFilter:Object):Boolean { if ($fclasses == undefined) { initialize(null); } $myFilter = $getInstance($myFilter); var $filters_temp:Array = $obj.filters; var $index:Number = getFilterIndex($obj, $myFilter); if ($index == -1) { return (false); } $filters_temp.splice($index, 1); $obj.filters = $filters_temp; return true; } /** * Queries properties from MovieClips that have not been initialized. * @param $obj target filter's parent * @param $filtername BitmapFilter instance name * @param $createNew Boolean variable to set whether or not to create new filter instance * @return the value of the property, usually a number * @see #writeFilter * @see #getFilterProp * @see #setFilterProp * @see #setFilterProps */ public static function getFilterProp($obj:Object, $filtername:String, $createNew:Boolean):Object { var $splitname:Array = $filtername.split("_"); if ($splitname[1] == 'blur') { $splitname[1] = 'blurX'; } return (actionscript_video_com_mosesSupposes_fuse_FuseFMP.getFilter($obj, $splitname[0]+"Filter", $createNew)[$splitname[1]]); } /** * Sets properties for filter. * @param $obj target filter's parent * @param $propname BitmapFilter property * @param $val Properties and values * @description Support for multiple targets and multiple properties. There are two distinct syntaxes.
examples: actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProps([my_mc,my_txt], { Blur_blurX:50, Bevel_blurX:1 }); // multiple targs, multiple filters * actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProps(my_mc, 'Blur', { blurX:50, blurY:0, quality:3 }); // write a customized blur filter to my_mc * @see #getFilterProp * @see #setFilterProps * @see #writeFilter * @see #removeFilter */ public static function setFilterProp($obj:Object, $propname:Object, $val:Object):Void { // this code block avoids calling other methods for speed (it clocks 40% of setFilterProps). if ($fclasses == undefined) { initialize(null); } var $splitname:Array = $propname.split("_"); var $fname:String = ($splitname[0]+"Filter"); if ($fclasses[$fname] == undefined) { return; } var $filter:BitmapFilter = (new ($fclasses[$fname])()); var $prop:String = $splitname[1]; var $index:Number = ($obj.filters.length || 0); while (--$index>-1) { var $f:BitmapFilter = $obj.filters[$index]; if ($f.__proto__ == $filter.__proto__) { $filter = $f; // use existing break; } } if ($prop == 'blur') { $filter['blurX'] = $val; $filter['blurY'] = $val; } else { if ($prop.indexOf('lor')>-1) { if (typeof $val == 'string' && $prop.charAt(2) != 'l') { if ($val.charAt(0) == '#') { $val = $val.slice(1); } $val = (($val.charAt(1)).toLowerCase() != 'x') ? Number('0x'+$val) : Number($val); } } $filter[$prop] = $val; } if ($index == -1) { $obj.filters = [$filter]; } else { var $ftemp:Array = $obj.filters; $ftemp[$index] = $filter; $obj.filters = $ftemp; } } /** * Sets properties for one or more filters. * @param $obj target filter's parent * @param $propname BitmapFilter property * @param $val Properties and values * @description Support for multiple targets and multiple properties. There are two distinct syntaxes.
examples: actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProps([my_mc,my_txt], { Blur_blurX:50, Bevel_blurX:1 }); // multiple targs, multiple filters * actionscript_video_com_mosesSupposes_fuse_FuseFMP.setFilterProps(my_mc, 'Blur', { blurX:50, blurY:0, quality:3 }); // write a customized blur filter to my_mc * @see #getFilterProp * @see #setFilterProp * @see #writeFilter * @see #removeFilter */ public static function setFilterProps($obj:Object, $filterOrPropsObj:Object, $propsObj:Object):Void { if ($fclasses == undefined) { initialize(null); } if (!($obj instanceof Array)) { $obj = [$obj]; } var $fo:Object = new Object(); var $prop:String, $val:Object; if (arguments.length == 3) { // 2nd param filter, 3rd param short names like blur for (var i:String in $obj) { var $filter:BitmapFilter = getFilter($obj[i], $filterOrPropsObj, true); // param3:createNew if ($filter == null) { continue; } var $prefix:String = getFilterName($filter).substr(0, -6)+'_'; for ($prop in $propsObj) { $fo[$prop] = $propsObj[$prop]; } // bugfix: arrays like "alphas" wouldn't transfer, don't know why. for ($prop in $fo) { $val = $fo[$prop]; if ($prop.indexOf($prefix) == 0) { $prop = $prop.slice($prefix.length); } // in case of long name if ($prop == 'blur') { BlurFilter($filter).blurX = Number($val); BlurFilter($filter).blurY = Number($val); } else if ($prop.indexOf('lor')>-1 && $prop.charAt(2) != 'l' && typeof $val == 'string') { if ($val.charAt(0) == '#') { $val = $val.slice(1); } $val = (($val.charAt(1)).toLowerCase() != 'x') ? Number('0x'+$val) : Number($val); } else { $filter[$prop] = $val; } } writeFilter($obj[i], $filter); } } else if (typeof $filterOrPropsObj == 'object') { // 2 params. obj contains long names like Blur_blur $propsObj = $filterOrPropsObj; for ($prop in $propsObj) { // organize all props passed by filter class names var $splitname:Array = $prop.split("_"); var $fname:String = $splitname[0]+"Filter"; if ($fclasses[$fname] == undefined) { continue; } if ($fo[$fname] == undefined) { $fo[$fname] = {}; } if ($splitname[1] == 'blur') { BlurFilter($fo[$fname]).blurX = $propsObj[$prop]; BlurFilter($fo[$fname]).blurY = $propsObj[$prop]; } else { ($fo[$fname])[$splitname[1]] = $propsObj[$prop]; } } for (var i:String in $obj) { for (var $fname:String in $fo) { var $filter:BitmapFilter = getFilter($obj[i], $fname, true); // param3:createNew if ($filter == null) { continue; } for ($prop in $fo[$fname]) { $val = ($fo[$fname])[$prop]; if ($prop.indexOf('lor')>-1 && $prop.charAt(2) != 'l' && typeof $val == 'string') { if ($val.charAt(0) == '#') { $val = $val.slice(1); } $val = (($val.charAt(1)).toLowerCase() != 'x') ? Number('0x'+$val) : Number($val); } $filter[$prop] = $val; } writeFilter($obj[i], $filter); } } } } /** * Retrieves an array of supported property shortcut strings. Similar to traceAllFilters. * @return array of supported property shortcuts * @see #traceAllFilters * @see #getFilterName */ public static function getAllShortcuts():Array { if ($fclasses == undefined) { initialize(null); } var fa:Array = []; for (var $filtername:String in $fclasses) { var $f:BitmapFilter = new ($fclasses[$filtername])(); for (var b:String in $f) { if (typeof $f[b] == 'function') { continue; } fa.push($filtername.substr(0, -6)+'_'+b); if (b == 'blurX') { fa.push($filtername.substr(0, -6)+'_blur'); } } } return fa; } /** * Lists all filters and shortcut properties (Bevel_blurX, etc.) to the Output panel for reference. * @see #getAllShortcuts * @see #getFilterName */ public static function traceAllFilters():Void { if ($fclasses == undefined) { initialize(null); } var s:String = "------ actionscript_video_com_mosesSupposes_fuse_FuseFMP filter properties ------\n"; for (var $filtername:String in $fclasses) { s += ($filtername); var $f:BitmapFilter = new ($fclasses[$filtername])(); for (var b:String in $f) { if (typeof $f[b] == 'function') { continue; } // excluding .clone and any other method encountered s += (' - '+$filtername.substr(0, -6)+'_'+b); if (b == 'blurX') { s += (' - '+$filtername.substr(0, -6)+'_blur'); } // show "_blur" props } s += '\n'; } FuseKitCommon.output(s); } /** * Internal - generates or returns existing BitmapFilter based on input type: constructor, instance, long/short-name string */ private static function $getInstance($myFilter:Object):BitmapFilter { if ($myFilter instanceof BitmapFilter) { return BitmapFilter($myFilter); } if (typeof $myFilter == "function") { for (var j:String in $fclasses) { if ($myFilter == $fclasses[j]) { return (new ($fclasses[j])()); } } } if (typeof $myFilter == "string") { var $filterStr:String = String($myFilter); if ($filterStr.substr(-6) != 'Filter') { $filterStr += 'Filter'; } // allow string to omit 'Filter'. for (var j:String in $fclasses) { if (j == $filterStr) { return (new ($fclasses[j])()); } } } return null; } }