1  /**
     2   * properties.FilterShortcuts
     3   * Special properties for the Tweener class to handle MovieClip filters
     4   * The function names are strange/inverted because it makes for easier debugging (alphabetic order). They're only for internal use (on this class) anyways.
     5   *
     6   * @author		Zeh Fernando, Nate Chatellier, Arthur Debert
     7   * @version		1.0.0
     8   */
     9  
    10  import flash.display.BitmapData;
    11  import flash.filters.BevelFilter;
    12  import flash.filters.BitmapFilter;
    13  import flash.filters.BlurFilter;
    14  import flash.filters.ColorMatrixFilter;
    15  import flash.filters.ConvolutionFilter;
    16  import flash.filters.DisplacementMapFilter;
    17  import flash.filters.DropShadowFilter;
    18  import flash.filters.GlowFilter;
    19  import flash.filters.GradientBevelFilter;
    20  import flash.filters.GradientGlowFilter;
    21  import flash.geom.Point;
    22  
    23  import caurina.transitions.Tweener;
    24  import caurina.transitions.AuxFunctions;
    25  
    26  class caurina.transitions.properties.FilterShortcuts {
    27  
    28  	/**
    29  	 * There's no constructor.
    30  	 */
    31  	public function FilterShortcuts () {
    32  		trace ("This is an static class and should not be instantiated.")
    33  	}
    34  
    35  	/**
    36  	 * Registers all the special properties to the Tweener class, so the Tweener knows what to do with them.
    37  	 */
    38  	public static function init():Void {
    39  
    40  		// Filter tweening splitter properties
    41  		Tweener.registerSpecialPropertySplitter("_filter", _filter_splitter);
    42  
    43  		// Shortcuts - BevelFilter
    44  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/BevelFilter.html
    45  		Tweener.registerSpecialProperty("_Bevel_angle",				_filter_property_get,	_filter_property_set,	[BevelFilter, "angle"]);
    46  		Tweener.registerSpecialProperty("_Bevel_blurX",				_filter_property_get,	_filter_property_set,	[BevelFilter, "blurX"]);
    47  		Tweener.registerSpecialProperty("_Bevel_blurY",				_filter_property_get,	_filter_property_set,	[BevelFilter, "blurY"]);
    48  		Tweener.registerSpecialProperty("_Bevel_distance",			_filter_property_get,	_filter_property_set,	[BevelFilter, "distance"]);
    49  		Tweener.registerSpecialProperty("_Bevel_highlightAlpha",	_filter_property_get,	_filter_property_set,	[BevelFilter, "highlightAlpha"]);
    50  		Tweener.registerSpecialPropertySplitter("_Bevel_highlightColor",		_generic_color_splitter, ["_Bevel_highlightColor_r", "_Bevel_highlightColor_g", "_Bevel_highlightColor_b"]);
    51  		Tweener.registerSpecialProperty("_Bevel_highlightColor_r",	_filter_property_get,	_filter_property_set,	[BevelFilter, "highlightColor", "color", "r"]);
    52  		Tweener.registerSpecialProperty("_Bevel_highlightColor_g",	_filter_property_get,	_filter_property_set,	[BevelFilter, "highlightColor", "color", "g"]);
    53  		Tweener.registerSpecialProperty("_Bevel_highlightColor_b",	_filter_property_get,	_filter_property_set,	[BevelFilter, "highlightColor", "color", "b"]);
    54  		Tweener.registerSpecialProperty("_Bevel_knockout",			_filter_property_get,	_filter_property_set,	[BevelFilter, "knockout"]);
    55  		Tweener.registerSpecialProperty("_Bevel_quality",			_filter_property_get,	_filter_property_set,	[BevelFilter, "quality"]);
    56  		Tweener.registerSpecialProperty("_Bevel_shadowAlpha",		_filter_property_get,	_filter_property_set,	[BevelFilter, "shadowAlpha"]);
    57  		Tweener.registerSpecialPropertySplitter("_Bevel_shadowColor",		_generic_color_splitter, ["_Bevel_shadowColor_r", "_Bevel_shadowColor_g", "_Bevel_shadowColor_b"]);
    58  		Tweener.registerSpecialProperty("_Bevel_shadowColor_r",		_filter_property_get,	_filter_property_set,	[BevelFilter, "shadowColor", "color", "r"]);
    59  		Tweener.registerSpecialProperty("_Bevel_shadowColor_g",		_filter_property_get,	_filter_property_set,	[BevelFilter, "shadowColor", "color", "g"]);
    60  		Tweener.registerSpecialProperty("_Bevel_shadowColor_b",		_filter_property_get,	_filter_property_set,	[BevelFilter, "shadowColor", "color", "b"]);
    61  		Tweener.registerSpecialProperty("_Bevel_strength",			_filter_property_get,	_filter_property_set,	[BevelFilter, "strength"]);
    62  		Tweener.registerSpecialProperty("_Bevel_type",				_filter_property_get,	_filter_property_set,	[BevelFilter, "type"]);
    63  
    64  		// Shortcuts - BlurFilter
    65  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/BlurFilter.html
    66  		Tweener.registerSpecialProperty("_Blur_blurX",				_filter_property_get,	_filter_property_set, [BlurFilter, "blurX"]);
    67  		Tweener.registerSpecialProperty("_Blur_blurY",				_filter_property_get,	_filter_property_set, [BlurFilter, "blurY"]);
    68  		Tweener.registerSpecialProperty("_Blur_quality",			_filter_property_get,	_filter_property_set, [BlurFilter, "quality"]);
    69  
    70  		// Shortcuts - ColorMatrixFilter
    71  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/ColorMatrixFilter.html
    72  		Tweener.registerSpecialPropertySplitter("_ColorMatrix_matrix",	_generic_matrix_splitter, [[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
    73  																									["_ColorMatrix_matrix_rr", "_ColorMatrix_matrix_rg", "_ColorMatrix_matrix_rb", "_ColorMatrix_matrix_ra", "_ColorMatrix_matrix_ro",
    74  																									"_ColorMatrix_matrix_gr", "_ColorMatrix_matrix_gg", "_ColorMatrix_matrix_gb", "_ColorMatrix_matrix_ga", "_ColorMatrix_matrix_go",
    75  																									"_ColorMatrix_matrix_br", "_ColorMatrix_matrix_bg", "_ColorMatrix_matrix_bb", "_ColorMatrix_matrix_ba", "_ColorMatrix_matrix_bo",
    76  																									"_ColorMatrix_matrix_ar", "_ColorMatrix_matrix_ag", "_ColorMatrix_matrix_ab", "_ColorMatrix_matrix_aa", "_ColorMatrix_matrix_ao"]]);
    77  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_rr",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 0]);
    78  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_rg",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 1]);
    79  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_rb",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 2]);
    80  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ra",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 3]);
    81  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ro",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 4]);
    82  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_gr",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 5]);
    83  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_gg",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 6]);
    84  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_gb",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 7]);
    85  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ga",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 8]);
    86  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_go",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 9]);
    87  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_br",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 10]);
    88  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_bg",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 11]);
    89  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_bb",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 12]);
    90  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ba",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 13]);
    91  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_bo",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 14]);
    92  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ar",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 15]);
    93  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ag",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 16]);
    94  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ab",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 17]);
    95  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_aa",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 18]);
    96  		Tweener.registerSpecialProperty("_ColorMatrix_matrix_ao",	_filter_property_get,	_filter_property_set, [ColorMatrixFilter, "matrix", "matrix", 19]);
    97  
    98  		// Shortcuts - ConvolutionFilter
    99  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/ConvolutionFilter.html
   100  		Tweener.registerSpecialProperty("_Convolution_alpha",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "alpha"]);
   101  		Tweener.registerSpecialProperty("_Convolution_bias",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "bias"]);
   102  		Tweener.registerSpecialProperty("_Convolution_clamp",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "clamp"]);
   103  		Tweener.registerSpecialPropertySplitter("_Convolution_color",	_generic_color_splitter, ["_Convolution_color_r", "_Convolution_color_g", "_Convolution_color_b"]);
   104  		Tweener.registerSpecialProperty("_Convolution_color_r",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "color", "color", "r"]);
   105  		Tweener.registerSpecialProperty("_Convolution_color_g",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "color", "color", "g"]);
   106  		Tweener.registerSpecialProperty("_Convolution_color_b",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "color", "color", "b"]);
   107  		Tweener.registerSpecialProperty("_Convolution_divisor",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "divisor"]);
   108  		//Tweener.registerSpecialPropertySplitter("_Convolution_matrix",	_generic_array_splitter, ["_Convolution_matrix_array"]);
   109  		//Tweener.registerSpecialProperty("_Convolution_matrix_array",	_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "matrix", "array"]);
   110  		Tweener.registerSpecialProperty("_Convolution_matrixX",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "matrixX"]);
   111  		Tweener.registerSpecialProperty("_Convolution_matrixY",			_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "matrixY"]);
   112  		Tweener.registerSpecialProperty("_Convolution_preserveAlpha",	_filter_property_get,	_filter_property_set,	[ConvolutionFilter, "preserveAlpha"]);
   113  
   114  		// Shortcuts - DisplacementMapFilter
   115  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/DisplacementMapFilter.html
   116  		Tweener.registerSpecialProperty("_DisplacementMap_alpha",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "alpha"]);
   117  		Tweener.registerSpecialPropertySplitter("_DisplacementMap_color",	_generic_color_splitter, ["_DisplacementMap_color_r", "_DisplacementMap_color_r", "_DisplacementMap_color_r"]);
   118  		Tweener.registerSpecialProperty("_DisplacementMap_color_r",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "color", "color", "r"]);
   119  		Tweener.registerSpecialProperty("_DisplacementMap_color_g",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "color", "color", "g"]);
   120  		Tweener.registerSpecialProperty("_DisplacementMap_color_b",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "color", "color", "b"]);
   121  		Tweener.registerSpecialProperty("_DisplacementMap_componentX",		_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "componentX"]);
   122  		Tweener.registerSpecialProperty("_DisplacementMap_componentY",		_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "componentY"]);
   123  		Tweener.registerSpecialProperty("_DisplacementMap_mapBitmap",		_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "mapBitmap"]);
   124  		Tweener.registerSpecialProperty("_DisplacementMap_mapPoint",		_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "mapPoint"]);
   125  		Tweener.registerSpecialProperty("_DisplacementMap_mode",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "mode"]);
   126  		Tweener.registerSpecialProperty("_DisplacementMap_scaleX",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "scaleX"]);
   127  		Tweener.registerSpecialProperty("_DisplacementMap_scaleY",			_filter_property_get,	_filter_property_set, [DisplacementMapFilter, "scaleY"]);
   128  
   129  		// Shortcuts - DropShadowFilter
   130  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/DropShadowFilter.html
   131  		Tweener.registerSpecialProperty("_DropShadow_alpha",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "alpha"]);
   132  		Tweener.registerSpecialProperty("_DropShadow_angle",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "angle"]);
   133  		Tweener.registerSpecialProperty("_DropShadow_blurX",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "blurX"]);
   134  		Tweener.registerSpecialProperty("_DropShadow_blurY",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "blurY"]);
   135  		Tweener.registerSpecialPropertySplitter("_DropShadow_color",	_generic_color_splitter, ["_DropShadow_color_r", "_DropShadow_color_g", "_DropShadow_color_b"]);
   136  		Tweener.registerSpecialProperty("_DropShadow_color_r",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "color", "color", "r"]);
   137  		Tweener.registerSpecialProperty("_DropShadow_color_g",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "color", "color", "g"]);
   138  		Tweener.registerSpecialProperty("_DropShadow_color_b",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "color", "color", "b"]);
   139  		Tweener.registerSpecialProperty("_DropShadow_distance",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "distance"]);
   140  		Tweener.registerSpecialProperty("_DropShadow_hideObject",		_filter_property_get,	_filter_property_set, [DropShadowFilter, "hideObject"]);
   141  		Tweener.registerSpecialProperty("_DropShadow_inner",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "inner"]);
   142  		Tweener.registerSpecialProperty("_DropShadow_knockout",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "knockout"]);
   143  		Tweener.registerSpecialProperty("_DropShadow_quality",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "quality"]);
   144  		Tweener.registerSpecialProperty("_DropShadow_strength",			_filter_property_get,	_filter_property_set, [DropShadowFilter, "strength"]);
   145  		
   146  		// Shortcuts - GlowFilter
   147  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/GlowFilter.html
   148  		Tweener.registerSpecialProperty("_Glow_alpha",				_filter_property_get,	_filter_property_set, [GlowFilter, "alpha"]);
   149  		Tweener.registerSpecialProperty("_Glow_blurX",				_filter_property_get,	_filter_property_set, [GlowFilter, "blurX"]);
   150  		Tweener.registerSpecialProperty("_Glow_blurY",				_filter_property_get,	_filter_property_set, [GlowFilter, "blurY"]);
   151  		Tweener.registerSpecialPropertySplitter("_Glow_color",		_generic_color_splitter, ["_Glow_color_r", "_Glow_color_g", "_Glow_color_b"]);
   152  		Tweener.registerSpecialProperty("_Glow_color_r",			_filter_property_get,	_filter_property_set, [GlowFilter, "color", "color", "r"]);
   153  		Tweener.registerSpecialProperty("_Glow_color_g",			_filter_property_get,	_filter_property_set, [GlowFilter, "color", "color", "g"]);
   154  		Tweener.registerSpecialProperty("_Glow_color_b",			_filter_property_get,	_filter_property_set, [GlowFilter, "color", "color", "b"]);
   155  		Tweener.registerSpecialProperty("_Glow_inner",				_filter_property_get,	_filter_property_set, [GlowFilter, "inner"]);
   156  		Tweener.registerSpecialProperty("_Glow_knockout",			_filter_property_get,	_filter_property_set, [GlowFilter, "knockout"]);
   157  		Tweener.registerSpecialProperty("_Glow_quality",			_filter_property_get,	_filter_property_set, [GlowFilter, "quality"]);
   158  		Tweener.registerSpecialProperty("_Glow_strength",			_filter_property_get,	_filter_property_set, [GlowFilter, "strength"]);
   159  
   160  		// Shortcuts - GradientBevelFilter
   161  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/GradientBevelFilter.html
   162  		// .alphas (array)
   163  		Tweener.registerSpecialProperty("_GradientBevel_angle",		_filter_property_get,	_filter_property_set, [GradientBevelFilter, "angle"]);
   164  		Tweener.registerSpecialProperty("_GradientBevel_blurX",		_filter_property_get,	_filter_property_set, [GradientBevelFilter, "blurX"]);
   165  		Tweener.registerSpecialProperty("_GradientBevel_blurY",		_filter_property_get,	_filter_property_set, [GradientBevelFilter, "blurY"]);
   166  		// .colors (array)
   167  		Tweener.registerSpecialProperty("_GradientBevel_distance",	_filter_property_get,	_filter_property_set, [GradientBevelFilter, "distance"]);
   168  		Tweener.registerSpecialProperty("_GradientBevel_quality",	_filter_property_get,	_filter_property_set, [GradientBevelFilter, "quality"]);
   169  		// .ratios(array)
   170  		Tweener.registerSpecialProperty("_GradientBevel_strength",	_filter_property_get,	_filter_property_set, [GradientBevelFilter, "strength"]);
   171  		Tweener.registerSpecialProperty("_GradientBevel_type",		_filter_property_get,	_filter_property_set, [GradientBevelFilter, "type"]);
   172  
   173  		// Shortcuts - GradientGlowFilter
   174  		// http://livedocs.adobe.com/flex/2/langref/flash/filters/GradientGlowFilter.html
   175  		// .alphas (array)
   176  		Tweener.registerSpecialProperty("_GradientGlow_angle",		_filter_property_get,	_filter_property_set, [GradientGlowFilter, "angle"]);
   177  		Tweener.registerSpecialProperty("_GradientGlow_blurX",		_filter_property_get,	_filter_property_set, [GradientGlowFilter, "blurX"]);
   178  		Tweener.registerSpecialProperty("_GradientGlow_blurY",		_filter_property_get,	_filter_property_set, [GradientGlowFilter, "blurY"]);
   179  		// .colors (array)
   180  		Tweener.registerSpecialProperty("_GradientGlow_distance",	_filter_property_get,	_filter_property_set, [GradientGlowFilter, "distance"]);
   181  		Tweener.registerSpecialProperty("_GradientGlow_knockout",	_filter_property_get,	_filter_property_set, [GradientGlowFilter, "knockout"]);
   182  		Tweener.registerSpecialProperty("_GradientGlow_quality",	_filter_property_get,	_filter_property_set, [GradientGlowFilter, "quality"]);
   183  		// .ratios (array)
   184  		Tweener.registerSpecialProperty("_GradientGlow_strength",	_filter_property_get,	_filter_property_set, [GradientGlowFilter, "strength"]);
   185  		Tweener.registerSpecialProperty("_GradientGlow_type",		_filter_property_get,	_filter_property_set, [GradientGlowFilter, "type"]);
   186  
   187  	}
   188  
   189  
   190  	// ==================================================================================================================================
   191  	// PROPERTY GROUPING/SPLITTING functions --------------------------------------------------------------------------------------------
   192  
   193  	// ----------------------------------------------------------------------------------------------------------------------------------
   194  	// generic splitters
   195  
   196  	/**
   197  	 * A generic color splitter - from 0xrrggbb to r, g, b with the name of the parameters passed
   198  	 *
   199  	 * @param		p_value				Number		The original _color value
   200  	 * @return							Array		An array containing the .name and .value of all new properties
   201  	 */
   202  	public static function _generic_color_splitter (p_value:Number, p_parameters:Array):Array {
   203  		var nArray:Array = new Array();
   204  		nArray.push({name:p_parameters[0], value:AuxFunctions.numberToR(p_value)});
   205  		nArray.push({name:p_parameters[1], value:AuxFunctions.numberToG(p_value)});
   206  		nArray.push({name:p_parameters[2], value:AuxFunctions.numberToB(p_value)});
   207  		return nArray;
   208  	}
   209  
   210  	/**
   211  	 * A generic matrix splitter - from [] to items with the name of the parameters passed
   212  	 *
   213  	 * @param		p_value				Array		The original
   214  	 * @return							Array		An array containing the .name and .value of all new properties
   215  	 */
   216  	public static function _generic_matrix_splitter (p_value:Array, p_parameters:Array):Array {
   217  		if (p_value == null) p_value = p_parameters[0].concat();
   218  		var nArray:Array = new Array();
   219  		for (var i:Number = 0; i < p_value.length; i++) {
   220  			nArray.push({name:p_parameters[1][i], value:p_value[i]});
   221  		}
   222  		return nArray;
   223  	}
   224  
   225  	/**
   226  	 * A generic array splitter - from [] to items with the index passed back
   227  	 *
   228  	 * @param		p_value				Array		The original array value
   229  	 * @return							Array		An array containing the .name and .value of all new properties
   230  	 */
   231  	/*
   232  	public static function _generic_array_splitter (p_value:Array, p_parameters:Array):Array {
   233  		if (p_value == null) p_value = p_parameters[0].concat();
   234  		var nArray:Array = new Array();
   235  		for (var i:Number = 0; i < p_value.length; i++) {
   236  			nArray.push({name:p_parameters[1][i], value:p_value[i], arrayIndex:i});
   237  		}
   238  		return nArray;
   239  	}
   240  	*/
   241  
   242  	// ----------------------------------------------------------------------------------------------------------------------------------
   243  	// filters
   244  
   245  	/**
   246  	 * Splits the _filter, _blur, etc parameter into specific filter variables
   247  	 *
   248  	 * @param		p_value				BitmapFilter	A BitmapFilter instance
   249  	 * @return							Array			An array containing the .name and .value of all new properties
   250  	 */
   251  	public static function _filter_splitter (p_value:BitmapFilter):Array {
   252  		var nArray:Array = new Array();
   253  		if (p_value instanceof BevelFilter) {
   254  			nArray.push({name:"_Bevel_angle",					value:BevelFilter(p_value).angle});
   255  			nArray.push({name:"_Bevel_blurX",					value:BevelFilter(p_value).blurX});
   256  			nArray.push({name:"_Bevel_blurY",					value:BevelFilter(p_value).blurY});
   257  			nArray.push({name:"_Bevel_distance",				value:BevelFilter(p_value).distance});
   258  			nArray.push({name:"_Bevel_highlightAlpha",			value:BevelFilter(p_value).highlightAlpha});
   259  			nArray.push({name:"_Bevel_highlightColor",			value:BevelFilter(p_value).highlightColor});
   260  			nArray.push({name:"_Bevel_knockout",				value:BevelFilter(p_value).knockout});
   261  			nArray.push({name:"_Bevel_quality",					value:BevelFilter(p_value).quality});
   262  			nArray.push({name:"_Bevel_shadowAlpha",				value:BevelFilter(p_value).shadowAlpha});
   263  			nArray.push({name:"_Bevel_shadowColor",				value:BevelFilter(p_value).shadowColor});
   264  			nArray.push({name:"_Bevel_strength",				value:BevelFilter(p_value).strength});
   265  			nArray.push({name:"_Bevel_type",					value:BevelFilter(p_value).type});
   266  		} else if (p_value instanceof BlurFilter) {
   267  			nArray.push({name:"_Blur_blurX",					value:BlurFilter(p_value).blurX});
   268  			nArray.push({name:"_Blur_blurY",					value:BlurFilter(p_value).blurY});
   269  			nArray.push({name:"_Blur_quality",					value:BlurFilter(p_value).quality});
   270  		} else if (p_value instanceof ColorMatrixFilter) {
   271  			nArray.push({name:"_ColorMatrix_matrix",			value:ColorMatrixFilter(p_value).matrix});
   272  		} else if (p_value instanceof ConvolutionFilter) {
   273  			nArray.push({name:"_Convolution_alpha",				value:ConvolutionFilter(p_value).alpha});
   274  			nArray.push({name:"_Convolution_bias",				value:ConvolutionFilter(p_value).bias});
   275  			nArray.push({name:"_Convolution_clamp",				value:ConvolutionFilter(p_value).clamp});
   276  			nArray.push({name:"_Convolution_color",				value:ConvolutionFilter(p_value).color});
   277  			// .matrix
   278  			nArray.push({name:"_Convolution_divisor",			value:ConvolutionFilter(p_value).divisor});
   279  			nArray.push({name:"_Convolution_matrixX",			value:ConvolutionFilter(p_value).matrixX});
   280  			nArray.push({name:"_Convolution_matrixY",			value:ConvolutionFilter(p_value).matrixY});
   281  			nArray.push({name:"_Convolution_preserveAlpha",		value:ConvolutionFilter(p_value).preserveAlpha});
   282  		} else if (p_value instanceof DisplacementMapFilter) {
   283  			nArray.push({name:"_DisplacementMap_alpha",			value:DisplacementMapFilter(p_value).alpha});
   284  			nArray.push({name:"_DisplacementMap_color",			value:DisplacementMapFilter(p_value).color});
   285  			nArray.push({name:"_DisplacementMap_componentX",	value:DisplacementMapFilter(p_value).componentX});
   286  			nArray.push({name:"_DisplacementMap_componentY",	value:DisplacementMapFilter(p_value).componentY});
   287  			nArray.push({name:"_DisplacementMap_mapBitmap",		value:DisplacementMapFilter(p_value).mapBitmap});
   288  			nArray.push({name:"_DisplacementMap_mapPoint",		value:DisplacementMapFilter(p_value).mapPoint});
   289  			nArray.push({name:"_DisplacementMap_mode",			value:DisplacementMapFilter(p_value).mode});
   290  			nArray.push({name:"_DisplacementMap_scaleX",		value:DisplacementMapFilter(p_value).scaleX});
   291  			nArray.push({name:"_DisplacementMap_scaleY",		value:DisplacementMapFilter(p_value).scaleY});
   292  		} else if (p_value instanceof DropShadowFilter) {
   293  			nArray.push({name:"_DropShadow_alpha",				value:DropShadowFilter(p_value).alpha});
   294  			nArray.push({name:"_DropShadow_angle",				value:DropShadowFilter(p_value).angle});
   295  			nArray.push({name:"_DropShadow_blurX",				value:DropShadowFilter(p_value).blurX});
   296  			nArray.push({name:"_DropShadow_blurY",				value:DropShadowFilter(p_value).blurY});
   297  			nArray.push({name:"_DropShadow_color",				value:DropShadowFilter(p_value).color});
   298  			nArray.push({name:"_DropShadow_distance",			value:DropShadowFilter(p_value).distance});
   299  			nArray.push({name:"_DropShadow_hideObject",			value:DropShadowFilter(p_value).hideObject});
   300  			nArray.push({name:"_DropShadow_inner",				value:DropShadowFilter(p_value).inner});
   301  			nArray.push({name:"_DropShadow_knockout",			value:DropShadowFilter(p_value).knockout});
   302  			nArray.push({name:"_DropShadow_quality",			value:DropShadowFilter(p_value).quality});
   303  			nArray.push({name:"_DropShadow_strength",			value:DropShadowFilter(p_value).strength});
   304  		} else if (p_value instanceof GlowFilter) {
   305  			nArray.push({name:"_Glow_alpha",					value:GlowFilter(p_value).alpha});
   306  			nArray.push({name:"_Glow_blurX",					value:GlowFilter(p_value).blurX});
   307  			nArray.push({name:"_Glow_blurY",					value:GlowFilter(p_value).blurY});
   308  			nArray.push({name:"_Glow_color",					value:GlowFilter(p_value).color});
   309  			nArray.push({name:"_Glow_inner",					value:GlowFilter(p_value).inner});
   310  			nArray.push({name:"_Glow_knockout",					value:GlowFilter(p_value).knockout});
   311  			nArray.push({name:"_Glow_quality",					value:GlowFilter(p_value).quality});
   312  			nArray.push({name:"_Glow_strength",					value:GlowFilter(p_value).strength});
   313  		} else if (p_value instanceof GradientBevelFilter) {
   314  			// .alphas (array)
   315  			nArray.push({name:"_GradientBevel_angle",			value:GradientBevelFilter(p_value).strength});
   316  			nArray.push({name:"_GradientBevel_blurX",			value:GradientBevelFilter(p_value).blurX});
   317  			nArray.push({name:"_GradientBevel_blurY",			value:GradientBevelFilter(p_value).blurY});
   318  			// .colors (array)
   319  			nArray.push({name:"_GradientBevel_distance",		value:GradientBevelFilter(p_value).distance});
   320  			nArray.push({name:"_GradientBevel_quality",			value:GradientBevelFilter(p_value).quality});
   321  			// .ratios(array)
   322  			nArray.push({name:"_GradientBevel_strength",		value:GradientBevelFilter(p_value).strength});
   323  			nArray.push({name:"_GradientBevel_type",			value:GradientBevelFilter(p_value).type});
   324  		} else if (p_value instanceof GradientGlowFilter) {
   325  			// .alphas (array)
   326  			nArray.push({name:"_GradientGlow_angle",			value:GradientGlowFilter(p_value).strength});
   327  			nArray.push({name:"_GradientGlow_blurX",			value:GradientGlowFilter(p_value).blurX});
   328  			nArray.push({name:"_GradientGlow_blurY",			value:GradientGlowFilter(p_value).blurY});
   329  			// .colors (array)
   330  			nArray.push({name:"_GradientGlow_distance",			value:GradientGlowFilter(p_value).distance});
   331  			nArray.push({name:"_GradientGlow_knockout",			value:GradientGlowFilter(p_value).knockout});
   332  			nArray.push({name:"_GradientGlow_quality",			value:GradientGlowFilter(p_value).quality});
   333  			// .ratios(array)
   334  			nArray.push({name:"_GradientGlow_strength",			value:GradientGlowFilter(p_value).strength});
   335  			nArray.push({name:"_GradientGlow_type",				value:GradientGlowFilter(p_value).type});
   336  		} else {
   337  			// ?
   338  			trace ("Tweener FilterShortcuts Error :: Unknown filter class used");
   339  		}
   340  		return nArray;
   341  	}
   342  
   343  
   344  	// ==================================================================================================================================
   345  	// NORMAL SPECIAL PROPERTY functions ------------------------------------------------------------------------------------------------
   346  
   347  	// ----------------------------------------------------------------------------------------------------------------------------------
   348  	// filters
   349  
   350  	/**
   351  	 * (filters)
   352  	 * Generic function for the properties of filter objects
   353  	 */
   354  	public static function _filter_property_get (p_obj:Object, p_parameters:Array):Number {
   355  		var f:Array = p_obj.filters;
   356  		var i:Number;
   357  		var filterClass:Object = p_parameters[0];
   358  		var propertyName:String = p_parameters[1];
   359  		var splitType:String = p_parameters[2];
   360  		for (i = 0; i < f.length; i++) {
   361  			if (f[i] instanceof filterClass) {
   362  				if (splitType == "color") {
   363  					// Composite, color channel
   364  					var colorComponent:String = p_parameters[3];
   365  					if (colorComponent == "r") return AuxFunctions.numberToR(f[i][propertyName]);
   366  					if (colorComponent == "g") return AuxFunctions.numberToG(f[i][propertyName]);
   367  					if (colorComponent == "b") return AuxFunctions.numberToB(f[i][propertyName]);
   368  				} else if (splitType == "matrix") {
   369  					// Composite, some kind of matrix
   370  					return f[i][propertyName][p_parameters[3]];
   371  				} else {
   372  					// Standard property
   373  					return (f[i][propertyName]);
   374  				}
   375  			}
   376  		}
   377  
   378  		// No value found for this property - no filter instance found using this class!
   379  		// Must return default desired values
   380  		var defaultValues:Object;
   381  		switch (filterClass) {
   382  			case BevelFilter:
   383  				defaultValues = {angle:NaN, blurX:0, blurY:0, distance:0, highlightAlpha:1, highlightColor:NaN, knockout:null, quality:NaN, shadowAlpha:1, shadowColor:NaN, strength:2, type:null};
   384  				break;
   385  			case BlurFilter:
   386  				defaultValues = {blurX:0, blurY:0, quality:NaN};
   387  				break;
   388  			case ColorMatrixFilter:
   389  				defaultValues = {matrix:[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]};
   390  				break;
   391  			case ConvolutionFilter:
   392  				defaultValues = {alpha:0, bias:0, clamp:null, color:NaN, divisor:1, matrix:[1], matrixX:1, matrixY:1, preserveAlpha:null};
   393  				break;
   394  			case DisplacementMapFilter:
   395  				defaultValues = {alpha:0, color:NaN, componentX:null, componentY:null, mapBitmap:null, mapPoint:null, mode:null, scaleX:0, scaleY:0};
   396  				break;
   397  			case DropShadowFilter:
   398  				defaultValues = {distance:0, angle:NaN, color:NaN, alpha:1, blurX:0, blurY:0, strength:1, quality:NaN, inner:null, knockout:null, hideObject:null};
   399  				break;
   400  			case GlowFilter:
   401  				defaultValues = {alpha:1, blurX:0, blurY:0, color:NaN, inner:null, knockout:null, quality:NaN, strength:2};
   402  				break;
   403  			case GradientBevelFilter:
   404  				defaultValues = {alphas:null, angle:NaN, blurX:0, blurY:0, colors:null, distance:0, knockout:null, quality:NaN, ratios:NaN, strength:1, type:null};
   405  				break;
   406  			case GradientGlowFilter:
   407  				defaultValues = {alphas:null, angle:NaN, blurX:0, blurY:0, colors:null, distance:0, knockout:null, quality:NaN, ratios:NaN, strength:1, type:null};
   408  				break;
   409  		}
   410  		// When returning NaN, the Tweener engine sets the starting value as being the same as the final value (if not found)
   411  		// When returning null, the Tweener engine doesn't tween it at all, just setting it to the final value
   412  		// This is DIFFERENT from the default filter applied as default on _filter_property_set because some values shouldn't be tweened
   413  		if (splitType == "color") {
   414  			// Composite, color channel; always defaults to target value
   415  			return NaN;
   416  		} else if (splitType == "matrix") {
   417  			// Composite, matrix; always defaults to target value
   418  			return defaultValues[propertyName][p_parameters[3]];
   419  		} else {
   420  			// Standard property
   421  			return defaultValues[propertyName];
   422  		}
   423  	}
   424  
   425  	public static function _filter_property_set (p_obj:Object, p_value:Number, p_parameters:Array):Void {
   426  		var f:Array = p_obj.filters;
   427  		var i:Number;
   428  		var filterClass:Object = p_parameters[0];
   429  		var propertyName:String = p_parameters[1];
   430  		var splitType:String = p_parameters[2];
   431  		for (i = 0; i < f.length; i++) {
   432  			if (f[i] instanceof filterClass) {
   433  				if (splitType == "color") {
   434  					// Composite, color channel
   435  					var colorComponent:String = p_parameters[3];
   436  					if (colorComponent == "r") f[i][propertyName] = (f[i][propertyName] & 0xffff) | (p_value << 16);
   437  					if (colorComponent == "g") f[i][propertyName] = (f[i][propertyName] & 0xff00ff) | (p_value << 8);
   438  					if (colorComponent == "b") f[i][propertyName] = (f[i][propertyName] & 0xffff00) | p_value;
   439  				} else if (splitType == "matrix") {
   440  					var mtx:Array = f[i][propertyName];
   441  					mtx[p_parameters[3]] = p_value;
   442  					f[i][propertyName] = mtx;
   443  				} else {
   444  					// Standard property
   445  					f[i][propertyName] = p_value;
   446  				}
   447  				p_obj.filters = f;
   448  				return;
   449  			}
   450  		}
   451  
   452  		// The correct filter class wasn't found, so create a new one that is the equivalent of the object without the filter
   453  		if (f == undefined) f = new Array();
   454  		var fi:BitmapFilter;
   455  		switch (filterClass) {
   456  			case BevelFilter:
   457  				fi = new BevelFilter(0, 45, 0xffffff, 1, 0x000000, 1, 0, 0);
   458  				break;
   459  			case BlurFilter:
   460  				fi = new BlurFilter(0, 0);
   461  				break;
   462  			case ColorMatrixFilter:
   463  				fi = new ColorMatrixFilter([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]);
   464  				break;
   465  			case ConvolutionFilter:
   466  				fi = new ConvolutionFilter(1, 1, [1], 1, 0, true, true, 0x000000, 0);
   467  				break;
   468  			case DisplacementMapFilter:
   469  				// Doesn't make much sense to create a new empty DisplacementMapFilter if there's nothing to tween
   470  				fi = new DisplacementMapFilter(new BitmapData(10, 10), new Point(0, 0), 0, 1, 0, 0);
   471  				break;
   472  			case DropShadowFilter:
   473  				fi = new DropShadowFilter(0, 45, 0x000000, 1, 0, 0);
   474  				break;
   475  			case GlowFilter:
   476  				fi = new GlowFilter(0xff0000, 1, 0, 0);
   477  				break;
   478  			case GradientBevelFilter:
   479  				fi = new GradientBevelFilter(0, 45, [0xffffff, 0x000000], [1, 1], [32, 223], 0, 0);
   480  				break;
   481  			case GradientGlowFilter:
   482  				fi = new GradientGlowFilter(0, 45, [0xffffff, 0x000000], [1, 1], [32, 223], 0, 0);
   483  				break;
   484  		}
   485  		//fi[propertyName] = p_value;
   486  		f.push(fi);
   487  		p_obj.filters = f;
   488  		_filter_property_set(p_obj, p_value, p_parameters);
   489  	}
   490  
   491  }
   492