root/as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPCanvas.as

リビジョン 3470, 7.9 kB (コミッタ: hkrn, コミット時期: 3 年 前)

added compat project

Line 
1 package org.libspark.gunyarapaint.controls
2 {
3     import flash.display.Bitmap;
4     import flash.display.BitmapData;
5     import flash.display.Shape;
6     import flash.display.Sprite;
7     import flash.events.MouseEvent;
8     import flash.geom.Rectangle;
9    
10     import mx.core.UIComponent;
11     import mx.managers.CursorManager;
12    
13     import org.libspark.gunyarapaint.entities.GPLogger;
14    
15     public class GPCanvas extends UIComponent
16     {
17         private var baseBitmap:Bitmap; // ベース画像(しましま) (0)
18         // _logger.layerArray.view レイヤ統合画像 (1)
19         private var additionalBox:Shape; // 縦横補助線 (2)
20         private var additionalSkew:Shape; // 斜め補助線 (3)
21         private var additionalNumber:uint = 4; // 補助線の分割数
22        
23         private var _logger:GPLogger; // 描画コマンド履歴
24        
25         public function GPCanvas(logger:GPLogger)
26         {
27             _logger = logger;
28             var width:uint = logger.canvasWidth;
29             var height:uint = logger.canvasHeight;
30            
31             // 透明時に表示されるbitmap
32             baseBitmap = new Bitmap();
33             baseBitmap.bitmapData = new BitmapData(width, height, false);
34             for (var i:uint = 0; i < width; i++) {
35                 for (var j:uint = 0; j < height; j++) {
36                     baseBitmap.bitmapData.setPixel(i, j, ((i ^ j) & 1) ? 0x999999 : 0xffffff);
37                 }
38             }
39             addChildAt(baseBitmap, 0);
40            
41             // レイヤ画像群
42             addChildAt(_logger.layerArray.view, 1);
43            
44             // 補助線用shape
45             additionalBox = new Shape();
46             additionalSkew = new Shape();
47             changeAdditional();
48             additionalBox.visible = false;
49             additionalSkew.visible = false;
50             addChildAt(additionalBox, 2);
51             addChildAt(additionalSkew, 3);
52            
53             this.mouseEnabled = true;
54             this.mouseChildren = false;
55            
56             this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
57             this.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
58             this.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
59             this.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);
60            
61             super();
62         }
63        
64         // 20090906-haku2 upd start px単位指定対応、オブジェクト数削減
65         private function changeAdditional():void {
66             var maxWidth:Number = _logger.canvasWidth;
67             var maxHeight:Number = _logger.canvasHeight;
68             var addWidth:Number = maxWidth / additionalNumber;
69             var addHeight:Number = maxHeight / additionalNumber;
70             additionalBox.graphics.clear();
71             additionalSkew.graphics.clear();
72             additionalBox.graphics.lineStyle(0, _logger.additionalColor, _logger.additionalAlpha);
73             additionalSkew.graphics.lineStyle(0, _logger.additionalColor, _logger.additionalAlpha);
74             additionalBox.graphics.drawRect(0, 0, maxWidth, maxHeight);
75             // 補助線種類判定
76             if(_logger.additionalType == 0) {
77                 // 分割
78                 for (var i:uint = 0; i < additionalNumber; i++) {
79                     if(i > 0){
80                         additionalBox.graphics.moveTo(i * addWidth, 0);
81                         additionalBox.graphics.lineTo(i * addWidth, maxHeight);
82                         additionalBox.graphics.moveTo(0, i * addHeight);
83                         additionalBox.graphics.lineTo(maxWidth, i * addHeight);
84                         additionalSkew.graphics.moveTo(i * addWidth, 0);
85                         additionalSkew.graphics.lineTo(0, i * addHeight);
86                         additionalSkew.graphics.moveTo(maxWidth - (i * addWidth), 0);
87                         additionalSkew.graphics.lineTo(maxWidth, i * addHeight);
88                     }
89                     additionalSkew.graphics.moveTo(maxWidth - ((i + 1) * addWidth), maxHeight);
90                     additionalSkew.graphics.lineTo(maxWidth, maxHeight - ((i + 1) * addHeight));
91                     additionalSkew.graphics.moveTo((i + 1) * addWidth, maxHeight);
92                     additionalSkew.graphics.lineTo(0, maxHeight - ((i + 1) * addHeight));
93                 }
94             } else {
95                 // px単位
96                 for (var i2:uint = additionalNumber; i2 < maxWidth; i2 += additionalNumber) {
97                     additionalBox.graphics.moveTo(i2, 0);
98                     additionalBox.graphics.lineTo(i2, maxHeight);
99                 }
100                 for (var j2:uint = additionalNumber; j2 < maxHeight; j2 += additionalNumber) {
101                     additionalBox.graphics.moveTo(0, j2);
102                     additionalBox.graphics.lineTo(maxWidth, j2);
103                 }
104                 var max:uint = (maxWidth > maxHeight) ? maxWidth : maxHeight;
105                 max += additionalNumber - (max % additionalNumber);
106                 for (var k2:uint = additionalNumber; k2 <= max; k2 += additionalNumber) {
107                     additionalSkew.graphics.moveTo(k2 - additionalNumber, 0);
108                     additionalSkew.graphics.lineTo(0, k2 - additionalNumber);
109                     additionalSkew.graphics.moveTo(max - (k2 - additionalNumber), 0);
110                     additionalSkew.graphics.lineTo(max, k2 - additionalNumber);
111                     additionalSkew.graphics.moveTo(max, max - k2);
112                     additionalSkew.graphics.lineTo(max - k2, max);
113                     additionalSkew.graphics.moveTo(0, max - k2);
114                     additionalSkew.graphics.lineTo(k2, max);
115                 }
116                 var clip:Rectangle = new Rectangle(0, 0, maxWidth, maxHeight);
117                 additionalSkew.scrollRect = clip;
118             }
119         }
120         // 20090906-haku2 upd end
121        
122         // 描画関係のフラグ
123         public var isMoveTo:Boolean = false;
124         public var isDrawnLine:Boolean = false;
125        
126         private function isInCanvas(evt:MouseEvent):Boolean {
127             return (evt.localX >= 0 && evt.localY >= 0 &&
128                 evt.localX < _logger.canvasWidth && evt.localY < _logger.canvasHeight);
129         }
130        
131         private var isCursorChanged:Boolean = false; // マウスカーソルが変更されているかどうか。多重変更防止   
132         public function setCursor(icon:Class):void {
133             if (icon && !isCursorChanged) {
134                 CursorManager.setCursor(icon);
135                 isCursorChanged = true;
136             } else {
137                 CursorManager.removeCursor(CursorManager.currentCursorID);
138                 isCursorChanged = false;
139             }
140         }
141        
142         public function setAdditionalNumber(num:uint):void {
143             additionalNumber = num;
144             changeAdditional();
145         }
146         public function setAdditionalBox(visible:Boolean):void {
147             additionalBox.visible = visible;
148         }
149         public function setAdditionalSkew(visible:Boolean):void {
150             additionalSkew.visible = visible;
151         }
152         // 20090906-haku2 ins start
153         public function refreshAdditional():void {
154             changeAdditional();
155         }
156         // 20090906-haku2 ins end
157        
158         /** new functions **/
159         public function mouseDown(evt:MouseEvent):void {
160             if (isInCanvas(evt)) {
161                 _logger.mouseDown(evt);
162             }
163         }
164         public function mouseMove(evt:MouseEvent):void {
165             if (isInCanvas(evt)) {
166                 _logger.mouseMove(evt);
167             }
168         }
169         public function mouseUp(evt:MouseEvent):void {
170             if (isInCanvas(evt)) {
171                 _logger.mouseUp(evt);
172             }
173         }
174         public function mouseOut(evt:MouseEvent):void {
175             _logger.mouseOut(evt);
176         }
177     }
178 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。