チェンジセット 1121: as3

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

r72@poppop (orig r71): tasuku | 2008-06-02 18:31:15 +0900

  • support line
  • support floodFill
ファイル:

凡例:

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

    r1120 r1121  
    3030    private var undoBufferSize:uint; 
    3131     
    32     private var lineShape:Shape; // 描画用 
    33      
    34     private var additionalBox:Shape; // 縦横補助線 
    35     private var additionalSkew:Shape; // 斜め補助線 
     32    private var lineShape:Shape; // 描画用 (1) 
     33    private var additionalBox:Shape; // 縦横補助線 (2) 
     34    private var additionalSkew:Shape; // 斜め補助線 (3) 
     35    private var previewShape:Shape; // プレビュー用 (4) 
     36     
    3637    private var additionalNumber:uint = 4; // 補助線の分割数 
    3738     
     
    7273      addChildAt(additionalBox, 2); 
    7374      addChildAt(additionalSkew, 3); 
    74        
     75 
     76      // テンポラリ・プレビュー用shape(直線ツールとか) 
     77      previewShape = new Shape(); 
     78      addChildAt(previewShape, 4); 
     79 
    7580      if (logger) { 
    7681        this._log = logger; 
     
    162167        } 
    163168         
    164         private function setLineStyle():void { 
     169        private function setLineStyle(shape:Shape):void { 
    165170          // TODO: pixel hintingのパラメータつける… 
    166       lineShape.graphics.lineStyle(_pen.thickness, 
     171      shape.graphics.lineStyle(_pen.thickness, 
    167172                                   _pen.color, 
    168173                                   _pen.alpha, 
     
    173178                                   _pen.miterLimit); 
    174179 
    175       lineShape.blendMode = _pen.blendMode; 
     180      shape.blendMode = _pen.blendMode;            
     181        } 
     182         
     183        private function setAndLogLineStyle():void { 
     184      setLineStyle(lineShape); 
    176185       
    177186      if (writeLog) { 
     
    219228      } 
    220229        } 
     230         
     231        // マウス座標から描画座標に変換。 
     232        private function zz(n:Number):Number { 
     233          return Math.floor(n) + 0.5; 
     234        } 
     235         
     236        public function previewClear():void { 
     237          previewShape.graphics.clear(); 
     238        } 
     239         
     240        public function previewLineTo(fromX:Number, fromY:Number, toX:Number, toY:Number):void { 
     241          previewShape.graphics.clear(); 
     242          setLineStyle(previewShape); 
     243          previewShape.graphics.moveTo(zz(fromX), zz(fromY)); 
     244          previewShape.graphics.lineTo(zz(toX), zz(toY)); 
     245        }        
     246         
    221247        // 描画関係のフラグ 
    222248        public var isMoveTo:Boolean = false; 
     
    227253    public function oldMoveTo(x:Number, y:Number):void { 
    228254      lineShape.graphics.moveTo(x, y); 
    229       setLineStyle(); 
     255      setAndLogLineStyle(); 
    230256      logWrite(['moveTo', x, y]); 
    231257      isDrawnLine = false; 
     
    260286        } 
    261287         
     288        public function floodFill():void { 
     289          canvasData.floodFill(currentPoint.x, currentPoint.y, _pen.argbColor); 
     290      afterDrawBitmap(); 
     291      logWrite(['floodFill', x, y]); 
     292        } 
     293 
     294        // FIXME: x, yはcurrentPointでいいのでは?lineStyleもmoveToでセットしてくれるし。 
    262295    public function drawRect(x:Number, y:Number, width:uint, height:uint):void { 
    263296      x = Math.floor(x) + 0.5; 
    264297      y = Math.floor(y) + 0.5; 
    265       setLineStyle(); 
    266298      lineShape.graphics.drawRect(x, y, width, height); 
    267299      logWrite(['drawRect', x, y, width, height]); 
     
    276308      var x:Number = currentPoint.x; 
    277309      var y:Number = currentPoint.y; 
    278       setLineStyle(); 
    279310      lineShape.graphics.drawCircle(x, y, radius); 
    280311      // moveToでx, yは保存されているので、半径のみ保存 
     
    312343      // 描画 
    313344      canvasData.draw(lineShape, null, null, _pen.blendMode, null, false); 
     345      logWrite(['drawShapeOnBitmap']); 
     346       
     347      afterDrawBitmap(); 
     348    } 
     349     
     350    public function afterDrawBitmap():void { 
    314351      // リングバッファに追加して 
    315352      // TODO: avoid GC 
     
    324361      lineShape.graphics.clear(); 
    325362      isMoveTo = false; 
    326       this.dispatchEvent(new Event('changeUndoRedo')); 
    327       logWrite(['drawShapeOnBitmap']); 
     363      this.dispatchEvent(new Event('changeUndoRedo'));       
    328364    } 
    329365     
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControl.mxml

    r1110 r1121  
    8686 
    8787  <!-- line method/blend mode --> 
    88   <mx:ComboBox id="penModeComboBox" x="6" y="290" width="96" enabled="false"
     88  <mx:ComboBox id="penModeComboBox" x="6" y="290" width="96"
    8989  </mx:ComboBox> 
    9090  <mx:ComboBox id="blendModeComboBox" x="6" y="316" width="97"> 
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControlScript.as

    r1116 r1121  
    3939  penModeComboBox.dataProvider = [ 
    4040    {label: '手描き', data: GPPen.PEN_MODE_HAND }, 
    41     {label: 'スポイト', data: GPPen.PEN_MODE_DROPPER }, 
     41/*    {label: 'スポイト', data: GPPen.PEN_MODE_DROPPER }, */ 
    4242    {label: '直線', data: GPPen.PEN_MODE_LINE }, 
    43     {label: '四角', data: GPPen.PEN_MODE_RECT }, 
     43/*    {label: '四角', data: GPPen.PEN_MODE_RECT }, 
    4444    {label: '円', data: GPPen.PEN_MODE_ELLIPSE }, 
    45     {label: '角丸四角', data: GPPen.PEN_MODE_ROUND_RECT } 
     45    {label: '角丸四角', data: GPPen.PEN_MODE_ROUND_RECT }, */ 
     46    {label: 'ペイント', data: GPPen.PEN_MODE_FLOOD_FILL } 
    4647  ]; 
     48  penModeComboBox.addEventListener(ListEvent.CHANGE, penModeComboBoxHandler); 
    4749   
    4850  // ブレンドモード 
     
    126128} 
    127129 
     130private function penModeComboBoxHandler(evt:ListEvent):void { 
     131  cancelDropper(); 
     132  _pen.mode = uint(evt.currentTarget.value); 
     133  changePen(); 
     134} 
     135 
    128136private function blendModeComboBoxHandler(evt:ListEvent):void { 
    129137  cancelDropper(); 
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPLogger.as

    r1117 r1121  
    9191    public static const ACTION_DRAW_ELLIPSE:uint = 11; 
    9292    public static const ACTION_DRAW_ROUND_RECT:uint = 12; 
     93    public static const ACTION_FLOOD_FILL:uint = 13; 
    9394 
    9495    // LINESTYLE 
     
    193194        writeDouble(info[1]); 
    194195        break; 
    195  
     196      case 'floodFill': 
     197        writeByte(ACTION_FLOOD_FILL); 
     198        break; 
    196199      default: 
    197200        Alert.show('対応していないアクションがログされました!'); 
     
    343346          case GPLogger.ACTION_DRAW_CIRCLE: 
    344347            _playCanvas.drawCircle(a[1]); 
     348            break; 
     349          case GPLogger.ACTION_FLOOD_FILL: 
     350            _playCanvas.floodFill(); 
    345351            break; 
    346352          default: 
     
    426432          obj = readDouble(); 
    427433          return [ACTION_DRAW_CIRCLE, obj]; 
     434        case ACTION_FLOOD_FILL: 
     435          return [ACTION_FLOOD_FILL]; 
    428436        default: 
    429437          if (byte & 0x80) { 
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPPen.as

    r1120 r1121  
    66  import flash.display.LineScaleMode; 
    77  import flash.events.MouseEvent; 
     8  import flash.geom.Point; 
    89   
    910  import gunyarapaint.controls.GPCanvas; 
    1011  import gunyarapaint.controls.PenDetailControl; 
    11    
    12   import mx.core.Application; 
    1312 
    1413  public class GPPen 
     
    2019    public static const PEN_MODE_ELLIPSE:uint = 5; 
    2120    public static const PEN_MODE_ROUND_RECT:uint = 6; 
     21    public static const PEN_MODE_FLOOD_FILL:uint = 7; 
    2222 
    2323    private var _mode:uint; 
     
    6565    public function get pixelHinting():Boolean { 
    6666      return _pixelHinting; 
     67    } 
     68    public function get argbColor():uint { 
     69      return uint(_alpha * 255) << 24 | _color; 
    6770    } 
    6871     
     
    146149    } 
    147150     
     151    private var fromPoint:Point = new Point(); 
     152    private var isMouseDownAndOut:Boolean = false; 
     153     
    148154    public function mouseDown(evt:MouseEvent):void { 
    149155      // 一応… 
     
    153159          switch (mode) { 
    154160            case PEN_MODE_HAND: 
     161              // moveToして、ペンの状態を設定し、ペンの状態変化をログし、始点の座標を覚えさせる 
     162              // FIXME: lintToまでmoveToを遅延させよう! 
    155163              _canvas.moveTo(evt.localX, evt.localY); 
    156164              break; 
     
    159167            case PEN_MODE_ELLIPSE: 
    160168            case PEN_MODE_ROUND_RECT: 
    161               _canvas.moveTo(evt.localX, evt.localY); 
     169              fromPoint.x = evt.localX; 
     170              fromPoint.y = evt.localY;      
    162171        break; 
    163172      case PEN_MODE_DROPPER: 
    164173        color = _canvas.getColor(evt); 
    165174        break; 
    166           }       
    167     } 
    168  
    169     private var isMouseDownAndOut:Boolean = false; 
    170     private var lastX:Number, lastY:Number; 
     175      case PEN_MODE_FLOOD_FILL: 
     176              _canvas.moveTo(evt.localX, evt.localY); 
     177        _canvas.floodFill(); 
     178        break; 
     179          } 
     180    } 
    171181 
    172182    public function mouseMove(evt:MouseEvent):void { 
     
    191201          } 
    192202          break; 
     203        case PEN_MODE_LINE: 
     204          _canvas.previewLineTo(fromPoint.x, fromPoint.y, evt.localX, evt.localY); 
     205          break; 
    193206        } 
    194         lastX = evt.localX; 
    195         lastY = evt.localY; 
    196207      } 
    197208    } 
    198209    public function mouseUp(evt:MouseEvent):void { 
    199       if (!_canvas.isDrawnLine) { 
    200         var tmpAlpha:Number = alpha; 
    201         alpha = 0; 
    202         _canvas.beginFill(color, tmpAlpha); 
    203         _canvas.drawCircle(thickness / 2); 
    204         _canvas.endFill(); 
    205         alpha = tmpAlpha; 
    206       } 
    207       _canvas.drawShapeOnBitmap();         
     210      switch (mode) { 
     211      case PEN_MODE_HAND: 
     212        if (!_canvas.isDrawnLine) { 
     213          var tmpAlpha:Number = alpha; 
     214          alpha = 0; 
     215          _canvas.beginFill(color, tmpAlpha); 
     216          _canvas.drawCircle(thickness / 2); 
     217          _canvas.endFill(); 
     218          alpha = tmpAlpha; 
     219        } 
     220        _canvas.drawShapeOnBitmap(); 
     221        break; 
     222      case PEN_MODE_LINE: 
     223        _canvas.moveTo(fromPoint.x, fromPoint.y); 
     224        _canvas.lineTo(evt.localX, evt.localY); 
     225        _canvas.drawShapeOnBitmap(); 
     226        break; 
     227      } 
    208228    } 
    209229    public function mouseOut(evt:MouseEvent):void { 
    210       if (_canvas.isMoveTo) { 
    211         mouseUp(evt); 
     230      switch (mode) { 
     231      case PEN_MODE_HAND: 
     232        if (_canvas.isMoveTo) { 
     233          mouseUp(evt); 
     234        } 
     235        break; 
     236      case PEN_MODE_LINE: 
     237        _canvas.previewClear(); 
     238        break; 
    212239      } 
    213240    }