チェンジセット 3481
- コミット日時:
- 2010/03/04 02:04:49 (3 年前)
- ファイル:
-
- as3/gunyarapaint/branches/gunyarapaint/compat/src/gunyarapaint.as (更新) (4 diffs)
- as3/gunyarapaint/branches/gunyarapaint/compat/src/gunyarapaint.mxml (更新) (2 diffs)
- as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPCanvas.as (更新) (2 diffs)
- as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPCanvasWindowControl.as (更新) (12 diffs)
- as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPLayerWindowControlScript.as (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/gunyarapaint/branches/gunyarapaint/compat/src/gunyarapaint.as
r3473 r3481 152 152 m_recorder.prepare(width, height, undoBufferSize); 153 153 m_module = DrawModuleFactory.create(DrawModuleFactory.FREE_HAND, m_recorder); 154 //_logger = GPLogger.createForDraw(width, height, undoBufferSize, null, null);154 gpCanvasWindow.delegate = penDetailWindow.delegate = this; 155 155 relocateComponents(); 156 156 } … … 297 297 private function additionalNumberStepperHandler(evt:NumericStepperEvent):void 298 298 { 299 //_logger.eventSetAdditionalNumber(evt.value);299 gpCanvasWindow.auxBitmap.length = evt.value; 300 300 } 301 301 302 302 private function additionalBoxCheckBoxHandler(evt:Event):void 303 303 { 304 //_logger.eventSetAdditionalBox(evt.target.selected);304 gpCanvasWindow.auxBitmap.boxVisible = evt.target.selected; 305 305 } 306 306 307 307 private function additionalSkewCheckBoxHandler(evt:Event):void 308 308 { 309 //_logger.eventSetAdditionalSkew(evt.target.selected);309 gpCanvasWindow.auxBitmap.skewVisible = evt.target.selected; 310 310 } 311 311 … … 336 336 undoButton.label = 'アンドゥ (' + undoCount + ')'; 337 337 undoButton.enabled = true; 338 } else { 338 } 339 else { 339 340 undoButton.label = 'アンドゥ'; 340 341 undoButton.enabled = false; … … 343 344 redoButton.label = 'リドゥ (' + redoCount + ')'; 344 345 redoButton.enabled = true; 345 } else { 346 } 347 else { 346 348 redoButton.label = 'リドゥ'; 347 349 redoButton.enabled = false; as3/gunyarapaint/branches/gunyarapaint/compat/src/gunyarapaint.mxml
r3473 r3481 6 6 creationComplete="init()" 7 7 applicationComplete="appComplete()" 8 resize="relocateComponents()"9 8 borderStyle="solid" cornerRadius="0" borderColor="#333333" 10 9 backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#cccccc, #cccccc]" … … 61 60 <mx:ComboBox y="4" id="additionalTypeComboBox" right="66" width="70" fontSize="8" height="18" selectedIndex="0"></mx:ComboBox> 62 61 </mx:Canvas> 63 <gpcontrol:PenDetailWindowControl id="penDetailWindow" x="9" y="163" layout="absolute" title="ペン" height="450" delegate="{this}"/>64 <gpcontrol:GPCanvasWindowControl id="gpCanvasWindow" x="145" y="163" width="379" height="410" layout="absolute" title="キャンバス" delegate="{this}"/>62 <gpcontrol:PenDetailWindowControl id="penDetailWindow" x="9" y="163" layout="absolute" title="ペン" height="450" /> 63 <gpcontrol:GPCanvasWindowControl id="gpCanvasWindow" x="145" y="163" width="379" height="410" layout="absolute" title="キャンバス" /> 65 64 <gpcontrol:GPLayerWindowControl x="532" y="163" layout="absolute" title="レイヤー" id="gpLayerWindow" height="312" /> 66 65 <mx:Label id="versionLabel" text="ver.2009090902" right="10" bottom="10" alpha="0.5"/> as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPCanvas.as
r3470 r3481 1 1 package org.libspark.gunyarapaint.controls 2 2 { 3 import flash.display.Bitmap;4 import flash.display.BitmapData;5 import flash.display.Shape;6 3 import flash.display.Sprite; 7 4 import flash.events.MouseEvent; … … 9 6 10 7 import mx.core.UIComponent; 11 import mx.managers.CursorManager;12 8 13 import org.libspark.gunyarapaint.entities.GPLogger; 9 import org.libspark.gunyarapaint.controls.IDelegate; 10 import org.libspark.gunyarapaint.framework.AuxBitmap; 11 import org.libspark.gunyarapaint.framework.TransparentBitmap; 14 12 15 publicclass GPCanvas extends UIComponent13 internal class GPCanvas extends UIComponent 16 14 { 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; // 補助線の分割数 15 private var m_aux:AuxBitmap; 16 private var m_delegate:IDelegate; 22 17 23 private var _logger:GPLogger; // 描画コマンド履歴 24 25 public function GPCanvas(logger:GPLogger) 18 public function GPCanvas(delegate:IDelegate) 26 19 { 27 _logger = logger; 28 var width:uint = logger.canvasWidth; 29 var height:uint = logger.canvasHeight; 20 var rect:Rectangle = new Rectangle(0, 0, delegate.recorder.width, delegate.recorder.height); 21 var transparent:TransparentBitmap = new TransparentBitmap(rect); 22 m_aux = new AuxBitmap(rect); 23 m_delegate = delegate; 30 24 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); 25 addChild(transparent); 26 addChild(delegate.recorder.painter.view); 27 addChild(m_aux); 40 28 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); 29 addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 30 addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 31 addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler); 60 32 61 33 super(); 62 34 } 63 35 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); 36 public function get auxBitmap():AuxBitmap 37 { 38 return m_aux; 129 39 } 130 40 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 } 41 private function mouseDownHandler(evt:MouseEvent):void 42 { 43 m_delegate.module.start(evt.localX, evt.localY); 44 m_delegate.recorder.painter.view.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); 140 45 } 141 46 142 p ublic function setAdditionalNumber(num:uint):void {143 additionalNumber = num;144 changeAdditional();47 private function mouseMoveHandler(evt:MouseEvent):void 48 { 49 m_delegate.module.move(evt.localX, evt.localY); 145 50 } 146 public function setAdditionalBox(visible:Boolean):void { 147 additionalBox.visible = visible; 51 52 private function mouseUpHandler(evt:MouseEvent):void 53 { 54 m_delegate.recorder.painter.view.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); 55 m_delegate.module.stop(evt.localX, evt.localY); 148 56 } 149 public function setAdditionalSkew(visible:Boolean):void {150 additionalSkew.visible = visible;151 }152 // 20090906-haku2 ins start153 public function refreshAdditional():void {154 changeAdditional();155 }156 // 20090906-haku2 ins end157 57 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); 58 private function mouseOutHandler(evt:MouseEvent):void 59 { 60 m_delegate.module.interrupt(evt.localX, evt.localY); 176 61 } 177 62 } as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPCanvasWindowControl.as
r3473 r3481 1 1 package org.libspark.gunyarapaint.controls 2 2 { 3 import flash.display.Sprite; 3 4 import flash.events.MouseEvent; 4 5 import flash.geom.Matrix; … … 11 12 import mx.controls.scrollClasses.ScrollBar; 12 13 import mx.core.Container; 14 import mx.core.UIComponent; 13 15 import mx.events.MoveEvent; 14 16 import mx.events.ResizeEvent; 15 17 import mx.events.ScrollEvent; 16 18 19 import org.libspark.gunyarapaint.controls.GPCanvas; 20 import org.libspark.gunyarapaint.framework.AuxBitmap; 17 21 import org.libspark.gunyarapaint.framework.Pen; 18 import org.libspark.gunyarapaint. controls.IDelegate;22 import org.libspark.gunyarapaint.framework.TransparentBitmap; 19 23 import org.libspark.gunyarapaint.utils.ComponentResizer; 20 24 … … 31 35 private var scrollDragStartPoint:Point; 32 36 37 private var m_canvas:GPCanvas; 33 38 private var m_delegate:IDelegate; 34 39 … … 38 43 39 44 backgroundColor = 0x000000; 40 41 // setStyle('backgroundAlpha', 0); 42 horizontalScrollPolicy = 'off'; 43 verticalScrollPolicy = 'off'; 44 45 horizontalScrollPolicy = "off"; 46 verticalScrollPolicy = "off"; 45 47 addEventListener(ResizeEvent.RESIZE, resizeHandler); 46 addEventListener(MoveEvent.MOVE, moveHandler);47 48 48 ComponentResizer.addResize(this, new Point(100, 100)); 49 49 _preDegree = 0; 50 50 } 51 52 51 53 52 public function zoomCanvas(m:Number):void … … 92 91 } 93 92 93 public function get auxBitmap():AuxBitmap 94 { 95 return m_canvas.auxBitmap; 96 } 97 94 98 public function set statusText(value:String):void 95 99 { … … 98 102 99 103 public function set delegate(value:IDelegate):void 100 { 104 { 101 105 _contentContainer = new Container(); 102 _contentContainer.setStyle( 'borderStyle', 'none');103 _contentContainer.horizontalScrollPolicy = 'off';104 _contentContainer.verticalScrollPolicy = 'off';106 _contentContainer.setStyle("borderStyle", "none"); 107 _contentContainer.horizontalScrollPolicy = "off"; 108 _contentContainer.verticalScrollPolicy = "off"; 105 109 _contentContainer.percentWidth = 100; 106 110 _contentContainer.percentHeight = 100; 107 111 addChild(_contentContainer); 108 109 112 validateNow(); // percentWidth/Height -> width/heightに更新 110 113 … … 119 122 120 123 _canvasContainer = new Container(); 124 _canvasContainer.mouseEnabled = false; 121 125 _canvasContainer.width = _contentContainer.width - vScrollBar.width; 122 126 _canvasContainer.height = _contentContainer.height - hScrollBar.height; 123 _canvasContainer.setStyle('borderStyle', 'none'); 124 _canvasContainer.horizontalScrollPolicy = 'off'; 125 _canvasContainer.verticalScrollPolicy = 'off'; 126 127 _canvasContainer.addChild(value.recorder.painter.view); 127 _canvasContainer.setStyle("borderStyle", "none"); 128 _canvasContainer.horizontalScrollPolicy = "off"; 129 _canvasContainer.verticalScrollPolicy = "off"; 130 131 canvasX = canvasY = 0; 132 _canvasScale = 1; 133 134 m_canvas = new GPCanvas(value); 135 _canvasContainer.addChild(m_canvas); 136 128 137 _contentContainer.addChild(_canvasContainer); 129 138 _contentContainer.addChild(hScrollBar); 130 139 _contentContainer.addChild(vScrollBar); 131 132 _canvasContainer.mouseEnabled = false;133 140 _contentContainer.addEventListener(MouseEvent.CLICK, contentContainerClickHandler); 134 141 135 /*136 mouseChildren = false;137 addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);138 addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);139 addEventListener(MouseEvent.MOUSE_UP, mouseUp);140 addEventListener(MouseEvent.MOUSE_OUT, mouseOut);141 */142 142 m_delegate = value; 143 144 canvasX = canvasY = 0;145 _canvasScale = 1;146 143 resizeContainer(); 147 144 moveCanvas(); … … 150 147 private function moveCanvas():void 151 148 { 152 var maxX:Number = 0 * _canvasScale - _canvasContainer.width; 153 var maxY:Number = 0 * _canvasScale - _canvasContainer.height; 154 canvasX = Math.floor(canvasX); 155 canvasY = Math.floor(canvasY); 156 if (maxX <= 0) 157 maxX = 0; 158 if (maxY <= 0) 159 maxY = 0; 160 if (canvasX < 0) 161 canvasX = 0; 162 if (canvasY < 0) 163 canvasY = 0; 164 if (canvasX > maxX) 165 canvasX = maxX; 166 if (canvasY > maxY) 167 canvasY = maxY; 168 hScrollBar.scrollPosition = canvasX; 169 vScrollBar.scrollPosition = canvasY; 170 hScrollBar.lineScrollSize = _canvasScale; 171 vScrollBar.lineScrollSize = _canvasScale; 172 hScrollBar.setScrollProperties(_canvasContainer.width, 0, maxX, 0); 173 vScrollBar.setScrollProperties(_canvasContainer.height, 0, maxY, 0); 174 //_logger.eventCanvasMove(-canvasX, -canvasY); 149 if (m_delegate != null) { 150 var maxX:Number = m_delegate.recorder.width * _canvasScale - _canvasContainer.width; 151 var maxY:Number = m_delegate.recorder.height * _canvasScale - _canvasContainer.height; 152 canvasX = Math.floor(canvasX); 153 canvasY = Math.floor(canvasY); 154 if (maxX <= 0) 155 maxX = 0; 156 if (maxY <= 0) 157 maxY = 0; 158 if (canvasX < 0) 159 canvasX = 0; 160 if (canvasY < 0) 161 canvasY = 0; 162 if (canvasX > maxX) 163 canvasX = maxX; 164 if (canvasY > maxY) 165 canvasY = maxY; 166 hScrollBar.scrollPosition = canvasX; 167 vScrollBar.scrollPosition = canvasY; 168 hScrollBar.lineScrollSize = _canvasScale; 169 vScrollBar.lineScrollSize = _canvasScale; 170 hScrollBar.setScrollProperties(_canvasContainer.width, 0, maxX, 0); 171 vScrollBar.setScrollProperties(_canvasContainer.height, 0, maxY, 0); 172 m_canvas.move(-canvasX, -canvasY); 173 } 175 174 } 176 175 … … 189 188 private function set backgroundColor(c:uint):void 190 189 { 191 setStyle( 'backgroundColor', c);190 setStyle("backgroundColor", c); 192 191 } 193 192 … … 196 195 if (e.eventPhase == flash.events.EventPhase.AT_TARGET) { 197 196 var pen:Pen = m_delegate.recorder.painter.pen; 198 backgroundColor = pen.color; 199 //_logger.additionalColor = backgroundColor; 200 //_logger.additionalAlpha = m_delegate.module.alpha; 201 //_logger.eventRefreshAdditional(); 197 backgroundColor = auxBitmap.lineColor = pen.color; 198 auxBitmap.lineAlpha = pen.alpha; 199 auxBitmap.validate(); 202 200 } 203 201 } … … 205 203 private function resizeContainer():void 206 204 { 207 // 仮にサイズを狭める 208 _canvasContainer.width = _canvasContainer.height = 209 hScrollBar.width = vScrollBar.height = 0; 210 211 validateNow(); // _contentContainerのサイズを更新 212 213 // それを使って再設定 214 var clientWidth:Number = _contentContainer.width - vScrollBar.width; 215 var clientHeight:Number = _contentContainer.height - hScrollBar.height; 216 217 hScrollBar.width = clientWidth; 218 vScrollBar.height = clientHeight; 219 220 var canvasWidth:uint = m_delegate.recorder.width; 221 var canvasHeight:uint = m_delegate.recorder.height; 222 // TODO: minでいいやん 223 if (canvasWidth * _canvasScale < clientWidth) 224 _canvasContainer.width = canvasWidth * _canvasScale; 225 else 226 _canvasContainer.width = clientWidth; 227 228 if (canvasHeight * _canvasScale < clientHeight) 229 _canvasContainer.height = canvasHeight * _canvasScale; 230 else 231 _canvasContainer.height = clientHeight; 232 233 hScrollBar.move(0, clientHeight); 234 vScrollBar.move(clientWidth, 0); 235 236 _canvasContainer.move((clientWidth - _canvasContainer.width) / 2, 237 (clientHeight - _canvasContainer.height) / 2); 205 if (m_delegate != null) { 206 // 仮にサイズを狭める 207 _canvasContainer.width = _canvasContainer.height = 208 hScrollBar.width = vScrollBar.height = 0; 209 210 validateNow(); // _contentContainerのサイズを更新 211 212 // それを使って再設定 213 var clientWidth:Number = _contentContainer.width - vScrollBar.width; 214 var clientHeight:Number = _contentContainer.height - hScrollBar.height; 215 216 hScrollBar.width = clientWidth; 217 vScrollBar.height = clientHeight; 218 219 var canvasWidth:uint = m_delegate.recorder.width; 220 var canvasHeight:uint = m_delegate.recorder.height; 221 // TODO: minでいいやん 222 if (canvasWidth * _canvasScale < clientWidth) 223 _canvasContainer.width = canvasWidth * _canvasScale; 224 else 225 _canvasContainer.width = clientWidth; 226 227 if (canvasHeight * _canvasScale < clientHeight) 228 _canvasContainer.height = canvasHeight * _canvasScale; 229 else 230 _canvasContainer.height = clientHeight; 231 232 hScrollBar.move(0, clientHeight); 233 vScrollBar.move(clientWidth, 0); 234 235 _canvasContainer.move((clientWidth - _canvasContainer.width) / 2, 236 (clientHeight - _canvasContainer.height) / 2); 237 } 238 238 } 239 239 … … 242 242 resizeContainer(); 243 243 moveCanvas(); 244 }245 246 private function moveHandler(evt:MoveEvent):void247 {248 // 整数化して、shape->bitmapのズレをなくす249 x = int(x);250 y = int(y);251 244 } 252 245 } as3/gunyarapaint/branches/gunyarapaint/compat/src/org/libspark/gunyarapaint/controls/GPLayerWindowControlScript.as
r3473 r3481 37 37 blendModeComboBox.dataProvider = value.supportedBlendModes; 38 38 enabled = true; 39 change Layer();39 change(); 40 40 var painter:Painter = value.recorder.painter; 41 41 var layers:LayerBitmapCollection = painter.layers;

