SHARE
TWEET

Untitled

a guest Mar 11th, 2013 270 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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top