• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

system/classes/colorutils.php

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         // 'fed' = 'ffeedd'
00044         for ( $i = 0; $i < 3; $i++ ) {
00045           $normalized .= $hex_string{$i} . $hex_string{$i};
00046         }
00047         break;
00048       case 6:
00049         // already normal
00050         $normalized = $hex_string;
00051         break;
00052       case 2:
00053       case 4:
00054         // who uses this anyway!
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;  // This never happens, since one of the three is always the max
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       // grey
00133       $r = $g = $b = $hsv_arr['v'];
00134     }
00135     else {
00136       $h = $hsv_arr['h'] / 60; // degrees to sectors
00137       $s = $hsv_arr['s'] / 100; // percent to fraction
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: // first sector
00146           $r = $hsv_arr['v'];
00147           $g = $t;
00148           $b = $p;
00149           break;
00150         case 1: // second sector
00151           $r = $q;
00152           $g = $hsv_arr['v'];
00153           $b = $p;
00154           break;
00155         case 2: // third sector
00156           $r = $p;
00157           $g = $hsv_arr['v'];
00158           $b = $t;
00159           break;
00160         case 3: // fourth sector
00161           $r = $p;
00162           $g = $q;
00163           $b = $hsv_arr['v'];
00164           break;
00165         case 4: // fifth sector
00166           $r = $t;
00167           $g = $p;
00168           $b = $hsv_arr['v'];
00169           break;
00170         case 5: // sixth sector
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 ?>

Generated on Sun Aug 4 2013 12:51:43 for Habari by  doxygen 1.7.1