チェンジセット 3612

差分発生行の前後
無視リスト:
コミット日時:
2010/03/27 18:36:36 (3 年前)
コミッタ:
hkrn
ログメッセージ:

refactoring for reducing memory usage

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmap.as

    r3605 r3612  
    1111     *  
    1212     */ 
    13     public final class LayerBitmap extends Bitmap 
     13    public final class LayerBitmap 
    1414    { 
    1515        public function LayerBitmap(bitmapData:BitmapData) 
    1616        { 
     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; 
    1729            this.bitmapData = bitmapData; 
    18             name = "Layer" + index; 
    1930        } 
    2031         
     
    5263                                      blendMode:String):void 
    5364        { 
    54             bitmapData.draw(source, null, null, blendMode); 
     65            bitmapData = m_bitmapData.clone(); 
     66            m_bitmapData.draw(source, null, null, blendMode); 
    5567        } 
    5668         
     
    6779        { 
    6880            // 可視である場合のみ対象の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); 
    7383        } 
    7484         
     
    8292            var transformed:BitmapData = new BitmapData(width, height, true, 0x0); 
    8393            transformed.draw(bitmapData, matrix); 
    84             bitmapData.dispose(); 
    8594            bitmapData = transformed; 
    8695        } 
     
    95104        public function floodFill(x:Number, y:Number, color:uint):void 
    96105        { 
    97             bitmapData.floodFill(x, y, color); 
     106            bitmapData = m_bitmapData.clone(); 
     107            m_bitmapData.floodFill(x, y, color); 
    98108        } 
    99109         
     
    107117        public function setPixel(x:Number, y:Number, color:uint):void 
    108118        { 
    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; 
    110238        } 
    111239         
     
    121249         *  
    122250         * @default false 
    123          */         
     251         */ 
    124252        public var locked:Boolean; 
    125253         
    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; 
    136261    } 
    137262} 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/LayerBitmapCollection.as

    r3605 r3612  
    11package org.libspark.gunyarapaint.framework 
    22{ 
     3    import flash.display.Bitmap; 
    34    import flash.display.BitmapData; 
    45    import flash.display.Sprite; 
     
    1617        { 
    1718            currentIndex = 0; 
    18             doCompositeAll = false; 
     19            doCompositeAll = true; 
    1920            m_width = width; 
    2021            m_height = height; 
     
    2829            composited = new BitmapData(width, height, true, 0x0); 
    2930            layers.push(layer); 
    30             spriteToView.addChild(layer); 
     31            spriteToView.addChild(layer.bitmap); 
    3132        } 
    3233         
     
    4445            currentIndex++; 
    4546            layers.splice(currentIndex, 0, layer); 
    46             spriteToView.addChildAt(layer, currentIndex); 
     47            spriteToView.addChildAt(layer.bitmap, currentIndex); 
    4748            compositeAll(); 
    4849            resetLayersIndex(); 
     
    8182            layer.name += "'s copy"; 
    8283            layers.splice(index, 0, layer); 
    83             spriteToView.addChildAt(layer, index); 
     84            spriteToView.addChildAt(layer.bitmap, index); 
    8485            compositeAll(); 
    8586            resetLayersIndex(); 
     
    204205            for (var i:uint = 0; i < count; i++) { 
    205206                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); 
    209210                else 
    210211                    trace(layer.name + " is not child of spriteToView."); 
    211212            } 
    212             layers.length = 0
     213            layers.splice(0, count)
    213214        } 
    214215         
     
    221222            if (doCompositeAll) { 
    222223                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); 
    224227                for (var i:uint = 0; i < c; i++) { 
    225228                    var layer:LayerBitmap = layers[i]; 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Painter.as

    r3605 r3612  
    11package org.libspark.gunyarapaint.framework 
    22{ 
     3    import flash.display.Bitmap; 
    34    import flash.display.BitmapData; 
    45    import flash.display.BlendMode; 
     
    117118                rectangle.y = i * height; 
    118119                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]); 
    125121                m_layers.layers.push(layer); 
    126                 sprite.addChild(layer); 
     122                sprite.addChild(layer.bitmap); 
    127123            } 
    128124        } 
     
    145141                layerBitmap.copyPixels(layer.bitmapData, rectangle, destination); 
    146142                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()); 
    155144            } 
    156145            layerBitmap.unlock(); 
     
    472461                    blendMode == BlendMode.NORMAL ? BlendMode.LAYER : blendMode; 
    473462                m_drawingSprite.alpha = currentLayer.alpha; 
    474                 m_tempLayer = currentLayer.clone(false); 
     463                m_tempLayer = new Bitmap(currentLayer.bitmapData); 
    475464                m_tempLayer.blendMode = BlendMode.NORMAL; 
    476465                m_tempLayer.alpha = 1.0; 
     
    478467                m_drawingSprite.addChild(m_paintEngine.shape); 
    479468                var sprite:Sprite = m_layers.spriteToView; 
    480                 sprite.removeChild(currentLayer); 
     469                sprite.removeChild(currentLayer.bitmap); 
    481470                sprite.addChildAt(m_drawingSprite, m_layers.currentIndex); 
    482471            } 
     
    497486                currentLayer.alpha = m_drawingSprite.alpha; 
    498487                sprite.removeChild(m_drawingSprite); 
    499                 sprite.addChildAt(currentLayer, m_layers.currentIndex); 
     488                sprite.addChildAt(currentLayer.bitmap, m_layers.currentIndex); 
    500489                m_paintEngine.clear(); 
    501490                m_drawingSprite.removeChild(m_tempLayer); 
     
    542531            var i:uint = 0; 
    543532            m_layers.clear(); 
    544             var count:uint = undoData.layers.length; 
     533            var layers:Vector.<Object> = undoData.layers; 
     534            var count:uint = layers.length; 
    545535            var sprite:Sprite = m_layers.spriteToView; 
    546536            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); 
    548540                m_layers.layers.push(layer); 
    549                 sprite.addChild(layer); 
     541                sprite.addChild(layer.bitmap); 
    550542            } 
    551543            m_layers.currentIndex = undoData.index; 
     
    556548        { 
    557549            var count:uint = m_layers.count; 
    558             var layers:Vector.<LayerBitmap> = new Vector.<LayerBitmap>( 
     550            var layers:Vector.<Object> = new Vector.<Object>( 
    559551                count, true 
    560552            ); 
    561553            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; 
    564558            } 
    565559            undoData.index = m_layers.currentIndex; 
     
    675669        private var m_scaleMatrix:Matrix; 
    676670        private var m_drawingSprite:Sprite; 
    677         private var m_tempLayer:LayerBitmap; 
     671        private var m_tempLayer:Bitmap; 
    678672        private var m_shouldCopyBitmap:Boolean; 
    679673        private var m_version:uint;