00001 <?php
00002 namespace Habari;
00011 class ColorUtils
00012 {
00016 public static function rgb_rgbarr( $r, $g, $b )
00017 {
00018 return array_map( 'round', array( 'r' => $r, 'g' => $g, 'b' => $b ) );
00019 }
00020
00024 public static function hsv_hsvarr( $h, $s, $v )
00025 {
00026 return array_map( 'round', array( 'h' => $h, 's' => $s, 'v' => $v ) );
00027 }
00028
00032 public static function hex_rgb( $hex_string )
00033 {
00034 $hex_string = ltrim( $hex_string, '#' );
00035 if ( ! preg_match( '/^[0-9a-f]+$/i', $hex_string ) ) {
00036 return Error::raise( _t( 'Not a valid hex color.' ) );
00037 }
00038
00039 $normalized = '';
00040
00041 switch ( strlen( $hex_string ) ) {
00042 case 3:
00043
00044 for ( $i = 0; $i < 3; $i++ ) {
00045 $normalized .= $hex_string{$i} . $hex_string{$i};
00046 }
00047 break;
00048 case 6:
00049
00050 $normalized = $hex_string;
00051 break;
00052 case 2:
00053 case 4:
00054
00055 $normalized = $hex_string . str_repeat( '0', 6 - strlen( $hex_string ) );
00056 break;
00057 default:
00058 return Error::raise( _t( 'Not a valid color format.' ) );
00059 }
00060
00061 return self::rgb_rgbarr(
00062 hexdec( substr( $normalized, 0, 2 ) ),
00063 hexdec( substr( $normalized, 2, 2 ) ),
00064 hexdec( substr( $normalized, 4, 2 ) )
00065 );
00066 }
00067
00071 public static function rgb_hex( $rgb_arr )
00072 {
00073 $hex_string = sprintf( '%02x%02x%02x', $rgb_arr['r'], $rgb_arr['g'], $rgb_arr['b'] );
00074
00075 return $hex_string;
00076 }
00077
00081 public static function rgb_hsv( $rgb_arr )
00082 {
00083 $var_R = ($rgb_arr['r'] / 255);
00084 $var_G = ($rgb_arr['g'] / 255);
00085 $var_B = ($rgb_arr['b'] / 255);
00086
00087 $var_Min = min($var_R, $var_G, $var_B);
00088 $var_Max = max($var_R, $var_G, $var_B);
00089 $del_Max = $var_Max - $var_Min;
00090
00091 $V = $var_Max;
00092
00093 if( $del_Max == 0 ) {
00094 $H = 0;
00095 $S = 0;
00096 } else {
00097 $S = $del_Max / $var_Max;
00098
00099 $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
00100 $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
00101 $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
00102
00103 if( $var_R == $var_Max ) {
00104 $H = $del_B - $del_G;
00105 }
00106 elseif( $var_G == $var_Max ) {
00107 $H = (1 / 3) + $del_R - $del_B;
00108 }
00109 elseif( $var_B == $var_Max ) {
00110 $H = (2 / 3) + $del_G - $del_R;
00111 }
00112 else {
00113 $H = 0;
00114 }
00115
00116 if( $H < 0 ) {
00117 $H += 1;
00118 }
00119 if( $H > 1 ) {
00120 $H -= 1;
00121 }
00122 }
00123 return self::hsv_hsvarr($H * 360, $S * 255, $V * 255);
00124 }
00125
00129 public static function hsv_rgb( $hsv_arr )
00130 {
00131 if ( $hsv_arr['s'] == 0 ) {
00132
00133 $r = $g = $b = $hsv_arr['v'];
00134 }
00135 else {
00136 $h = $hsv_arr['h'] / 60;
00137 $s = $hsv_arr['s'] / 100;
00138 $f = $h - floor( $h );
00139
00140 $p = $hsv_arr['v'] * ( 1 - $s );
00141 $q = $hsv_arr['v'] * ( 1 - $s * $f );
00142 $t = $hsv_arr['v'] * ( 1 - $s * ( 1 - $f ) );
00143
00144 switch ( floor( $h ) ) {
00145 case 0:
00146 $r = $hsv_arr['v'];
00147 $g = $t;
00148 $b = $p;
00149 break;
00150 case 1:
00151 $r = $q;
00152 $g = $hsv_arr['v'];
00153 $b = $p;
00154 break;
00155 case 2:
00156 $r = $p;
00157 $g = $hsv_arr['v'];
00158 $b = $t;
00159 break;
00160 case 3:
00161 $r = $p;
00162 $g = $q;
00163 $b = $hsv_arr['v'];
00164 break;
00165 case 4:
00166 $r = $t;
00167 $g = $p;
00168 $b = $hsv_arr['v'];
00169 break;
00170 case 5:
00171 $r = $hsv_arr['v'];
00172 $g = $p;
00173 $b = $q;
00174 break;
00175 }
00176 }
00177
00178 return self::rgb_rgbarr( $r, $g, $b );
00179 }
00180 }
00181
00182 ?>