/** * ID文字列からカラースタイルを算出して返す * * @param string $id xxxxxxxxxx * @param string $count ID出現数 * @return array(style1, style2 [, debug]) */ function coloredIdStyle($id, $count) { global $_conf, $STYLE; // Version.20081215 // ID本体とは別に、ID:の部分に別の背景色を適用 // 色変換処理をcolorchange.phpにまとめた。 // その他、こまごまとした修正 // Version.20081216 // HSV,HLSに加え、L*C*h表色系にも対応(ライブラリも修正) // Version.20081224 設定で変換前と変換後のカラーコードを表示できるようにした(デバッグ用?) // Version.20081228 色パラメータ設定を色空間別に個別化 require_once P2_LIB_DIR . '/colorchange.php'; // IDから色の元を抽出 $coldiv = 360; // 色相環の分割数 $arr1 = unpack('N', pack('H', 0) . base64_decode(str_replace('.', '+', substr($id, 0, 4)))); $arr2 = unpack('N', pack('H', 0) . base64_decode(str_replace('.', '+', substr($id, 4, 4)))); $color = $arr1[1] % $coldiv; $color2 = $arr2[1] % $coldiv; // HSV(またはHLS)パラメータ設定 // レス数が増えるほど、色が濃く、暗くなる // 色相H:値域0〜360(角度) $h = $color * 360 / $coldiv; $h2 = $color2 * 360 / $coldiv; $colorMode = 2; // 0:HSV,1:HSL,2:L*C*h switch ($colorMode) { case 0: // HSV色空間 // 彩度S(HSV):値域0(淡い)〜1(濃い) $S = $count * 0.05; if ($S > 1) { $S = 1; } // 明度V(HSV):値域0(暗い)〜1(明るい) $V = 1 - $count * 0.025; if ($L < 0.1) { $L = 0.1; } $color_param = array(array($h, $S, $V, $colorMode), array($h2, 1, 0.6, $colorMode)); break; case 1: // HLS色空間 // 輝度L(HLS):値域0(黒)〜0.5(純色)〜1(白) $L = 0.95 - $count * 0.025; if ($L < 0.1) { $L = 0.1; } // 彩度S(HLS):値域0(灰色)〜1(純色) $S = $count * 0.05; if ($S > 1) { $S = 1; } $color_param = array(array($h, $L, $S, $colorMode), array($h2, 0.6, 0.5, $colorMode)); break; case 2: // L*C*h色空間 // 明度L*(L*C*h):値域0(黒)〜50(純色)〜100(白) $L = 100 - $count * 2.5; if ($L < 10) { $L = 10; } // 彩度C*(L*C*h):値域0(灰色)〜100(純色) $C = floor(40 * sin(deg2rad($count * 180 / 50)) + 8); if ($C < 0) { $C = 0; } $C += 30 - $L > 0 ? 30 - $L : 0; $color_param = array(array($L, $C, $h, $colorMode), array(50, 60, $h2, $colorMode)); break; } // 色空間に関する参考資料 // HSV,HLS色空間 http://tt.sakura.ne.jp/~hiropon/lecture/color.html // L*C*h表色系 http://konicaminolta.jp/instruments/colorknowledge/part1/08.html // L*a*b*表色系 http://konicaminolta.jp/instruments/colorknowledge/part1/07.html // RGBに変換 $rgb = array(); for ($key = 0; $key < count($color_param); $key++) { $colorMode = $color_param[$key][3]; if ($colorMode == 2) { array_push($rgb, LCh2RGB($color_param[$key])); } else { array_push($rgb, $colorMode ? HLS2RGB($color_param[$key]) : HSV2RGB($color_param[$key])); // unset($color_param[$key]); } } // CSSで色をつける $idstr2 = preg_split('/:/', $idstr, 2); // コロンでID文字列を分割 $idstr2[0] .= ':'; $uline = $STYLE['a_underline_none'] == 1 ? '' : "text-decoration:underline;"; $bcolor = array(); $LCh = array(); for ($i = 0; $i < count($rgb); $i++) { if ($rgb['type'] == 'L*C*h') { $LCh[$i] = $color_param[$i]; } else { $LCh[$i] = RGB2LCh($rgb[$i]); /* if ($LCh[$i][0]<70 && $LCh[$i][0]>40) { $LCh[$i][0]-=30; $rgb[$i]=LCh2RGB($LCh[$i]); }*/ } $colorcode = $rgb[$i]['color']; $bcolor[$i] = "background-color:{$colorcode};"; // $border="border-width:thin;border-style:solid;"; if ($LCh[$i][0] > 60) { $bcolor[$i] .= "color:#000;"; } else { $bcolor[$i] .= "color:#fff;"; } } if ($_conf['coloredid.rate.hissi.times'] > 0 && $count >= $_conf['coloredid.rate.hissi.times']) { // 必死チェッカー発動 $uline .= "text-decoration:blink;"; } // $colorprint=1; // 1にすると、色の変換結果が表示される if ($colorprint) { $debug = ''; for ($i = 0; $i < 1; $i++) { switch ($rgb[$i]['type']) { case 'L*C*h': $debug .= "(L*={$rgb[$i][9]},C*={$rgb[$i][10]},h={$rgb[$i][11]})"; $X = $rgb[$i][3]; $Y = $rgb[$i][4]; $Z = $rgb[$i][5]; if ($X > 0.9504 || $X < 0) { $X = "<span style=\"color:#F00\">{$X}</span>"; } if ($Y > 1 || $Y < 0) { $Y = "<span style=\"color:#F00\">{$Y}</span>"; } if ($Z > 1.0889 || $Z < 0) { $Z = "<span style=\"color:#F00\">{$Z}</span>"; } $debug .= ",(X={$X},Y={$Y},Z={$Z})"; break; case 'HSV': $debug .= "(H={$rgb[$i][3]},S={$rgb[$i][4]},V={$rgb[$i][5]})"; break; case 'HLS': $debug .= "(H={$rgb[$i][3]},L={$rgb[$i][4]},S={$rgb[$i][5]})"; break; } $R = $rgb[$i][0]; $G = $rgb[$i][1]; $B = $rgb[$i][2]; if ($R > 255 || $R < 0) { $R = "<span style=\"color:#F00\">{$R}</span>"; } if ($G > 255 || $G < 0) { $G = "<span style=\"color:#F00\">{$G}</span>"; } if ($B > 255 || $B < 0) { $B = "<span style=\"color:#F00\">{$B}</span>"; } $debug .= ",(R={$R},G={$G},B={$B}),{$rgb[$i]['color']}"; } // $idstr2[1].= join(",",$rgb[0]); return array(isset($rgb[1]) ? "{$bcolor[1]}{$border}{$uline}" : '', "{$bcolor[0]}{$border}{$uline}", $debug); } else { return array(isset($rgb[1]) ? "{$bcolor[1]}{$border}{$uline}" : '', "{$bcolor[0]}{$border}{$uline}"); } }
/** * Merged from http://jiyuwiki.com/index.php?cmd=read&page=rep2%A4%C7%A3%C9%A3%C4%A4%CE%C7%D8%B7%CA%BF%A7%CA%D1%B9%B9&alias%5B%5D=pukiwiki%B4%D8%CF%A2 * * @access private * @return string */ function coloredIdStyle($idstr, $id, $count = 0) { global $STYLE; static $idcount = array(); static $idstyles = array(); static $id_color_used = array(); if ($count >= 2) { //[$id] >= 2 ココの数字でスレに何個以上同じIDが出た時に背景色を変えるか決まる if (isset($idstyles[$id])) { return $idstyles[$id]; } else { // $alpha=0.8; // アルファチャネル // IDから色の元を抽出 $coldiv = 64; // 色相環の分割数 if (preg_match('/ID:/', $idstr)) { // IDが使える $rev_id = strrev(substr($id, 0, 8)); $raw = base64_decode($rev_id); // 8文字をバイナリデータ6文字分に変換 $id_hex = unpack('H12', substr($raw, 0, 6)); // バイナリデータを16進文字列に変換 $id_bin = base_convert($id_hex[1], 16, 2); // さらに2進文字列に変換 while ($id_bin) { $arr[] = base_convert(substr($id_bin, -6), 2, 10); $id_bin = substr($id_bin, 0, -6); } $colors[0] = $arr[0]; // % $coldiv; $idstr2 = preg_split('/:/', $idstr, 2); // コロンでID文字列を分割 array_shift($idstr2); if ($id_color_used[$colors[0]]++) { $colors[1] = $colors[0] + ($id_color_used[$colors[0]] - 1) + 1; $idstr2[1] = substr($idstr2[0], 4); $idstr2[0] = substr($idstr2[0], 0, 4); // コロンでID文字列を分割 } } else { //シベリア板タイプ $ip_hex = preg_split('/\\./', $id); //var_dump($ip_hex);echo "<br>"; $colors[1] = $ip_hex[1] % $coldiv; $idstr2 = preg_split('/:/', $idstr, 2); // コロンでID文字列を分割 $idstr2[0] .= ':'; if ($id_color_used[$colors[1]]++) { $colors[2] = $colors[1] + ($id_color_used[$colors[1]] - 1) + 1; $idstr2[2] = ".{$ip_hex[2]}.{$ip_hex[3]}"; $idstr2[1] = "{$ip_hex[0]}.{$ip_hex[1]}"; // コロンでID文字列を分割 } } $color_param = array(); // HLS色空間 // 色相H:値域0〜360(角度) // 輝度L(HLS):値域0(黒)〜0.5(純色)〜1(白) // 彩度S(HLS):値域0(灰色)〜1(純色) foreach ($colors as $key => $color) { // var_dump(array(/*$raw,$id_hex,$arr,$col,*/$id_top,$c1,$c2));echo "<br>"; $color_param[$key] = array(); $angle = deg2rad($color * 180 / $coldiv); $color_param[$key]['H'] = $color * 360 * 4 / $coldiv; while ($color_param[$key]['H'] > 360) { $color_param[$key]['H'] -= 360; } $color_param[$key]['L'] = 0.22 + sin($angle) * 0.08; $color_param[$key]['S'] = 0.4 + sin($angle) * 0.1; // RGBに変換 $color_param[$key] = HLS2RGB($color_param[$key]); $color_param[$key]['Y'] = ($color_param[$key]['R'] * 299 + $color_param[$key]['G'] * 587 + $color_param[$key]['B'] * 114) / 1000; } // CSSで色をつける $uline = $STYLE['a_underline_none'] == 1 ? '' : "text-decoration:underline;"; if ($count[$id] >= 25) { // 必死チェッカー発動 $uline .= "text-decoration:blink;"; } $opacity = ''; // "opacity:{$alpha};"; foreach ($color_param as $area => $param) { $r = (int) $color_param[$area]['R']; $g = (int) $color_param[$area]['G']; $b = (int) $color_param[$area]['B']; if ($opacity || !$alpha) { $bcolor[$area] = "background-color:rgb({$r},{$g},{$b});"; } else { $bcolor[$area] = "background-color:rgba({$r},{$g},{$b},{$alpha});"; } // 背景色によって文字色を変える $y1 = 158; $y2 = 185; if ($param['Y'] >= $y1) { $y = ($param['Y'] - ($param['Y'] >= $y2 ? $y2 : $y1)) / $param['Y']; $r = (int) ($r * $y); $g = (int) ($g * $y); $b = (int) ($b * $y); $bcolor[$area] .= "color:rgb({$r},{$g},{$b});"; } else { $y1 = 140; $y2 = 160; if ($param['Y'] <= 255 - $y1) { $y = ($param['Y'] <= 255 - $y2 ? $y2 : $y1) / (255 - $param['Y']); $r += (int) ((255 - $r) * $y); $g += (int) ((255 - $g) * $y); $b += (int) ((255 - $b) * $y); $bcolor[$area] .= "color:rgb({$r},{$g},{$b});"; } else { $bcolor[$area] .= "color:#fff;"; } } $idstr2[$area] = "<span style=\"{$bcolor[$area]}{$border}{$uline}{$opacity}\">{$idstr2[$area]}</span>"; } // var_dump(array('id'=>$id,'bcolor'=>$bcolor));echo "<br>"; $idstr = join('', $idstr2); $idstyles[$id] = $bcolor; /*array( (isset($rgb[1]) ? "{$bcolor[1]}{$border}{$uline}" : ''), "{$bcolor[0]}{$border}{$uline}"); */ } } // var_dump(array('idstyles'=>$idstyles[$id]));echo "<br>"; return $idstyles[$id]; }