root/as3/gunyarapaint/trunk/gunyarapaint/src/org/libspark/gunyarapaint/entities/GPPen.as

リビジョン 1458, 11.9 kB (コミッタ: tasuku, コミット時期: 5 年 前)

post layer_infos and palettes with json

Line 
1 package org.libspark.gunyarapaint.entities
2 {
3   import flash.display.BlendMode;
4   import flash.display.CapsStyle;
5   import flash.display.Graphics;
6   import flash.display.JointStyle;
7   import flash.display.LineScaleMode;
8   import flash.display.Shape;
9   import flash.events.MouseEvent;
10   import flash.geom.Point;
11  
12   import mx.controls.Alert;
13  
14   import org.libspark.gunyarapaint.controls.GPCanvas;
15   import org.libspark.gunyarapaint.controls.GPCanvasWindowControl;
16   import org.libspark.gunyarapaint.controls.PenDetailControl;
17
18   public class GPPen
19   {
20     [Embed(source="../../../../../imgs/icon_dropper.png")] private var dropperIcon:Class;
21     [Embed(source="../../../../../imgs/icon_hand_open.png")] private var handOpenIcon:Class;
22     [Embed(source="../../../../../imgs/icon_hand_close.png")] private var handCloseIcon:Class;
23
24     public static const PEN_MODE_HAND:uint = 1;
25     public static const PEN_MODE_DROPPER:uint = 2;
26     public static const PEN_MODE_LINE:uint = 3;
27     public static const PEN_MODE_RECT:uint = 4;
28     public static const PEN_MODE_ELLIPSE:uint = 5;
29     public static const PEN_MODE_ROUND_RECT:uint = 6;
30     public static const PEN_MODE_FLOOD_FILL:uint = 7;
31     public static const PEN_MODE_HANDTOOL:uint = 8;
32     public static const PEN_MODE_ERASER:uint = 9;
33
34     private var _mode:uint;
35
36     private var _thickness:uint;
37     private var _color:uint;
38     private var _alpha:Number;
39     private var _blendMode:String;
40     private var _scaleMode:String;
41     private var _capsStyle:String;
42     private var _jointStyle:String;
43     private var _miterLimit:Number;
44     private var _pixelHinting:Boolean;
45
46     private var _canvas:GPCanvas;
47     private var _canvasWindow:GPCanvasWindowControl;
48     private var _control:PenDetailControl;
49
50     private var _drawShape:Shape; // 描画用Shape
51     private var _previewShape:Shape; // プレビュー用Shape(直線とか)
52     private var _layers:GPLayerArray;
53    
54     public function get mode():uint {
55       return _mode;
56     }
57     public function get thickness():uint {
58       return _thickness;
59     }
60     public function get color():uint {
61       return _color;
62     }
63     public function get alpha():Number {
64       return _alpha;
65     }
66     public function get blendMode():String {
67       return _blendMode;
68     }
69     public function get scaleMode():String {
70       return _scaleMode;
71     }
72     public function get capsStyle():String {
73       return _capsStyle;
74     }
75     public function get jointStyle():String {
76       return _jointStyle;
77     }
78     public function get miterLimit():Number {
79       return _miterLimit;
80     }
81     public function get pixelHinting():Boolean {
82       return _pixelHinting;
83     }
84     public function get argbColor():uint {
85       return uint(_alpha * 255) << 24 | _color;
86     }
87     public function get argbRGBColor():uint {
88       return 0xFF000000 | _color;
89     }
90     public function get drawShape():Shape {
91       return _drawShape;
92     }
93
94     public function GPPen(thickness:uint = 3,
95                           color:uint = 0x000000,
96                           alpha:Number = 1,
97                           blendMode:String = flash.display.BlendMode.NORMAL,
98                                 scaleMode:String = LineScaleMode.NORMAL,
99                                 capsStyle:String = CapsStyle.ROUND,
100                                 jointStyle:String = JointStyle.ROUND,
101                                 miterLimit:Number = 3,
102                                 pixelHinting:Boolean = true,
103                                 mode:uint = PEN_MODE_HAND) {
104         this.thickness = thickness;
105         this.color = color;
106         this.alpha = alpha;
107         this.blendMode = blendMode;
108         this.scaleMode = scaleMode;
109         this.capsStyle = capsStyle;
110         this.jointStyle = jointStyle;
111         this.miterLimit = miterLimit;
112         this.pixelHinting = pixelHinting;
113         this.mode = mode;
114         _drawShape = new Shape();
115         _previewShape = new Shape();
116     }
117    
118     public function clone():GPPen {
119       return new GPPen(thickness, color, alpha, blendMode, scaleMode, capsStyle, jointStyle, miterLimit, pixelHinting, mode);
120     }
121
122         public function setLineStyle(shape:Shape):void {
123       shape.graphics.lineStyle(_thickness,
124                                _color,
125                                _alpha,
126                                _pixelHinting,
127                                _scaleMode,
128                                _capsStyle,
129                                _jointStyle,
130                                _miterLimit);
131
132       shape.blendMode = _blendMode;
133         }
134            
135     public function set mode(v:uint):void {
136       _mode = v;
137       if (_canvas) {
138         switch (mode) {
139         case PEN_MODE_DROPPER:
140           _canvas.setCursor(dropperIcon);
141           break;
142         case PEN_MODE_HANDTOOL:
143           _canvas.setCursor(handOpenIcon);
144           break;
145         case PEN_MODE_ERASER:
146            // FIXME: give me eraser icon
147           _canvas.setCursor(null);
148           break;
149         default:
150           _canvas.setCursor(null);
151         }
152         if (mode == PEN_MODE_DROPPER) {
153         } else {
154         }       
155       }
156     }
157     public function set thickness(v:uint):void {
158       if (v > 32) {
159         // TODO: alert
160         return;
161       }
162       _thickness = v;
163     }
164    
165     public function set color(v:uint):void {
166       _color = v;
167       if (_control) {
168         _control.penColorChangeHandler();
169       }
170     }
171     public function set alpha(v:Number):void {
172       _alpha = v;
173     }
174     public function set blendMode(v:String):void {
175       _blendMode = v;
176     }
177     public function set scaleMode(v:String):void {
178       _scaleMode = v;
179     }
180     public function set capsStyle(v:String):void {
181       _capsStyle = v;
182     }
183     public function set jointStyle(v:String):void {
184       _jointStyle = v;
185     }
186     public function set miterLimit(v:Number):void {
187       _miterLimit = v;
188     }
189     public function set pixelHinting(v:Boolean):void {
190       _pixelHinting = v;
191     }
192    
193     public function set canvas(c:GPCanvas):void {
194       _canvas = c;
195     }
196     public function set canvasWindow(cw:GPCanvasWindowControl):void {
197       _canvasWindow = cw;
198     }
199     public function set control(c:PenDetailControl):void {
200       _control = c;
201     }
202     public function get drawGraphics():Graphics {
203       return _drawShape.graphics;
204     }
205     public function set layers(l:GPLayerArray):void {
206       _layers = l;
207     }
208    
209     private var fromPoint:Point = new Point();
210     private var scrollBase:Point;
211     private var isMouseDownAndOut:Boolean = false;
212    
213     public function mouseDown(evt:MouseEvent):void {
214       // 一応…
215       if (!_canvas.isInCanvas(evt)) {
216         return;
217       }
218           switch (mode) {
219             case PEN_MODE_HAND:
220             case PEN_MODE_ERASER:
221               // moveToして、ペンの状態を設定し、ペンの状態変化をログし、始点の座標を覚えさせる
222               // FIXME: lintToまでmoveToを遅延させよう!
223         if (!_canvas.isTargetLayerVisible) {
224           Alert.show('不可視の状態では描画できません!', '手書き/消しゴムツール');
225           return;
226         }
227         if (_canvas.isTargetLayerLocked) {
228           Alert.show('ロックされています!', '手書き/消しゴムツール');
229           return;
230         }
231               _canvas.moveTo(evt.localX, evt.localY);
232               break;
233             case PEN_MODE_LINE:
234             case PEN_MODE_RECT:
235             case PEN_MODE_ELLIPSE:
236             case PEN_MODE_ROUND_RECT:
237         if (!_canvas.isTargetLayerVisible) {
238           Alert.show('不可視の状態では描画できません!', '描画ツール');
239           return;
240         }
241         if (_canvas.isTargetLayerLocked) {
242           Alert.show('ロックされています!', '描画ツール');
243           return;
244         }
245               fromPoint.x = evt.localX;
246               fromPoint.y = evt.localY;     
247         break;
248             case PEN_MODE_HANDTOOL:
249               fromPoint.x = Math.floor(evt.localX); fromPoint.y = Math.floor(evt.localY);
250               scrollBase = _canvasWindow.canvasScrollPosition;
251         break;
252       case PEN_MODE_DROPPER:
253         color = _canvas.getColor(evt);
254         break;
255       case PEN_MODE_FLOOD_FILL:
256         if (!_canvas.isTargetLayerVisible) {
257           Alert.show('不可視の状態では描画できません!', 'バケツツール');
258           return;
259         }
260         if (_canvas.isTargetLayerLocked) {
261           Alert.show('ロックされています!', 'バケツツール');
262           return;
263         }
264               _canvas.moveTo(evt.localX, evt.localY);
265         _canvas.floodFill();
266         break;
267           }
268     }
269
270     public function mouseMove(evt:MouseEvent):void {
271       if (evt.buttonDown) {
272         switch (mode) {
273               case PEN_MODE_HAND:
274               case PEN_MODE_ERASER:
275           if (_canvas.isInCanvas(evt)) {
276             if (_canvas.isMoveTo) {
277               _canvas.lineTo(evt.localX, evt.localY);
278             } else {
279               // マウス押しっぱなしで領域内にはいってきた場合
280               ; // 今は何もしない
281             }
282           } else {
283             // TODO: 直線と枠との交点を座標とする。
284             return;
285           }
286           break;
287         case PEN_MODE_DROPPER:
288           if (_canvas.isInCanvas(evt)) {
289             color = _canvas.getColor(evt);
290           }
291           break;
292         case PEN_MODE_HANDTOOL:
293           if (scrollBase) {
294             _canvasWindow.scrollCanvas(scrollBase.x + (fromPoint.x - evt.localX),
295                                        scrollBase.y + (fromPoint.y - evt.localY));
296             //trace('base x:' + scrollBase.x + ' y:' + scrollBase.y + ' from x:' + fromPoint.x + ' y:' + fromPoint.y + ' local x:' + evt.localX + ' y:' + evt.localY + ' diff x:' + (fromPoint.x - evt.localX) + ' y:' + (fromPoint.y - evt.localY));           
297           }
298           break;
299         case PEN_MODE_LINE:
300           previewLineTo(fromPoint.x, fromPoint.y, evt.localX, evt.localY);
301           break;
302         }
303       }
304     }
305     public function mouseUp(evt:MouseEvent):void {
306       switch (mode) {
307       case PEN_MODE_HAND:
308       case PEN_MODE_ERASER:
309         if (!_canvas.isDrawnLine) {
310           var tmpAlpha:Number = alpha;
311           alpha = 0;
312           _canvas.setAndLogLineStyle();
313           _canvas.beginFill(color, tmpAlpha);
314           _canvas.drawCircle(thickness / 2);
315           _canvas.endFill();
316           alpha = tmpAlpha;
317         }
318         _canvas.drawShapeOnBitmap();
319         break;
320       case PEN_MODE_LINE:
321         if (!GPCanvas.comparePoint(fromPoint.x, fromPoint.y, evt.localX, evt.localY)) {
322           // 始点と終点が違う場合にのみ線を引く
323           clearPreviewShape();
324           _canvas.moveTo(fromPoint.x, fromPoint.y);
325           _canvas.lineTo(evt.localX, evt.localY);
326           _canvas.drawShapeOnBitmap();         
327         }
328         break;
329       case PEN_MODE_DROPPER:
330         if (_control) {
331           _control.cancelTool();
332         }
333         break;
334       case PEN_MODE_HANDTOOL:
335         scrollBase = null;
336         break;
337       }
338     }
339    
340     // stage全体でmouseUpがあった場合。
341     // mouseUpと二重で呼ばれる場合があるので注意
342     public function extMouseUp():void {
343     }
344    
345     public function mouseOut(evt:MouseEvent):void {
346       switch (mode) {
347       case PEN_MODE_HAND:
348         // 外に出ても1mouseUpとかはしない
349         break;
350       case PEN_MODE_LINE:
351         clearPreviewShape();
352         break;
353       }
354     }
355     // イベントハンドラおわり
356    
357     // previewShape系   
358         public function clearPreviewShape():void {
359           _previewShape.graphics.clear();
360         }
361        
362         public function previewLineTo(fromX:Number, fromY:Number, toX:Number, toY:Number):void {
363           _previewShape.graphics.clear();
364           setLineStyle(_previewShape);
365           _previewShape.graphics.moveTo(GPCanvas.zz(fromX), GPCanvas.zz(fromY));
366           _previewShape.graphics.lineTo(GPCanvas.zz(toX), GPCanvas.zz(toY));
367         }
368   }
369 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。