チェンジセット 3612
- コミット日時:
- 2010/03/27 18:36:36 (3 年前)
- ファイル:
-
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmap.as (更新) (7 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmapCollection.as (更新) (7 diffs)
- as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Painter.as (更新) (9 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmap.as
r3605 r3612 11 11 * 12 12 */ 13 public final class LayerBitmap extends Bitmap13 public final class LayerBitmap 14 14 { 15 15 public function LayerBitmap(bitmapData:BitmapData) 16 16 { 17 m_bitmap = new Bitmap(); 18 m_colorTransform = new ColorTransform( 19 1.0, 20 1.0, 21 1.0, 22 1.0, 23 0, 24 0, 25 0, 26 0 27 ); 28 name = "Layer" + index; 17 29 this.bitmapData = bitmapData; 18 name = "Layer" + index;19 30 } 20 31 … … 52 63 blendMode:String):void 53 64 { 54 bitmapData.draw(source, null, null, blendMode); 65 bitmapData = m_bitmapData.clone(); 66 m_bitmapData.draw(source, null, null, blendMode); 55 67 } 56 68 … … 67 79 { 68 80 // 可視である場合のみ対象のBitmapDataに描写する 69 if (visible) { 70 s_colorTransform.alphaMultiplier = alpha; 71 dest.draw(bitmapData, null, s_colorTransform, blendMode); 72 } 81 if (visible) 82 dest.draw(bitmapData, null, m_colorTransform, blendMode); 73 83 } 74 84 … … 82 92 var transformed:BitmapData = new BitmapData(width, height, true, 0x0); 83 93 transformed.draw(bitmapData, matrix); 84 bitmapData.dispose();85 94 bitmapData = transformed; 86 95 } … … 95 104 public function floodFill(x:Number, y:Number, color:uint):void 96 105 { 97 bitmapData.floodFill(x, y, color); 106 bitmapData = m_bitmapData.clone(); 107 m_bitmapData.floodFill(x, y, color); 98 108 } 99 109 … … 107 117 public function setPixel(x:Number, y:Number, color:uint):void 108 118 { 109 bitmapData.setPixel32(x, y, color); 119 bitmapData = m_bitmapData.clone(); 120 m_bitmapData.setPixel32(x, y, color); 121 } 122 123 /** 124 * toJSON でシリアライズされたオブジェクトから復元する 125 * 126 */ 127 public function fromJSON(data:Object):void 128 { 129 alpha = data.alpha; 130 blendMode = data.blendMode; 131 locked = data.lock == "true"; 132 name = data.name; 133 visible = data.visible == "true"; 134 } 135 136 /** 137 * 現在の画像データを除くメタ情報をJSON 形式に変換する 138 * 139 */ 140 public function toJSON():Object 141 { 142 return { 143 "alpha": alpha, 144 "blendMode": blendMode, 145 "lock": locked ? "true" : "false", 146 "name": name, 147 "visible": visible ? "true" : "false" 148 }; 149 } 150 151 /** 152 * 現在の不透明度を取得する 153 * 154 */ 155 public function get alpha():Number 156 { 157 return m_bitmap.alpha; 158 } 159 160 /** 161 * 現在のブレンドモードを取得する 162 * 163 */ 164 public function get blendMode():String 165 { 166 return m_bitmap.blendMode; 167 } 168 169 /** 170 * 現在の画像の高さを取得する 171 * 172 */ 173 public function get height():uint 174 { 175 return m_bitmap.height; 176 } 177 178 /** 179 * 現在の可視状態を取得する 180 * 181 */ 182 public function get visible():Boolean 183 { 184 return m_bitmap.visible; 185 } 186 187 /** 188 * 現在の画像の幅を取得する 189 * 190 */ 191 public function get width():uint 192 { 193 return m_bitmap.width; 194 } 195 196 /** 197 * 現在の不透明度を設定する 198 * 199 */ 200 public function set alpha(value:Number):void 201 { 202 m_bitmap.alpha = value; 203 m_colorTransform.alphaMultiplier = value; 204 } 205 206 /** 207 * 現在のブレンドモードを設定する 208 * 209 */ 210 public function set blendMode(value:String):void 211 { 212 m_bitmap.blendMode = value; 213 } 214 215 /** 216 * 現在の可視状態を設定する 217 * 218 */ 219 public function set visible(value:Boolean):void 220 { 221 m_bitmap.visible = value; 222 } 223 224 internal function get bitmap():Bitmap 225 { 226 return m_bitmap; 227 } 228 229 internal function get bitmapData():BitmapData 230 { 231 return m_bitmapData; 232 } 233 234 internal function set bitmapData(value:BitmapData):void 235 { 236 m_bitmap.bitmapData = value; 237 m_bitmapData = value; 110 238 } 111 239 … … 121 249 * 122 250 * @default false 123 */ 251 */ 124 252 public var locked:Boolean; 125 253 126 private static var s_colorTransform:ColorTransform = new ColorTransform( 127 1.0, 128 1.0, 129 1.0, 130 1.0, 131 0, 132 0, 133 0, 134 0 135 ); 254 public var name:String; 255 256 private var m_bitmap:Bitmap; 257 258 private var m_bitmapData:BitmapData; 259 260 private var m_colorTransform:ColorTransform; 136 261 } 137 262 } as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmapCollection.as
r3605 r3612 1 1 package org.libspark.gunyarapaint.framework 2 2 { 3 import flash.display.Bitmap; 3 4 import flash.display.BitmapData; 4 5 import flash.display.Sprite; … … 16 17 { 17 18 currentIndex = 0; 18 doCompositeAll = false;19 doCompositeAll = true; 19 20 m_width = width; 20 21 m_height = height; … … 28 29 composited = new BitmapData(width, height, true, 0x0); 29 30 layers.push(layer); 30 spriteToView.addChild(layer );31 spriteToView.addChild(layer.bitmap); 31 32 } 32 33 … … 44 45 currentIndex++; 45 46 layers.splice(currentIndex, 0, layer); 46 spriteToView.addChildAt(layer , currentIndex);47 spriteToView.addChildAt(layer.bitmap, currentIndex); 47 48 compositeAll(); 48 49 resetLayersIndex(); … … 81 82 layer.name += "'s copy"; 82 83 layers.splice(index, 0, layer); 83 spriteToView.addChildAt(layer , index);84 spriteToView.addChildAt(layer.bitmap, index); 84 85 compositeAll(); 85 86 resetLayersIndex(); … … 204 205 for (var i:uint = 0; i < count; i++) { 205 206 var layer:LayerBitmap = layers[i]; 206 layer.bitmapData.dispose();207 if (spriteToView.contains( layer))208 spriteToView.removeChild( layer);207 var bitmap:Bitmap = layer.bitmap; 208 if (spriteToView.contains(bitmap)) 209 spriteToView.removeChild(bitmap); 209 210 else 210 211 trace(layer.name + " is not child of spriteToView."); 211 212 } 212 layers. length = 0;213 layers.splice(0, count); 213 214 } 214 215 … … 221 222 if (doCompositeAll) { 222 223 var c:uint = count; 223 composited.fillRect(composited.rect, 0x0); 224 // 操作毎にBitmapDataが生成されるため、逆にGarbageCollectionを発生させやすくしている。 225 // そのため、これがないとBitmapDataによるメモリリークが余計にひどくなる。 226 composited = new BitmapData(m_width, m_height, true, 0x0); 224 227 for (var i:uint = 0; i < c; i++) { 225 228 var layer:LayerBitmap = layers[i]; as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Painter.as
r3605 r3612 1 1 package org.libspark.gunyarapaint.framework 2 2 { 3 import flash.display.Bitmap; 3 4 import flash.display.BitmapData; 4 5 import flash.display.BlendMode; … … 117 118 rectangle.y = i * height; 118 119 var layer:LayerBitmap = new LayerBitmap(bitmapData); 119 var layerInfo:Object = layersInfo[i]; 120 layer.alpha = layerInfo.alpha; 121 layer.blendMode = layerInfo.blendMode; 122 layer.locked = layerInfo.lock == "true"; 123 layer.name = layerInfo.name; 124 layer.visible = layerInfo.visible == "true"; 120 layer.fromJSON(layersInfo[i]); 125 121 m_layers.layers.push(layer); 126 sprite.addChild(layer );122 sprite.addChild(layer.bitmap); 127 123 } 128 124 } … … 145 141 layerBitmap.copyPixels(layer.bitmapData, rectangle, destination); 146 142 destination.y = i * height; 147 var layerInfo:Object = { 148 "alpha": layer.alpha, 149 "blendMode": layer.blendMode, 150 "lock": layer.locked ? "true" : "false", 151 "name": layer.name, 152 "visible": layer.visible ? "true" : "false" 153 }; 154 layersInfo.push(layerInfo); 143 layersInfo.push(layer.toJSON()); 155 144 } 156 145 layerBitmap.unlock(); … … 472 461 blendMode == BlendMode.NORMAL ? BlendMode.LAYER : blendMode; 473 462 m_drawingSprite.alpha = currentLayer.alpha; 474 m_tempLayer = currentLayer.clone(false);463 m_tempLayer = new Bitmap(currentLayer.bitmapData); 475 464 m_tempLayer.blendMode = BlendMode.NORMAL; 476 465 m_tempLayer.alpha = 1.0; … … 478 467 m_drawingSprite.addChild(m_paintEngine.shape); 479 468 var sprite:Sprite = m_layers.spriteToView; 480 sprite.removeChild(currentLayer );469 sprite.removeChild(currentLayer.bitmap); 481 470 sprite.addChildAt(m_drawingSprite, m_layers.currentIndex); 482 471 } … … 497 486 currentLayer.alpha = m_drawingSprite.alpha; 498 487 sprite.removeChild(m_drawingSprite); 499 sprite.addChildAt(currentLayer , m_layers.currentIndex);488 sprite.addChildAt(currentLayer.bitmap, m_layers.currentIndex); 500 489 m_paintEngine.clear(); 501 490 m_drawingSprite.removeChild(m_tempLayer); … … 542 531 var i:uint = 0; 543 532 m_layers.clear(); 544 var count:uint = undoData.layers.length; 533 var layers:Vector.<Object> = undoData.layers; 534 var count:uint = layers.length; 545 535 var sprite:Sprite = m_layers.spriteToView; 546 536 for (i = 0; i < count; i++) { 547 var layer:LayerBitmap = undoData.layers[i].clone(); 537 var data:Object = layers[i]; 538 var layer:LayerBitmap = new LayerBitmap(data.bitmapData); 539 layer.fromJSON(data); 548 540 m_layers.layers.push(layer); 549 sprite.addChild(layer );541 sprite.addChild(layer.bitmap); 550 542 } 551 543 m_layers.currentIndex = undoData.index; … … 556 548 { 557 549 var count:uint = m_layers.count; 558 var layers:Vector.< LayerBitmap> = new Vector.<LayerBitmap>(550 var layers:Vector.<Object> = new Vector.<Object>( 559 551 count, true 560 552 ); 561 553 for (var i:uint = 0; i < count; i++) { 562 var layer:LayerBitmap = m_layers.layers[i].clone(); 563 layers[i] = layer; 554 var layer:LayerBitmap = m_layers.at(i); 555 var data:Object = layer.toJSON(); 556 data.bitmapData = layer.bitmapData; 557 layers[i] = data; 564 558 } 565 559 undoData.index = m_layers.currentIndex; … … 675 669 private var m_scaleMatrix:Matrix; 676 670 private var m_drawingSprite:Sprite; 677 private var m_tempLayer: LayerBitmap;671 private var m_tempLayer:Bitmap; 678 672 private var m_shouldCopyBitmap:Boolean; 679 673 private var m_version:uint;

