Advertisement
Guest User

Untitled

a guest
Mar 11th, 2013
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.kpulv {
  2.     import flash.display.Bitmap;
  3.     import flash.display.BitmapData;
  4.     import flash.geom.Point;
  5.     import flash.geom.Rectangle;
  6.     import net.flashpunk.FP;
  7.     import net.flashpunk.graphics.Image;
  8.     /**
  9.      * NineSlice.as
  10.      * @author kpulv
  11.      */
  12.     public class NineSlice extends Image {
  13.        
  14.         private var _width:uint;
  15.         private var _height:uint;
  16.        
  17.         public var gridX:uint;
  18.         public var gridY:uint;
  19.        
  20.         public var snapWidth:Boolean = false;
  21.         public var snapHeight:Boolean = false;
  22.        
  23.         public var stretchLeft:Boolean = false;
  24.         public var stretchTop:Boolean = false;
  25.         public var stretchRight:Boolean = false;
  26.         public var stretchBottom:Boolean = false;
  27.         public var stretchCenter:Boolean = false;
  28.        
  29.         private static var cachedPoint:Point = new Point();
  30.         private static var cachedRect:Rectangle = new Rectangle();
  31.        
  32.         private var _sliceSource:BitmapData;
  33.        
  34.         public var sliceBuffer:BitmapData;
  35.        
  36.         public var image:Image;
  37.        
  38.         public var slices:Vector.<BitmapData> = new Vector.<BitmapData>(9);
  39.        
  40.         private var needsRefresh:Boolean = false;
  41.        
  42.         public function NineSlice(sliceSource:*, width:uint = 1, height:uint = 1) {
  43.             _bitmap = new Bitmap
  44.             _width = width;
  45.             _height = height;
  46.            
  47.             if (source is Class) {
  48.                 this.sliceSource = FP.getBitmap(sliceSource);
  49.             }
  50.             else {
  51.                 this.sliceSource = sliceSource
  52.             }
  53.            
  54.             copy();
  55.            
  56.             super(sliceBuffer);
  57.         }
  58.        
  59.         public function updateSliceBuffer():void {
  60.             if (_source) {
  61.                 _source.dispose();
  62.             }
  63.             _source = sliceBuffer;
  64.             _sourceRect = sliceBuffer.rect;
  65.             createBuffer();
  66.             updateBuffer();
  67.         }
  68.        
  69.         public function copy():void {
  70.             if (_width == 0 || _height == 0) {
  71.                 sliceBuffer = new BitmapData(1, 1);
  72.                 sliceBuffer.fillRect(sliceBuffer.rect, 0);
  73.                 return;
  74.             }
  75.            
  76.             var i:uint = 0;
  77.             var j:uint = 0;
  78.             for (i = 0; i < 9; i++) {
  79.                 slices[i] = new BitmapData(gridX, gridY);
  80.                 var xx:uint = convert2dX(i, 3) * gridX;
  81.                 var yy:uint = convert2dY(i, 3) * gridY;
  82.                 slices[i].copyPixels(_sliceSource, cacheRect(xx, yy, gridX, gridY), cachePoint(0, 0));
  83.             }
  84.            
  85.             sliceBuffer = new BitmapData(_width, _height);
  86.             sliceBuffer.fillRect(sliceBuffer.rect, 0);
  87.            
  88.            
  89.            
  90.             var bd:BitmapData;
  91.            
  92.             /** Draw the center */
  93.             if (stretchCenter) {
  94.                 if (_width > gridX + gridX) {
  95.                     if (_height > gridY + gridY) {
  96.                         bd = scaleBitmapData(slices[4], (_width - gridX - gridX) / gridX, (_height - gridY - gridY) / gridY);
  97.                         sliceBuffer.copyPixels(bd, bd.rect, cachePoint(gridX, gridY));
  98.                         bd.dispose();
  99.                     }
  100.                 }
  101.             }
  102.             else {
  103.                 for (i = gridX; i < _width - gridX; i += gridX) {
  104.                     for (j = gridY; j < _height - gridY; j += gridY) {
  105.                         sliceBuffer.copyPixels(slices[4], slices[4].rect, cachePoint(i, j));
  106.                     }
  107.                 }
  108.             }
  109.            
  110.             /** Draw the edges */
  111.             if (stretchTop) {
  112.                 if (_width > gridX + gridX) {
  113.                     bd = scaleBitmapData(slices[1], (_width - gridX - gridX) / gridX, 1);
  114.                     sliceBuffer.copyPixels(bd, bd.rect, cachePoint(gridX, 0));
  115.                     bd.dispose();
  116.                 }
  117.             }
  118.             else {
  119.                 for (i = gridX; i < _width - gridX; i += gridX) {
  120.                     sliceBuffer.copyPixels(slices[1], slices[1].rect, cachePoint(i, 0));
  121.                 }
  122.             }
  123.            
  124.             if (stretchBottom) {
  125.                 if (_width > gridX + gridX) {
  126.                     bd = scaleBitmapData(slices[7], (_width - gridX - gridX) / gridX, 1);
  127.                     sliceBuffer.copyPixels(bd, bd.rect, cachePoint(gridX, _height - gridY));
  128.                     bd.dispose();
  129.                 }
  130.             }
  131.             else {
  132.                 for (i = gridX; i < _width - gridX; i += gridX) {
  133.                     sliceBuffer.copyPixels(slices[7], slices[7].rect, cachePoint(i, _height - gridY)); 
  134.                 }
  135.             }
  136.            
  137.             if (stretchLeft) {
  138.                 if (_height > gridY + gridY) {
  139.                     bd = scaleBitmapData(slices[3], 1, (_height - gridY - gridY) / gridY);
  140.                     sliceBuffer.copyPixels(bd, bd.rect, cachePoint(0, gridY));
  141.                     bd.dispose();
  142.                 }
  143.             }
  144.             else {
  145.                 for (i = gridY; i < _height - gridY; i += gridY) {
  146.                     sliceBuffer.copyPixels(slices[3], slices[3].rect, cachePoint(0, i));
  147.                 }
  148.             }a
  149.            
  150.             if (stretchRight) {
  151.                 if (_height > gridY + gridY) {
  152.                     bd = scaleBitmapData(slices[5], 1, (_height - gridY - gridY) / gridY);
  153.                     sliceBuffer.copyPixels(bd, bd.rect, cachePoint(_width - gridX, gridY));
  154.                     bd.dispose();
  155.                 }
  156.             }
  157.             else {
  158.                 for (i = gridY; i < _height - gridY; i += gridY) {
  159.                     sliceBuffer.copyPixels(slices[5], slices[5].rect, cachePoint(_width - gridX, i));
  160.                 }
  161.             }
  162.            
  163.             /** draw corners */
  164.             sliceBuffer.copyPixels(slices[0], slices[0].rect, cachePoint(0, 0));
  165.             sliceBuffer.copyPixels(slices[2], slices[2].rect, cachePoint(_width - gridX, 0));
  166.             sliceBuffer.copyPixels(slices[6], slices[6].rect, cachePoint(0, _height - gridY));
  167.             sliceBuffer.copyPixels(slices[8], slices[8].rect, cachePoint(_width - gridX, _height - gridY));
  168.            
  169.             bd = null;
  170.         }
  171.  
  172.        
  173.         private function cachePoint(x:Number = 0, y:Number = 0):Point {
  174.             cachedPoint.x = x;
  175.             cachedPoint.y = y;
  176.             return cachedPoint;
  177.         }
  178.        
  179.         private function cacheRect(x:Number = 0, y:Number = 0, width:Number = 0, height:Number = 0 ):Rectangle {
  180.             cachedRect.x = x;
  181.             cachedRect.y = y;
  182.             cachedRect.width = width;
  183.             cachedRect.height = height;
  184.             return cachedRect;
  185.         }
  186.        
  187.         public function get sliceSource():BitmapData { return _sliceSource; }
  188.         public function set sliceSource(value:*):void {
  189.             if (value == _sliceSource) return;
  190.            
  191.             if (value is Class) {
  192.                 _sliceSource = FP.getBitmap(value);
  193.             }
  194.             else {
  195.                 _sliceSource = value;
  196.             }
  197.            
  198.             gridX = _sliceSource.width / 3;
  199.             gridY = _sliceSource.height / 3;
  200.            
  201.             copy();
  202.             updateSliceBuffer();
  203.         }
  204.        
  205.         public function set width(value:uint):void {
  206.             if (value == _width) return;
  207.            
  208.             var temp:uint = _width;
  209.             _width = value;
  210.             if (snapWidth) {
  211.                 _width = Math.floor(_width / gridX) * gridX;
  212.                 if (temp == _width) return;
  213.             }
  214.            
  215.             copy();
  216.             updateSliceBuffer();
  217.         }
  218.        
  219.         public function set height(value:uint):void {
  220.             if (value == _height) return;
  221.            
  222.             var temp:uint = _height;
  223.             _height = value;
  224.             if (snapHeight) {
  225.                 _height = Math.floor(_height / gridY) * gridY;
  226.                 if (temp == _height) return;
  227.             }
  228.            
  229.             copy();
  230.             updateSliceBuffer();
  231.         }
  232.        
  233.         public function get y2():Number {
  234.             return y + height;
  235.         }
  236.        
  237.         public function get x2():Number {
  238.             return x + width;
  239.         }
  240.        
  241.         public function get centerX():Number {
  242.             return x + width / 2;
  243.         }
  244.        
  245.         public function get centerY():Number {
  246.             return y + height / 2;
  247.         }
  248.  
  249.         protected function scaleBitmapData(bitmapData:BitmapData, scaleX:Number, scaleY:Number):BitmapData {
  250.             scaleX = Math.abs(scaleX);
  251.             scaleY = Math.abs(scaleY);
  252.             var width:int = (bitmapData.width * scaleX) || 1;
  253.             var height:int = (bitmapData.height * scaleY) || 1;
  254.             var transparent:Boolean = bitmapData.transparent;
  255.             var result:BitmapData = new BitmapData(width, height, transparent);
  256.             var matrix:Matrix = new Matrix();
  257.             matrix.scale(scaleX, scaleY);
  258.             result.draw(bitmapData, matrix);
  259.             return result;
  260.         }
  261.  
  262.         protected function convert2dX(i:int, width:uint):int {
  263.             return i % width;
  264.         }
  265.  
  266.         protected function convert2dY(i:int, width:uint):int {
  267.             return Math.floor(i / width);
  268.         }
  269.        
  270.     }
  271.  
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement