/* * Copyright(c) 2006-2008 the Spark project. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.libspark.utils { import flash.errors.IllegalOperationError; import flash.geom.ColorTransform; /** * 色情報を扱うユーティリティクラスです */ public class ColorUtil { /** * @private */ function ColorUtil() { throw new IllegalOperationError("Error #2012: ColorUtil class cannot be instantiated."); } /** * RGB 情報から ColorTransform インスタンスを作成します。 * * @param rgb RGBを示す整数値 (0x000000 - 0xFFFFFF) * @param amount 塗りの適応値 (0.0 - 1.0) * @param alpha 透明度 (0.0 - 1.0) * @return 新しい ColorTransform インスタンス * @author michi at seyself.com */ public static function colorTransform( rgb:uint=0, amount:Number=1.0, alpha:Number=1.0 ):ColorTransform { amount = ( amount > 1 ) ? 1 : ( amount < 0 ) ? 0 : amount; alpha = ( alpha > 1 ) ? 1 : ( alpha < 0 ) ? 0 : alpha; var r:Number = ( ( rgb >> 16 ) & 0xff ) * amount; var g:Number = ( ( rgb >> 8 ) & 0xff ) * amount; var b:Number = ( rgb & 0xff ) * amount; var a:Number = 1-amount; return new ColorTransform( a, a, a, alpha, r , g , b, 0 ); } /** * 減算.
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減算した数値を返します. * * @param col1 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @param col2 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 減算混色値 * @author michi at seyself.com */ public static function subtract( col1:uint , col2:uint ):uint { var colA:Array = toRGB( col1 ); var colB:Array = toRGB( col2 ); var r:uint = Math.max( Math.max( colB[0]-(256-colA[0]) , colA[0]-(256-colB[0]) ) , 0 ); var g:uint = Math.max( Math.max( colB[1]-(256-colA[1]) , colA[1]-(256-colB[1]) ) , 0 ); var b:uint = Math.max( Math.max( colB[2]-(256-colA[2]) , colA[2]-(256-colB[2]) ) , 0 ); return r << 16 | g << 8 | b; } /** * 加法混色.
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から加法混色した数値を返します. * * @param col1 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @param col2 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 加法混色値 * @author michi at seyself.com */ public static function sum( col1:uint , col2:uint ):uint { var c1:Array = toRGB( col1 ); var c2:Array = toRGB( col2 ); var r:uint = Math.min( c1[0]+c2[0] , 255 ); var g:uint = Math.min( c1[1]+c2[1] , 255 ); var b:uint = Math.min( c1[2]+c2[2] , 255 ); return r << 16 | g << 8 | b; } /** * 減法混色.
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減法混色した数値を返します. * * @param col1 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @param col2 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 減法混色値 * @author michi at seyself.com */ public static function sub( col1:uint , col2:uint ):uint { var c1:Array = toRGB( col1 ); var c2:Array = toRGB( col2 ); var r:uint = Math.max( c1[0]-c2[0] , 0 ); var g:uint = Math.max( c1[1]-c2[1] , 0 ); var b:uint = Math.max( c1[2]-c2[2] , 0 ); return r << 16 | g << 8 | b; } /** * 比較(暗).
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の低い方を合わせた数値を返します. * * @param col1 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @param col2 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 比較(暗)値 * @author michi at seyself.com */ public static function min( col1:uint , col2:uint ):uint { var c1:Array = toRGB( col1 ); var c2:Array = toRGB( col2 ); var r:uint = Math.min( c1[0] , c2[0] ); var g:uint = Math.min( c1[1] , c2[1] ); var b:uint = Math.min( c1[2] , c2[2] ); return r << 16 | g << 8 | b; } /** * 比較(明).
* 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の高い方を合わせた数値を返します. * * @param col1 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @param col2 RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 比較(明)値 * @author michi at seyself.com */ public static function max( col1:uint , col2:uint ):uint { var c1:Array = toRGB( col1 ); var c2:Array = toRGB( col2 ); var r:uint = Math.max( c1[0] , c2[0] ); var g:uint = Math.max( c1[1] , c2[1] ); var b:uint = Math.max( c1[2] , c2[2] ); return r << 16 | g << 8 | b; } /** * RGB それぞれの数値から RGB カラー値を求めます。 * * @param r 赤(R)を示す数値( 0 から 255 まで) * @param g 緑(G)を示す数値( 0 から 255 まで) * @param b 青(B)を示す数値( 0 から 255 まで) * @return 各色の値から求められたRGBを示す数値 * @author michi at seyself.com */ public static function rgb(r:uint, g:uint, b:uint):uint { return r << 16 | g << 8 | b; } /** * HSV それぞれの数値から RGB カラー値を求めます。 * * @param h 色相(Hue)を示す数値( 0 から 360 まで) * @param s 彩度(Saturation)を示す数値( 0.0 から 1.0 まで) * @param v 明度(Value)を示す数値( 0.0 から 1.0 まで) * @return 各色の値から求められたRGBを示す数値 * @author michi at seyself.com */ public static function hsv(h:int, s:Number, v:Number):uint { return rgb.apply( null, HSVtoRGB(h, s, v)); } /** * RGBを示す数値( 0x000000 から 0xFFFFFF まで)を * R, G, B それぞれ 0 から 255 までの数値に分割した配列を返します. * * @param rgb RGBを示す数値( 0x000000 から 0xFFFFFF まで) * @return 各色の値を示す配列 [ R , G , B ] * @author michi at seyself.com */ public static function toRGB( rgb:uint ):Array { var r:uint = rgb >> 16 & 0xFF; var g:uint = rgb >> 8 & 0xFF; var b:uint = rgb & 0xFF; return [r,g,b]; } /** * RGBそれぞれの数値から、HSV に換算した配列を返します. * RGB の値はそれぞれ以下の通りです. * R - 0 から 255 までの数値 * G - 0 から 255 までの数値 * B - 0 から 255 までの数値 * * HSV の値はそれぞれ以下の通りです. * H - 0 から 360 までの数値 * S - 0 から 1.0 までの数値 * V - 0 から 1.0 までの数値 * * アルファを含めた計算はできません. * * @param r 赤(R)を示す数値( 0x00 から 0xFF まで) * @param g 緑(G)を示す数値( 0x00 から 0xFF まで) * @param b 青(B)を示す数値( 0x00 から 0xFF まで) * @return HSVに変換した値の配列 [ H, S, V ] * @author michi at seyself.com */ public static function RGBtoHSV( r:Number, g:Number, b:Number ):Array { r/=255; g/=255; b/=255; var h:Number=0, s:Number=0, v:Number=0; var x:Number, y:Number; if(r>=g) x=r; else x=g; if(b>x) x=b; if(r<=g) y=r; else y=g; if(b1) s=1; if(v<0) v=0; if(v>1) v=1; h = h % 360; if (h < 0) h += 360; h /= 60; i = h >> 0; x = v * (1 - s); y = v * (1 - s * (h - i)); z = v * (1 - s * (1 - h + i)); switch(i){ case 0 : r=v; g=z; b=x; break; case 1 : r=y; g=v; b=x; break; case 2 : r=x; g=v; b=z; break; case 3 : r=x; g=y; b=v; break; case 4 : r=z; g=x; b=v; break; case 5 : r=v; g=x; b=y; break; } return [ r*255>>0, g*255>>0, b*255>>0 ]; } } }