1: <?php
2: 3: 4: 5: 6: 7: 8:
9:
10: namespace ManiaLib\Utils;
11:
12: abstract class Color
13: {
14: const CONTRAST_DARKER = -1;
15: const CONTRAST_AUTO = 0;
16: const CONTRAST_LIGHTER = 1;
17:
18: static function Contrast($colorRgb, $backgroundRgb, $contrast=self::CONTRAST_AUTO)
19: {
20: $backgroundHsv = self::Rgb24ToHsv($backgroundRgb);
21: $colorHsv = self::Rgb24ToHsv($colorRgb);
22: $threshold = ($colorHsv['hue'] == $backgroundHsv['hue']) ? .05 : .025;
23:
24: if(self::Difference($colorRgb, $backgroundRgb) > 20)
25: return $colorRgb;
26: if($contrast === self::CONTRAST_AUTO)
27: {
28: if($backgroundHsv['value'] < $threshold)
29: $contrast = self::CONTRAST_LIGHTER;
30: else if($backgroundHsv['saturation'] < $threshold)
31: $contrast = self::CONTRAST_DARKER;
32: else if($backgroundHsv['value'] < $colorHsv['value'])
33: $contrast = self::CONTRAST_LIGHTER;
34: else if($backgroundHsv['value'] > $colorHsv['value'])
35: $contrast = self::CONTRAST_DARKER;
36: else if($backgroundHsv['saturation'] > $colorHsv['saturation'])
37: $contrast = self::CONTRAST_LIGHTER;
38: else if($backgroundHsv['saturation'] < $colorHsv['saturation'])
39: $contrast = self::CONTRAST_DARKER;
40: else if($backgroundHsv['saturation'] < .5)
41: $contrast = self::CONTRAST_LIGHTER;
42: else
43: $contrast = self::CONTRAST_DARKER;
44: }
45:
46: $colorHsv['saturation'] -= $contrast * $threshold;
47: $colorHsv['value'] += $contrast * $threshold;
48: if($colorHsv['saturation'] < 0)
49: $colorHsv['saturation'] = 0;
50: else if($colorHsv['saturation'] > 1)
51: $colorHsv['saturation'] = 1;
52: if($colorHsv['value'] < 0)
53: $colorHsv['value'] = 0;
54: else if($colorHsv['value'] > 1)
55: $colorHsv['value'] = 1;
56:
57: return self::HsvToRgb24($colorHsv);
58: }
59:
60: static private function Difference($rgb2, $rgb1)
61: {
62: $r = (($rgb2 & 0xff0000) >> 16) - (($rgb1 & 0xff0000) >> 16);
63: $g = (($rgb2 & 0xff00) >> 8) - (($rgb1 & 0xff00) >> 8);
64: $b = ($rgb2 & 0xff) - ($rgb1 & 0xff);
65:
66: return sqrt($r*$r + $g*$g + $b*$b);
67: }
68:
69: static function StringToRgb24($hex)
70: {
71: $hex = trim($hex, '#$');
72: if(strlen($hex) == 3)
73: return self::Rgb12ToRgb24(hexdec($hex) & 0xfff);
74: else
75: return hexdec($hex) & 0xffffff;
76: }
77:
78: static function StringToRgb12($hex)
79: {
80: $hex = trim($hex, '#$');
81: return hexdec($hex) & 0xfff;
82: }
83:
84: static function Rgb12ToRgb24($rgb)
85: {
86: return ($rgb & 0xf00) * 0x1100 + ($rgb & 0xf0) * 0x110 + ($rgb & 0xf) * 0x11;
87: }
88:
89: static function Rgb24ToRgb12($rgb)
90: {
91: $r = (int) round((($rgb & 0xff0000) >> 16) / 17);
92: $g = (int) round((($rgb & 0xff00) >> 8) / 17);
93: $b = (int) round(($rgb & 0xff) / 17);
94: return ($r << 8) + ($g << 4) + $b;
95: }
96:
97: static function Rgb12ToString($rgb)
98: {
99: return str_pad(dechex($rgb), 3, '0', STR_PAD_LEFT);
100: }
101:
102: static function Rgb24ToString($rgb)
103: {
104: $hex = str_pad(dechex($rgb), 6, '0', STR_PAD_LEFT);
105: if(preg_match('/(?:([0-9a-z])\g{-1}){3}/i', $hex))
106: return $hex[0].$hex[2].$hex[4];
107: else
108: return $hex;
109: }
110:
111: static function Rgb24ToHsv($rgb)
112: {
113: $r = (($rgb & 0xff0000) >> 16) / 255;
114: $g = (($rgb & 0xff00) >> 8) / 255;
115: $b = ($rgb & 0xff) / 255;
116:
117: $max = max($r, $g, $b);
118: $min = min($r, $g, $b);
119: $chroma = $max - $min;
120:
121: if($chroma == 0)
122: $hue = 0;
123: else if($max == $r)
124: $hue = ($g - $b) / $chroma;
125: else if($max == $g)
126: $hue = (($b - $r) / $chroma) + 2;
127: else
128: $hue = (($r - $g) / $chroma) + 4;
129:
130: return array('hue' => fmod($hue, 6),
131: 'saturation' => $max == 0 ? 0 : $chroma / $max,
132: 'value' => $max);
133: }
134:
135: static function HsvToRgb24($hsv)
136: {
137: $hue = $hsv['hue'];
138: $saturation = $hsv['saturation'];
139: $value = $hsv['value'];
140:
141: $chroma = $saturation * $value;
142: $x = $chroma * (1 - abs(fmod($hue, 2) - 1));
143:
144: if($hue == 0)
145: $rgb = array(0, 0, 0);
146: else if($hue < 1)
147: $rgb = array($chroma, $x, 0);
148: else if($hue < 2)
149: $rgb = array($x, $chroma, 0);
150: else if($hue < 3)
151: $rgb = array(0, $chroma, $x);
152: else if($hue < 4)
153: $rgb = array(0, $x, $chroma);
154: else if($hue < 5)
155: $rgb = array($x, 0, $chroma);
156: else if($hue < 6)
157: $rgb = array($chroma, 0, $x);
158:
159: $m = $value - $chroma;
160: $r = intval(($rgb[0] + $m) * 255);
161: $g = intval(($rgb[1] + $m) * 255);
162: $b = intval(($rgb[2] + $m) * 255);
163:
164: return ($r << 16) + ($g << 8) + $b;
165: }
166: }
167:
168: ?>
169: