チェンジセット 1171

差分発生行の前後
無視リスト:
コミット日時:
2008/08/27 18:21:50 (5 年前)
コミッタ:
tasuku
ログメッセージ:

r122@poppop (orig r121): tasuku | 2008-08-15 11:33:53 +0900
added GPUndoBuffer

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/GPCanvas.as

    r1164 r1171  
    1515  import gunyarapaint.entities.GPLogger; 
    1616  import gunyarapaint.entities.GPPen; 
     17  import gunyarapaint.entities.GPUndoBuffer; 
    1718   
    1819  import mx.core.UIComponent; 
     
    3738    private var _pen:GPPen = null; 
    3839    private var _prePen:GPPen = null; 
     40    private var _undoBuffer:GPUndoBuffer; 
    3941     
    4042    private var _canvasWindowControl:GPCanvasWindowControl = null; // キャンバスのウィンドウ。描画時のみ 
    41  
    4243    private var protectCanvas:Boolean = false; // 描画をするかどうか。スクロールバーやlayerのD&Dから保護 
     44 
     45    private var _layerWindow:GPLayerWindowControl; // レイヤのコントロール 
    4346 
    4447        public function GPCanvas(width:uint, height:uint, undoBufferSize:uint, logger:GPLogger, baseData:BitmapData, initPen:GPPen) 
     
    6871            canWidth = baseData.width; 
    6972            canHeight = baseData.height; 
    70        _layers = new GPLayerArray([baseData], canWidth, canHeight, undoBufferSize); 
     73       _layers = new GPLayerArray([baseData], 0, canWidth, canHeight); 
    7174          } else { 
    7275          canWidth = width; 
    7376          canHeight = height; 
    74        _layers = new GPLayerArray(null, canWidth, canHeight, undoBufferSize); 
     77       _layers = new GPLayerArray(null, 0, canWidth, canHeight); 
    7578          } 
    7679          this.width = canWidth; 
     
    106109      // ペン関連の初期化 
    107110      pen = initPen; 
     111          _undoBuffer = new GPUndoBuffer(undoBufferSize, _layers); 
    108112         
    109113      super(); 
    110114        } 
    111115 
    112         public function combineLayers():void { 
    113           // TODO: remove it! 
    114           /* 
    115           var a:Array = _layers.combinedDrawBitmapData; 
    116           combinedLowerBitmap.bitmapData = a[0]; 
    117           combinedUpperBitmap.bitmapData = a[1]; 
    118           */ 
     116    public function set layerWindow(lw:GPLayerWindowControl):void { 
     117      _layerWindow = lw; 
     118    } 
     119 
     120        public function replaceLayerArray(a:GPLayerArray):void { 
     121          var index:int = getChildIndex(_layers.view); 
     122          removeChildAt(index); 
     123          addChildAt(a.view, index); 
     124          _layers = a; 
     125          _pen.layers = a; 
     126      _layerWindow.layers = a; 
    119127        } 
    120128         
     
    269277          if (c) { 
    270278            _layers.draw(c, null, null, _pen.blendMode, null, false); 
     279            _undoBuffer.push(_layers); 
    271280        afterDrawBitmap(); 
    272281        logWrite(['floodFill', x, y]); 
     
    344353      // 描画 
    345354      _layers.draw(_pen.drawShape, null, null, _pen.blendMode, null, false); 
     355            _undoBuffer.push(_layers); 
    346356      logWrite(['drawShapeOnBitmap']); 
    347357      afterDrawBitmap(); 
     
    349359     
    350360    public function afterDrawBitmap():void { 
    351       // レイヤ統合して表示を更新して 
    352       combineLayers(); 
    353361      // 描画用シェイプは空にしておく 
    354362      _pen.clearDrawShape(); 
     
    365373        } 
    366374        public function undo():void { 
    367           _layers.undo(); 
    368           combineLayers(); 
     375          replaceLayerArray(_undoBuffer.undo()); 
    369376      this.dispatchEvent(new Event('changeUndoRedo')); 
    370377      logWrite(['undo', x, y]); 
    371378        } 
    372379        public function redo():void { 
    373           _layers.redo(); 
    374           combineLayers(); 
     380          replaceLayerArray(_undoBuffer.redo()); 
    375381      this.dispatchEvent(new Event('changeUndoRedo')); 
    376382      logWrite(['redo', x, y]); 
    377383        } 
    378          
    379          
     384                 
    380385    public function getUndoCount():uint { 
    381       // FIXME: 直接聞くようにすべき 
    382       return _layers.getUndoCount(); 
     386      return _undoBuffer.getUndoCount(); 
    383387    } 
    384388    public function getRedoCount():uint { 
    385       // FIXME: 直接聞くようにすべき 
    386       return _layers.getRedoCount(); 
     389      return _undoBuffer.getRedoCount(); 
    387390    } 
    388391     
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/GPLayerWindowControlScript.as

    r1167 r1171  
    5656  _canvas = can; 
    5757  _layers = can.layers; 
     58  can.layerWindow = this; 
    5859  this.enabled = true; 
    59   syncWithLayersAlphaBlendCanvas(); 
     60  syncWithLayersAlphaBlend(); 
    6061  layerDataGrid.selectedIndex = 0; 
    6162  /* 
     
    6667} 
    6768 
     69public function set layers(a:GPLayerArray):void { 
     70  _layers = a; 
     71  syncWithLayersAlphaBlend(); 
     72} 
     73 
    6874private function itemFocusHandler(evt:mx.events.DataGridEvent):void { 
    6975  _layers.targetIndex = evt.currentTarget.selectedItem.index; 
    70   syncWithAlphaBlendCanvas(); 
     76  syncWithAlphaBlend(); 
    7177} 
    7278 
    73 private function syncWithAlphaBlendCanvas():void { 
     79private function syncWithAlphaBlend():void { 
    7480  syncWithAlpha(); 
    7581  syncWithBlend(); 
    76   syncWithCanvas();   
    7782} 
    7883 
    79 private function syncWithLayersAlphaBlendCanvas():void { 
     84private function syncWithLayersAlphaBlend():void { 
    8085  syncWithLayers(); 
    8186  syncWithAlpha(); 
    8287  syncWithBlend(); 
    83   syncWithCanvas();   
    8488} 
    8589 
     
    101105} 
    102106private function syncWithCanvas():void { 
    103   _canvas.combineLayers()
     107//  _layers = _canvas.layers
    104108} 
    105109 
    106110private function newLayerHandler(evt:Event):void { 
    107111  _layers.pushBlank(); 
    108   syncWithLayersAlphaBlendCanvas(); 
     112  syncWithLayersAlphaBlend(); 
    109113} 
    110114 
    111115private function copyLayerHandler(evt:Event):void {   
    112116  _layers.copy(layerDataGrid.selectedItem.index); 
    113   syncWithLayersAlphaBlendCanvas(); 
     117  syncWithLayersAlphaBlend(); 
    114118} 
    115119 
    116120private function deleteLayerHandler(evt:Event):void { 
    117121  _layers.remove(layerDataGrid.selectedItem.index); 
    118   syncWithLayersAlphaBlendCanvas(); 
     122  syncWithLayersAlphaBlend(); 
    119123} 
    120124 
    121125private function mergeLayerHandler(evt:Event):void { 
    122126  _layers.mergeWithBelow(layerDataGrid.selectedItem.index); 
    123   syncWithLayersAlphaBlendCanvas(); 
     127  syncWithLayersAlphaBlend(); 
    124128} 
    125129 
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPLayer.as

    r1162 r1171  
    4242      _lock = lock; 
    4343      _mask = mask; 
    44       _blendMode = blendMode; 
    45       _alpha = alpha; 
     44      _colorTransform = new ColorTransform(); 
     45      _bitmap = new Bitmap(_bitmapData); 
     46      this.blendMode = blendMode; 
     47      this.alpha = alpha; 
    4648      if (name) { 
    4749        _name = name; 
     
    4951        _name = 'レイヤ' + _index; 
    5052      } 
    51       _colorTransform = new ColorTransform(); 
    52       _bitmap = new Bitmap(_bitmapData); 
    5353    } 
    5454     
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPLayerArray.as

    r1165 r1171  
    1111   
    1212  import mx.controls.Alert; 
    13  
     13   
    1414  // Arrayの継承はしない, IListを実装すればdataProviderに直指定できるけど、めんどい。 
    1515  public class GPLayerArray 
     
    1818    private var _targetIndex:uint; // 現在描画対象となっているレイヤ番号(1 startがいいかな?) 
    1919    private var _width:uint, _height:uint; // キャンバスサイズ 
    20  
    21     private var _undoRingBuffer:Array; 
    22     private var _undoIndex:uint; 
    23     private var _undoFirstIndex:uint; 
    24     private var _undoLastIndex:uint; 
    25     private var _undoBufferSize:uint; 
    2620     
    2721    private var _combinedBitmapData:BitmapData; 
     
    2923    private var _targetSprite:Sprite; // 描画対象のBitmapと描画用Shapeを子に持つSprite。 
    3024 
    31     public function GPLayerArray(a:Array, w:uint, h:uint, undoBufferSize:uint) { 
     25    public function GPLayerArray(a:Array, targetIndex:uint, w:uint, h:uint) { 
    3226      _width = w; 
    3327      _height = h; 
    3428      _targetIndex = 0; 
    35       _undoBufferSize = undoBufferSize + 1; // 現状を保持する分を追加 
    3629      _view = new Sprite(); 
    3730      _view.mouseEnabled = false; // マウスイベント取りません! 
    3831      if (a) { 
    3932        _a = a; 
     33        _targetIndex = targetIndex; 
     34        for (var i:uint = 0; i < a.length; i++) { 
     35          _view.addChild(a[i].bitmap); 
     36        } 
    4037      } else { 
    4138        _a = new Array(); 
     
    4340        _a[0].name = '背景'; 
    4441      } 
    45       _undoRingBuffer = new Array(_undoBufferSize); 
    46       initUndoRingBuffer(); 
    47       recombine(); 
    48     } 
    49  
    50         private function initUndoRingBuffer():void { 
    51       _undoIndex = 0; 
    52       _undoFirstIndex = 0; 
    53       _undoLastIndex = 0; 
    54       _undoRingBuffer[0] = targetLayer.clone(); 
    55         } 
     42      recombine(); 
     43    } 
     44 
     45    public function clone():GPLayerArray { 
     46      var a:Array = new Array(); 
     47      for (var i:uint = 0; i < _a.length; i++) { 
     48        a[i] = _a[i].clone(); 
     49      } 
     50      return new GPLayerArray(a, _targetIndex, _width, _height); 
     51    } 
    5652 
    5753    public function pushBlank():void { 
     
    160156    public function draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void { 
    161157      _a[_targetIndex].draw(source, matrix, colorTransform, blendMode, clipRect, smoothing); 
    162       addUndo(); 
    163       recombine(); 
    164     } 
    165      
    166     public function undo():void { 
    167           if (_undoIndex == _undoFirstIndex) { 
    168             return; 
    169           } else if (_undoIndex == 0) { 
    170             _undoIndex = _undoBufferSize - 1; 
    171           } else { 
    172             _undoIndex--; 
    173           } 
    174           var undoData:GPLayer = _undoRingBuffer[_undoIndex]; 
    175           _a[undoData.index] = undoData.clone(); 
    176       recombine(); 
    177     } 
    178      
    179     public function redo():void { 
    180           if (_undoIndex == _undoLastIndex) { 
    181         return; 
    182           } 
    183           _undoIndex = (_undoIndex + 1) % _undoBufferSize; 
    184           var undoData:GPLayer = _undoRingBuffer[_undoIndex]; 
    185           _a[undoData.index] = undoData.clone(); 
    186158      recombine(); 
    187159    } 
     
    191163        _a[i].index = i; 
    192164      } 
    193     } 
    194      
    195     private function addUndo():void { 
    196       // リングバッファに追加して 
    197       _undoIndex = (_undoIndex + 1) % _undoBufferSize; 
    198       _undoRingBuffer[_undoIndex] = targetLayer.clone(); 
    199       _undoLastIndex = _undoIndex; 
    200       if (_undoIndex == _undoFirstIndex) { 
    201         // バッファ1周したのでずらす 
    202         _undoFirstIndex = (_undoFirstIndex + 1) % _undoBufferSize; 
    203       }       
    204     } 
    205  
    206     public function getUndoCount():uint { 
    207       var ret:int = _undoIndex - _undoFirstIndex; 
    208       return ret < 0 ? ret + _undoBufferSize : ret; 
    209     } 
    210      
    211     public function getRedoCount():uint { 
    212       var ret:int = _undoLastIndex - _undoIndex; 
    213       return ret < 0 ? ret + _undoBufferSize : ret; 
    214165    } 
    215166