Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.kpulv {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import net.flashpunk.FP;
- import net.flashpunk.graphics.Image;
- import net.flashpunk.utils.Draw;
- /**
- * ...
- * @author kpulv
- */
- public class NineSlice {
- private var _width:uint;
- private var _height:uint;
- public var gridX:uint;
- public var gridY:uint;
- public var snapWidth:Boolean = false;
- public var snapHeight:Boolean = false;
- public var stretchLeft:Boolean = false;
- public var stretchTop:Boolean = false;
- public var stretchRight:Boolean = false;
- public var stretchBottom:Boolean = false;
- public var stretchCenter:Boolean = false;
- private var _x:Number;
- private var _y:Number;
- public var scrollX:Number = 1;
- public var scrollY:Number = 1;
- private var _source:BitmapData;
- public var buffer:BitmapData;
- public var image:Image;
- public var slices:Vector.<BitmapData> = new Vector.<BitmapData>(9);
- private var needsRefresh:Boolean = false;
- public function NineSlice(source:*, gridX:uint, gridY:uint, width:uint = 1, height:uint = 1) {
- if (source is Class) {
- this.source = FP.getBitmap(source);
- }
- else {
- this.source = source
- }
- this.gridX = gridX;
- this.gridY = gridY;
- _width = width;
- _height = height;
- updateBuffer();
- }
- public function updateBuffer():void {
- var i:uint = 0;
- var j:uint = 0;
- for (i = 0; i < 9; i++) {
- slices[i] = new BitmapData(gridX, gridY);
- var xx:uint = convert2dX(i, 3) * gridX;
- var yy:uint = convert2dY(i, 3) * gridY;
- slices[i].copyPixels(_source, new Rectangle(xx, yy, gridX, gridY), FP.zero);
- }
- buffer = new BitmapData(_width, _height);
- buffer.fillRect(buffer.rect, 0);
- var bd:BitmapData;
- /** Draw the center */
- if (stretchCenter) {
- if (_width > gridX + gridX) {
- if (_height > gridY + gridY) {
- bd = scaleBitmapData(slices[4], (_width - gridX - gridX) / gridX, (_height - gridY - gridY) / gridY);
- buffer.copyPixels(bd, bd.rect, new Point(gridX, gridY));
- bd.dispose();
- }
- }
- }
- else {
- for (i = gridX; i < _width - gridX; i += gridX) {
- for (j = gridY; j < _height - gridY; j += gridY) {
- buffer.copyPixels(slices[4], slices[4].rect, new Point(i, j));
- }
- }
- }
- /** Draw the edges */
- if (stretchTop) {
- if (_width > gridX + gridX) {
- bd = scaleBitmapData(slices[1], (_width - gridX - gridX) / gridX, 1);
- buffer.copyPixels(bd, bd.rect, new Point(gridX, 0));
- bd.dispose();
- }
- }
- else {
- for (i = gridX; i < _width - gridX; i += gridX) {
- buffer.copyPixels(slices[1], slices[1].rect, new Point(i, 0));
- }
- }
- if (stretchBottom) {
- if (_width > gridX + gridX) {
- bd = scaleBitmapData(slices[7], (_width - gridX - gridX) / gridX, 1);
- buffer.copyPixels(bd, bd.rect, new Point(gridX, _height - gridY));
- bd.dispose();
- }
- }
- else {
- for (i = gridX; i < _width - gridX; i += gridX) {
- buffer.copyPixels(slices[7], slices[7].rect, new Point(i, _height - gridY));
- }
- }
- if (stretchLeft) {
- if (_height > gridY + gridY) {
- bd = scaleBitmapData(slices[3], 1, (_height - gridY - gridY) / gridY);
- buffer.copyPixels(bd, bd.rect, new Point(0, gridY));
- bd.dispose();
- }
- }
- else {
- for (i = gridY; i < _height - gridY; i += gridY) {
- buffer.copyPixels(slices[3], slices[3].rect, new Point(0, i));
- }
- }
- if (stretchRight) {
- if (_height > gridY + gridY) {
- bd = KscaleBitmapData(slices[5], 1, (_height - gridY - gridY) / gridY);
- buffer.copyPixels(bd, bd.rect, new Point(_width - gridX, gridY));
- bd.dispose();
- }
- }
- else {
- for (i = gridY; i < _height - gridY; i += gridY) {
- buffer.copyPixels(slices[5], slices[5].rect, new Point(_width - gridX, i));
- }
- }
- /** draw corners */
- buffer.copyPixels(slices[0], slices[0].rect, FP.zero);
- buffer.copyPixels(slices[2], slices[2].rect, new Point(_width - gridX, 0));
- buffer.copyPixels(slices[6], slices[6].rect, new Point(0, _height - gridY));
- buffer.copyPixels(slices[8], slices[8].rect, new Point(_width - gridX, _height - gridY));
- bd = null;
- image = new Image(buffer);
- image.scrollX = scrollX;
- image.scrollY = scrollY;
- image.x = x;
- image.y = y;
- }
- public function render():void {
- if (needsRefresh) {
- needsRefresh = false;
- updateBuffer();
- }
- Draw.graphic(image);
- }
- public function get source():BitmapData { return _source; }
- public function set source(value:*):void {
- if (value is Class) {
- _source = FP.getBitmap(value);
- }
- else {
- _source = value;
- }
- needsRefresh = true;
- }
- public function get x():Number { return _x; }
- public function set x(value:Number):void {
- _x = value;
- needsRefresh = true;
- }
- public function get y():Number { return _x; }
- public function set y(value:Number):void {
- _y = value;
- needsRefresh = true;
- }
- public function get width():uint { return _width; }
- public function set width(value:uint):void {
- _width = value;
- if (snapWidth) {
- _width = Math.floor(_width / gridX) * gridX;
- }
- needsRefresh = true;
- }
- public function get height():uint { return _height; }
- public function set height(value:uint):void {
- _height = value;
- if (snapHeight) {
- _height = Math.floor(_height / gridY) * gridY;
- }
- needsRefresh = true;
- }
- public static function scaleBitmapData(bitmapData:BitmapData, scaleX:Number, scaleY:Number):BitmapData {
- scaleX = Math.abs(scaleX);
- scaleY = Math.abs(scaleY);
- var width:int = (bitmapData.width * scaleX) || 1;
- var height:int = (bitmapData.height * scaleY) || 1;
- var transparent:Boolean = bitmapData.transparent;
- var result:BitmapData = new BitmapData(width, height, transparent);
- var matrix:Matrix = new Matrix();
- matrix.scale(scaleX, scaleY);
- result.draw(bitmapData, matrix);
- return result;
- }
- public static function convert2dX(i:int, width:uint):int {
- return i % width;
- }
- public static function convert2dY(i:int, width:uint, height:uint = 0):int {
- return Math.floor(i / width);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement