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:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user