forked from: Patern Generator
forked from Patern Generator (diff: 4)
ActionScript3 source code
/**
* Copyright zmaxlin ( http://wonderfl.net/user/zmaxlin )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/e0Z1
*/
<?xml version="1.0" encoding="utf-8"?>
<!-- forked from clockmaker's Patern Generator -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="465" height="465" creationComplete="atReady(event)">
<!-- ===============================================
パターンジェネレーター Patern Generator
[使い方 A]
ウェブデザインの背景のパターンを作ったりする
[使い方 B]
CHECKMATEのProfessional問題のパターンに使えます
http://wonderfl.net/code/5f88476bd21cac4d45ad2086af2333782a5d3cb8
※CHECKMATEの出題問題はパターンのデザインを競い合うものではなくて
パターンを駆使してどのような表現をするかが趣旨だと思うので
このツールで簡単に投稿できるようになりますが、
パターンだけのはあんまり量產しないといいと思います。。たぶん。
================================================ -->
<mx:Script>
<![CDATA[
import mx.utils.ColorUtil;
import mx.graphics.codec.PNGEncoder;
import mx.events.ListEvent;
import mx.collections.ArrayCollection;
private var sp:Sprite;
private var paint:Bitmap;
protected function atReady(event:Event):void
{
sp = bg.addChild(new Sprite()) as Sprite;
sizeCombo.dataProvider = new ArrayCollection([
{label:"2x2", px:2},
{label:"4x4", px:4},
{label:"8x8", px:8},
{label:"16x16", px:16},
{label:"32x32", px:32},
{label:"48x48", px:48},
{label:"64x64", px:64},
{label:"128x128", px:128}
]);
sizeCombo.selectedIndex = 1;
paint = new Bitmap(null);
patern.addChild(paint);
sizeChange();
paint.bitmapData = build(
[
[1,0,0,0],
[0,1,0,0],
[0,0,1,0],
[0,0,0,1]
],
[0xFFEEEEEE, 0xFF336699]
);
update();
}
protected function onMouseDown(event:MouseEvent):void
{
var px:int = sizeCombo.selectedItem.px;
paint.bitmapData.setPixel(patern.mouseX / (10 * 16 / px), patern.mouseY / (10 * 16 / px), myColor.selectedColor);
update();
}
private function update():void
{
var g:Graphics = sp.graphics;
g.beginBitmapFill(paint.bitmapData);
g.drawRect(0,0,465,465);
g.endFill();
}
protected function sizeChange(event:ListEvent = null):void
{
var px:int = sizeCombo.selectedItem.px;
var bmpdata:BitmapData = new BitmapData(px, px, false, 0xFFCCCCCC);
paint.bitmapData = bmpdata;
paint.scaleX = paint.scaleY = 10 * 16 / px;
update();
}
protected function saveFile(event:MouseEvent):void
{
var f:FileReference = new FileReference();
f.save(new PNGEncoder().encode(paint.bitmapData), "patern.png");
}
protected function loadImage(event:MouseEvent):void
{
// ローカル畫像の読み込み
var fr:FileReference = new FileReference();
fr.browse();
fr.addEventListener("select", function():void { fr.load(); });
fr.addEventListener("complete", function():void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener("init", function():void {
var matrix:Matrix = new Matrix();
matrix.scale(sizeCombo.selectedItem.px / loader.content.width, sizeCombo.selectedItem.px / loader.content.height);
paint.bitmapData.draw(loader, matrix, null, null, null, true);
loader.unload();
});
loader.loadBytes(fr.data);
});
}
/**
* creates BitmapData filled with dot pattern.
* First parameter is 2d array that contains color index for each pixels;
* Second parameter contains color reference table.
*
* @parameter pattern:Array 2d array that contains color index for each pixel.
* @parameter colors:Array 1d array that contains color table.
* @returns BitmapData
*/
public static function build(pattern:Array, colors:Array):BitmapData{
var bitmapW:int = pattern[0].length;
var bitmapH:int = pattern.length;
var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
for(var yy:int=0; yy<bitmapH; yy++){
for(var xx:int=0; xx<bitmapW; xx++){
var color:int = colors[pattern[yy][xx]];
bmd.setPixel32(xx, yy, color);
}
}
return bmd;
}
protected function copyCheckmate(event:MouseEvent):void
{
var p:Array = [];
var c:Array = [];
var i:int, j:int, k:int;
for(i=0; i<paint.bitmapData.height; i++)
{
p[i] = [];
for(j=0; j<paint.bitmapData.width; j++)
{
var flag:Boolean = false;
for(k=0; k<c.length; k++)
if(paint.bitmapData.getPixel32(j,i) == c[k]) {flag = true; break;}
if(!flag)
c.push(paint.bitmapData.getPixel32(j,i));
for(k=0; k<c.length; k++)
if(paint.bitmapData.getPixel32(j,i) == c[k]) break;
p[i][j] = k;
}
}
// debug
paint.bitmapData = build(p,c);
update();
// for text
var str:String = "[\n";
for(i=0; i<p.length; i++)
{
str += " " + "[";
for(j=0; j<p[i].length; j++)
str += (j==0 ? "" : ",") + p[i][j];
str += "]"+ (i==p.length-1 ? "" : ", ") + "\n";
}
str += "],\n[";
for(i=0; i<c.length; i++) str += "0x" + c[i].toString(16) + (i==c.length-1 ? "" : ", ");
str += "]";
trace(str)
System.setClipboard(str);
}
]]>
</mx:Script>
<mx:UIComponent id="bg" />
<mx:Panel paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" x="200" y="50">
<mx:HBox>
<mx:Label text="Size" width="50" />
<mx:ComboBox id="sizeCombo" change="sizeChange(event)" />
</mx:HBox>
<mx:HBox>
<mx:Label text="Color" width="50" />
<mx:ColorPicker id="myColor"/>
</mx:HBox>
<mx:Button label="Load Image" click="loadImage(event)" toolTip="ローカルの畫像を読み込んでパターンに使用します" />
<mx:Label text="Please Paint" />
<mx:UIComponent id="patern" mouseDown="onMouseDown(event)" width="160" height="160" />
<mx:Button label="Copy checkmate patern" click="copyCheckmate(event)" toolTip="チェックメイト用のパターンJSONをコピーします" />
<mx:Button label="Save PNG" click="saveFile(event)" toolTip="PNGファイルでパターンを保存します" />
</mx:Panel>
</mx:Application>