画像にscale9Grid 9つのBitmapを配置

by zahir forked from 画像にscale9Grid (diff: 14)
直感でやってみたけど・・・・
* 綺麗じゃない…
*
* 修正
*
* beginBitmapFill()
* 使うのとどっちが効率的なんだろう…
* 誰かお願いします
**
* 
♥0 | Line 183 | Modified 2009-09-20 11:43:41 | MIT License | (replaced)
play

Related images

ActionScript3 source code

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

// forked from zahir's 画像にscale9Grid
/*
 * 直感でやってみたけど・・・・
 * 綺麗じゃない…
 *
 * 修正
 *
 * beginBitmapFill()
 * 使うのとどっちが効率的なんだろう…
 * 誰かお願いします
 **
 * */
package{
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;

	public class Scale9Grid_test2 extends Sprite{
		private const URL:String = "http://assets.wonderfl.net/images/related_images/6/65/65fb/65fb02d96036069076e3e206b6b6e1f50679de67";
		private var scale:Number = 0.99;
		public function Scale9Grid_test2(){
			var img:Loader = new Loader();
			img.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
			img.load( new URLRequest(URL), new LoaderContext(true));
			
			function onComp( e:Event ):void{
				var r:Rectangle = new Rectangle(36,36, img.width-72, img.height-72);
				
				var bmp:Bitmap = img.content as Bitmap;
				var bs9g:BitmapScale9Grid = new BitmapScale9Grid( bmp.bitmapData, r) ;
				addChild(bs9g);
				
				//*
				addEventListener(Event.ENTER_FRAME, function(e:Event):void{
					if(bs9g.scaleX > 1.5) scale = 0.99;
					if(bs9g.scaleX < 0.5) scale = 1.01;
					bs9g.scaleX *= scale;
				});
				//*/
			}
		}
		//-----------------------------------------------------------------
	}
}
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Rectangle;
	import flash.geom.Matrix;
	import flash.geom.Point;
	

class BitmapScale9Grid extends Sprite{
	private var lt:Bitmap;
	private var t:Bitmap;
	private var rt:Bitmap;
	
	private var l:Bitmap;
	private var m:Bitmap;
	private var r:Bitmap;
	
	private var lb:Bitmap;
	private var b:Bitmap;
	private var rb:Bitmap;
	
	private var w:Number, h:Number;
	private var insideWidth:Number;
	private var insideHeight:Number;
	
	private var left:Number;
	private var right:Number;
	private var top:Number;
	private var bottom:Number;
	
	private var _data:BitmapData;
	private var _grid:Rectangle;
	
	private var sX:Number = 1;
	private var sY:Number = 1;
	
	public function BitmapScale9Grid( data:BitmapData , grid:Rectangle){
		_data = data;
		_grid = grid;
		
		lt = new Bitmap();
		t = new Bitmap();
		rt = new Bitmap();
		
		l = new Bitmap();
		m = new Bitmap();
		r = new Bitmap();
		
		lb = new Bitmap();
		b = new Bitmap();
		rb = new Bitmap();
		
		add();
		setSource( data, grid);
	}
	public function setSource( data:BitmapData, grid:Rectangle):void{
		checkPos();
		setBitmapData();
		
		// top
		var rect:Rectangle = new Rectangle(0,0, left, top);
		var p:Point = new Point(0,0)
		lt.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle( left, 0, w - right, top);
		t.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle( w - right, 0, w, top);
		rt.bitmapData.copyPixels( data, rect, p);
		
		// m
		rect = new Rectangle(0,top, left, insideWidth);
		l.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle(left,top, w-right, insideWidth);
		m.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle(w-right,top, w, insideWidth);
		r.bitmapData.copyPixels( data, rect, p);
		
		// bottom
		rect = new Rectangle(0,h - bottom, left, bottom);
		lb.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle(left,h - bottom, w - right, bottom);
		b.bitmapData.copyPixels( data, rect, p);
		
		rect = new Rectangle( w - right,h - bottom, w, bottom);
		rb.bitmapData.copyPixels( data, rect, p);
		
		positioning( w, h);
	}
	private function checkPos():void{
		w = _data.width;
		h = _data.height;
		insideWidth = _grid.width;
		insideHeight = _grid.height;
		
		left = _grid.x;
		right = w - ( left + insideWidth );
		top = _grid.y;
		bottom = h - ( top + insideHeight );
	}
	private function setBitmapData():void{
		lt.bitmapData = new BitmapData( left, top);
		t.bitmapData = new BitmapData( insideWidth, top );
		rt .bitmapData = new BitmapData( right, top );
		
		l.bitmapData = new BitmapData( left, insideHeight );
		m.bitmapData = new BitmapData( insideWidth, insideHeight );
		r.bitmapData = new BitmapData( right, insideHeight );
		
		lb.bitmapData = new BitmapData(left, bottom );
		b.bitmapData = new BitmapData(insideWidth, bottom );
		rb.bitmapData = new BitmapData(right, bottom );
	}
	private function add():void{
		addChild( lt );
		addChild( t );
		addChild( rt );
		//*
		addChild( l );
		addChild( m );
		addChild( r );
		
		addChild( lb );
		addChild( b );
		addChild( rb );
		//*/
	}
	private function positioning( w:Number, h:Number):void{
		lt.x = l.x = lb.x = 0;
		t.x = m.x = b.x = left;
		rt.x = r.x = rb.x = w - right;
		l.y = m.y = r.y = top;
		lb.y = b.y = rb.y = h - bottom;
	}
	
	private function scaling( width:Number, height:Number):void{
		unlock();
		if( w != width){
			t.scaleX = m.scaleX = b.scaleX = (width - (left + right)) / insideWidth;
		}else{
			t.scaleX = m.scaleX = b.scaleX = 1;
		}
		if( h != height){
			l.scaleY = m.scaleY = r.scaleY = (height - (top + bottom)) / insideHeight;
		}else{
			l.scaleY = m.scaleY = r.scaleY = 1;
		}
		lock();
		positioning( width, height);
	}
	private function lock():void{
		lt.bitmapData.lock();
		t.bitmapData.lock();
		rt.bitmapData.lock();
		
		l.bitmapData.lock();
		m.bitmapData.lock();
		r.bitmapData.lock();
		
		lb.bitmapData.lock();
		b.bitmapData.lock();
		rb.bitmapData.lock();
	}
	private function unlock():void{
		lt.bitmapData.unlock();
		t.bitmapData.unlock();
		rt.bitmapData.unlock();
		
		l.bitmapData.unlock();
		m.bitmapData.unlock();
		r.bitmapData.unlock();
		
		lb.bitmapData.unlock();
		b.bitmapData.unlock();
		rb.bitmapData.unlock();
	}
	
	public override function get scaleX():Number{
		return sX;
	}
	public override function set scaleX(value:Number):void{
		scaling( Math.round( w * value ), h);
		sX = value;
	}
	public override function get scaleY():Number{
		return sY;
	}
	public override function set scaleY(value:Number):void{
		scaling(w, Math.round( h*value ) );
		sY = value;
	}
	public override function set height(value:Number):void{
		scaling(w, Math.round( value ));
	}
	public override function set width(value:Number):void{
		scaling( Math.round( value ), h);
	}
}