root/lang/legacy-actionscript/as2draw/Drawable.as

Revision 3477, 4.4 kB (checked in by gyuque, 13 months ago)

lang/legacy-actionscript/as2draw: indexed pixel buffer

Line 
1class Drawable
2{
3        public static var UNDO_LIMIT = 3;
4       
5        private var mBGColor:Number;
6        private var mMC:MovieClip;
7        private var mMStack:MovieClipStack;
8        private var mCurrentDrawingMC:MovieClip;
9        private var mSize:Object;
10        private var mPixBuf:PixelBuffer;
11
12        private var mDragData;
13        private var mCurrentPen:Pen;
14
15        public function Drawable(aContainer:MovieClip, aBGColor:Number, aW:Number, aH:Number)
16        {
17                mCurrentPen = new Pen();
18                mDragData = {dragging: false, prevX: 0, prevY: 0, count: 0, startX: 0, startY: 0, startLayer: null};
19                mMC = aContainer.createEmptyMovieClip("drawable_mc", 1);
20                mMC._quality = "LOW";
21               
22                mMStack = new MovieClipStack(mMC);
23                mCurrentDrawingMC = null;
24               
25                mPixBuf = new PixelBuffer(aW, aH, mMC);
26                mBGColor = aBGColor;
27
28                mSize = {w: aW, h:aH};
29                clear();
30
31                var _this = this;
32                mMC.onPress     = function(){ _this.onPress();     };
33                mMC.onMouseUp   = function(){ _this.onMouseUp();   };
34                mMC.onMouseMove = function(){ _this.onMouseMove(); };
35                mMC.useHandCursor = false;
36        }
37
38        public function getCurrentPen():Pen
39        {
40                return mCurrentPen;
41        }
42
43        public function setY(y:Number):Void
44        {
45                mMC._y = y;
46        }
47       
48        public function removeTopLayer():Void
49        {
50                //mPixBuf.dumpBuffer();
51                mMStack.pop();
52        }
53
54        public function onPress()
55        {
56                mDragData.dragging = true;
57                mDragData.count = 0;
58                mDragData.prevX = Math.floor(mMC._xmouse);
59                mDragData.prevY = Math.floor(mMC._ymouse);
60               
61                mDragData.startX = mDragData.prevX;
62                mDragData.startY = mDragData.prevY;
63               
64                renderLine(mDragData.prevX, mDragData.prevY, mDragData.prevX, mDragData.prevY);
65                mDragData.startLayer = mCurrentDrawingMC;
66       
67        }
68
69        public function onMouseUp()
70        {
71                mDragData.dragging = false;
72                /*if (mDragData.count > 0)
73                        smooth(mMC._xmouse, mMC._ymouse);*/
74                commit();
75        }
76       
77        private static var PEN_OFFSET_1:Array = [0,-1, 1,0, 0,1, -1,0];
78/*     
79        private static var PEN_OFFSET_2:Array = [
80                        -1, -2,  0, -2,  1, -2,
81                -2, -1, -1, -1,  0, -1,  1, -1, 2, -1,
82                -2,  0, -1,  0,  0,  0,  1,  0, 2,  0,
83                -2,  1, -1,  1,  0,  1,  1,  1, 2,  1,
84                        -1,  2,  0,  2,  1,  2
85        ];*/
86        private function renderLine(x1:Number, y1:Number, x2:Number, y2:Number)
87        {
88                var color:Number = mCurrentPen.color;
89                var g:MovieClip;
90               
91                if (!mCurrentDrawingMC)
92                        mCurrentDrawingMC = mMStack.pushNew();
93               
94                g = mCurrentDrawingMC;
95       
96                var ofs:Array = PEN_OFFSET_1;
97                var l:Number = ofs.length>>1;
98                var dx:Number = 0;
99                var dy:Number = 0;
100               
101                for (var i:Number = -1;i < l;i++)
102                {
103                        if (i >= 0)
104                        {
105                                dx = ofs[i<<1];
106                                dy = ofs[(i<<1)+1];
107                        }
108/*                     
109                        mPixBuf.setOut(g);
110*/
111                        g.stackData.log.push(new LineData(x1+dx, y1+dy, x2+dx, y2+dy, color, mCurrentPen.color_index));
112                        drawNativeLine(g, x1+dx, y1+dy, x2+dx, y2+dy, color);
113                }
114        }
115
116        public function drawPixBufferLine(x1:Number, y1:Number, x2:Number, y2:Number, color:Number)
117        {
118                mPixBuf.drawLine(
119                        x1, y1,
120                        x2, y2, color, 0);
121        }
122       
123        public function drawNativeLine(g:MovieClip, x1:Number, y1:Number, x2:Number, y2:Number, color:Number)
124        {
125                var DX:Number = Math.abs(x2 - x1);
126                var DY:Number = Math.abs(y2 - y1);
127               
128                g.lineStyle(0, color);
129                g.moveTo(x1, y1);
130                g.lineTo(x2, y2);
131               
132                if (!(DX > DY && x1 < x2 && y1 < y2))
133                        g.lineTo(x2+1, y2);
134        }
135
136        public function onMouseMove()
137        {
138                if (mDragData.dragging)
139                {
140                        /*if (++mDragData.count == 5)
141                        {
142                                smooth(mMC._xmouse, mMC._ymouse);
143                                mDragData.count = 0;
144                        }
145                        else*/
146                        {
147                                var x:Number = Math.floor(mMC._xmouse);
148                                var y:Number = Math.floor(mMC._ymouse);
149                                renderLine(mDragData.prevX, mDragData.prevY, x, y);
150                       
151                                mDragData.prevX = x;
152                                mDragData.prevY = y;
153                        }
154                }
155        }
156       
157        public function smooth(x:Number, y:Number)
158        {
159                x = Math.floor(x);
160                y = Math.floor(y);
161               
162                if (mDragData.startLayer == mCurrentDrawingMC)
163                        mCurrentDrawingMC.clear();
164                else
165                        mMStack.pop();
166               
167                mCurrentDrawingMC = mDragData.startLayer;
168                renderLine(mDragData.startX, mDragData.startY, x, y);
169                mCurrentDrawingMC = null;
170               
171                mDragData.startX = x;
172                mDragData.startY = y;
173                mDragData.prevX = x;
174                mDragData.prevY = y;
175
176        }
177
178        public function clear()
179        {
180                mMC.beginFill(mBGColor);
181                U.rect(mMC, 0, 0, mSize.w, mSize.h);
182                mMC.endFill();
183        }
184       
185        private function commit()
186        {
187                if (mMStack.size() > UNDO_LIMIT)
188                {
189                        mMStack.fixBottom(mMC, this);
190                }
191               
192                mCurrentDrawingMC = null;
193        }
194}
Note: See TracBrowser for help on using the browser.