package gradfont; #------------------------------------------------------------------------ # gradfont.pl: 文字列グラデーション化ライブラリ Ver1.01 # # 文字コードをシフトJISで判定している理由は、謎・・・ # EUCなら、もっと、簡単につくれるらしい? # よくわからん。 # # Copyright (c) 1999 qz@ca.sakura.ne.jp # # 著作権は放棄しませんが、自由に使用・改造・再配布可能です。 # # ---------------------------------------------------------------- # 基本的な使い方 # require "gradfont.pl"; # print &gradfont'GradStr("あいうえお", "#000000", "#FFFFFF"); # print &gradfont'GradStr2("あいうえお", "#000000", "#FF0000", "#FFFFFF"); # ---------------------------------------------------------------- # 最新版入手先 # http://www.ca.sakura.ne.jp/~qz/ # # 更新履歴: # 1999.03.11 1.00 初版。 # 1999.03.14 1.01 3点式グラデーション機能の追加。 #------------------------------------------------------------------------ #文字列グラデーション化(文字列、開始色、中間色、終了色) sub GradStr2{ local($Str, $ColorFrom, $ColorIn, $ColorTo, $Len, $FromLen, $ToLen , $FromStr, $ToStr, $FromTagStr, $ToTagStr, $i, @S); $Str = $_[0]; $ColorFrom = $_[1]; $ColorIn = $_[2]; $ColorTo = $_[3]; $Len = &Klength($Str); $FromLen = int($Len / 2); $ToLen = $Len - $FromLen; $FromStr = ""; for($i = 1;$i <= $FromLen;$i++){ $FromStr = $FromStr . &KcharAt($Str, $i); } $ToStr = ""; for($i = $FromLen + 1;$i <= $Len;$i++){ $ToStr = $ToStr . &KcharAt($Str, $i); } if($FromLen == $ToLen){ $ToStr = &KcharAt($FromStr, $FromLen) . $ToStr; }else{ $FromStr = $FromStr . &KcharAt($ToStr, 1); } $FromTagStr = &GradStr($FromStr, $ColorFrom, $ColorIn); $ToTagStr = &GradStr($ToStr, $ColorIn, $ColorTo); @S = split(/<\/FONT>/, $ToTagStr); shift(@S); $ToTagStr = join("", @S, ""); return $FromTagStr . $ToTagStr; } #文字列グラデーション化(文字列、開始色、終了色) sub GradStr{ local($Str, $ColorFrom, $ColorTo, %Red, %Green, %Blue, $Len , $TagStr, $i, $StaTag, $EndTag, $FColor); $Str = $_[0]; $ColorFrom = $_[1]; $ColorTo = $_[2]; $StaTag = "" . &KcharAt($Str, $i + 1) . $EndTag; } return $TagStr; } #グラデーション階調を算出 引数(開始色,終了色,段階) sub GetLev{ local($F, $T, $n, $sa, $am); $F = $_[0]; $T = $_[1]; $n = $_[2]; $sa = $T - $F; if ($n == 0) {$am = 0;} else {$am = $sa % $n; $am = ($sa - $am) / $n;} return($am); } #--シフトJISコード: #--1バイト目 : 0x81 - 0x9F, 0xE0 - 0xFC #--2バイト目 : 0x40 - 0x7E, 0x80 - 0xFC #--EUCコード: #--0x80-0xff #日本語混在の文字列の長さを取得(Shift JIS)(文字列) sub Klength{ local($moji, $klen, $ki, $c, $cb); $moji = $_[0]; $klen = 0; for ($ki=0; $ki=0x81) && ($cb<=0x9F)) || (($cb>=0xE0) && ($cb<=0xFC))){ $ki++; } $klen++; } return $klen; } #日本語混在の文字列から指定した1文字を取得(Shift JIS)(文字列、位置) sub KcharAt{ local($moji, $len, $ai, $c, $cb); $moji = $_[0]; $pos = $_[1]; $len = 1; for($ai=0; $ai=0x81) && ($cb<=0x9F)) || (($cb>=0xE0) && ($cb<=0xFC))){ $c = $c . substr($moji, $ai + 1, 1); $ai++; } if ($pos == $len){last;} $len++; } return $c; } 1; #______________________________________________________________________End Of Script