チェンジセット 3614
- コミット日時:
- 2010/03/27 19:44:08 (3 年前)
- ファイル:
-
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmap.as (更新) (10 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmapCollection.as (更新) (23 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Painter.as (更新) (13 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/UndoStack.as (更新) (3 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/ui/IApplication.as (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmap.as
r3612 r3614 3 3 import flash.display.Bitmap; 4 4 import flash.display.BitmapData; 5 import flash.display.DisplayObject; 5 6 import flash.display.IBitmapDrawable; 6 7 import flash.geom.ColorTransform; … … 27 28 ); 28 29 name = "Layer" + index; 29 this.bitmapData = bitmapData;30 setBitmapData(bitmapData); 30 31 } 31 32 … … 63 64 blendMode:String):void 64 65 { 65 bitmapData = m_bitmapData.clone();66 setBitmapData(m_bitmapData.clone()); 66 67 m_bitmapData.draw(source, null, null, blendMode); 67 68 } … … 92 93 var transformed:BitmapData = new BitmapData(width, height, true, 0x0); 93 94 transformed.draw(bitmapData, matrix); 94 bitmapData = transformed;95 setBitmapData(transformed); 95 96 } 96 97 … … 104 105 public function floodFill(x:Number, y:Number, color:uint):void 105 106 { 106 bitmapData = m_bitmapData.clone();107 setBitmapData(m_bitmapData.clone()); 107 108 m_bitmapData.floodFill(x, y, color); 108 109 } … … 117 118 public function setPixel(x:Number, y:Number, color:uint):void 118 119 { 119 bitmapData = m_bitmapData.clone();120 setBitmapData(m_bitmapData.clone()); 120 121 m_bitmapData.setPixel32(x, y, color); 121 122 } … … 148 149 }; 149 150 } 151 152 private function setBitmapData(value:BitmapData):void 153 { 154 m_bitmap.bitmapData = value; 155 m_bitmapData = value; 156 } 150 157 151 158 /** … … 165 172 { 166 173 return m_bitmap.blendMode; 174 } 175 176 /** 177 * DisplayObject の派生オブジェクトを取得する 178 * 179 */ 180 public function get displayObject():DisplayObject 181 { 182 return m_bitmap; 167 183 } 168 184 … … 222 238 } 223 239 224 internal function get bitmap():Bitmap225 { 226 return m_bitmap;240 internal function get newDisplayObject():DisplayObject 241 { 242 return new Bitmap(m_bitmapData); 227 243 } 228 244 … … 230 246 { 231 247 return m_bitmapData; 232 }233 234 internal function set bitmapData(value:BitmapData):void235 {236 m_bitmap.bitmapData = value;237 m_bitmapData = value;238 248 } 239 249 as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmapCollection.as
r3612 r3614 3 3 import flash.display.Bitmap; 4 4 import flash.display.BitmapData; 5 import flash.display.DisplayObject; 5 6 import flash.display.Sprite; 7 import flash.events.Event; 8 import flash.events.IEventDispatcher; 6 9 7 10 import org.libspark.gunyarapaint.framework.errors.MergeLayersError; … … 12 15 * 13 16 */ 14 public class LayerBitmapCollection 17 public class LayerBitmapCollection implements IEventDispatcher 15 18 { 16 19 public function LayerBitmapCollection(width:int, height:int) … … 20 23 m_width = width; 21 24 m_height = height; 22 layers = new Vector.<LayerBitmap>();23 spriteToView= new Sprite();25 m_layers = new Vector.<LayerBitmap>(); 26 m_sprite = new Sprite(); 24 27 // 白い背景を作成してレイヤー群に追加する 25 28 var layer:LayerBitmap = new LayerBitmap( … … 28 31 layer.name = "Background"; 29 32 composited = new BitmapData(width, height, true, 0x0); 30 layers.push(layer); 31 spriteToView.addChild(layer.bitmap); 33 addLayer(layer); 32 34 } 33 35 … … 44 46 ); 45 47 currentIndex++; 46 layers.splice(currentIndex, 0, layer);47 spriteToView.addChildAt(layer.bitmap, currentIndex);48 m_layers.splice(currentIndex, 0, layer); 49 m_sprite.addChildAt(layer.displayObject, currentIndex); 48 50 compositeAll(); 49 51 resetLayersIndex(); … … 51 53 52 54 /** 55 * レイヤーオブジェクトを追加する 56 * 57 * @param layer レイヤーオブジェクト 58 */ 59 public function addLayer(layer:LayerBitmap):void 60 { 61 m_layers.push(layer); 62 m_sprite.addChild(layer.displayObject); 63 } 64 65 /** 53 66 * 指定された番号のレイヤーを取り出す 54 67 * … … 58 71 public function at(index:int):LayerBitmap 59 72 { 60 return layers[index];73 return m_layers[index]; 61 74 } 62 75 … … 79 92 public function copyAt(index:int):void 80 93 { 81 var layer:LayerBitmap = layers[index].clone();94 var layer:LayerBitmap = m_layers[index].clone(); 82 95 layer.name += "'s copy"; 83 layers.splice(index, 0, layer);84 spriteToView.addChildAt(layer.bitmap, index);96 m_layers.splice(index, 0, layer); 97 m_sprite.addChildAt(layer.displayObject, index); 85 98 compositeAll(); 86 99 resetLayersIndex(); … … 95 108 public function swap(from:int, to:int):void 96 109 { 97 var layer:LayerBitmap = layers[from];98 layers[from] =layers[to];99 layers[to] = layer;100 spriteToView.swapChildrenAt(from, to);110 var layer:LayerBitmap = m_layers[from]; 111 m_layers[from] = m_layers[to]; 112 m_layers[to] = layer; 113 m_sprite.swapChildrenAt(from, to); 101 114 compositeAll(); 102 115 resetLayersIndex(); … … 128 141 // レイヤーは必ず2つ以上 129 142 if (currentIndex > 0) { 130 var current:LayerBitmap = layers[index];131 var prev:LayerBitmap = layers[index - 1];143 var current:LayerBitmap = m_layers[index]; 144 var prev:LayerBitmap = m_layers[index - 1]; 132 145 // 両方可視である必要がある 133 146 if (current.visible && prev.visible) { … … 135 148 // 合成後の LayerBitmap は完全に不透明にしておく 136 149 prev.alpha = 1.0; 137 layers.splice(index, 1);138 spriteToView.removeChildAt(index);150 m_layers.splice(index, 1); 151 m_sprite.removeChildAt(index); 139 152 if (index >= currentIndex) 140 153 currentIndex -= 1; … … 170 183 public function removeAt(index:int):void 171 184 { 172 if ( layers.length <= 1)185 if (m_layers.length <= 1) 173 186 throw new RemoveLayerError(); 174 layers[index].bitmapData.dispose();175 layers.splice(index, 1);176 spriteToView.removeChildAt(index);187 m_layers[index].bitmapData.dispose(); 188 m_layers.splice(index, 1); 189 m_sprite.removeChildAt(index); 177 190 if (currentIndex > 0 && index >= currentIndex) 178 191 currentIndex -= 1; … … 182 195 183 196 /** 197 * 表示オブジェクトから現在のビューを削除する 198 * 199 * @param parent 親となる表示オブジェクト 200 */ 201 public function removeView(parent:Sprite):void 202 { 203 parent.removeChild(m_sprite); 204 } 205 206 /** 207 * 現在のビューを表示オブジェクトに設定する 208 * 209 * @param parent 親となる表示オブジェクト 210 */ 211 public function setView(parent:Sprite):void 212 { 213 parent.addChild(m_sprite); 214 } 215 216 /** 184 217 * 現在の全てのレイヤー情報を dataProvider に適用出来る形で返す 185 218 * … … 189 222 { 190 223 var ret:Array = []; 191 var count:uint = layers.length;224 var count:uint = m_layers.length; 192 225 for (var i:uint = 0; i < count; i++) { 193 ret.push( layers[i]);226 ret.push(m_layers[i]); 194 227 } 195 228 return ret.reverse(); 196 229 } 197 230 231 public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void 232 { 233 m_sprite.addEventListener(type, listener, useCapture, priority, useWeakReference); 234 } 235 236 public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void 237 { 238 m_sprite.removeEventListener(type, listener, useCapture); 239 } 240 241 public function dispatchEvent(event:Event):Boolean 242 { 243 return m_sprite.dispatchEvent(event); 244 } 245 246 public function hasEventListener(type:String):Boolean 247 { 248 return m_sprite.hasEventListener(type); 249 } 250 251 public function willTrigger(type:String):Boolean 252 { 253 return m_sprite.willTrigger(type); 254 } 255 198 256 /** 199 257 * 全てのレイヤーを削除する … … 202 260 internal function clear():void 203 261 { 204 var count:uint = layers.length;262 var count:uint = m_layers.length; 205 263 for (var i:uint = 0; i < count; i++) { 206 var layer:LayerBitmap = layers[i];207 var bitmap:Bitmap = layer.bitmap;208 if ( spriteToView.contains(bitmap))209 spriteToView.removeChild(bitmap);264 var layer:LayerBitmap = m_layers[i]; 265 var displayObject:DisplayObject = layer.displayObject; 266 if (m_sprite.contains(displayObject)) 267 m_sprite.removeChild(displayObject); 210 268 else 211 269 trace(layer.name + " is not child of spriteToView."); 212 270 } 213 layers.splice(0, count);271 m_layers.splice(0, count); 214 272 } 215 273 … … 226 284 composited = new BitmapData(m_width, m_height, true, 0x0); 227 285 for (var i:uint = 0; i < c; i++) { 228 var layer:LayerBitmap = layers[i];286 var layer:LayerBitmap = m_layers[i]; 229 287 layer.compositeTo(composited); 230 288 } … … 233 291 234 292 /** 293 * saveState で保存したオブジェクトを復元する 294 * 295 */ 296 internal function loadState(undoData:Object):void 297 { 298 var i:uint = 0; 299 var layers:Vector.<Object> = undoData.layers; 300 var c:uint = layers.length; 301 clear(); 302 for (i = 0; i < c; i++) { 303 var data:Object = layers[i]; 304 var layer:LayerBitmap = new LayerBitmap(data.bitmapData); 305 layer.fromJSON(data); 306 addLayer(layer); 307 } 308 currentIndex = undoData.index; 309 compositeAll(); 310 } 311 312 /** 313 * 画像データを含むすべてのレイヤー情報を保存する 314 * 315 */ 316 internal function saveState(undoData:Object):void 317 { 318 var c:uint = count; 319 var layers:Vector.<Object> = new Vector.<Object>(c, true); 320 for (var i:uint = 0; i < c; i++) { 321 var layer:LayerBitmap = m_layers[i]; 322 var data:Object = layer.toJSON(); 323 data.bitmapData = layer.bitmapData; 324 layers[i] = data; 325 } 326 undoData.index = currentIndex; 327 undoData.layers = layers; 328 } 329 330 /** 331 * 現在のビューに対して表示オブジェクトの入れ替えを行う 332 * 333 */ 334 internal function swapChild(from:DisplayObject, to:DisplayObject):void 335 { 336 m_sprite.removeChild(from); 337 m_sprite.addChildAt(to, currentIndex); 338 } 339 340 /** 235 341 * 現在のレイヤー画像を設定する 236 342 * … … 238 344 internal function setCurrentLayer(value:LayerBitmap):void 239 345 { 240 layers[currentIndex] = value;346 m_layers[currentIndex] = value; 241 347 } 242 348 … … 246 352 var c:uint = count; 247 353 for (var i:uint = 0; i < c; i++) { 248 var layer:LayerBitmap = layers[i];354 var layer:LayerBitmap = m_layers[i]; 249 355 layer.index = i; 250 356 } … … 275 381 public function get currentLayer():LayerBitmap 276 382 { 277 return layers[currentIndex];383 return m_layers[currentIndex]; 278 384 } 279 385 … … 284 390 public function get count():uint 285 391 { 286 return layers.length; 392 return m_layers.length; 393 } 394 395 /** 396 * スプライトオブジェクトを返す 397 * 398 */ 399 internal function get view():Sprite 400 { 401 return m_sprite; 287 402 } 288 403 … … 306 421 * @default null 307 422 */ 308 internal var spriteToView:Sprite;423 private var m_sprite:Sprite; 309 424 310 425 /** … … 315 430 internal var composited:BitmapData; 316 431 317 /** 318 * レイヤーの配列 319 * 320 * @default null 321 */ 322 internal var layers:Vector.<LayerBitmap>; 323 432 private var m_layers:Vector.<LayerBitmap>; 324 433 private var m_width:uint; 325 434 private var m_height:uint; as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Painter.as
r3612 r3614 4 4 import flash.display.BitmapData; 5 5 import flash.display.BlendMode; 6 import flash.display.DisplayObject; 6 7 import flash.display.Shape; 7 8 import flash.display.Sprite; … … 64 65 public function undo():void 65 66 { 66 m_undo.undo( this);67 m_undo.undo(m_layers); 67 68 } 68 69 … … 72 73 public function redo():void 73 74 { 74 m_undo.redo( this);75 m_undo.redo(m_layers); 75 76 } 76 77 … … 80 81 public function pushUndo():void 81 82 { 82 m_undo.push( this);83 m_undo.push(m_layers); 83 84 } 84 85 … … 111 112 var destination:Point = new Point(0, 0); 112 113 var rectangle:Rectangle = new Rectangle(0, 0, width, height); 113 var sprite:Sprite = m_layers.spriteToView;114 114 m_layers.clear(); 115 115 for (var i:uint = 0; i < layerCount; i++) { … … 119 119 var layer:LayerBitmap = new LayerBitmap(bitmapData); 120 120 layer.fromJSON(layersInfo[i]); 121 m_layers.layers.push(layer); 122 sprite.addChild(layer.bitmap); 121 m_layers.addLayer(layer); 123 122 } 124 123 } … … 461 460 blendMode == BlendMode.NORMAL ? BlendMode.LAYER : blendMode; 462 461 m_drawingSprite.alpha = currentLayer.alpha; 463 m_tempLayer = new Bitmap(currentLayer.bitmapData);462 m_tempLayer = currentLayer.newDisplayObject; 464 463 m_tempLayer.blendMode = BlendMode.NORMAL; 465 464 m_tempLayer.alpha = 1.0; 466 465 m_drawingSprite.addChild(m_tempLayer); 467 466 m_drawingSprite.addChild(m_paintEngine.shape); 468 var sprite:Sprite = m_layers.spriteToView; 469 sprite.removeChild(currentLayer.bitmap); 470 sprite.addChildAt(m_drawingSprite, m_layers.currentIndex); 467 m_layers.swapChild(currentLayer.displayObject, m_drawingSprite); 471 468 } 472 469 } … … 479 476 { 480 477 if (m_tempLayer != null) { 481 var sprite:Sprite = m_layers.spriteToView;482 478 var currentLayer:LayerBitmap = m_layers.currentLayer; 483 479 var blendMode:String = m_drawingSprite.blendMode; … … 485 481 blendMode == BlendMode.LAYER ? BlendMode.NORMAL : blendMode; 486 482 currentLayer.alpha = m_drawingSprite.alpha; 487 sprite.removeChild(m_drawingSprite); 488 sprite.addChildAt(currentLayer.bitmap, m_layers.currentIndex); 483 m_layers.swapChild(m_drawingSprite, currentLayer.displayObject); 489 484 m_paintEngine.clear(); 490 485 m_drawingSprite.removeChild(m_tempLayer); … … 527 522 } 528 523 529 internal function loadState(undoData:Object):void530 {531 var i:uint = 0;532 m_layers.clear();533 var layers:Vector.<Object> = undoData.layers;534 var count:uint = layers.length;535 var sprite:Sprite = m_layers.spriteToView;536 for (i = 0; i < count; i++) {537 var data:Object = layers[i];538 var layer:LayerBitmap = new LayerBitmap(data.bitmapData);539 layer.fromJSON(data);540 m_layers.layers.push(layer);541 sprite.addChild(layer.bitmap);542 }543 m_layers.currentIndex = undoData.index;544 m_layers.compositeAll();545 }546 547 internal function saveState(undoData:Object):void548 {549 var count:uint = m_layers.count;550 var layers:Vector.<Object> = new Vector.<Object>(551 count, true552 );553 for (var i:uint = 0; i < count; i++) {554 var layer:LayerBitmap = m_layers.at(i);555 var data:Object = layer.toJSON();556 data.bitmapData = layer.bitmapData;557 layers[i] = data;558 }559 undoData.index = m_layers.currentIndex;560 undoData.layers = layers;561 }562 563 524 /** 564 525 * レイヤーオブジェクトを返す … … 571 532 572 533 /** 573 * スプライトオブジェクトを返す574 *575 */576 public function get view():Sprite577 {578 return m_layers.spriteToView;579 }580 581 /**582 534 * ペンオブジェクトを返す 583 535 * … … 662 614 } 663 615 616 // テストでLayerBitmapCollectionの差し替えを行うため敢えてprotected にしてある 664 617 protected var m_layers:LayerBitmapCollection; 665 618 private var m_paintEngine:PaintEngine; … … 669 622 private var m_scaleMatrix:Matrix; 670 623 private var m_drawingSprite:Sprite; 671 private var m_tempLayer: Bitmap;624 private var m_tempLayer:DisplayObject; 672 625 private var m_shouldCopyBitmap:Boolean; 673 626 private var m_version:uint; as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/UndoStack.as
r3605 r3614 23 23 m_buffer[i] = {}; 24 24 } 25 painter. saveState(m_buffer[0]);25 painter.layers.saveState(m_buffer[0]); 26 26 } 27 27 28 internal function undo( painter:Painter):void28 internal function undo(layers:LayerBitmapCollection):void 29 29 { 30 30 if (m_index === m_first) { … … 37 37 m_index--; 38 38 } 39 painter.loadState(m_buffer[m_index]);39 layers.loadState(m_buffer[m_index]); 40 40 if (hasEventListener(UndoEvent.UNDO)) 41 41 dispatchEvent(new UndoEvent(UndoEvent.UNDO)); 42 42 } 43 43 44 internal function redo( painter:Painter):void44 internal function redo(layers:LayerBitmapCollection):void 45 45 { 46 46 if (m_index === m_last) { … … 48 48 } 49 49 m_index = (m_index + 1) % m_buffer.length; 50 painter.loadState(m_buffer[m_index]);50 layers.loadState(m_buffer[m_index]); 51 51 if (hasEventListener(UndoEvent.REDO)) 52 52 dispatchEvent(new UndoEvent(UndoEvent.REDO)); 53 53 } 54 54 55 internal function push( painter:Painter):void55 internal function push(layers:LayerBitmapCollection):void 56 56 { 57 57 m_index = (m_index + 1) % m_buffer.length; 58 painter.saveState(m_buffer[m_index]);58 layers.saveState(m_buffer[m_index]); 59 59 m_last = m_index; 60 60 if (m_index === m_first) { as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/ui/IApplication.as
r3605 r3614 62 62 */ 63 63 function get canvasHeight():uint; 64 65 /**66 * キャンバスのスプライトオブジェクトを取得する67 *68 */69 function get canvasView():Sprite;70 64 } 71 65 }

