         multiply(sampledColor, sampledColor, colorWeight);
     }
 
-    private function updateParameters():void {
+    protected function updateStrengths():void {
+        _strengthsDirty = false;
+
+        _strengths.length   = 0;
+        var str:Number      = Math.min(_firstPassStrength, _strength);
+        var sum:Number      = 0;
+
+        while(sum + str < _strength) {
+            _strengths[_strengths.length] = str;
+            sum += str;
+            str *= _strengthIncreaseRatio;
+        }
+
+        var diff:Number = _strength - sum;
+
+        if(diff > 0 || _strengths.length == 0)
+            _strengths[_strengths.length] = diff;
+
+        _strengths.sort(function (a:Number, b:Number):Number { return b - a; });
+
+        //trace("strengths: [" + _strengths + "], total: " + _strength);
+    }
+
+    protected function updateOffsets():void {
         // algorithm described here:
         // http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/
         //


        _pixelSize[1] = value;
        _pixelSize[3] = value / 2;
        _paramsDirty = true;
    }

    public function get passesNeeded():int {


    protected static const TEXTURE_FLAGS:Array = [TextureFlag.TYPE_2D, TextureFlag.MODE_CLAMP, TextureFlag.FILTER_LINEAR, TextureFlag.MIP_NO];

    protected static var _verticalOffsets:Vector.<Number>     = new <Number>[0.0, 1.3846153846, 0.0, 3.2307692308];
    protected static var _horizontalOffsets:Vector.<Number>   = new <Number>[1.3846153846, 0.0, 3.2307692308, 0.0];
    protected static var _weights:Vector.<Number>             = new <Number>[0.2270270270, 0.3162162162, 0.0702702703, 0];

    private var _type:String                    = HORIZONTAL;
    private var _pass:int                       = 0;
    private var _strength:Number                = Number.NaN;
    private var _firstPassStrength:Number       = DEFAULT_FIRST_PASS_STRENGTH;
    private var _strengthIncreaseRatio:Number   = DEFAULT_STRENGTH_INCREASE_PER_PASS_RATIO;

    private var _uv:Vector.<Number>             = new <Number>[0, 1, 0, 1];
    private var _pixelSize:Vector.<Number>      = new <Number>[Number.NaN, Number.NaN, Number.NaN, Number.NaN];

    protected var _offsetsDirty:Boolean         = true;
    protected var _strengthsDirty:Boolean       = true;

    protected var _offsets:Vector.<Number>      = new <Number>[0, 0, 0, 0];
    protected var _strengths:Vector.<Number>    = new <Number>[];

    // shader constants
    protected var uvCenter:IRegister            = VARYING[0];
