図形描画クラス(aquaボタン描画)

ほぼまんまパクりだけどのっけとく

/**
*
* 図形描画クラス
*
* @author aizu
* @version 0.1.0
*/
class jp.ojos.tools.Shapes {

/**
*
* 楕円作成
*
* @param x 楕円の中心のx座標
* @param y 楕円の中心のy座標
* @param w 幅の半径
* @param h 高さの半径
* @param c 塗りの色(number or array [0x######,0x######])
* @param alpha アルファ値
* @param rot 変換マトリックス(詳細 : ActionScript クラス > MovieClip > beginGradientFill 参照 )
* @param gradient グラデーションタイプ("linear" or "radial")
* @param ratios Transform値(省略可:デフォルト[0,255])
*
* Example
*
* import jp.ojos.tools.Shapes;
* Shapes.drawOval(this, 200, 200, 200, 200, [0xff0000e, 0x00ff00], 100, 20, "linear");
*/

static function drawOval(target : Object,
x : Number,
y : Number,
w : Number,
h : Number,
c : Object,
alpha : Object,
rot : Object,
gradient : String,
ratios : Object) : Void {
// if color is an object then allow for complex fills
if(typeof c == "object")
{
if (typeof alpha != "object")
var alphas : Object = [alpha,alpha];
else
var alphas : Object = alpha;

if (ratios == undefined)
var ratios : Array = [ 0, 0xff ];

var sh : Number = h *.7;
if (typeof rot != "object")
var matrix : Object = {matrixType:"box", x:-sh, y:sh, w:w*2, h:h*4, r:rot * 0.0174532925199433 };
else
var matrix : Object = rot;

if (gradient == "radial")
target.beginGradientFill( "radial", c, alphas, ratios, matrix );
else
target.beginGradientFill( "linear", c, alphas, ratios, matrix );

}
else if (c != undefined)
{
target.beginFill (c, alpha);
}



var j : Number = w*0.70711;
var n : Number = h*0.70711;
var i : Number = j-(h-n)*w/h;
var m : Number = n-(w-j)*h/w;

target.moveTo(x+w, y);
target.curveTo(x+w, y-m, x+j, y-n);
target.curveTo(x+i, y-h, x, y-h);
target.curveTo(x-i, y-h, x-j, y-n);
target.curveTo(x-w, y-m, x-w, y);
target.curveTo(x-w, y+m, x-j, y+n);
target.curveTo(x-i, y+h, x, y+h);
target.curveTo(x+i, y+h, x+j, y+n);
target.curveTo(x+w, y+m, x+w, y);

if (c != undefined)
target.endFill();
}

/**
*
* 長方形(角丸も可)作成
*
* @param x x座標
* @param y y座標
* @param w 幅
* @param h 高さ
* @param r 角の丸み(number or object {br:#,bl:#,tl:#,tr:#})
* @param c 塗りの色(number or array [0x######,0x######])
* @param alpha アルファ値
* @param rot 変換マトリックス(詳細 : ActionScript クラス > MovieClip > beginGradientFill 参照 )
* @param gradient グラデーションタイプ("linear" or "radial")
* @param ratios Transform値(省略可:デフォルト[0,255])
*
* Example
*
* import jp.ojos.tools.Shapes;
* Shapes.drawRoundRect(this, 0, 0, 400, 400, {tl:10,tr:10,br:0,bl:0},[0xff0000e,0x00ff00],100,20,"linear");
*/

static function drawRoundRect(target : Object,
x : Number,
y : Number,
w : Number,
h : Number,
r : Object,
c : Object,
alpha : Object,
rot : Object,
gradient : String,
ratios : Object) : Void {
if (typeof r == "object") {
var rbr : Object = r.br; //bottom right corner
var rbl : Object = r.bl; //bottom left corner
var rtl : Object = r.tl; //top left corner
var rtr : Object = r.tr; //top right corner
}
else
{
var rbr : Object = rbl = rtl = rtr = r;
}
// if color is an object then allow for complex fills
if(typeof c == "object")
{
if (typeof alpha != "object")
var alphas : Object = [alpha,alpha];
else
var alphas : Object = alpha;

if (ratios == undefined)
var ratios : Array = [ 0, 0xff ];

var sh : Number = h *.7;
if (typeof rot != "object")
var matrix : Object = {matrixType:"box", x:-sh, y:sh, w:w*2, h:h*4, r:rot * 0.0174532925199433 };
else
var matrix : Object = rot;

if (gradient == "radial")
target.beginGradientFill( "radial", c, alphas, ratios, matrix );
else
target.beginGradientFill( "linear", c, alphas, ratios, matrix );

}
else if (c != undefined)
{
target.beginFill (c, alpha);
}

// Math.sin and Math,tan values for optimal performance.
// Math.rad = Math.PI/180 = 0.0174532925199433
// r*Math.sin(45*Math.rad) = (r*0.707106781186547);
// r*Math.tan(22.5*Math.rad) = (r*0.414213562373095);

//bottom right corner
r = rbr;
var a : Number = r - (r*0.707106781186547); //radius - anchor pt;
var s : Number = r - (r*0.414213562373095); //radius - control pt;
target.moveTo ( x+w,y+h-r);
target.lineTo ( x+w,y+h-r );
target.curveTo( x+w,y+h-s,x+w-a,y+h-a);
target.curveTo( x+w-s,y+h,x+w-r,y+h);

//bottom left corner
r = rbl;
var a : Number = r - (r*0.707106781186547);
var s : Number = r - (r*0.414213562373095);
target.lineTo ( x+r,y+h );
target.curveTo( x+s,y+h,x+a,y+h-a);
target.curveTo( x,y+h-s,x,y+h-r);

//top left corner
r = rtl;
var a : Number = r - (r*0.707106781186547);
var s : Number = r - (r*0.414213562373095);
target.lineTo ( x,y+r );
target.curveTo( x,y+s,x+a,y+a);
target.curveTo( x+s,y,x+r,y);

//top right
r = rtr;
var a : Number = r - (r*0.707106781186547);
var s : Number = r - (r*0.414213562373095);
target.lineTo ( x+w-r,y );
target.curveTo( x+w-s,y,x+w-a,y+a);
target.curveTo( x+w,y+s,x+w,y+r);
target.lineTo ( x+w,y+h-r );

if (c != undefined)
target.endFill();
}
}

でこれで一時期はやったアクアボタンをスクリプトだけで描く。
これもほとんどパクりだけど気にしない。

import jp.ojos.tools.Shapes;

var rbg = 0xcccccc;
var __width = 100;
var __height = 22;
var __x = 0;
var __y = 0;

Shapes.drawRoundRect(this, __x, __y, __width, __height, __height / 2,0x000000,15);
Shapes.drawRoundRect(this, __x + 1, __y + 1, __width - 2, __height - 2, (__height - 1) /2,rbg,100);
Shapes.drawRoundRect(this, __x + 1, __y + 1, __width - 2, __height - 2, (__height - 1) /2,[0xffffff,0xffffff],[0,100],
{matrixType:"box", x:__x + 1, y:__y + 1, w:__width - 2, h:__height - 2, r:(90/180)*Math.PI},"linear",
[130,255]);
Shapes.drawRoundRect(this, __x + (__height - 2) / 4,
__y + 1,
__width - (__height - 2) / 2,
(__height - 2) / 2,
(__height - 2) / 4,
[0xffffff,0xffffff],
[100,0],
{matrixType:"box", x:__x + (__height - 2) / 4,
y:__y + 1,
w:__width - (__height - 2) / 2,
h:(__height - 2) / 2,
r:(90/180)*Math.PI},"linear");