1. BitmapData;
2. Не блендер, а BlendMode - один из параметров метода BitmapData.draw();
Мне тут самому интересно стало, я наваял такой вот код. Работает:

Код AS3:
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* ...
* @author DoctorSTaL
*/
public class PixelHitTest extends Sprite {
private var triangle:Sprite;
private var circle:Sprite;
private var bitmap:Bitmap;
public function PixelHitTest() {
super();
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
private function addedToStageHandler(event:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
init();
}
// Создаем наши объекты
private function init():void {
circle = new Sprite();
with (circle.graphics) {
beginFill(0x336699);
drawCircle(0,0,50);
endFill();
}
circle.startDrag(true);
triangle = new Sprite();
with (triangle.graphics) {
beginFill(0x0000FF);
lineTo(100, 10);
lineTo(50, 100);
endFill();
}
triangle.x = 30;
triangle.y = 40;
addChild(triangle);
addChild(circle);
bitmap = new Bitmap(); // Просто, чтобы было видно, что и куда у нас рисуется
bitmap.y = 250;
addChild(bitmap);
addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}
private function mouseMoveHandler(event:MouseEvent):void {
if (realHitTest(circle, triangle)) {
trace("They do!");
}else {
trace("They do not!");
}
}
private function realHitTest(first:DisplayObject, second:DisplayObject):Boolean {
var fBBox:Rectangle = first.getBounds(this);
var sBBox:Rectangle = second.getBounds(this);
if (fBBox.intersects(sBBox)) { // чтобы не делать лишних попиксельных проверок и больших битмап
var bounds:Rectangle = fBBox.union(sBBox); // общие границы двух объектов
var bdata:BitmapData = new BitmapData(bounds.width, bounds.height,false,0); // Битмапа с новыми размерами
bitmap.bitmapData = bdata; // Просто, чтобы было видно, что и куда у нас рисуется
// Отрисовываем первый объект. Обратите внимание на ColorTransform.
// За счет оффсетов в нем мы отрисовываем весь объект одним цветом - красным.
var fp:Point = globalToLocal(first.localToGlobal(new Point()));
var fMtrx:Matrix = new Matrix();
fMtrx.translate(fp.x-bounds.x, fp.y-bounds.y);
bdata.draw(first, fMtrx, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 0));
// Накладываем на него другой. Обратите внимание
// на BlendMode.ADD - мы добавляем на битмапу второй
// объект, но уже зеленым цветом. Зеленым по красному
// получается желтый ( 0xff0000 + 0x00ff00 = 0xffff00).
var sp:Point = globalToLocal(second.localToGlobal(new Point()));
var sMtrx:Matrix = new Matrix();
sMtrx.translate(sp.x-bounds.x,sp.y-bounds.y);
bdata.draw(second, sMtrx, new ColorTransform(1, 1, 1, 1, -255, 255, -255, 0), BlendMode.ADD);
// Если в битмапе нет желтого - объекты не накладываются.
// Впринципе, можно пользовать threshold, но не знаю - будет ли лучше.
return !bdata.getColorBoundsRect(0xffffff, 0xffff00).isEmpty();
}
bitmap.bitmapData = null;
return false;
}
}
}