Alright, I give up. I'm going back to this BitmapSymbol class. I'm not the original author so I have no clue why it works, but it does. Here's the code in case it's useful to someone else. I think the original came from here.
public final class BitmapSymbol extends PictureMarkerSymbol
{
public function BitmapSymbol(bitmap:Bitmap)
{
super(bitmap, bitmap.width, bitmap.height);
}
override public function draw(sprite:Sprite, geometry:Geometry, attributes:Object, map:Map):void
{
const point:MapPoint = geometry as MapPoint;
sprite.x = toScreenX(map, point.x) - m_xoffset;
sprite.y = toScreenY(map, point.y) - m_yoffset);
clear(sprite);
sprite.graphics.beginBitmapFill(source.bitmapData, null, false, true);
sprite.graphics.drawRect(0, 0, source.width, source.height);
sprite.graphics.endFill();
}
}