Partial implementation of FilterUtil.

git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@197 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Ray Greenwell
2007-04-14 00:17:18 +00:00
parent 97a7ebcab3
commit a3b441fcaa
+132
View File
@@ -0,0 +1,132 @@
package com.threerings.flash {
import flash.display.DisplayObject;
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;
import com.threerings.util.ClassUtil;
/**
* Useful utility methods that wouldn't be needed if the flash API were not so retarded.
*/
public class FilterUtil
{
/**
* Add the specified filter to the DisplayObject.
*/
public static function addFilter (disp :DisplayObject, filter :BitmapFilter) :void
{
checkArgs(disp, filter);
var filts :Array = disp.filters;
if (filts == null) {
filts = [];
}
filts.push(filter);
disp.filters = filts;
}
/**
* Remove the specified filter from the DisplayObject.
* Note that the filter set in the DisplayObject is a clone, so the values
* of the specified filter are used to find a match.
*/
public static function removeFilter (disp :DisplayObject, filter :BitmapFilter) :void
{
checkArgs(disp, filter);
var filts :Array = disp.filters;
if (filts != null) {
for (var ii :int = filts.length - 1; ii >= 0; ii--) {
var oldFilter :BitmapFilter = (filts[ii] as BitmapFilter);
if (equals(oldFilter, filter)) {
filts.splice(ii, 1);
if (filts.length == 0) {
filts = null;
}
disp.filters = filts;
return; // SUCCESS
}
}
}
}
/**
* Are the two filters equals?
*/
public static function equals (f1 :BitmapFilter, f2 :BitmapFilter) :Boolean
{
if (f1 === f2) { // catch same instance, or both null
return true;
} else if (f1 == null || f2 == null) { // otherwise nulls are no good
return false;
}
var c1 :Class = ClassUtil.getClass(f1);
if (c1 !== ClassUtil.getClass(f2)) {
return false;
}
// when we have two filters of the same class, figure it out by hand...
switch (c1) {
case BevelFilter:
// TODO
return false;
case BlurFilter:
// TODO
return false;
case ColorMatrixFilter:
// TODO
return false;
case ConvolutionFilter:
// TODO
return false;
case DisplacementMapFilter:
// TODO
return false;
case DropShadowFilter:
// TODO
return false;
case GlowFilter:
var gf1 :GlowFilter = (f1 as GlowFilter);
var gf2 :GlowFilter = (f2 as GlowFilter);
return (gf1.alpha == gf2.alpha) && (gf1.blurX == gf2.blurX) &&
(gf1.blurY == gf2.blurY) && (gf1.color == gf2.color) && (gf1.inner == gf2.inner) &&
(gf1.knockout == gf2.knockout) && (gf1.quality == gf2.quality) &&
(gf1.strength == gf2.strength);
case GradientBevelFilter:
// TODO
return false;
case GradientGlowFilter:
// TODO
return false;
default:
throw new ArgumentError("OMG! Unknown filter type: " + c1);
}
}
protected static function checkArgs (disp :DisplayObject, filter :BitmapFilter) :void
{
if (disp == null || filter == null) {
throw new ArgumentError("args may not be null");
}
}
}
}