- コミット日時:
- 2008/08/27 18:18:14 (5 年前)
- ファイル:
-
- as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/GPCanvas.as (更新) (10 diffs)
- as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControl.mxml (更新) (1 diff)
- as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControlScript.as (更新) (2 diffs)
- as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPLogger.as (更新) (4 diffs)
- as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPPen.as (更新) (7 diffs)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/GPCanvas.as
r1120 r1121 30 30 private var undoBufferSize:uint; 31 31 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 36 37 private var additionalNumber:uint = 4; // 補助線の分割数 37 38 … … 72 73 addChildAt(additionalBox, 2); 73 74 addChildAt(additionalSkew, 3); 74 75 76 // テンポラリ・プレビュー用shape(直線ツールとか) 77 previewShape = new Shape(); 78 addChildAt(previewShape, 4); 79 75 80 if (logger) { 76 81 this._log = logger; … … 162 167 } 163 168 164 private function setLineStyle( ):void {169 private function setLineStyle(shape:Shape):void { 165 170 // TODO: pixel hintingのパラメータつける… 166 lineShape.graphics.lineStyle(_pen.thickness,171 shape.graphics.lineStyle(_pen.thickness, 167 172 _pen.color, 168 173 _pen.alpha, … … 173 178 _pen.miterLimit); 174 179 175 lineShape.blendMode = _pen.blendMode; 180 shape.blendMode = _pen.blendMode; 181 } 182 183 private function setAndLogLineStyle():void { 184 setLineStyle(lineShape); 176 185 177 186 if (writeLog) { … … 219 228 } 220 229 } 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 221 247 // 描画関係のフラグ 222 248 public var isMoveTo:Boolean = false; … … 227 253 public function oldMoveTo(x:Number, y:Number):void { 228 254 lineShape.graphics.moveTo(x, y); 229 set LineStyle();255 setAndLogLineStyle(); 230 256 logWrite(['moveTo', x, y]); 231 257 isDrawnLine = false; … … 260 286 } 261 287 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でセットしてくれるし。 262 295 public function drawRect(x:Number, y:Number, width:uint, height:uint):void { 263 296 x = Math.floor(x) + 0.5; 264 297 y = Math.floor(y) + 0.5; 265 setLineStyle();266 298 lineShape.graphics.drawRect(x, y, width, height); 267 299 logWrite(['drawRect', x, y, width, height]); … … 276 308 var x:Number = currentPoint.x; 277 309 var y:Number = currentPoint.y; 278 setLineStyle();279 310 lineShape.graphics.drawCircle(x, y, radius); 280 311 // moveToでx, yは保存されているので、半径のみ保存 … … 312 343 // 描画 313 344 canvasData.draw(lineShape, null, null, _pen.blendMode, null, false); 345 logWrite(['drawShapeOnBitmap']); 346 347 afterDrawBitmap(); 348 } 349 350 public function afterDrawBitmap():void { 314 351 // リングバッファに追加して 315 352 // TODO: avoid GC … … 324 361 lineShape.graphics.clear(); 325 362 isMoveTo = false; 326 this.dispatchEvent(new Event('changeUndoRedo')); 327 logWrite(['drawShapeOnBitmap']); 363 this.dispatchEvent(new Event('changeUndoRedo')); 328 364 } 329 365 as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControl.mxml
r1110 r1121 86 86 87 87 <!-- 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"> 89 89 </mx:ComboBox> 90 90 <mx:ComboBox id="blendModeComboBox" x="6" y="316" width="97"> as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/controls/PenDetailControlScript.as
r1116 r1121 39 39 penModeComboBox.dataProvider = [ 40 40 {label: '手描き', data: GPPen.PEN_MODE_HAND }, 41 {label: 'スポイト', data: GPPen.PEN_MODE_DROPPER }, 41 /* {label: 'スポイト', data: GPPen.PEN_MODE_DROPPER }, */ 42 42 {label: '直線', data: GPPen.PEN_MODE_LINE }, 43 {label: '四角', data: GPPen.PEN_MODE_RECT },43 /* {label: '四角', data: GPPen.PEN_MODE_RECT }, 44 44 {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 } 46 47 ]; 48 penModeComboBox.addEventListener(ListEvent.CHANGE, penModeComboBoxHandler); 47 49 48 50 // ブレンドモード … … 126 128 } 127 129 130 private function penModeComboBoxHandler(evt:ListEvent):void { 131 cancelDropper(); 132 _pen.mode = uint(evt.currentTarget.value); 133 changePen(); 134 } 135 128 136 private function blendModeComboBoxHandler(evt:ListEvent):void { 129 137 cancelDropper(); as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPLogger.as
r1117 r1121 91 91 public static const ACTION_DRAW_ELLIPSE:uint = 11; 92 92 public static const ACTION_DRAW_ROUND_RECT:uint = 12; 93 public static const ACTION_FLOOD_FILL:uint = 13; 93 94 94 95 // LINESTYLE … … 193 194 writeDouble(info[1]); 194 195 break; 195 196 case 'floodFill': 197 writeByte(ACTION_FLOOD_FILL); 198 break; 196 199 default: 197 200 Alert.show('対応していないアクションがログされました!'); … … 343 346 case GPLogger.ACTION_DRAW_CIRCLE: 344 347 _playCanvas.drawCircle(a[1]); 348 break; 349 case GPLogger.ACTION_FLOOD_FILL: 350 _playCanvas.floodFill(); 345 351 break; 346 352 default: … … 426 432 obj = readDouble(); 427 433 return [ACTION_DRAW_CIRCLE, obj]; 434 case ACTION_FLOOD_FILL: 435 return [ACTION_FLOOD_FILL]; 428 436 default: 429 437 if (byte & 0x80) { as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/entities/GPPen.as
r1120 r1121 6 6 import flash.display.LineScaleMode; 7 7 import flash.events.MouseEvent; 8 import flash.geom.Point; 8 9 9 10 import gunyarapaint.controls.GPCanvas; 10 11 import gunyarapaint.controls.PenDetailControl; 11 12 import mx.core.Application;13 12 14 13 public class GPPen … … 20 19 public static const PEN_MODE_ELLIPSE:uint = 5; 21 20 public static const PEN_MODE_ROUND_RECT:uint = 6; 21 public static const PEN_MODE_FLOOD_FILL:uint = 7; 22 22 23 23 private var _mode:uint; … … 65 65 public function get pixelHinting():Boolean { 66 66 return _pixelHinting; 67 } 68 public function get argbColor():uint { 69 return uint(_alpha * 255) << 24 | _color; 67 70 } 68 71 … … 146 149 } 147 150 151 private var fromPoint:Point = new Point(); 152 private var isMouseDownAndOut:Boolean = false; 153 148 154 public function mouseDown(evt:MouseEvent):void { 149 155 // 一応… … … 153 159 switch (mode) { 154 160 case PEN_MODE_HAND: 161 // moveToして、ペンの状態を設定し、ペンの状態変化をログし、始点の座標を覚えさせる 162 // FIXME: lintToまでmoveToを遅延させよう! 155 163 _canvas.moveTo(evt.localX, evt.localY); 156 164 break; … … 159 167 case PEN_MODE_ELLIPSE: 160 168 case PEN_MODE_ROUND_RECT: 161 _canvas.moveTo(evt.localX, evt.localY); 169 fromPoint.x = evt.localX; 170 fromPoint.y = evt.localY; 162 171 break; 163 172 case PEN_MODE_DROPPER: 164 173 color = _canvas.getColor(evt); 165 174 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 } 171 181 172 182 public function mouseMove(evt:MouseEvent):void { … … 191 201 } 192 202 break; 203 case PEN_MODE_LINE: 204 _canvas.previewLineTo(fromPoint.x, fromPoint.y, evt.localX, evt.localY); 205 break; 193 206 } 194 lastX = evt.localX;195 lastY = evt.localY;196 207 } 197 208 } 198 209 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 } 208 228 } 209 229 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; 212 239 } 213 240 }

