• R/O
  • SSH
  • HTTPS

jinrousiki: コミット


コミットメタ情報

リビジョン2047 (tree)
日時2017-07-22 23:44:21
作者umethyl

ログメッセージ

message_image_generator.php:最適化

変更サマリ

差分

--- trunk/dev/image/include/message_image_builder.php (revision 2046)
+++ trunk/dev/image/include/message_image_builder.php (revision 2047)
@@ -40,17 +40,20 @@
4040 'sex_male' => array('R' => 0, 'G' => 0, 'B' => 255),
4141 'wisp' => array('R' => 170, 'G' => 102, 'B' => 255),
4242 'step' => array('R' => 102, 'G' => 153, 'B' => 51)
43- );
43+ );
4444
4545 public function __construct($list, $font) {
46- $font = IMAGE_FONT_PATH . $font;
47- $size = ($trans = $list == 'WishRoleList') ? 12 : 11;
46+ $font = IMAGE_FONT_PATH . $font;
47+ $trans = $list == 'WishRoleList';
48+ $size = $trans ? 12 : 11;
4849 $this->generator = new MessageImageGenerator($font, $size, 3, 3, $trans);
49- $this->list = new $list();
50+ $this->list = new $list();
5051 }
5152
5253 public function LoadDelimiter($delimiter, $colors) {
53- if (! is_array($colors)) $colors = $this->color_list[$colors];
54+ if (! is_array($colors)) {
55+ $colors = $this->color_list[$colors];
56+ }
5457 return new Delimiter($delimiter, $colors['R'], $colors['G'], $colors['B']);
5558 }
5659
@@ -61,8 +64,12 @@
6164 }
6265
6366 public function SetDelimiter(array $list) {
64- if (isset($list['type'])) $this->SetDelimiter($this->list->{$list['type']});
65- if (! isset($list['delimiter'])) $list['delimiter'] = array();
67+ if (isset($list['type'])) {
68+ $this->SetDelimiter($this->list->{$list['type']});
69+ }
70+ if (! isset($list['delimiter'])) {
71+ $list['delimiter'] = array();
72+ }
6673 $this->AddDelimiter($list);
6774 }
6875
--- trunk/dev/image/include/message_image_generator.php (revision 2046)
+++ trunk/dev/image/include/message_image_generator.php (revision 2047)
@@ -8,10 +8,10 @@
88 */
99
1010 class Delimiter {
11- public $c; // デリミタ文字
12- public $r; // RGB色指定の赤成分値
13- public $g; // RGB色指定の緑成分値
14- public $b; // RGB色指定の青成分値
11+ public $c; //デリミタ文字
12+ public $r; //RGB色指定の赤成分値
13+ public $g; //RGB色指定の緑成分値
14+ public $b; //RGB色指定の青成分値
1515
1616 /*
1717 コンストラクタ
@@ -29,16 +29,17 @@
2929 }
3030
3131 class MessageImageGenerator {
32- public $font; // フォントパス
33- public $size; // フォントサイズ
34- public $width; // 半角1文字あたりの幅
35- public $height; // 半角1文字あたりの高さ
36- public $x_margin; // マージン幅
37- public $y_margin; // マージン高さ
38- public $def_col; // デフォルト文字色のRGB値
39- public $def_bgc; // デフォルト背景色のRGB値
40- public $is_trans; // 背景色を透明にするかどうか
41- public $delimiters; // デリミタ情報、色を格納する配列
32+ public $font; //フォントパス
33+ public $size; //フォントサイズ
34+ public $width; //半角1文字あたりの幅
35+ public $height; //半角1文字あたりの高さ
36+ public $x_margin; //マージン幅
37+ public $y_margin; //マージン高さ
38+ public $def_col; //デフォルト文字色のRGB値
39+ public $def_bgc; //デフォルト背景色のRGB値
40+ public $is_trans; //背景色を透明にするかどうか
41+ public $delimiters; //デリミタ情報、色を格納する配列
42+
4243 /*
4344 コンストラクタ
4445 $font 使用するTrueTypeフォントのパス
@@ -45,17 +46,18 @@
4546 $size フォントサイズ
4647 $x_margin マージン幅
4748 $y_margin マージン高さ
49+ $is_trans 透過処理
4850 */
4951 public function __construct($font = "C:\\WINDOWS\\Fonts\\msgothic.ttc", $size = 12,
50- $x_margin = 5, $y_margin = 2, $is_trans = false) {
51- $this->font = $font;
52- $this->size = $size;
53- $this->x_margin = $x_margin;
54- $this->y_margin = $y_margin;
55- $this->def_col = array(0, 0, 0);
56- $this->def_bgc = array(255, 255, 255);
57- $this->is_trans = $is_trans;
58- $this->delimiters = array();
52+ $x_margin = 5, $y_margin = 2, $is_trans = false) {
53+ $this->font = $font;
54+ $this->size = $size;
55+ $this->x_margin = $x_margin;
56+ $this->y_margin = $y_margin;
57+ $this->def_col = array(0, 0, 0);
58+ $this->def_bgc = array(255, 255, 255);
59+ $this->is_trans = $is_trans;
60+ $this->delimiters = array();
5961
6062 //フォント幅・高さの測定。もっといい定跡があればそちらに変更する予定。
6163 $r_a = imagettfbbox($this->size, 0, $this->font, "A");
@@ -64,6 +66,7 @@
6466 $this->width = $r_a2[2] - $r_a[2];
6567 $this->height = $r_a2v[1] - $r_a[1];
6668 }
69+
6770 /*
6871 新規デリミタを追加する関数
6972 $nd 新しいデリミタと使用色を定義したDelimiterクラス
@@ -75,14 +78,16 @@
7578 return;
7679 }
7780 }
78- $this->delimiters[] = $nd; // 新しいデリミタを追加する
81+ $this->delimiters[] = $nd; //新しいデリミタを追加する
7982 }
83+
8084 /*
8185 登録されているデリミタを削除する関数
8286 $c デリミタ文字
8387 */
8488 public function DeleteDelimiter($c) {
85- for ($i = 0; $i < count($this->delimiters); $i++) {
89+ $count = count($this->delimiters);
90+ for ($i = 0; $i < $count; $i++) {
8691 if ($this->delimiters[$i]->c == $c) {
8792 array_splice($this->delimiters, $i, 1); //登録されているデリミタを削除する
8893 return;
@@ -89,6 +94,7 @@
8994 }
9095 }
9196 }
97+
9298 /*
9399 登録されているデリミタクラスを取得する関数
94100 $c デリミタ文字
@@ -95,7 +101,8 @@
95101 返り値 対応するデリミタクラス。登録されていない場合はデフォルトのデリミタクラス
96102 */
97103 public function GetDelimiter($c) {
98- for ($i = 0; $i < count($this->delimiters); $i++) {
104+ $count = count($this->delimiters);
105+ for ($i = 0; $i < $count; $i++) {
99106 if ($this->delimiters[$i]->c == $c) {
100107 return $this->delimiters[$i];
101108 }
@@ -102,6 +109,7 @@
102109 }
103110 return new Delimiter('', 0, 0, 0);
104111 }
112+
105113 /*
106114 登録されているデリミタから分割用の正規表現文字列を作成する関数
107115 返り値 正規表現文字列
@@ -108,6 +116,7 @@
108116 */
109117 public function GenerateDelimiterRegEx() {
110118 if (count($this->delimiters) == 0) return '';
119+
111120 $regex_str = '/[';
112121 foreach ($this->delimiters as $d) {
113122 //正規表現で特別な意味を持つ文字をデリミタとして使う場合は、ここで\を挿入する必要あり
@@ -127,6 +136,7 @@
127136 }
128137 return $regex_str . ']/';
129138 }
139+
130140 /*
131141 文字データの整形処理
132142 必要なら文字コード変換や正規表現の処理を実行する
@@ -135,6 +145,7 @@
135145 $message = $regex == '' ? $str : preg_replace($regex, '', $str);
136146 return mb_convert_encoding($message, 'UTF-8', 'auto');
137147 }
148+
138149 /*
139150 役職説明、能力実行結果などのメッセージ用画像ファイルを生成する関数
140151 $msg 作成したいメッセージ文。改行有効。||で囲んだ部分を指定した色で書く
@@ -152,33 +163,37 @@
152163 $plain_r = imagettfbbox($this->size, 0, $this->font, $plain_msg);
153164 //echo print_r($plain_r, true) . '<br>';
154165
155- // 画像の生成
166+ //画像の生成
156167 $img = imagecreatetruecolor($plain_r[2] - $plain_r[6] + $this->x_margin * 2,
157168 $plain_r[3] - $plain_r[7] + $this->y_margin * 2);
158169 $col_char = imagecolorallocate($img, $this->def_col[0], $this->def_col[1], $this->def_col[2]);
159170 $col_back = imagecolorallocate($img, $this->def_bgc[0], $this->def_bgc[1], $this->def_bgc[2]);
160- $color = $col_char; // 文字描画色をデフォルト文字色に設定
161- if ($this->is_trans) imagecolortransparent($img, $col_back); // 背景を透明色に設定する場合
171+ $color = $col_char; //文字描画色をデフォルト文字色に設定
172+ if ($this->is_trans) { //背景を透明色に設定する場合
173+ imagecolortransparent($img, $col_back);
174+ }
162175 imagefill($img, 0, 0, $col_back);
163176
164- // 各行ごとに処理
177+ //各行ごとに処理
165178 $y_disp = $this->y_margin;
166179 foreach (preg_split('/\n/', $msg, -1, PREG_SPLIT_NO_EMPTY) as $line) {
167180 //この行でどれだけ消費するか計算
168181 //echo $line.'<br>';
169- $line_len = mb_strlen($line);
170- $line_plain = $this->GetMessage($line, $regex_str);
171- $r = imagettfbbox($this->size, 0, $this->font, $line_plain);
172- //echo "line_r: $line_len "; print_r($r); echo "<br>";
182+ $r = imagettfbbox($this->size, 0, $this->font, $this->GetMessage($line, $regex_str));
183+ //echo "line_r: " . mb_strlen($line); print_r($r); echo "<br>";
173184
174185 // 強調部分の色を変えつつ表示
175- $array_msg = $regex_str == '' ? array(array($line, 0))
176- : preg_split($regex_str, $line, -1, PREG_SPLIT_OFFSET_CAPTURE);
186+ if ($regex_str == '') {
187+ $array_msg = array(array($line, 0));
188+ } else {
189+ $array_msg = preg_split($regex_str, $line, -1, PREG_SPLIT_OFFSET_CAPTURE);
190+ }
177191 //$x_disp = $this->x_margin;
178192 //echo print_r($array_msg, true) . '<br>';
179193 $str_total = '';
180194 $r_str_old = ''; //位置補正用
181- for ($i = 0; $i < count($array_msg); $i++) {
195+ $count = count($array_msg);
196+ for ($i = 0; $i < $count; $i++) {
182197 $str_len = mb_strlen($array_msg[$i][0]);
183198 //echo 'str_r: ' . $str_len . ' -> "' . $array_msg[$i][0] . '"<br>';
184199 $str = mb_convert_encoding($array_msg[$i][0], 'UTF-8', 'auto');
@@ -188,7 +203,9 @@
188203 $r_str_total = imagettfbbox($this->size, 0, $this->font, $str_total);
189204 if (is_array($r_str_old) && count($calib) > 0) { //位置補正処理
190205 $diff = $r_str_total[2] - ($r_str[2] + $r_str_old[2]);
191- if ($diff != 0) $r_str[2] += floor($diff * array_shift($calib));
206+ if ($diff != 0) {
207+ $r_str[2] += floor($diff * array_shift($calib));
208+ }
192209 }
193210 $r_str_old = $r_str_total; //補正用の現在値を保存
194211 //echo print_r($r_str, true) . '<br>';
@@ -202,8 +219,7 @@
202219 //既に同じデリミタがスタックにある→現在の色指定を解除
203220 array_shift($d_stack);
204221 $c_d = $this->GetDelimiter($d_stack[0]);
205- }
206- else {
222+ } else {
207223 //現在のデリミタをスタックに追加
208224 array_unshift($d_stack, $c_d->c);
209225 }
旧リポジトリブラウザで表示