Source for file SC_GraphBase.php

Documentation is available at SC_GraphBase.php

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

Documentation generated on Tue, 28 Apr 2009 18:13:20 +0900 by phpDocumentor 1.4.2