forked from: スキャンライン - シードフィル

by hacker_xaotp5zq
♥0 | Line 97 | Modified 2009-12-29 14:10:57 | MIT License
play

ActionScript3 source code

/**
 * Copyright hacker_xaotp5zq ( http://wonderfl.net/user/hacker_xaotp5zq )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/pSpK
 */

// forked from kihon's スキャンライン - シードフィル
package
{
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import jp.progression.commands.Func;
	import jp.progression.commands.lists.SerialList;
	import jp.progression.commands.Wait;
	
	public class Main extends Sprite
	{
		private var bd:BitmapData;
		private var list:SerialList = new SerialList();
		private var wait:Number = 60 / 1000.0;
		
		public function Main()
		{
			bd = new BitmapData(30, 30, false, 0xFFFFFF);
			init();
			
			var bitmap:Bitmap = new Bitmap(bd);
			bitmap.scaleX = bitmap.scaleY = 465 / 30;
			addChild(bitmap);
			
			fill(15, 15, 0xED1A3D);
			init();
			list.execute();
		}
		
		private function init():void
		{
			bd.fillRect(bd.rect, 0xFFFFFF);
			for (var i:int = 0; i < 10; i++)
			{
				bd.setPixel(i, i, 0x0);
			}
			
			for (i = 3; i < 10; i++)
			{
				bd.setPixel(10, i, 0x0);
			}
			
			for (i = 10; i < 28; i++)
			{
				bd.setPixel(i, 3, 0x0);
			}
			
			for (i = 3; i < 28; i++)
			{
				bd.setPixel(28, i, 0x0);
			}
			
			for (i = 10; i < 28; i++)
			{
				bd.setPixel(i, 28, 0x0);
			}
			
			for (i = 17; i < 28; i++)
			{
				bd.setPixel(10, i, 0x0);
			}
		}
		
		private function fill(x:int, y:int, fillColor:int):void
		{
			if (bd.getPixel(x, y) == fillColor) return;
			
			var color:int = bd.getPixel(x, y);
			var buffer:Array = new Array();
			buffer.push(new Point(x, y));
			
			while (buffer.length)
			{
				var point:Point = buffer.shift();
				if (bd.getPixel(point.x, point.y) == fillColor) continue;
				
				for (var leftX:int = point.x; 0 <= leftX; leftX--)
				{
					if (bd.getPixel(leftX - 1, point.y) != color) break;
				}
				
				for (var rightX:int = point.x; rightX < bd.width; rightX++)
				{
					if (bd.getPixel(rightX + 1, point.y) != color) break;
				}
				
				bd.fillRect(new Rectangle(leftX, point.y, rightX - leftX + 1, 1), fillColor);
				list.addCommand(new Func(function(leftX:int, rightX:int, y:int):void { bd.fillRect(new Rectangle(leftX, y, rightX - leftX + 1, 1), fillColor); }, [leftX, rightX, point.y]));
				list.addCommand(new Wait(wait));
				
				if (point.y + 1 < bd.height) 	scanLine(leftX, rightX, point.y + 1, color, buffer);
				if (0 <= point.y - 1) 		scanLine(leftX, rightX, point.y - 1, color, buffer);
			}
		}
		
		private function scanLine(leftX:int, rightX:int, y:int, color:int, buffer:Array):void
		{
			while (leftX <= rightX)
			{
				for (; leftX <= rightX; leftX++)
				{
					if (bd.getPixel(leftX, y) == color) break;
				}
				
				if (rightX < leftX) break;
				
				for (; leftX <= rightX; leftX++)
				{
					if (bd.getPixel(leftX, y) != color) break;
				}
				buffer.push(new Point(leftX - 1, y));
			}
		}
	}
}