source: branches/version-2_13-dev/data/class/graph/SC_Graph_Base.php @ 22856

Revision 22856, 15.2 KB checked in by Seasoft, 13 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.13.0)

  • 主に空白・空白行の調整。もう少し整えたいが、一旦現状コミット。
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/** TTFフォントファイル */
25define('FONT_REALFILE', DATA_REALDIR . 'fonts/wlmaru20044.ttf');
26
27/** フォントサイズ */
28define('FONT_SIZE', 8);
29
30/** タイトルフォントサイズ */
31define('TITLE_FONT_SIZE', 11);
32
33/** 背景幅 */
34define('BG_WIDTH', 720);
35
36/** 背景高さ */
37define('BG_HEIGHT', 400);
38
39/** 行間 */
40define('LINE_PAD', 5);
41
42/** フォント補正値(実際の描画幅/フォントサイズ) */
43define('TEXT_RATE', 0.75);
44
45// -----------------------------------------------------------------------------
46// 円グラフ
47// -----------------------------------------------------------------------------
48/** 円グラフ位置 */
49define('PIE_LEFT', 200);
50
51/** 円グラフ位置 */
52define('PIE_TOP', 150);
53
54/** 円グラフ幅 */
55define('PIE_WIDTH', 230);
56
57/** 円グラフ高さ */
58define('PIE_HEIGHT', 100);
59
60/** 円グラフ太さ */
61define('PIE_THICK', 30);
62
63/** 円グラフのラベル位置を上にあげる */
64define('PIE_LABEL_UP', 20);
65
66/** 値が大きいほど影が長くなる */
67define('PIE_SHADE_IMPACT', 0.1);
68
69// -----------------------------------------------------------------------------
70// 折れ線グラフ
71// -----------------------------------------------------------------------------
72/** Y軸の目盛り数 */
73define('LINE_Y_SCALE', 10);
74
75/** X軸の目盛り数 */
76define('LINE_X_SCALE', 10);
77
78/** 線グラフ位置 */
79define('LINE_LEFT', 60);
80
81/** 線グラフ位置 */
82define('LINE_TOP', 50);
83
84/** 線グラフ背景のサイズ */
85define('LINE_AREA_WIDTH', 600);
86
87/** 線グラフ背景のサイズ */
88define('LINE_AREA_HEIGHT', 300);
89
90/** 線グラフマークのサイズ */
91define('LINE_MARK_SIZE', 6);
92
93/** 目盛り幅 */
94define('LINE_SCALE_SIZE', 6);
95
96/** X軸のラベルの表示制限数 */
97define('LINE_XLABEL_MAX', 30);
98
99/** X軸のタイトルと軸の間隔 */
100define('LINE_XTITLE_PAD', -5);
101
102/** Y軸のタイトルと軸の間隔 */
103define('LINE_YTITLE_PAD', 15);
104
105// -----------------------------------------------------------------------------
106//  棒グラフ
107// -----------------------------------------------------------------------------
108/** グラフと目盛りの間隔 */
109define('BAR_PAD', 6);
110
111// -----------------------------------------------------------------------------
112//  タイトルラベル
113// -----------------------------------------------------------------------------
114/** 背景枠との上幅 */
115define('TITLE_TOP', 10);
116
117// -----------------------------------------------------------------------------
118//  凡例
119// -----------------------------------------------------------------------------
120/** 背景枠との上幅 */
121define('LEGEND_TOP', 10);
122
123/** 背景枠との右幅 */
124define('LEGEND_RIGHT', 10);
125
126/**
127 * SC_Graph 共通クラス.
128 *
129 * @package Graph
130 * @author LOCKON CO.,LTD.
131 * @version $Id$
132 */
133class SC_Graph_Base
134{
135    var $arrRGB;
136    var $arrColor;
137    var $arrDarkColor;
138    var $image;
139    var $left;
140    var $top;
141    var $shade_color;
142    var $flame_color;
143    var $shade_on;
144    var $text_color;
145    var $labelbg_color;
146    var $bgw;
147    var $bgh;
148    var $clabelbg_color;
149    var $title_color;
150    var $text_top;
151    var $mark_color;
152    var $arrLegend;
153
154    /** グラフ背景 */
155    var $ARR_GRAPH_RGB;
156
157    /** 背景色 */
158    var $ARR_BG_COLOR;
159
160    /** 影の色 */
161    var $ARR_SHADE_COLOR;
162
163    /** 縁の色 */
164    var $ARR_FLAME_COLOR;
165
166    /** 文字色 */
167    var $ARR_TEXT_COLOR;
168
169    /** ラベル背景 */
170    var $ARR_LABELBG_COLOR;
171
172    /** 凡例背景 */
173    var $ARR_LEGENDBG_COLOR;
174
175    /** タイトル文字色 */
176    var $ARR_TITLE_COLOR;
177
178    /** グリッド線色 */
179    var $ARR_GRID_COLOR;
180
181    // コンストラクタ
182    function __construct($bgw, $bgh, $left, $top)
183    {
184        $this->init();
185        // 画像作成
186        $this->bgw = $bgw;
187        $this->bgh = $bgh;
188        $this->image = imagecreatetruecolor($bgw, $bgh);
189        // アンチエイリアス有効
190        if (function_exists('imageantialias')) imageantialias($this->image, true);
191        // 背景色をセット
192        imagefill($this->image, 0, 0, $this->lfGetImageColor($this->image, $this->ARR_BG_COLOR));
193
194        // 使用色の生成
195        $this->setColorList($this->ARR_GRAPH_RGB);
196        // グラフ描画位置の設定
197        $this->left = $left;
198        $this->top = $top;
199        $this->shade_color = $this->lfGetImageColor($this->image, $this->ARR_SHADE_COLOR);
200        $this->flame_color = $this->lfGetImageColor($this->image, $this->ARR_FLAME_COLOR);
201        $this->text_color = $this->lfGetImageColor($this->image, $this->ARR_TEXT_COLOR);
202        $this->labelbg_color = $this->lfGetImageColor($this->image, $this->ARR_LABELBG_COLOR);
203        $this->clabelbg_color = $this->lfGetImageColor($this->image, $this->ARR_LEGENDBG_COLOR);
204        $this->title_color = $this->lfGetImageColor($this->image, $this->ARR_TITLE_COLOR);
205        $this->grid_color = $this->lfGetImageColor($this->image, $this->ARR_GRID_COLOR);
206
207        // 影あり
208        $this->shade_on = true;
209    }
210
211    // リサンプル(画像を滑らかに縮小する)
212    function resampled()
213    {
214        $new_width = $this->bgw * 0.8;
215        $new_height = $this->bgh * 0.8;
216        $tmp_image = imagecreatetruecolor($new_width, $new_height);
217        if (imagecopyresampled($tmp_image, $this->image, 0, 0, 0, 0, $new_width, $new_height, $this->bgw, $this->bgh)) {
218            $this->image = $tmp_image;
219        }
220    }
221
222    // オブジェクトカラーの設定
223    function setColorList($arrRGB)
224    {
225        $this->arrRGB = $arrRGB;
226        $count = count($this->arrRGB);
227        // 通常色の設定
228        for ($i = 0; $i < $count; $i++) {
229            $this->arrColor[$i] = $this->lfGetImageColor($this->image, $this->arrRGB[$i]);
230        }
231        // 暗色の設定
232        for ($i = 0; $i < $count; $i++) {
233            $this->arrDarkColor[$i] = $this->lfGetImageDarkColor($this->image, $this->arrRGB[$i]);
234        }
235    }
236
237    // 影のありなし
238    function setShadeOn($shade_on)
239    {
240        $this->shade_on = $shade_on;
241    }
242
243    // 画像を出力する
244    function outputGraph($header = true, $filename = '')
245    {
246        if ($header) {
247            header('Content-type: image/png');
248        }
249
250        if ($filename != '') {
251            imagepng($this->image, $filename);
252        } else {
253            imagepng($this->image);
254        }
255
256        imagedestroy($this->image);
257    }
258
259    // 描画時のテキスト幅を求める
260    function getTextWidth($text, $font_size)
261    {
262        $text_len = strlen($text);
263        $ret = $font_size * $text_len * TEXT_RATE;
264        /*
265            ※正確な値が取得できなかったので廃止
266            // テキスト幅の取得
267            $arrPos = imagettfbbox($font_size, 0, FONT_REALFILE, $text);
268            $ret = $arrPos[2] - $arrPos[0];
269        */
270        return $ret;
271    }
272
273    // テキストを出力する
274    function setText($font_size, $left, $top, $text, $color = NULL, $angle = 0, $labelbg = false)
275    {
276        // 時計回りに角度を変更
277        $angle = -$angle;
278        // ラベル背景
279        if ($labelbg) {
280            $text_width = $this->getTextWidth($text, $font_size);
281            imagefilledrectangle($this->image, $left - 2, $top - 2, $left + $text_width + 2, $top + $font_size + 2, $this->labelbg_color);
282        }
283        /*
284         * XXX EUC-JP にしないと Warning がでる.
285         *     --enable-gd-jis-conv も関係していそうだが, このオプションを
286         *     つけなくても出る.
287         *
288         *     Warning: imagettftext() [function.imagettftext]:
289         *     any2eucjp(): something happen in
290         *
291         *     PHP Bugs: #42218
292         *
293         *     http://www.php.net/imagettftext を見ると, UTF-8 にしろと
294         *     書いてあるのに...
295         *
296         */
297        $text = mb_convert_encoding($text, 'EUC-JP', CHAR_CODE);
298        //$text = mb_convert_encoding($text, CHAR_CODE);
299        if ($color != NULL) {
300            ImageTTFText($this->image, $font_size, $angle, $left, $top + $font_size, $color, FONT_REALFILE, $text);
301        } else {
302            ImageTTFText($this->image, $font_size, $angle, $left, $top + $font_size, $this->text_color, FONT_REALFILE, $text);
303        }
304    }
305
306    // タイトルを出力する
307    function drawTitle($text, $font_size = TITLE_FONT_SIZE)
308    {
309        // 出力位置の算出
310        $text_width = $this->getTextWidth($text, $font_size);
311        $left = ($this->bgw - $text_width) / 2;
312        $top = TITLE_TOP;
313        $this->setText($font_size, $left, $top, $text, $this->title_color);
314    }
315
316    // ログを出力する
317    function debugPrint($text)
318    {
319        $text = mb_convert_encoding($text, 'UTF-8', CHAR_CODE);
320        if (!isset($this->text_top)) {
321            $this->text_top = FONT_SIZE + LINE_PAD;
322        }
323        // テキスト描画
324        ImageTTFText($this->image, FONT_SIZE, 0, LINE_PAD, $this->text_top, $this->text_color, FONT_REALFILE, $text);
325        $this->text_top += FONT_SIZE + LINE_PAD;
326    }
327
328    // カラーラベルを描画
329    function drawLegend($legend_max = '', $clabelbg = true)
330    {
331        // 凡例が登録されていなければ中止
332        if (count($this->arrLegend) <= 0) {
333            return;
334        }
335
336        if ($legend_max != '') {
337            $label_max = $legend_max;
338        } else {
339            $label_max = count($this->arrLegend);
340        }
341
342        $height_max = 0;
343        $text_max = 0;
344        $width_max = 0;
345
346        // 一番文字数が多いものを取得
347        for ($i = 0; $i < $label_max; $i++) {
348            $text_len = strlen($this->arrLegend[$i]);
349            if ($text_max < $text_len) {
350                $text_max = $text_len;
351            }
352            $height_max += FONT_SIZE + LINE_PAD;
353        }
354        $width_max = FONT_SIZE * $text_max * TEXT_RATE;
355
356        //  カラーアイコンと文字間を含めた幅
357        $width_max += FONT_SIZE + (LINE_PAD * 2);
358        $left = $this->bgw - $width_max - LEGEND_RIGHT;
359        $top = LEGEND_TOP;
360        // カラーラベル背景の描画
361        if ($clabelbg) {
362            $this->drawClabelBG($left - LINE_PAD, $top, $left + $width_max, $top + $height_max + LINE_PAD);
363        }
364        $top += LINE_PAD;
365
366        // 色数の取得
367        $c_max = count($this->arrColor);
368        for ($i = 0; $i < $label_max; $i++) {
369            // カラーアイコンの表示
370            imagerectangle($this->image, $left, $top, $left + FONT_SIZE, $top + FONT_SIZE, $this->flame_color);
371            imagefilledrectangle($this->image, $left + 1, $top + 1, $left + FONT_SIZE - 1, $top + FONT_SIZE - 1, $this->arrColor[($i % $c_max)]);
372            // ラベルの表示
373            $this->setText(FONT_SIZE, $left + FONT_SIZE + LINE_PAD, $top, $this->arrLegend[$i]);
374            $top += FONT_SIZE + LINE_PAD;
375        }
376    }
377
378    // カラーラベル背景の描画
379    function drawClabelBG($left, $top, $right, $bottom)
380    {
381        // 影の描画
382        if ($this->shade_on) {
383            imagefilledrectangle($this->image, $left + 2, $top + 2, $right + 2, $bottom + 2, $this->shade_color);
384        }
385        // カラーラベル背景の描画
386        imagefilledrectangle($this->image, $left, $top, $right, $bottom, $this->clabelbg_color);
387        imagerectangle($this->image, $left, $top, $right, $bottom, $this->flame_color);
388    }
389
390    // 凡例をセットする
391    function setLegend($arrLegend)
392    {
393        $this->arrLegend = array_values((array)$arrLegend);
394    }
395
396    /**
397     * クラスの初期化を行う.
398     *
399     * 表示色をメンバ変数にセットする.
400     *
401     * @access protected
402     * @return void
403     */
404    function init()
405    {
406        // 凡例背景
407        $this->ARR_LEGENDBG_COLOR = array(245,245,245);
408        // ラベル背景
409        $this->ARR_LABELBG_COLOR = array(255,255,255);
410        // グラフカラー
411        $this->ARR_GRAPH_RGB = array(
412            array(200,50,50),
413            array(50,50,200),
414            array(50,200,50),
415            array(255,255,255),
416            array(244,200,200),
417            array(200,200,255),
418            array(50,200,50),
419            array(255,255,255),
420            array(244,244,244),
421        );
422        // 影の色
423        $this->ARR_SHADE_COLOR = array(100,100,100);
424        // 縁の色
425        $this->ARR_FLAME_COLOR = array(0, 0, 0);
426        // 文字色
427        $this->ARR_TEXT_COLOR = array(0, 0, 0);
428        // 背景カラー
429        $this->ARR_BG_COLOR = array(255,255,255);
430        // タイトル文字色
431        $this->ARR_TITLE_COLOR = array(0, 0, 0);
432        // グリッド線色
433        $this->ARR_GRID_COLOR = array(200, 200, 200);
434        // マークの色
435        $this->ARR_MARK_COLOR = array(130, 130, 255);
436    }
437
438    /**
439     * 円の中心点と直径から弧の終端座標を算出する.
440     *
441     * @param integer $cx 中心点X座標
442     * @param integer $cy 中心点Y座標
443     * @param integer $r 半径
444     * @param integer $e 角度
445     * @return array 円の中心点と直径から弧の終端座標の配列
446     */
447    function lfGetArcPos($cx, $cy, $cw, $ch, $e)
448    {
449        // 三角関数用の角度を求める
450        $s = 90 - $e;
451        $r = $cw / 2;
452        // 位置を求める
453        $x = $cx + ($r * cos(deg2rad($s)));
454        $y = $cy - (($r * sin(deg2rad($s))) * ($ch / $cw));
455
456        return array(round($x), round($y));
457    }
458
459    /** 画像にテキストを描画する */
460    function lfImageText($dst_image, $text, $font_size, $left, $top, $font, $arrRGB)
461    {
462        $color = ImageColorAllocate($dst_image, $arrRGB[0], $arrRGB[1], $arrRGB[2]);
463        $text = mb_convert_encoding($text, 'UTF-8', CHAR_CODE);
464        // 表示角度
465        $angle = 0;
466        // テキスト描画
467        ImageTTFText($dst_image, $font_size, $angle, $left, $top, $color, $font, $text);
468    }
469
470    /** 表示色の取得 */
471    function lfGetImageColor($image, $array)
472    {
473        if (count($array) != 3) {
474            return NULL;
475        }
476        $ret = imagecolorallocate($image, $array[0], $array[1], $array[2]);
477
478        return $ret;
479    }
480
481    /** 影用表示色の取得 */
482    function lfGetImageDarkColor($image, $array)
483    {
484        if (count($array) != 3) {
485            return NULL;
486        }
487        $i = 0;
488        foreach ($array as $val) {
489            $dark[$i] = $val - 45;
490            if ($dark[$i] < 0) {
491                $dark[$i] = 0;
492            }
493            $i++;
494        }
495        $ret = imagecolorallocate($image, $dark[0], $dark[1], $dark[2]);
496
497        return $ret;
498    }
499}
Note: See TracBrowser for help on using the repository browser.