チェンジセット 3505: as3/gunyarapaint/branches

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

removed Painter class, CanvasContext? has imported Painter methods. renamed PainterVx? to PaintEngineVx? for removing Painter

ファイル:

凡例:

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

    r3501 r3505  
    11package org.libspark.gunyarapaint.framework 
    22{ 
     3    import flash.display.BitmapData; 
     4    import flash.display.BlendMode; 
    35    import flash.display.Shape; 
     6    import flash.display.Sprite; 
    47    import flash.events.EventDispatcher; 
     8    import flash.geom.Matrix; 
     9    import flash.geom.Point; 
     10    import flash.geom.Rectangle; 
    511     
    612    import org.libspark.gunyarapaint.framework.errors.NotSupportedVersionError; 
     
    1016     * 再生及び記録のための共通基盤 
    1117     *  
     18     * @todo: Painter の実装を取り入れる 
    1219     */ 
    1320    public class CanvasContext extends EventDispatcher 
     
    3138        public static const PAINTER_VERSION_STRING:String = "ver." + PAINTER_VERSION; 
    3239         
    33         public function CanvasContext() 
    34         { 
    35             super(null); 
     40        public function CanvasContext(width:uint, height:uint, paintEngine:PaintEngine) 
     41        { 
     42            m_coordinate = new Point(); 
     43            m_layers = new LayerBitmapCollection(width, height); 
     44            m_drawingSprite = new Sprite(); 
     45            m_drawingSprite.mouseEnabled = false; 
     46            m_horizontalMirrorMatrix = new Matrix(-1, 0, 0, 1, width, 0); 
     47            m_verticalMirrorMatrix = new Matrix(1, 0, 0, -1, 0, height); 
    3648            m_version = PAINTER_LOG_VERSION; 
    3749        } 
     
    4254        public function undo():void 
    4355        { 
    44             m_undo.undo(m_painter); 
     56            m_undo.undo(this); 
    4557            if (hasEventListener(UndoEvent.UNDO)) 
    4658                dispatchEvent(new UndoEvent(UndoEvent.UNDO, m_undo.undoCount, m_undo.redoCount)); 
     
    5264        public function redo():void 
    5365        { 
    54             m_undo.redo(m_painter); 
     66            m_undo.redo(this); 
    5567            if (hasEventListener(UndoEvent.REDO)) 
    5668                dispatchEvent(new UndoEvent(UndoEvent.REDO, m_undo.undoCount, m_undo.redoCount)); 
     
    6274        public function pushUndo():void 
    6375        { 
    64             m_undo.push(m_painter); 
     76            m_undo.push(this); 
    6577            if (hasEventListener(UndoEvent.PUSH)) 
    6678                dispatchEvent(new UndoEvent(UndoEvent.PUSH, m_undo.undoCount, m_undo.redoCount)); 
     
    8294         
    8395        /** 
    84          * Painter オブジェクトを作成する 
    85          *  
    86          * @param width 画像の幅 
    87          * @param height 画像の高さ 
    88          * @param version ペイントログのバージョン 
    89          */ 
    90         protected function createPainter(width:int, height:int, version:uint):void 
    91         { 
    92             var engine:PaintEngine = new PaintEngine(new Shape()); 
     96         * 連結されたレイヤー画像とメタデータから復元する 
     97         *  
     98         * @param layerBitmaps 縦に連結されたレイヤー画像 
     99         * @param metadata メタデータ 
     100         */ 
     101        public function restore(layerBitmaps:BitmapData, metadata:Object):void 
     102        { 
     103            var width:uint = metadata.width; 
     104            var height:uint = metadata.height; 
     105            var layerCount:uint = layerBitmaps.height / height; 
     106            var destination:Point = new Point(0, 0); 
     107            var rectangle:Rectangle = new Rectangle(0, 0, width, height); 
     108            var sprite:Sprite = m_layers.spriteToView; 
     109            m_layers.clear(); 
     110            for (var i:uint = 0; i < layerCount; i++) { 
     111                var bitmapData:BitmapData = new BitmapData(width, height); 
     112                bitmapData.copyPixels(layerBitmaps, rectangle, destination); 
     113                rectangle.y = i * height; 
     114                var layerBitmap:LayerBitmap = new LayerBitmap(bitmapData); 
     115                m_layers.layers.push(layerBitmap); 
     116                sprite.addChild(layerBitmap); 
     117            } 
     118        } 
     119         
     120        /** 
     121         * 現在位置を変更する 
     122         *  
     123         * <p> 
     124         * PainterEngine クラスにある moveTo の委譲 
     125         * </p> 
     126         *  
     127         * @param x 移動先となる X 座標 
     128         * @param y 移動先となる Y 座標 
     129         */ 
     130        public function moveTo(x:Number, y:Number):void 
     131        { 
     132            m_paintEngine.moveTo(x, y); 
     133        } 
     134         
     135        /** 
     136         * 現在位置から指定された位置まで線を描写する 
     137         *  
     138         * <p> 
     139         * PainterEngine クラスにある lineTo の委譲 
     140         * </p> 
     141         *  
     142         * @param x 描写先となる X 座標 
     143         * @param y 描写先となる Y 座標 
     144         */ 
     145        public function lineTo(x:Number, y:Number):void 
     146        { 
     147            m_paintEngine.lineTo(x, y); 
     148        } 
     149         
     150        /** 
     151         * 矩形を描写する 
     152         *  
     153         * <p> 
     154         * PainterEngine クラスにある drawRect の委譲 
     155         * </p> 
     156         *  
     157         * @param x 基準点となる X 座標 
     158         * @param y 基準点となる Y 座標 
     159         * @param width 幅 
     160         * @param height 高さ 
     161         */ 
     162        public function drawRect(x:Number, y:Number, 
     163                                 width:uint, height:uint):void 
     164        { 
     165            m_paintEngine.drawRect(x, y, width, height); 
     166        } 
     167         
     168        /** 
     169         * 楕円を描写する 
     170         *  
     171         * <p> 
     172         * PainterEngine クラスにある drawEllipse の委譲 
     173         * </p> 
     174         *  
     175         * @param x 基準点となる X 座標 
     176         * @param y 基準点となる Y 座標 
     177         * @param width 幅 
     178         * @param height 高さ 
     179         */ 
     180        public function drawEllipse(x:Number, y:Number, 
     181                                    width:uint, height:uint):void 
     182        { 
     183            m_paintEngine.drawEllipse(x, y, width, height); 
     184        } 
     185         
     186        /** 
     187         * 塗りつぶしを開始する 
     188         *  
     189         * <p> 
     190         * PainterEngine クラスにある beginFill の委譲 
     191         * </p> 
     192         *  
     193         * @param color 塗りつぶす色 
     194         * @param alpha 透明度 
     195         */ 
     196        public function beginFill(color:uint, alpha:Number):void 
     197        { 
     198            m_paintEngine.beginFill(color, alpha); 
     199        } 
     200         
     201        /** 
     202         * 現在の位置から円弧を描写する 
     203         *  
     204         * <p> 
     205         * PainterEngine クラスにある drawCircle の委譲 
     206         * </p> 
     207         *  
     208         * @param radius 半径 
     209         */ 
     210        public function drawCircle(radius:Number):void 
     211        { 
     212            m_paintEngine.drawCircle(radius); 
     213        } 
     214         
     215        /** 
     216         * 塗りつぶしを終了する 
     217         *  
     218         * <p> 
     219         * PainterEngine クラスにある endFill の委譲 
     220         * </p> 
     221         *  
     222         */ 
     223        public function endFill():void 
     224        { 
     225            m_paintEngine.endFill(); 
     226        } 
     227         
     228        /** 
     229         * ペンオブジェクトを初期状態にリセットする 
     230         *  
     231         * <p> 
     232         * PainterEngine クラスにある resetPen の委譲 
     233         * </p> 
     234         *  
     235         */ 
     236        public function resetPen():void 
     237        { 
     238            m_paintEngine.resetPen(); 
     239        } 
     240         
     241        /** 
     242         * 描写中の内容を消去する 
     243         *  
     244         * <p> 
     245         * PainterEngine クラスにある clear の委譲 
     246         * </p> 
     247         *  
     248         */ 
     249        public function clear():void 
     250        { 
     251            m_paintEngine.clear(); 
     252        } 
     253         
     254        /** 
     255         * PainterEngine クラスに描写された中身を現在のレイヤーに反映させる 
     256         *  
     257         * <p> 
     258         *  Pen クラスのブレンドモードを適用する 
     259         * </p> 
     260         *  
     261         */ 
     262        public function composite():void 
     263        { 
     264            // undoBuffer に入っているLayerBitmapを上書きしない為にコピーしてから作業する 
     265            // これは floodFill 及び setPixel も同様 
     266            m_layers.currentLayer.compositeFrom( 
     267                m_paintEngine.shape, 
     268                m_paintEngine.pen.blendMode 
     269            ); 
     270            m_layers.compositeAll(); 
     271        } 
     272         
     273        /** 
     274         * 塗りつぶしを行う  
     275         *  
     276         * <p> 
     277         * PainterEngine クラスの現在位置と Pen クラスの色を適用する 
     278         * </p> 
     279         *  
     280         */ 
     281        public function floodFill():void 
     282        { 
     283            m_layers.currentLayer.floodFill( 
     284                m_paintEngine.x, 
     285                m_paintEngine.y, 
     286                m_paintEngine.pen.argb 
     287            ); 
     288            m_layers.compositeAll(); 
     289        } 
     290         
     291        /** 
     292         * 1 ピクセルを描写する 
     293         *  
     294         * <p> 
     295         * 現在の Pen クラスの色を適用する 
     296         * </p> 
     297         *  
     298         * @param x 描写先となる X 座標 
     299         * @param y 描写先となる Y 座標 
     300         */ 
     301        public function setPixel(x:int, y:int):void 
     302        { 
     303            m_layers.currentLayer.setPixel(x, y, m_paintEngine.pen.argb); 
     304            m_layers.compositeAll(); 
     305        } 
     306         
     307        /** 
     308         * 特定のピクセルの色を取得する(不透明度は取得しない) 
     309         *  
     310         * @param x 取得先となる X 座標 
     311         * @param y 取得先となる Y 座標 
     312         * @return RGB 形式の色の値 
     313         */ 
     314        public function getPixel(x:int, y:int):uint 
     315        { 
     316            // AAAARRRRGGGGBBBB 
     317            var alpha:uint = m_layers.composited.getPixel32(x, y) >> 24 && 0xff; 
     318            return alpha > 0 ? m_layers.composited.getPixel(x, y) : 0xffffff; 
     319        } 
     320         
     321        /** 
     322         * 特定のピクセルの色を取得する 
     323         *  
     324         * @param x 取得先となる X 座標 
     325         * @param y 取得先となる Y 座標 
     326         * @return ARGB 形式の色の値 
     327         */ 
     328        public function getPixel32(x:int, y:int):uint 
     329        { 
     330            return layers.composited.getPixel32(x, y); 
     331        } 
     332         
     333        /** 
     334         * レイヤーの可視状態を変更する 
     335         *  
     336         * @param index レイヤー番号 
     337         * @param visible 可視であるかどうか 
     338         */ 
     339        public function setVisibleAt(index:int, visible:Boolean):void 
     340        { 
     341            m_layers[index].visible = visible; 
     342            m_layers.compositeAll(); 
     343        } 
     344         
     345        /** 
     346         * 指定されたレイヤーに対して水平方向に鏡面処理を実行する 
     347         *  
     348         * @param index レイヤー番号 
     349         */ 
     350        public function transformWithHorizontalMirrorAt(index:int):void 
     351        { 
     352            transformFromMatrixAt(index, m_horizontalMirrorMatrix); 
     353        } 
     354         
     355        /** 
     356         * 指定されたレイヤーに対して垂直方向に鏡面処理を実行する 
     357         *  
     358         * @param index レイヤー番号 
     359         */ 
     360        public function transformWithVerticalMirrorAt(index:int):void 
     361        { 
     362            transformFromMatrixAt(index, m_verticalMirrorMatrix); 
     363        } 
     364         
     365        /** 
     366         * 描写開始を宣言する 
     367         *  
     368         * <p> 
     369         * 全てのレイヤーに対してではなく、現在のレイヤーのみにブレンドモードが 
     370         * 適用されるように Sprite の変更が行われる。 
     371         * </p> 
     372         */ 
     373        public function startDrawingSession():void 
     374        { 
     375            if (m_tempLayer == null) { 
     376                var currentLayer:LayerBitmap = m_layers.currentLayer; 
     377                var blendMode:String = currentLayer.blendMode; 
     378                m_paintEngine.resetPen(); 
     379                m_drawingSprite.blendMode = 
     380                    blendMode == BlendMode.NORMAL ? BlendMode.LAYER : blendMode; 
     381                m_drawingSprite.alpha = currentLayer.alpha; 
     382                m_tempLayer = currentLayer.clone(false); 
     383                m_tempLayer.blendMode = BlendMode.NORMAL; 
     384                m_tempLayer.alpha = 1.0; 
     385                m_drawingSprite.addChild(m_tempLayer); 
     386                m_drawingSprite.addChild(m_paintEngine.shape); 
     387                var sprite:Sprite = m_layers.spriteToView; 
     388                sprite.removeChild(currentLayer); 
     389                sprite.addChildAt(m_drawingSprite, m_layers.currentIndex); 
     390            } 
     391        } 
     392         
     393        /** 
     394         * 描写終了を宣言する 
     395         *  
     396         */ 
     397        public function stopDrawingSession():void 
     398        { 
     399            if (m_tempLayer != null) { 
     400                var sprite:Sprite = m_layers.spriteToView; 
     401                var currentLayer:LayerBitmap = m_layers.currentLayer; 
     402                var blendMode:String = m_drawingSprite.blendMode; 
     403                currentLayer.blendMode = 
     404                    blendMode == BlendMode.LAYER ? BlendMode.NORMAL : blendMode; 
     405                currentLayer.alpha = m_drawingSprite.alpha; 
     406                sprite.removeChild(m_drawingSprite); 
     407                sprite.addChildAt(currentLayer, m_layers.currentIndex); 
     408                m_paintEngine.clear(); 
     409                m_drawingSprite.removeChild(m_tempLayer); 
     410                m_drawingSprite.removeChild(m_paintEngine.shape); 
     411                m_tempLayer = null; 
     412            } 
     413        } 
     414         
     415        public function correctCoordinate(coordinate:Point):void 
     416        { 
     417            m_paintEngine.correctCoordinate(coordinate); 
     418        } 
     419         
     420        protected function createPaintEngine(version:uint):PaintEngine 
     421        { 
     422            var shape:Shape = new Shape(); 
    93423            if (version > 0 && version <= 10) { 
    94                 m_painter = new PainterV1(width, height, engine); 
     424                return new PaintEngineV1(shape); 
    95425            } 
    96426            else if (version > 10 && version <= 21) { 
    97                 m_painter = new PainterV2(width, height, engine); 
     427                return new PaintEngineV2(shape); 
    98428            } 
    99429            else { 
    100430                throw new NotSupportedVersionError(version.toString()); 
    101431            } 
    102             m_width = width; 
    103             m_height = height; 
    104             m_version = version; 
    105         } 
    106          
    107         /** 
    108          * お絵描きを実行するオブジェクトを返す 
    109          *  
    110          * @return お絵描きを実行するオブジェクト 
    111          */ 
    112         public function get painter():Painter 
    113         { 
    114             return m_painter; 
     432        } 
     433         
     434        private function transformFromMatrixAt(index:int, matrix:Matrix):void 
     435        { 
     436            if (index === 0xff) { 
     437                var c:uint = m_layers.count; 
     438                for (var i:uint = 0; i < c; i++) { 
     439                    m_layers.at(i).applyMatrix(matrix); 
     440                } 
     441            } 
     442            else { 
     443                m_layers.currentLayer.applyMatrix(matrix); 
     444            } 
     445            m_layers.compositeAll(); 
     446        } 
     447         
     448        internal function saveState():Object 
     449        { 
     450            var count:uint = m_layers.count; 
     451            var layers:Vector.<LayerBitmap> = new Vector.<LayerBitmap>( 
     452                count, true 
     453            ); 
     454            for (var i:uint = 0; i < count; i++) { 
     455                var layer:LayerBitmap = m_layers.layers[i].clone(); 
     456                layers[i] = layer; 
     457            } 
     458            var undoData:Object = {}; 
     459            undoData.index = m_layers.currentIndex; 
     460            undoData.layers = layers; 
     461            return undoData; 
     462        } 
     463         
     464        internal function restoreState(undoData:Object):void 
     465        { 
     466            var i:uint = 0; 
     467            m_layers.clear(); 
     468            var count:uint = undoData.layers.length; 
     469            var sprite:Sprite = m_layers.spriteToView; 
     470            for (i = 0; i < count; i++) { 
     471                var layer:LayerBitmap = undoData.layers[i].clone(); 
     472                m_layers.layers.push(layer); 
     473                sprite.addChild(layer); 
     474            } 
     475            m_layers.currentIndex = undoData.index; 
     476            m_layers.compositeAll(); 
     477        } 
     478         
     479        /** 
     480         * レイヤーオブジェクトを返す 
     481         *  
     482         */ 
     483        public function get layers():LayerBitmapCollection 
     484        { 
     485            return m_layers; 
     486        } 
     487         
     488        /** 
     489         * スプライトオブジェクトを返す 
     490         *  
     491         */ 
     492        public function get view():Sprite 
     493        { 
     494            return m_layers.spriteToView; 
     495        } 
     496         
     497        /** 
     498         * ペンオブジェクトを返す 
     499         *  
     500         */ 
     501        public function get pen():Pen 
     502        { 
     503            return m_paintEngine.pen; 
    115504        } 
    116505         
     
    146535         
    147536        /** 
     537         * 現在のレイヤーの透明度を変更する 
     538         *  
     539         */ 
     540        public function set currentLayerAlpha(value:Number):void 
     541        { 
     542            m_layers.currentLayer.alpha = value; 
     543            m_layers.compositeAll(); 
     544        } 
     545         
     546        /** 
     547         * 現在のブレンドモードを変更する 
     548         *  
     549         */ 
     550        public function set currentLayerBlendMode(value:String):void 
     551        { 
     552            m_layers.currentLayer.blendMode = value; 
     553            m_layers.compositeAll(); 
     554        } 
     555         
     556        /** 
     557         * ペンオブジェクトを設定する 
     558         *  
     559         */ 
     560        public function set pen(value:Pen):void 
     561        { 
     562            m_paintEngine.pen = value; 
     563        } 
     564         
     565        /** 
    148566         * UndoStack オブジェクトを設定する 
    149567         *  
     
    155573        } 
    156574         
     575        private var m_paintEngine:PaintEngine; 
     576        private var m_layers:LayerBitmapCollection; 
     577        private var m_horizontalMirrorMatrix:Matrix; 
     578        private var m_verticalMirrorMatrix:Matrix; 
     579        private var m_drawingSprite:Sprite; 
     580        private var m_tempLayer:LayerBitmap; 
     581        private var m_shouldCopyBitmap:Boolean; 
    157582        private var m_version:uint; 
    158         private var m_painter:Painter; 
    159583        private var m_undo:UndoStack; 
     584        private var m_coordinate:Point; 
    160585        private var m_width:uint; 
    161586        private var m_height:uint; 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/PaintEngine.as

    r3501 r3505  
    33    import flash.display.Graphics; 
    44    import flash.display.Shape; 
     5    import flash.errors.IllegalOperationError; 
    56    import flash.geom.Point; 
    67     
     
    89     * 実際に描写を行う 
    910     *  
     11     * @todo correctCoordinate (もともとroundPixel という名前) を仮想メソッドとして実装する 
    1012     */ 
    1113    public class PaintEngine 
     
    3638        public function moveTo(x:Number, y:Number):void 
    3739        { 
    38             m_graphics.moveTo(x, y); 
    3940            m_coordinate.x = x; 
    4041            m_coordinate.y = y; 
     42            correctCoordinate(m_coordinate); 
     43            m_graphics.moveTo(m_coordinate.x, m_coordinate.y); 
    4144        } 
    4245         
     
    4952        public function lineTo(x:Number, y:Number):void 
    5053        { 
    51             m_graphics.lineTo(x, y); 
    5254            m_coordinate.x = x; 
    5355            m_coordinate.y = y; 
     56            correctCoordinate(m_coordinate); 
     57            m_graphics.lineTo(m_coordinate.x, m_coordinate.y); 
    5458        } 
    5559         
     
    114118        { 
    115119            m_graphics.endFill(); 
     120        } 
     121         
     122        public function correctCoordinate(point:Point):void 
     123        { 
    116124        } 
    117125         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/PaintEngineV1.as

    r3434 r3505  
    11package org.libspark.gunyarapaint.framework 
    22{ 
    3     internal final class PainterV1 extends Painter 
     3    import flash.display.Shape; 
     4    import flash.geom.Point; 
     5 
     6    internal final class PaintEngineV1 extends PaintEngine 
    47    { 
    5         public function PainterV1(width:int, height:int, engine:PaintEngine) 
     8        public function PaintEngineV1(shape:Shape) 
    69        { 
    7             super(width, height, engine); 
     10            super(shape); 
    811        } 
    912         
    10         public override function roundPixel(n:Number):Number 
     13        public override function correctCoordinate(coordinate:Point):void 
    1114        { 
    12             return int(n) + ((m_paintEngine.pen.thickness % 2) ? 0.5 : 0); 
     15            coordinate.x = int(coordinate.x + 0.5); 
     16            coordinate.y = int(coordinate.y + 0.5); 
    1317        } 
    1418    } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/PaintEngineV2.as

    r3434 r3505  
    11package org.libspark.gunyarapaint.framework 
    22{ 
    3     internal final class PainterV2 extends Painter 
     3    import flash.display.Shape; 
     4    import flash.geom.Point; 
     5 
     6    internal final class PaintEngineV2 extends PaintEngine 
    47    { 
    5         public function PainterV2(width:int, height:int, engine:PaintEngine) 
     8        public function PaintEngineV2(shape:Shape) 
    69        { 
    7             super(width, height, engine); 
     10            super(shape); 
    811        } 
    912         
    10         public override function roundPixel(n:Number):Number 
     13        public override function correctCoordinate(coordinate:Point):void 
    1114        { 
    12             return int(n + 0.5); 
     15            var aux:Number = (pen.thickness % 2) ? 0.5 : 0; 
     16            coordinate.x = int(coordinate.x) + aux; 
     17            coordinate.y = int(coordinate.y) + aux; 
    1318        } 
    1419    } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Player.as

    r3501 r3505  
    11package org.libspark.gunyarapaint.framework 
    22{ 
    3     import flash.display.BitmapData; 
    43    import flash.utils.ByteArray; 
    54    import flash.utils.clearInterval; 
     
    1615    public final class Player extends CanvasContext 
    1716    { 
    18         public function Player(
     17        public function Player(parser:Parser
    1918        { 
    20             super(); 
     19            var data:Object = {}; 
     20            parser.readHeader(data); 
     21            parser.loadCommands(); 
     22            parser.preload(); 
    2123            speed = 1; 
    2224            duration = 50; 
    2325            m_timerID = 0; 
     26            m_parser = parser; 
     27            super(data.width, data.height, createPaintEngine(data.version)); 
    2428        } 
    2529         
     
    3438         * @param bytes ログデータ 
    3539         */ 
    36         public function load(bytes:ByteArray):void 
     40        public static function load(bytes:ByteArray):Player 
    3741        { 
    38             var data:Object = {}; 
    39             m_parser = new Parser(bytes); 
    40             m_parser.readHeader(data); 
    41             var width:uint = data.width; 
    42             var height:uint = data.height; 
    43             var version:uint = data.version;  
    44             createPainter(width, height, version); 
    45             m_parser.loadCommands(); 
    46             m_parser.preload(); 
    47             setUndo(new UndoStack(painter, m_parser.maxUndoCount)); 
    48         } 
    49          
    50         /** 
    51          * ログデータを再読み込みしてオブジェクトを初期化する 
    52          *  
    53          */ 
    54         public function reload():void 
    55         { 
    56             createPainter(width, height, version); 
    57             m_parser.resetCommands(); 
    58             setUndo(new UndoStack(painter, m_parser.maxUndoCount)); 
     42            var player:Player = new Player(new Parser(bytes)); 
     43            player.setUndo(new UndoStack(player, player.m_parser.maxUndoCount)); 
     44            return player; 
    5945        } 
    6046         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/Recorder.as

    r3501 r3505  
    1919        public static const DEFAULT_UNDO_MAX:uint = 16; 
    2020         
    21         public function Recorder(bytes:ByteArray, commands:CommandCollection = null
     21        public function Recorder(width:uint, height:uint, bytes:ByteArray, commands:CommandCollection
    2222        { 
    23             bytes.endian = Endian.BIG_ENDIAN; 
    24             bytes.position = 0; 
    2523            m_bytes = bytes; 
    26             m_command = commands ? commands : new CommandCollection()
    27             super(); 
     24            m_command = commands
     25            super(width, height, createPaintEngine(PAINTER_LOG_VERSION)); 
    2826        } 
    2927         
     
    3533         * @param undo やり直しできる回数 
    3634         */ 
    37         public function prepare(width:int, height:int, undo:int):void 
     35        public static function create(width:int, height:int, undo:int):Recorder 
    3836        { 
    39             m_command.loadCommands(); 
    40             writeHeader(PAINTER_LOG_VERSION, width, height, undo); 
    41             createPainter(width, height, undo); 
    42             setUndo(new UndoStack(painter, undo)); 
    43         } 
    44          
    45         /** 
    46          * ログヘッダーを書き出す 
    47          *  
    48          * @param version ログのバージョン番号 
    49          * @param width 画像の幅 
    50          * @param height 画像の高さ 
    51          * @param undo やり直しできる回数 
    52          */ 
    53         private function writeHeader(version:uint, width:uint, height:uint, undo:uint):void 
    54         { 
     37            var bytes:ByteArray = new ByteArray(); 
     38            var commands:CommandCollection = new CommandCollection(); 
     39            var version:uint = PAINTER_LOG_VERSION; 
     40            commands.loadCommands(); 
     41            bytes.endian = Endian.BIG_ENDIAN; 
     42            bytes.position = 0; 
    5543            var signature:String = "GUNYARA_PAINT:" 
    5644                + (version / 100)         + ":" 
    5745                + ((version % 100) / 10)  + ":" 
    5846                + (version % 10)          + ":" 
    59             m_bytes.writeUTFBytes(signature); 
    60             m_bytes.writeShort(width); 
    61             m_bytes.writeShort(height); 
    62             m_bytes.writeShort(undo); 
     47            bytes.writeUTFBytes(signature); 
     48            bytes.writeShort(width); 
     49            bytes.writeShort(height); 
     50            bytes.writeShort(undo); 
     51            var recorder:Recorder = new Recorder(width, height, bytes, commands); 
     52            recorder.setUndo(new UndoStack(recorder, undo)); 
     53            return recorder; 
    6354        } 
    6455         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/UndoStack.as

    r3501 r3505  
    11package org.libspark.gunyarapaint.framework 
    22{ 
    3     import flash.events.EventDispatcher; 
    4     import flash.events.IEventDispatcher; 
    5      
    63    import org.libspark.gunyarapaint.framework.errors.RedoError; 
    74    import org.libspark.gunyarapaint.framework.errors.UndoError; 
     
    1310    internal final class UndoStack 
    1411    { 
    15         public function UndoStack(painter:Painter
     12        public function UndoStack(painter:CanvasContext
    1613                                  size:uint = 16) 
    1714        { 
     
    2623        } 
    2724         
    28         public function undo(painter:Painter):void 
     25        public function undo(cc:CanvasContext):void 
    2926        { 
    3027            if (m_index === m_first) { 
     
    3734                m_index--; 
    3835            } 
    39             painter.undo = m_buffer[m_index]
     36            cc.restoreState(m_buffer[m_index])
    4037        } 
    4138         
    42         public function redo(painter:Painter):void 
     39        public function redo(cc:CanvasContext):void 
    4340        { 
    4441            if (m_index === m_last) { 
     
    4643            } 
    4744            m_index = (m_index + 1) % m_buffer.length; 
    48             painter.undo = m_buffer[m_index]
     45            cc.restoreState(m_buffer[m_index])
    4946        } 
    5047         
    51         public function push(painter:Painter):void 
     48        public function push(painter:CanvasContext):void 
    5249        { 
    5350            m_index = (m_index + 1) % m_buffer.length; 
    54             m_buffer[m_index] = painter.undo
     51            m_buffer[m_index] = painter.saveState()
    5552            m_last = m_index; 
    5653            if (m_index === m_first) { 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/BeginFillCommand.as

    r3501 r3505  
    3737        public function execute(canvas:CanvasContext):void 
    3838        { 
    39             canvas.painter.beginFill(m_color, m_alpha); 
     39            canvas.beginFill(m_color, m_alpha); 
    4040        } 
    4141         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/CompositeCommand.as

    r3501 r3505  
    2828        public function execute(canvas:CanvasContext):void 
    2929        { 
    30             canvas.painter.composite(); 
     30            canvas.composite(); 
    3131            canvas.pushUndo(); 
    32             canvas.painter.stopDrawingSession(); 
     32            canvas.stopDrawingSession(); 
    3333        } 
    3434         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/DrawCircleCommand.as

    r3501 r3505  
    3232        public function execute(canvas:CanvasContext):void 
    3333        { 
    34             canvas.painter.drawCircle(m_radius); 
     34            canvas.drawCircle(m_radius); 
    3535        } 
    3636         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/EndFillCommand.as

    r3501 r3505  
    2828        public function execute(canvas:CanvasContext):void 
    2929        { 
    30             canvas.painter.endFill(); 
     30            canvas.endFill(); 
    3131        } 
    3232         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/FloodFillCommand.as

    r3501 r3505  
    2828        public function execute(canvas:CanvasContext):void 
    2929        { 
    30             canvas.painter.floodFill(); 
     30            canvas.floodFill(); 
    3131            canvas.pushUndo(); 
    32             canvas.painter.stopDrawingSession(); 
     32            canvas.stopDrawingSession(); 
    3333        } 
    3434         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/HorizontalMirrorCommand.as

    r3501 r3505  
    3333        public function execute(canvas:CanvasContext):void 
    3434        { 
    35             canvas.painter.transformWithHorizontalMirrorAt(m_index); 
     35            canvas.transformWithHorizontalMirrorAt(m_index); 
    3636        } 
    3737         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/LineToCommand.as

    r3501 r3505  
    6666        public function execute(canvas:CanvasContext):void 
    6767        { 
    68             canvas.painter.lineTo( 
     68            canvas.lineTo( 
    6969                readCoordinate.x || writeCoordinate.x, 
    7070                readCoordinate.y || writeCoordinate.y 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/MoveToCommand.as

    r3501 r3505  
    5656        public function execute(canvas:CanvasContext):void 
    5757        { 
    58             canvas.painter.moveTo( 
     58            canvas.moveTo( 
    5959                readCoordinate.x || writeCoordinate.x, 
    6060                readCoordinate.y || writeCoordinate.y 
    6161            ); 
    62             canvas.painter.startDrawingSession(); 
     62            canvas.startDrawingSession(); 
    6363        } 
    6464         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/PenCommand.as

    r3501 r3505  
    131131        public function execute(canvas:CanvasContext):void 
    132132        { 
    133             canvas.painter.pen = m_pen; 
     133            canvas.pen = m_pen; 
    134134        } 
    135135         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/PixelCommand.as

    r3501 r3505  
    3737        public function execute(canvas:CanvasContext):void 
    3838        { 
    39             canvas.painter.setPixel(m_x, m_y); 
     39            canvas.setPixel(m_x, m_y); 
    4040            canvas.pushUndo(); 
    4141        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/VerticalMirrorCommand.as

    r3501 r3505  
    3333        public function execute(canvas:CanvasContext):void 
    3434        { 
    35             canvas.painter.transformWithVerticalMirrorAt(m_index); 
     35            canvas.transformWithVerticalMirrorAt(m_index); 
    3636        } 
    3737         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/CopyLayerCommand.as

    r3501 r3505  
    2929        public function execute(canvas:CanvasContext):void 
    3030        { 
    31             canvas.painter.layers.copy(); 
     31            canvas.layers.copy(); 
    3232            canvas.pushUndoIfNeed(); 
    3333        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/CreateLayerCommand.as

    r3501 r3505  
    2929        public function execute(canvas:CanvasContext):void 
    3030        { 
    31             canvas.painter.layers.add(); 
     31            canvas.layers.add(); 
    3232            canvas.pushUndoIfNeed(); 
    3333        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/MergeLayerCommand.as

    r3501 r3505  
    2929        public function execute(canvas:CanvasContext):void 
    3030        { 
    31             canvas.painter.layers.merge(); 
     31            canvas.layers.merge(); 
    3232            canvas.pushUndoIfNeed(); 
    3333        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/RemoveLayerCommand.as

    r3501 r3505  
    2929        public function execute(canvas:CanvasContext):void 
    3030        { 
    31             canvas.painter.layers.remove(); 
     31            canvas.layers.remove(); 
    3232            canvas.pushUndoIfNeed(); 
    3333        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/SetLayerAlphaCommand.as

    r3501 r3505  
    3636        public function execute(canvas:CanvasContext):void 
    3737        { 
    38             canvas.painter.currentLayerAlpha = m_alpha; 
     38            canvas.currentLayerAlpha = m_alpha; 
    3939            canvas.pushUndoIfNeed(); 
    4040        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/SetLayerBlendModeCommand.as

    r3501 r3505  
    3737        public function execute(canvas:CanvasContext):void 
    3838        { 
    39             canvas.painter.currentLayerBlendMode = m_blendMode; 
     39            canvas.currentLayerBlendMode = m_blendMode; 
    4040            canvas.pushUndoIfNeed(); 
    4141        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/SetLayerIndexCommand.as

    r3501 r3505  
    3636        public function execute(canvas:CanvasContext):void 
    3737        { 
    38             canvas.painter.layers.currentIndex = m_index; 
     38            canvas.layers.currentIndex = m_index; 
    3939        } 
    4040         
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/SetLayerVisibleCommand.as

    r3501 r3505  
    3838        public function execute(canvas:CanvasContext):void 
    3939        { 
    40             canvas.painter.layers.at(m_index).visible = m_visible; 
     40            canvas.layers.at(m_index).visible = m_visible; 
    4141            canvas.pushUndoIfNeed(); 
    4242        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/commands/layer/SwapLayerCommand.as

    r3501 r3505  
    3838        public function execute(canvas:CanvasContext):void 
    3939        { 
    40             canvas.painter.layers.swap(m_from, m_to); 
     40            canvas.layers.swap(m_from, m_to); 
    4141            canvas.pushUndoIfNeed(); 
    4242        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/CircleModule.as

    r3479 r3505  
    33    import flash.geom.Rectangle; 
    44     
    5     import org.libspark.gunyarapaint.framework.Painter; 
    65    import org.libspark.gunyarapaint.framework.Recorder; 
    76    import org.libspark.gunyarapaint.framework.commands.CompositeCommand; 
     
    2019            validateLayerState(); 
    2120            setCoordinate(x, y); 
    22             m_recorder.painter.startDrawingSession(); 
     21            m_recorder.startDrawingSession(); 
    2322            m_drawing = true; 
    2423        } 
     
    2726        { 
    2827            if (m_drawing) { 
    29                 var painter:Painter = m_recorder.painter; 
    3028                storeCircleCoordinate(x, y); 
    31                 painter.clear(); 
    32                 painter.resetPen(); 
    33                 painter.moveTo(s_rectangle.x, s_rectangle.y); 
    34                 painter.drawCircle(s_rectangle.width); 
     29                m_recorder.clear(); 
     30                m_recorder.resetPen(); 
     31                m_recorder.moveTo(s_rectangle.x, s_rectangle.y); 
     32                m_recorder.drawCircle(s_rectangle.width); 
    3533            } 
    3634        } 
     
    3937        { 
    4038            if (m_drawing) { 
    41                 m_recorder.painter.stopDrawingSession(); 
     39                m_recorder.stopDrawingSession(); 
    4240                if (!equalsCoordinate(x, y)) { 
    4341                    storeCircleCoordinate(x, y); 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/DrawModule.as

    r3493 r3505  
    11package org.libspark.gunyarapaint.framework.modules 
    22{ 
     3    import flash.geom.Point; 
     4     
    35    import org.libspark.gunyarapaint.framework.LayerBitmap; 
    4     import org.libspark.gunyarapaint.framework.Painter; 
    56    import org.libspark.gunyarapaint.framework.Recorder; 
    67    import org.libspark.gunyarapaint.framework.commands.HorizontalMirrorCommand; 
     
    122123        protected function validateLayerState():void 
    123124        { 
    124             var layer:LayerBitmap = m_recorder.painter.layers.currentLayer; 
     125            var layer:LayerBitmap = m_recorder.layers.currentLayer; 
    125126            if (!layer.visible) 
    126127                throw new InvisibleLayerError(); 
     
    158159         * @return 同じである場合は true 
    159160         */         
    160         protected function equalsCoordinate(x:Number, y:Number):Boolean 
    161         { 
    162             var painter:Painter = m_recorder.painter; 
    163             return painter.roundPixel(x) == painter.roundPixel(s_coordinateX) && 
    164                 painter.roundPixel(y) == painter.roundPixel(s_coordinateY); 
     161        protected function equalsCoordinate(x:uint, y:uint):Boolean 
     162        { 
     163            var from:Point = new Point(s_coordinateX, s_coordinateY); 
     164            var to:Point = new Point(x, y); 
     165            m_recorder.correctCoordinate(from); 
     166            m_recorder.correctCoordinate(to); 
     167            return from.equals(to); 
    165168        } 
    166169         
     
    183186        protected function getArgumentsFromCoordinate(x:Number, y:Number):Object 
    184187        { 
    185             var painter:Painter = m_recorder.painter; 
     188            var coordinate:Point = new Point(x, y); 
     189            m_recorder.correctCoordinate(coordinate); 
    186190            var args:Object = { 
    187                 "x": painter.roundPixel(x)
    188                 "y": painter.roundPixel(y) 
     191                "x": coordinate.x
     192                "y": coordinate.y 
    189193            }; 
    190194            return args; 
     
    197201        protected function stopDrawing():void 
    198202        { 
    199             m_recorder.painter.stopDrawingSession(); 
     203            m_recorder.stopDrawingSession(); 
    200204            m_drawing = false; 
    201205        } 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/DropperModule.as

    r3479 r3505  
    4141                { 
    4242                    "type": PenCommand.COLOR, 
    43                     "color": m_recorder.painter.getPixel(x, y) 
     43                    "color": m_recorder.getPixel(x, y) 
    4444                } 
    4545            ); 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/EllipseModule.as

    r3471 r3505  
    11package org.libspark.gunyarapaint.framework.modules 
    22{ 
    3     import org.libspark.gunyarapaint.framework.Painter; 
    43    import org.libspark.gunyarapaint.framework.Recorder; 
    54     
     
    1514            validateLayerState(); 
    1615            setCoordinate(x, y); 
    17             m_recorder.painter.startDrawingSession(); 
     16            m_recorder.startDrawingSession(); 
    1817            m_drawing = true; 
    1918        } 
     
    2221        { 
    2322            if (m_drawing) { 
    24                 var painter:Painter = m_recorder.painter; 
    25                 var fromX:int = painter.roundPixel(coordinateX); 
    26                 var fromY:int = painter.roundPixel(coordinateY); 
    27                 var toX:int = painter.roundPixel(x); 
    28                 var toY:int = painter.roundPixel(y); 
    29                 painter.clear(); 
    30                 painter.resetPen(); 
    31                 painter.drawEllipse( 
    32                     fromX, 
    33                     fromY, 
    34                     Math.abs(toX - fromX), 
    35                     Math.abs(toY - fromY) 
     23                m_recorder.clear(); 
     24                m_recorder.resetPen(); 
     25                m_recorder.drawEllipse( 
     26                    coordinateX, 
     27                    coordinateY, 
     28                    Math.abs(x - coordinateX), 
     29                    Math.abs(y - coordinateY) 
    3630                ); 
    3731            } 
     
    4135        { 
    4236            if (m_drawing) { 
    43                 m_recorder.painter.stopDrawingSession(); 
     37                m_recorder.stopDrawingSession(); 
    4438                if (!equalsCoordinate(x, y)) { 
    4539                    // TODO: implement this 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/FreeHandModule.as

    r3479 r3505  
    4343            if (m_drawing) { 
    4444                if (!m_drawingLine) { 
    45                     var pen:Pen = m_recorder.painter.pen; 
     45                    var pen:Pen = m_recorder.pen; 
    4646                    var tempAlpha:Number = pen.alpha; 
    4747                    m_recorder.commitCommand( 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/LineModule.as

    r3479 r3505  
    11package org.libspark.gunyarapaint.framework.modules 
    22{ 
    3     import org.libspark.gunyarapaint.framework.Painter; 
    43    import org.libspark.gunyarapaint.framework.Recorder; 
    54    import org.libspark.gunyarapaint.framework.commands.CompositeCommand; 
     
    1817            validateLayerState(); 
    1918            setCoordinate(x, y); 
    20             m_recorder.painter.startDrawingSession(); 
     19            m_recorder.startDrawingSession(); 
    2120            m_drawing = true; 
    2221        } 
     
    2524        { 
    2625            if (m_drawing) { 
    27                 var painter:Painter = m_recorder.painter; 
    28                 var fromX:int = painter.roundPixel(coordinateX); 
    29                 var fromY:int = painter.roundPixel(coordinateY); 
    30                 var toX:int = painter.roundPixel(x); 
    31                 var toY:int = painter.roundPixel(y); 
    32                 painter.clear(); 
    33                 painter.resetPen(); 
    34                 painter.moveTo(fromX, fromY); 
    35                 painter.lineTo(toX, toY); 
     26                m_recorder.clear(); 
     27                m_recorder.resetPen(); 
     28                m_recorder.moveTo(coordinateX, coordinateY); 
     29                m_recorder.lineTo(x, y); 
    3630            } 
    3731        } 
     
    4034        { 
    4135            if (m_drawing) { 
    42                 m_recorder.painter.stopDrawingSession(); 
     36                m_recorder.stopDrawingSession(); 
    4337                if (!equalsCoordinate(x, y)) { 
    4438                    var from:Object = getArgumentsFromCurrentCoordinate(); 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/PixelModule.as

    r3479 r3505  
    11package org.libspark.gunyarapaint.framework.modules 
    22{ 
    3     import org.libspark.gunyarapaint.framework.Painter; 
    43    import org.libspark.gunyarapaint.framework.Recorder; 
    54    import org.libspark.gunyarapaint.framework.commands.PixelCommand; 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/RectModule.as

    r3471 r3505  
    11package org.libspark.gunyarapaint.framework.modules 
    22{ 
    3     import org.libspark.gunyarapaint.framework.Painter; 
    43    import org.libspark.gunyarapaint.framework.Recorder; 
    54     
     
    1514            validateLayerState(); 
    1615            setCoordinate(x, y); 
    17             m_recorder.painter.startDrawingSession(); 
     16            m_recorder.startDrawingSession(); 
    1817            m_drawing = true; 
    1918        } 
     
    2221        { 
    2322            if (m_drawing) { 
    24                 var painter:Painter = m_recorder.painter; 
    25                 var fromX:int = painter.roundPixel(coordinateX); 
    26                 var fromY:int = painter.roundPixel(coordinateY); 
    27                 var toX:int = painter.roundPixel(x); 
    28                 var toY:int = painter.roundPixel(y); 
    29                 painter.clear(); 
    30                 painter.resetPen(); 
    31                 painter.drawRect( 
    32                     fromX, 
    33                     fromY, 
    34                     Math.abs(toX - fromX), 
    35                     Math.abs(toY - fromY) 
     23                m_recorder.clear(); 
     24                m_recorder.resetPen(); 
     25                m_recorder.drawRect( 
     26                    coordinateX, 
     27                    coordinateY, 
     28                    Math.abs(x - coordinateX), 
     29                    Math.abs(y - coordinateY) 
    3630                ); 
    3731            } 
     
    4135        { 
    4236            if (m_drawing) { 
    43                 m_recorder.painter.stopDrawingSession(); 
     37                m_recorder.stopDrawingSession(); 
    4438                if (!equalsCoordinate(x, y)) { 
    4539                    // TODO: implement this 
  • as3/gunyarapaint/branches/gunyarapaint/framework/src/org/libspark/gunyarapaint/framework/modules/RoundRectModule.as

    r3471 r3505  
    1414            validateLayerState(); 
    1515            setCoordinate(x, y); 
    16             m_recorder.painter.startDrawingSession(); 
     16            m_recorder.startDrawingSession(); 
    1717            m_drawing = true; 
    1818        } 
     
    2626        { 
    2727            if (m_drawing) { 
    28                 m_recorder.painter.stopDrawingSession(); 
     28                m_recorder.stopDrawingSession(); 
    2929                if (!equalsCoordinate(x, y)) { 
    3030                    // TODO: implement this