1
8
9 import com.sekati.core.App;
10 import com.sekati.display.IBitmapImageClip;
11 import com.sekati.display.BaseClip;
12 import com.sekati.utils.Delegate;
13 import com.sekati.utils.MovieClipUtils;
14 import com.sekati.except.FatalException;
15 import flash.display.BitmapData;
16 import flash.geom.ColorTransform;
17 import flash.geom.Matrix;
18 import flash.geom.Rectangle;
19
20
40 class com.sekati.display.BitmapImageSliceClip extends BaseClip implements IBitmapImageClip {
41
42 public var img:MovieClip;
43 public var bmp:Array;
44 private var _uri:String;
45 private var _smooth:Boolean;
46 private var _progressCb:Function;
47 private var _initCb:Function;
48 private var _errorCb:Function;
49 private var _loader:MovieClipLoader;
50 private var _tmp:MovieClip;
51
52
55 public function BitmapImageSliceClip() {
56 super();
57 _loader = new MovieClipLoader();
58 _this.onLoadInit = Delegate.create(_this, _onInit);
59 _this.onLoadError = Delegate.create(_this, _onError);
60 _this.onLoadProgress = Delegate.create(_this, _onProgress);
61 _loader.addListener(_this);
62 }
63
64
73 public function load(uri:String, isSmoothed:Boolean, onInit:Function, onProgress:Function, onError:Function):Void {
74 _uri = uri;
75 _smooth = isSmoothed;
76 _progressCb = onProgress;
77 _initCb = onInit;
78 _errorCb = onError;
79 createContainers();
80 _loader.loadClip(_uri, _tmp);
81 }
82
83
87 public function unload():Void {
88 _loader.unloadClip(img);
89 bmp.dispose();
90 MovieClipUtils.rmClip(_tmp);
91 MovieClipUtils.rmClip(img);
92 }
93
94
98 private function createContainers():Void {
99 if (bmp.length > 0) {
100 for (var i:Number = 0; i < bmp.length; i++) bmp[i].dispose();
101 }
102 if (_tmp) MovieClipUtils.rmClip(_tmp);
103 if (img) MovieClipUtils.rmClip(img);
104 img = _this.createEmptyMovieClip("img", _this.getNextHighestDepth());
105 _tmp = _this.createEmptyMovieClip("_tmp", _this.getNextHighestDepth());
106 bmp = new Array();
107
108 _tmp._visible = false;
109 _this._alpha = 0;
110 }
111
112
116 private function clearCallbacks():Void {
117 _initCb = undefined;
118 _progressCb = undefined;
119 _errorCb = undefined;
120 }
121
122
127 private function _onInit():Void {
128 var sw:Number = _tmp._width;
129 var sh:Number = _tmp._height;
130 var sliceWidth:Number = 2000;
131 var slices:Number = Math.ceil( sw / sliceWidth );
132 var rect:Rectangle = new Rectangle( 0, 0, sliceWidth, sh );
133 var ct:ColorTransform = new ColorTransform();
134
135 App.log.info("foo", "### Source Image ("+sw+"x"+sh+") results in: "+slices+" slices @ "+sliceWidth+" px/slice (including overflow)");
136
137
138 for (var i:Number = 0; i < slices; i++) {
139 var xslice:Number = sliceWidth * i;
140 var diff:Number = 0;
141 if (i == (slices - 1) && (xslice + sliceWidth) > _tmp._width) {
142 App.log.warn(_this, "!!! BITMAP:IMAGE -> BUFFER OVERFLOW !!!");
143 diff = sliceWidth-(_tmp._width - xslice);
144 rect = new Rectangle(0, 0, sliceWidth-diff, sh);
145 App.log.info(_this, "Adjusting for overflow: New sliceWidth: "+(sliceWidth-diff));
146 }
147 var b:BitmapData = new BitmapData( (sliceWidth-diff), sh, true, 0x00FFFFFF );
148 var m:Matrix = new Matrix();
149 m.translate( -i*sliceWidth, 0 );
150 b.draw( _tmp, m, ct, "normal", rect, true );
151 var container:MovieClip = img.createEmptyMovieClip( "bmp"+i, img.getNextHighestDepth() );
152 container.attachBitmap( b, container.getNextHighestDepth(), "auto", _smooth );
153 container._x = xslice;
154 bmp.push(b);
155 App.log.info(_this, "Attaching bitmapData slice: "+i+" ("+container+"._x:"+container._x+") slice section: "+xslice+" - " +(xslice + sliceWidth - diff));
156 }
157
158 App.log.status(_this, ":Bitmap:Image slice assembly completed successfully: "+img._width+"x"+img._height);
159
160 MovieClipUtils.rmClip(_tmp);
161 _initCb();
162 clearCallbacks();
163 }
164
165
172 private function _onProgress(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
173
174 _progressCb(bytesLoaded, bytesTotal);
175 }
176
177
182 private function _onError(target_mc:MovieClip, errorCode:String, httpStatus:Number):Void {
183 _errorCb(errorCode, httpStatus);
184 clearCallbacks();
185 throw new FatalException(_this, "Could not load image from url:"+_uri, arguments);
186 }
187 }
188