root/as3/Utils/src/org/libspark/utils/ColorUtil.as

リビジョン 804, 10.3 kB (コミッタ: michi, コミット時期: 4 年 前)

asdoc追加

Line 
1 /*
2  * Copyright(c) 2006-2008 the Spark project.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13  * either express or implied. See the License for the specific language
14  * governing permissions and limitations under the License.
15  */
16
17
18 package org.libspark.utils
19 {
20         import flash.errors.IllegalOperationError;
21     import flash.geom.ColorTransform;
22        
23         /**
24          * 色情報を扱うユーティリティクラスです
25          */
26         public class ColorUtil
27         {
28                
29         /**
30          * @private
31          */
32                 function ColorUtil()
33                 {
34                         throw new IllegalOperationError("Error #2012: ColorUtil class cannot be instantiated.");
35                 }
36                
37         /**
38          * RGB 情報から ColorTransform インスタンスを作成します。
39          *
40          * @param       rgb RGBを示す整数値 (0x000000 - 0xFFFFFF)
41          * @param       amount 塗りの適応値 (0.0 - 1.0)
42          * @param       alpha 透明度 (0.0 - 1.0)
43          * @return 新しい ColorTransform インスタンス
44                  * @author  michi at seyself.com
45          */
46         public static function colorTransform( rgb:uint=0, amount:Number=1.0, alpha:Number=1.0 ):ColorTransform
47         {
48             amount = ( amount > 1 ) ? 1 : ( amount < 0 ) ? 0 : amount;
49             alpha  = ( alpha  > 1 ) ? 1 : ( alpha  < 0 ) ? 0 : alpha;
50             var r:Number = ( ( rgb >> 16 ) & 0xff ) * amount;
51             var g:Number = ( ( rgb >> 8  ) & 0xff ) * amount;
52             var b:Number = (   rgb         & 0xff ) * amount;
53             var a:Number = 1-amount;
54             return new ColorTransform( a, a, a, alpha, r , g , b, 0 );
55         }
56        
57                 /**
58                 * 減算. <br />
59                 * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減算した数値を返します.
60                 *
61                 * @param col1   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
62                 * @param col2   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
63                 * @return       減算混色値
64                 * @author  michi at seyself.com
65                 */
66                 public static function subtract( col1:uint , col2:uint ):uint
67                 {
68                         var colA:Array = toRGB( col1 );
69                         var colB:Array = toRGB( col2 );
70                         var r:uint = Math.max( Math.max( colB[0]-(256-colA[0]) , colA[0]-(256-colB[0]) ) , 0 );
71                         var g:uint = Math.max( Math.max( colB[1]-(256-colA[1]) , colA[1]-(256-colB[1]) ) , 0 );
72                         var b:uint = Math.max( Math.max( colB[2]-(256-colA[2]) , colA[2]-(256-colB[2]) ) , 0 );
73                         return r << 16 | g << 8 | b;
74                 }
75                
76                 /**
77                 * 加法混色. <br />
78                 * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から加法混色した数値を返します.
79                 *
80                 * @param col1   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
81                 * @param col2   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
82                 * @return       加法混色値
83                 * @author  michi at seyself.com
84                 */
85                 public static function sum( col1:uint , col2:uint ):uint
86                 {
87                         var c1:Array = toRGB( col1 );
88                         var c2:Array = toRGB( col2 );
89                         var r:uint = Math.min( c1[0]+c2[0] , 255 );
90                         var g:uint = Math.min( c1[1]+c2[1] , 255 );
91                         var b:uint = Math.min( c1[2]+c2[2] , 255 );
92                         return r << 16 | g << 8 | b;
93                 }
94                
95                 /**
96                 * 減法混色. <br />
97                 * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から減法混色した数値を返します.
98                 *
99                 * @param col1   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
100                 * @param col2   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
101                 * @return       減法混色値
102                 * @author  michi at seyself.com
103                 */
104                 public static function sub( col1:uint , col2:uint ):uint
105                 {
106                         var c1:Array = toRGB( col1 );
107                         var c2:Array = toRGB( col2 );
108                         var r:uint = Math.max( c1[0]-c2[0] , 0 );
109                         var g:uint = Math.max( c1[1]-c2[1] , 0 );
110                         var b:uint = Math.max( c1[2]-c2[2] , 0 );
111                         return r << 16 | g << 8 | b;
112                 }
113                
114                 /**
115                 * 比較(暗). <br />
116                 * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の低い方を合わせた数値を返します.
117                 *
118                 * @param col1   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
119                 * @param col2   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
120                 * @return       比較(暗)値
121                 * @author  michi at seyself.com
122                 */
123                 public static function min( col1:uint , col2:uint ):uint
124                 {
125                         var c1:Array = toRGB( col1 );
126                         var c2:Array = toRGB( col2 );
127                         var r:uint = Math.min( c1[0] , c2[0] );
128                         var g:uint = Math.min( c1[1] , c2[1] );
129                         var b:uint = Math.min( c1[2] , c2[2] );
130                         return r << 16 | g << 8 | b;
131                 }
132                
133                 /**
134                 * 比較(明). <br />
135                 * 2つのRGBを示す数値( 0x000000 から 0xFFFFFF まで)から比較して、RGBそれぞれ数値の高い方を合わせた数値を返します.
136                 *
137                 * @param col1   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
138                 * @param col2   RGBを示す数値( 0x000000 から 0xFFFFFF まで)
139                 * @return       比較(明)値
140                 * @author  michi at seyself.com
141                 */
142                 public static function max( col1:uint , col2:uint ):uint
143                 {
144                         var c1:Array = toRGB( col1 );
145                         var c2:Array = toRGB( col2 );
146                         var r:uint = Math.max( c1[0] , c2[0] );
147                         var g:uint = Math.max( c1[1] , c2[1] );
148                         var b:uint = Math.max( c1[2] , c2[2] );
149                         return r << 16 | g << 8 | b;
150                 }
151                
152                 /**
153                  * RGB それぞれの数値から RGB カラー値を求めます。
154                  *
155                  * @param r     赤(R)を示す数値( 0 から 255 まで)
156                  * @param g     緑(G)を示す数値( 0 から 255 まで)
157                  * @param b     青(B)を示す数値( 0 から 255 まで)
158                  * @return 各色の値から求められたRGBを示す数値
159                  * @author  michi at seyself.com
160                  */
161                 public static function rgb(r:uint, g:uint, b:uint):uint
162                 {
163                         return r << 16 | g << 8 | b;
164                 }
165                
166                 /**
167                  * HSV それぞれの数値から RGB カラー値を求めます。
168                  *
169                  * @param       h 色相(Hue)を示す数値( 0 から 360 まで)
170                  * @param   s 彩度(Saturation)を示す数値( 0.0 から 1.0 まで)
171                  * @param   v 明度(Value)を示す数値( 0.0 から 1.0 まで)
172                  * @return 各色の値から求められたRGBを示す数値
173                  * @author  michi at seyself.com
174                  */
175                 public static function hsv(h:int, s:Number, v:Number):uint
176                 {
177                         return rgb.apply( null, HSVtoRGB(h, s, v));
178                 }
179                
180                 /**
181                 * RGBを示す数値( 0x000000 から 0xFFFFFF まで)を
182                 * R, G, B それぞれ 0 から 255 までの数値に分割した配列を返します.
183                 *
184                 * @param rgb    RGBを示す数値( 0x000000 から 0xFFFFFF まで)
185                 * @return       各色の値を示す配列 [ R , G , B ]
186                 * @author  michi at seyself.com
187                 */
188                 public static function toRGB( rgb:uint ):Array
189                 {
190                         var r:uint = rgb >> 16 & 0xFF;
191                         var g:uint = rgb >> 8  & 0xFF;
192                         var b:uint = rgb       & 0xFF;
193                         return [r,g,b];
194                 }
195                
196                 /**
197                 * RGBそれぞれの数値から、HSV に換算した配列を返します.
198                 * RGB の値はそれぞれ以下の通りです.
199                 *     R - 0 から 255 までの数値
200                 *     G - 0 から 255 までの数値
201                 *     B - 0 から 255 までの数値
202                 *
203                 * HSV の値はそれぞれ以下の通りです.
204                 *     H - 0 から 360 までの数値
205                 *     S - 0 から 1.0 までの数値
206                 *     V - 0 から 1.0 までの数値
207                 *
208                 * アルファを含めた計算はできません.
209                 *
210                 * @param r      赤(R)を示す数値( 0x00 から 0xFF まで)
211                 * @param g      緑(G)を示す数値( 0x00 から 0xFF まで)
212                 * @param b      青(B)を示す数値( 0x00 から 0xFF まで)
213                 * @return       HSVに変換した値の配列 [ H, S, V ]
214                 * @author  michi at seyself.com
215                 */
216                 public static function RGBtoHSV( r:Number, g:Number, b:Number ):Array
217                 {
218             r/=255; g/=255; b/=255;
219             var h:Number=0, s:Number=0, v:Number=0;
220             var x:Number, y:Number;
221             if(r>=g) x=r; else x=g; if(b>x) x=b;
222             if(r<=g) y=r; else y=g; if(b<y) y=b;
223             v=x;
224             var c:Number=x-y;
225             if(x==0) s=0; else s=c/x;
226             if(s!=0){
227                 if(r==x){
228                     h=(g-b)/c;
229                 } else {
230                     if(g==x){
231                         h=2+(b-r)/c;
232                     } else {
233                         if(b==x){
234                             h=4+(r-g)/c;
235                         }
236                     }
237                 }
238                 h=h*60;
239                 if(h<0) h=h+360;
240             }
241             return [ h, s, v ];
242                 }
243                
244                 /**
245                 * HSVそれぞれの数値からRGBを割り出して配列として返します.
246                 * RGB の値はそれぞれ以下の通りです.
247                 *     R - 0 から 255 までの数値
248                 *     G - 0 から 255 までの数値
249                 *     B - 0 から 255 までの数値
250                 *
251                 * HSV の値はそれぞれ以下の通りです.
252                 *     H - 0 から 360 までの数値
253                 *     S - 0 から 1.0 までの数値
254                 *     V - 0 から 1.0 までの数値
255                 *
256                 * Hが上記範囲外の場合 0 から 360 の範囲内に相当する数値に置き換えられます.
257                 * アルファを含めた計算はできません.
258                 *
259                 * @param h      色相(Hue)を示す数値( 0 から 360 まで)
260                 * @param s      彩度(Saturation)を示す数値( 0.0 から 1.0 まで)
261                 * @param v      明度(Value)を示す数値( 0.0 から 1.0 まで)
262                 * @return       RGBに変換した値の配列 [ R, G, B ]
263                 * @author  michi at seyself.com
264                 */
265                 public static function HSVtoRGB( h:Number, s:Number, v:Number ):Array
266                 {
267                         var r:Number=0, g:Number=0, b:Number=0;
268                         var i:Number, x:Number, y:Number, z:Number;
269                         if(s<0) s=0; if(s>1) s=1; if(v<0) v=0; if(v>1) v=1;
270                         h = h % 360; if (h < 0) h += 360; h /= 60;
271                         i = h >> 0;
272                         x = v * (1 - s); y = v * (1 - s * (h - i)); z = v * (1 - s * (1 - h + i));
273                         switch(i){
274                                 case 0 : r=v; g=z; b=x; break;
275                                 case 1 : r=y; g=v; b=x; break;
276                                 case 2 : r=x; g=v; b=z; break;
277                                 case 3 : r=x; g=y; b=v; break;
278                                 case 4 : r=z; g=x; b=v; break;
279                                 case 5 : r=v; g=x; b=y; break;
280                         }
281                         return [ r*255>>0, g*255>>0, b*255>>0 ];
282                 }
283                
284         }
285 }
286
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。