| 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 |
} |
|---|