     public static function getSnapshot(target:Object):BitmapData
     {
         if (target is GraphicElement)
-            return GraphicElement(target).getBitmapData(true, 0);
-        else if (!(target is DisplayObject))
+            return GraphicElement(target).getBitmapData(true, 0, false);
+        else if (!(target is IUIComponent))
             throw new Error("FxAnimateShaderTransition can only operate on" + 
-                    " DisplayObject and GraphicElement instances");
-        // TODO (chaase): Simplify logic here - do we really need both local and
-        // global bounds?
+                    " IUIComponent and GraphicElement instances");
         // TODO (chaase): Does this utility function belong in a more central
         // location, like UIComponent, or as part of ImageSnapshot?
-        var targetBounds:Rectangle = target.getBounds(target);
-        var boundsOffset:Point = new Point(targetBounds.x, targetBounds.y);
-        var pixelBounds:Rectangle = target.transform.pixelBounds;
+        
+        var topLevel:Sprite = Sprite(IUIComponent(target).systemManager);   
+        var rectBounds:Rectangle = target.getBounds(topLevel);
         var m:Matrix = target.transform.concatenatedMatrix;
-        m.tx = 0;
-        m.ty = 0;
-        boundsOffset = m.transformPoint(boundsOffset);
-        m.translate(-boundsOffset.x, -boundsOffset.y);
-        var bmData:BitmapData = new BitmapData(pixelBounds.width, 
-            pixelBounds.height, true, 0);
+        // truncate position because the fractional offset will already be figured
+        // into the filter placement onto the target. 
+        // TODO (chaase): There are still some offset
+        // problems with objects inside of rotated parents, depending on the angle.
+        if (m)
+            m.translate(-(Math.floor(rectBounds.x)), -(Math.floor(rectBounds.y)));
+        var bmData:BitmapData = new BitmapData(rectBounds.width, 
+            rectBounds.height, true, 0);
         bmData.draw(IBitmapDrawable(target), m);
 
         return bmData;

 * that object when it does not exist.</p>
 * 
 * <p>This effect can only be run on targets that are either 
 * DisplayObjects or GraphicElements, since capturing the bitmap
 * of the object requires information about the object that only
 * exists in these classes.</p>
 * 
 * @see mx.graphics.GraphicElement
 * @see flash.display.DisplayObject

        animateShaderTransitionInstance.bitmapFrom = bitmapFrom;
        animateShaderTransitionInstance.bitmapTo = bitmapTo;

        if (!shaderCode)
            // User should always supply a shader, but if they don't just 
            // pass it on
            animateShaderTransitionInstance.shaderCode = null;
        else
            animateShaderTransitionInstance.shaderCode = 
                (shaderCode is ByteArray) ?
                ByteArray(shaderCode) :
                new shaderCode();
        animateShaderTransitionInstance.shaderProperties = shaderProperties;
    }
}
