Вы можете попробовать преобразовать его из рекурсивной функции в итеративную функцию, которая использует массив вместо программного стека.
Вот итеративная реализация FloodFill, как описано в , в статье Аллана упоминается :
function floodFill(bmpData:BitmapData, startX:int, startY:int, fill:uint, old:uint):void
{
var queue:Array = new Array();
queue.push(new Point(startX, startY));
var iterations:uint = 0;
var bmpWidth:int = bmpData.width;
var bmpHeight:int = bmpData.height;
var searchBmp:BitmapData = new BitmapData(bmpData.width, bmpData.height);
var currPoint:Point, newPoint:Point;
while (queue.length > 0)
{
currPoint = queue.shift();
++iterations;
if (currPoint.x < 0 || currPoint.x >= bmpWidth) continue;
if (currPoint.y < 0 || currPoint.y >= bmpHeight) continue;
searchBmp.setPixel(currPoint.x, currPoint.y, 0x00);
if (bmpData.getPixel(currPoint.x, currPoint.y) == old)
{
bmpData.setPixel(currPoint.x, currPoint.y, fill);
if (searchBmp.getPixel(currPoint.x + 1, currPoint.y) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x + 1, currPoint.y));
}
if (searchBmp.getPixel(currPoint.x, currPoint.y + 1) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x, currPoint.y + 1));
}
if (searchBmp.getPixel(currPoint.x - 1, currPoint.y) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x - 1, currPoint.y));
}
if (searchBmp.getPixel(currPoint.x, currPoint.y - 1) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x, currPoint.y - 1));
}
}
}
trace("iterations: " + iterations);
}
Редактировать: После нескольких попыток отследить, какие пиксели уже были найдены, я понял, что использование второго экземпляра BitmapData работает очень хорошо. Я обновил код соответственно.
Этот код заполняет растровое изображение 2000x1400 за ~ 14 секунд на моем компьютере. Для лучшего взаимодействия с пользователем вам следует разбить обработку заливки на несколько кадров, чтобы пользователю не приходилось смотреть на значок ожидания.
Да, и это по-прежнему влияет только на один цвет, но его легко изменить, чтобы он брал несколько цветов, или порог цвета, или аналогичный.
Редактировать, чтобы добавить: В статье Flood fill в Википедии есть несколько предложений алгоритмов.