From f1b5ab52ef7f16fe66f0deede1c99964c10c25e8 Mon Sep 17 00:00:00 2001 From: Martynas Mickevicius Date: Thu, 17 Jun 2010 16:01:09 +0300 Subject: [PATCH] added first pChart charts. --- libraries/chart/pChart/fonts/tahoma.ttf | Bin 0 -> 383804 bytes libraries/chart/pChart/pCache.class | 119 + libraries/chart/pChart/pChart.class | 3489 +++++++++++++++++++++++ libraries/chart/pChart/pData.class | 260 ++ libraries/chart/pma_pchart_chart.php | 25 + libraries/chart/pma_pchart_pie.php | 68 + 6 files changed, 3961 insertions(+) create mode 100644 libraries/chart/pChart/fonts/tahoma.ttf create mode 100644 libraries/chart/pChart/pCache.class create mode 100644 libraries/chart/pChart/pChart.class create mode 100644 libraries/chart/pChart/pData.class create mode 100644 libraries/chart/pma_pchart_chart.php create mode 100644 libraries/chart/pma_pchart_pie.php diff --git a/libraries/chart/pChart/fonts/tahoma.ttf b/libraries/chart/pChart/fonts/tahoma.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59b14a2d2d45b78eecbb2f22e1d2e084678e8d94 GIT binary patch literal 383804 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 QGW{ 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%0Dwr9W)AjlF<@N3L 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

IM?ys1at?vr3o1e&qaY)z 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 Yi= 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. + + Class initialisation : + pCache($CacheFolder="Cache/") + Cache management : + IsInCache($Data) + GetFromCache($ID,$Data) + WriteToCache($ID,$Data,$Picture) + DeleteFromCache($ID,$Data) + ClearCache() + Inner functions : + GetHash($ID,$Data) + */ + + /* pCache class definition */ + class pCache + { + var $HashKey = ""; + var $CacheFolder = "Cache/"; + + /* Create the pCache object */ + function pCache($CacheFolder="Cache/") + { + $this->CacheFolder = $CacheFolder; + } + + /* This function is clearing the cache folder */ + function ClearCache() + { + if ($handle = opendir($this->CacheFolder)) + { + while (false !== ($file = readdir($handle))) + { + if ( $file != "." && $file != ".." ) + unlink($this->CacheFolder.$file); + } + closedir($handle); + } + } + + /* This function is checking if we have an offline version of this chart */ + function IsInCache($ID,$Data,$Hash="") + { + if ( $Hash == "" ) + $Hash = $this->GetHash($ID,$Data); + + if ( file_exists($this->CacheFolder.$Hash) ) + return(TRUE); + else + return(FALSE); + } + + /* This function is making a copy of drawn chart in the cache folder */ + function WriteToCache($ID,$Data,$Picture) + { + $Hash = $this->GetHash($ID,$Data); + $FileName = $this->CacheFolder.$Hash; + + imagepng($Picture->Picture,$FileName); + } + + /* This function is removing any cached copy of this chart */ + function DeleteFromCache($ID,$Data) + { + $Hash = $this->GetHash($ID,$Data); + $FileName = $this->CacheFolder.$Hash; + + if ( file_exists($FileName ) ) + unlink($FileName); + } + + /* This function is retrieving the cached picture if applicable */ + function GetFromCache($ID,$Data) + { + $Hash = $this->GetHash($ID,$Data); + if ( $this->IsInCache("","",$Hash ) ) + { + $FileName = $this->CacheFolder.$Hash; + + header('Content-type: image/png'); + @readfile($FileName); + exit(); + } + } + + /* This function is building the graph unique hash key */ + function GetHash($ID,$Data) + { + $mKey = "$ID"; + foreach($Data as $key => $Values) + { + $tKey = ""; + foreach($Values as $Serie => $Value) + $tKey = $tKey.$Serie.$Value; + $mKey = $mKey.md5($tKey); + } + return(md5($mKey)); + } + } +?> \ No newline at end of file diff --git a/libraries/chart/pChart/pChart.class b/libraries/chart/pChart/pChart.class new file mode 100644 index 000000000..c407b7e2c --- /dev/null +++ b/libraries/chart/pChart/pChart.class @@ -0,0 +1,3489 @@ +. + + Class initialisation : + pChart($XSize,$YSize) + Draw methods : + drawBackground($R,$G,$B) + drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) + drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100) + drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) + drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B) + drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) + drawFromPNG($FileName,$X,$Y,$Alpha=100) + drawFromGIF($FileName,$X,$Y,$Alpha=100) + drawFromJPG($FileName,$X,$Y,$Alpha=100) + Graph setup methods : + addBorder($Width=3,$R=0,$G=0,$B=0) + clearScale() + clearShadow() + createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) + drawGraphArea($R,$G,$B,$Stripe=FALSE) + drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) + drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) + drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) + drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) + drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=FALSE) + drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) + drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) + drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) + drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) + drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) + drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) + drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) + getLegendBoxSize($DataDescription) + loadColorPalette($FileName,$Delimiter=",") + reportWarnings($Interface="CLI") + setGraphArea($X1,$Y1,$X2,$Y2) + setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) + setColorPalette($ID,$R,$G,$B) + setCurrency($Currency) + setDateFormat($Format) + setFontProperties($FontName,$FontSize) + setLineStyle($Width=1,$DotSize=0) + setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMin=0,$XDivisions=5) + setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha) + writeValues($Data,$DataDescription,$Series) + Graphs methods : + drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) + drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1) + drawLineGraph($Data,$DataDescription,$SerieName="") + drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) + drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) + drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") + drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) + drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) + drawBarGraph($Data,$DataDescription,$Shadow=FALSE) + drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) + drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) + drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) + drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) + drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) + drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) + drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) + drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) + Other methods : + setImageMap($Mode=TRUE,$GraphID="MyGraph") + getImageMap($MapName,$Flush=TRUE) + Render($FileName) + Stroke() + */ + + /* Declare some script wide constants */ + define("SCALE_NORMAL",1); + define("SCALE_ADDALL",2); + define("SCALE_START0",3); + define("SCALE_ADDALLSTART0",4); + define("PIE_PERCENTAGE", 1); + define("PIE_LABELS",2); + define("PIE_NOLABEL",3); + define("PIE_PERCENTAGE_LABEL", 4); + define("TARGET_GRAPHAREA",1); + define("TARGET_BACKGROUND",2); + define("ALIGN_TOP_LEFT",1); + define("ALIGN_TOP_CENTER",2); + define("ALIGN_TOP_RIGHT",3); + define("ALIGN_LEFT",4); + define("ALIGN_CENTER",5); + define("ALIGN_RIGHT",6); + define("ALIGN_BOTTOM_LEFT",7); + define("ALIGN_BOTTOM_CENTER",8); + define("ALIGN_BOTTOM_RIGHT",9); + + /* pChart class definition */ + class pChart + { + /* Palettes definition */ + var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46), + "1"=>array("R"=>224,"G"=>100,"B"=>46), + "2"=>array("R"=>224,"G"=>214,"B"=>46), + "3"=>array("R"=>46,"G"=>151,"B"=>224), + "4"=>array("R"=>176,"G"=>46,"B"=>224), + "5"=>array("R"=>224,"G"=>46,"B"=>117), + "6"=>array("R"=>92,"G"=>224,"B"=>46), + "7"=>array("R"=>224,"G"=>176,"B"=>46)); + + /* Some static vars used in the class */ + var $XSize = NULL; + var $YSize = NULL; + var $Picture = NULL; + var $ImageMap = NULL; + + /* Error management */ + var $ErrorReporting = FALSE; + var $ErrorInterface = "CLI"; + var $Errors = NULL; + var $ErrorFontName = "Fonts/pf_arma_five.ttf"; + var $ErrorFontSize = 6; + + /* vars related to the graphing area */ + var $GArea_X1 = NULL; + var $GArea_Y1 = NULL; + var $GArea_X2 = NULL; + var $GArea_Y2 = NULL; + var $GAreaXOffset = NULL; + var $VMax = NULL; + var $VMin = NULL; + var $VXMax = NULL; + var $VXMin = NULL; + var $Divisions = NULL; + var $XDivisions = NULL; + var $DivisionHeight = NULL; + var $XDivisionHeight = NULL; + var $DivisionCount = NULL; + var $XDivisionCount = NULL; + var $DivisionRatio = NULL; + var $XDivisionRatio = NULL; + var $DivisionWidth = NULL; + var $DataCount = NULL; + var $Currency = "\$"; + + /* Text format related vars */ + var $FontName = NULL; + var $FontSize = NULL; + var $DateFormat = "d/m/Y"; + + /* Lines format related vars */ + var $LineWidth = 1; + var $LineDotSize = 0; + + /* Layer related vars */ + var $Layers = NULL; + + /* Set antialias quality : 0 is maximum, 100 minimum*/ + var $AntialiasQuality = 0; + + /* Shadow settings */ + var $ShadowActive = FALSE; + var $ShadowXDistance = 1; + var $ShadowYDistance = 1; + var $ShadowRColor = 60; + var $ShadowGColor = 60; + var $ShadowBColor = 60; + var $ShadowAlpha = 50; + var $ShadowBlur = 0; + + /* Image Map settings */ + var $BuildMap = FALSE; + var $MapFunction = NULL; + var $tmpFolder = "tmp/"; + var $MapID = NULL; + + /* This function create the background picture */ + function pChart($XSize,$YSize) + { + $this->XSize = $XSize; + $this->YSize = $YSize; + $this->Picture = imagecreatetruecolor($XSize,$YSize); + + $C_White =$this->AllocateColor($this->Picture,255,255,255); + imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); + imagecolortransparent($this->Picture,$C_White); + + $this->setFontProperties("tahoma.ttf",8); + } + + /* Set if warnings should be reported */ + function reportWarnings($Interface="CLI") + { + $this->ErrorReporting = TRUE; + $this->ErrorInterface = $Interface; + } + + /* Set the font properties */ + function setFontProperties($FontName,$FontSize) + { + $this->FontName = $FontName; + $this->FontSize = $FontSize; + } + + /* Set the shadow properties */ + function setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha=50,$Blur=0) + { + $this->ShadowActive = TRUE; + $this->ShadowXDistance = $XDistance; + $this->ShadowYDistance = $YDistance; + $this->ShadowRColor = $R; + $this->ShadowGColor = $G; + $this->ShadowBColor = $B; + $this->ShadowAlpha = $Alpha; + $this->ShadowBlur = $Blur; + } + + /* Remove shadow option */ + function clearShadow() + { + $this->ShadowActive = FALSE; + } + + /* Set Palette color */ + function setColorPalette($ID,$R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $this->Palette[$ID]["R"] = $R; + $this->Palette[$ID]["G"] = $G; + $this->Palette[$ID]["B"] = $B; + } + + /* Create a color palette shading from one color to another */ + function createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) + { + $RFactor = ($R2-$R1)/$Shades; + $GFactor = ($G2-$G1)/$Shades; + $BFactor = ($B2-$B1)/$Shades; + + for($i=0;$i<=$Shades-1;$i++) + { + $this->Palette[$i]["R"] = $R1+$RFactor*$i; + $this->Palette[$i]["G"] = $G1+$GFactor*$i; + $this->Palette[$i]["B"] = $B1+$BFactor*$i; + } + } + + /* Load Color Palette from file */ + function loadColorPalette($FileName,$Delimiter=",") + { + $handle = @fopen($FileName,"r"); + $ColorID = 0; + if ($handle) + { + while (!feof($handle)) + { + $buffer = fgets($handle, 4096); + $buffer = str_replace(chr(10),"",$buffer); + $buffer = str_replace(chr(13),"",$buffer); + $Values = split($Delimiter,$buffer); + if ( count($Values) == 3 ) + { + $this->Palette[$ColorID]["R"] = $Values[0]; + $this->Palette[$ColorID]["G"] = $Values[1]; + $this->Palette[$ColorID]["B"] = $Values[2]; + $ColorID++; + } + } + } + } + + /* Set line style */ + function setLineStyle($Width=1,$DotSize=0) + { + $this->LineWidth = $Width; + $this->LineDotSize = $DotSize; + } + + /* Set currency symbol */ + function setCurrency($Currency) + { + $this->Currency = $Currency; + } + + /* Set the graph area location */ + function setGraphArea($X1,$Y1,$X2,$Y2) + { + $this->GArea_X1 = $X1; + $this->GArea_Y1 = $Y1; + $this->GArea_X2 = $X2; + $this->GArea_Y2 = $Y2; + } + + /* Prepare the graph area */ + function drawGraphArea($R,$G,$B,$Stripe=FALSE) + { + $this->drawFilledRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B,FALSE); + $this->drawRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R-40,$G-40,$B-40); + + if ( $Stripe ) + { + $R2 = $R-15; if ( $R2 < 0 ) { $R2 = 0; } + $G2 = $R-15; if ( $G2 < 0 ) { $G2 = 0; } + $B2 = $R-15; if ( $B2 < 0 ) { $B2 = 0; } + + $LineColor =$this->AllocateColor($this->Picture,$R2,$G2,$B2); + $SkewWidth = $this->GArea_Y2-$this->GArea_Y1-1; + + for($i=$this->GArea_X1-$SkewWidth;$i<=$this->GArea_X2;$i=$i+4) + { + $X1 = $i; $Y1 = $this->GArea_Y2; + $X2 = $i+$SkewWidth; $Y2 = $this->GArea_Y1; + + + if ( $X1 < $this->GArea_X1 ) + { $X1 = $this->GArea_X1; $Y1 = $this->GArea_Y1 + $X2 - $this->GArea_X1 + 1; } + + if ( $X2 >= $this->GArea_X2 ) + { $Y2 = $this->GArea_Y1 + $X2 - $this->GArea_X2 +1; $X2 = $this->GArea_X2 - 1; } +// * Fixed in 1.27 * { $X2 = $this->GArea_X2 - 1; $Y2 = $this->GArea_Y2 - ($this->GArea_X2 - $X1); } + + imageline($this->Picture,$X1,$Y1,$X2,$Y2+1,$LineColor); + } + } + } + + /* Allow you to clear the scale : used if drawing multiple charts */ + function clearScale() + { + $this->VMin = NULL; + $this->VMax = NULL; + $this->VXMin = NULL; + $this->VXMax = NULL; + $this->Divisions = NULL; + $this->XDivisions = NULL; } + + /* Allow you to fix the scale, use this to bypass the automatic scaling */ + function setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMax=0,$XDivisions=5) + { + $this->VMin = $VMin; + $this->VMax = $VMax; + $this->Divisions = $Divisions; + + if ( !$VXMin == 0 ) + { + $this->VXMin = $VXMin; + $this->VXMax = $VXMax; + $this->XDivisions = $XDivisions; + } + } + + /* Wrapper to the drawScale() function allowing a second scale to be drawn */ + function drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) + { + $this->drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks,$Angle,$Decimals,$WithMargin,$SkipLabels,TRUE); + } + + /* Compute and draw the scale */ + function drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawScale",$Data); + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + + $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); + $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); + + if ( $this->VMin == NULL && $this->VMax == NULL) + { + if (isset($DataDescription["Values"][0])) + { + $this->VMin = $Data[0][$DataDescription["Values"][0]]; + $this->VMax = $Data[0][$DataDescription["Values"][0]]; + } + else { $this->VMin = 2147483647; $this->VMax = -2147483647; } + + /* Compute Min and Max values */ + if ( $ScaleMode == SCALE_NORMAL || $ScaleMode == SCALE_START0 ) + { + if ( $ScaleMode == SCALE_START0 ) { $this->VMin = 0; } + + foreach ( $Data as $Key => $Values ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if (isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + + if ( is_numeric($Value) ) + { + if ( $this->VMax < $Value) { $this->VMax = $Value; } + if ( $this->VMin > $Value) { $this->VMin = $Value; } + } + } + } + } + } + elseif ( $ScaleMode == SCALE_ADDALL || $ScaleMode == SCALE_ADDALLSTART0 ) /* Experimental */ + { + if ( $ScaleMode == SCALE_ADDALLSTART0 ) { $this->VMin = 0; } + + foreach ( $Data as $Key => $Values ) + { + $Sum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if (isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + if ( is_numeric($Value) ) + $Sum += $Value; + } + } + if ( $this->VMax < $Sum) { $this->VMax = $Sum; } + if ( $this->VMin > $Sum) { $this->VMin = $Sum; } + } + } + + if ( $this->VMax > preg_replace('/\.[0-9]+/','',$this->VMax) ) + $this->VMax = preg_replace('/\.[0-9]+/','',$this->VMax)+1; + + /* If all values are the same */ + if ( $this->VMax == $this->VMin ) + { + if ( $this->VMax >= 0 ) { $this->VMax++; } + else { $this->VMin--; } + } + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; + + if ( $this->VMin == 0 && $this->VMax == 0 ) + { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; + $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; + $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) + { + $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; + $this->VMax = $GridID * $Scale * $Factor; + $Divisions++; + } + + if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) + { + $GridID = floor( $this->VMin / $Scale / $Factor); + $this->VMin = $GridID * $Scale * $Factor; + $Divisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($Divisions) ) + $Divisions = 2; + + if ($Scale == 1 && $Divisions%2 == 1) + $Divisions--; + } + else + $Divisions = $this->Divisions; + + $this->DivisionCount = $Divisions; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; + $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; + + $this->GAreaXOffset = 0; + if ( count($Data) > 1 ) + { + if ( $WithMargin == FALSE ) + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)-1); + else + { + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)); + $this->GAreaXOffset = $this->DivisionWidth / 2; + } + } + else + { + $this->DivisionWidth = $this->GArea_X2 - $this->GArea_X1; + $this->GAreaXOffset = $this->DivisionWidth / 2; + } + + $this->DataCount = count($Data); + + if ( $DrawTicks == FALSE ) + return(0); + + $YPos = $this->GArea_Y2; $XMin = NULL; + for($i=1;$i<=$Divisions+1;$i++) + { + if ( $RightScale ) + $this->drawLine($this->GArea_X2,$YPos,$this->GArea_X2+5,$YPos,$R,$G,$B); + else + $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); + + $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + + if ( $RightScale ) + { + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+10,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + if ( $XMin < $this->GArea_X2+15+$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X2+15+$TextWidth; } + } + else + { + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } + } + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Write the Y Axis caption if set */ + if ( isset($DataDescription["Axis"]["Y"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); + $TextHeight = abs($Position[1])+abs($Position[3]); + $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); + + if ( $RightScale ) + imagettftext($this->Picture,$this->FontSize,90,$XMin+$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + else + imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + } + + /* Horizontal Axis */ + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $ID = 1; $YMax = NULL; + foreach ( $Data as $Key => $Values ) + { + if ( $ID % $SkipLabels == 0 ) + { + $this->drawLine(floor($XPos),$this->GArea_Y2,floor($XPos),$this->GArea_Y2+5,$R,$G,$B); + $Value = $Data[$Key][$DataDescription["Position"]]; + if ( $DataDescription["Format"]["X"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["X"]; + if ( $DataDescription["Format"]["X"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["X"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["X"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["X"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextHeight = abs($Position[1])+abs($Position[3]); + + if ( $Angle == 0 ) + { + $YPos = $this->GArea_Y2+18; + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); + } + else + { + $YPos = $this->GArea_Y2+10+$TextHeight; + if ( $Angle <= 90 ) + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + else + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + } + if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } + } + + $XPos = $XPos + $this->DivisionWidth; + $ID++; + } + + /* Write the X Axis caption if set */ + if ( isset($DataDescription["Axis"]["X"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); + imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); + } + } + + /* Compute and draw the scale for X/Y charts */ + function drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawScale",$Data); + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + + $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); + $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); + + /* Process Y scale */ + if ( $this->VMin == NULL && $this->VMax == NULL) + { + $this->VMin = $Data[0][$YSerieName]; + $this->VMax = $Data[0][$YSerieName]; + + foreach ( $Data as $Key => $Values ) + { + if (isset($Data[$Key][$YSerieName])) + { + $Value = $Data[$Key][$YSerieName]; + if ( $this->VMax < $Value) { $this->VMax = $Value; } + if ( $this->VMin > $Value) { $this->VMin = $Value; } + } + } + + if ( $this->VMax > preg_replace('/\.[0-9]+/','',$this->VMax) ) + $this->VMax = preg_replace('/\.[0-9]+/','',$this->VMax)+1; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; + + if ( $this->VMin == 0 && $this->VMax == 0 ) + { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; + $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; + $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) + { + $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; + $this->VMax = $GridID * $Scale * $Factor; + $Divisions++; + } + + if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) + { + $GridID = floor( $this->VMin / $Scale / $Factor); + $this->VMin = $GridID * $Scale * $Factor; + $Divisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($Divisions) ) + $Divisions = 2; + + if ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions-1))) + $Divisions--; + elseif ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions+1))) + $Divisions++; + } + else + $Divisions = $this->Divisions; + + $this->DivisionCount = $Divisions; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; + $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; + + $YPos = $this->GArea_Y2; $XMin = NULL; + for($i=1;$i<=$Divisions+1;$i++) + { + $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); + $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); + + if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Process X scale */ + if ( $this->VXMin == NULL && $this->VXMax == NULL) + { + $this->VXMin = $Data[0][$XSerieName]; + $this->VXMax = $Data[0][$XSerieName]; + + foreach ( $Data as $Key => $Values ) + { + if (isset($Data[$Key][$XSerieName])) + { + $Value = $Data[$Key][$XSerieName]; + if ( $this->VXMax < $Value) { $this->VXMax = $Value; } + if ( $this->VXMin > $Value) { $this->VXMin = $Value; } + } + } + + if ( $this->VXMax > preg_replace('/\.[0-9]+/','',$this->VXMax) ) + $this->VXMax = preg_replace('/\.[0-9]+/','',$this->VXMax)+1; + + $DataRange = $this->VMax - $this->VMin; + if ( $DataRange == 0 ) { $DataRange = .1; } + + /* Compute automatic scaling */ + $ScaleOk = FALSE; $Factor = 1; + $MinDivWidth = 25; $MaxDivs = ($this->GArea_X2 - $this->GArea_X1) / $MinDivWidth; + + if ( $this->VXMin == 0 && $this->VXMax == 0 ) + { $this->VXMin = 0; $this->VXMax = 2; $Scale = 1; $XDivisions = 2;} + elseif ($MaxDivs > 1) + { + while(!$ScaleOk) + { + $Scale1 = ( $this->VXMax - $this->VXMin ) / $Factor; + $Scale2 = ( $this->VXMax - $this->VXMin ) / $Factor / 2; + $Scale4 = ( $this->VXMax - $this->VXMin ) / $Factor / 4; + + if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale1); $Scale = 1;} + if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale2); $Scale = 2;} + if (!$ScaleOk) + { + if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } + if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } + } + } + + if ( floor($this->VXMax / $Scale / $Factor) != $this->VXMax / $Scale / $Factor) + { + $GridID = floor ( $this->VXMax / $Scale / $Factor) + 1; + $this->VXMax = $GridID * $Scale * $Factor; + $XDivisions++; + } + + if ( floor($this->VXMin / $Scale / $Factor) != $this->VXMin / $Scale / $Factor) + { + $GridID = floor( $this->VXMin / $Scale / $Factor); + $this->VXMin = $GridID * $Scale * $Factor; + $XDivisions++; + } + } + else /* Can occurs for small graphs */ + $Scale = 1; + + if ( !isset($XDivisions) ) + $XDivisions = 2; + + if ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions-1))) + $XDivisions--; + elseif ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions+1))) + $XDivisions++; + } + else + $XDivisions = $this->XDivisions; + + $this->XDivisionCount = $Divisions; + $this->DataCount = $Divisions + 2; + + $XDataRange = $this->VXMax - $this->VXMin; + if ( $XDataRange == 0 ) { $XDataRange = .1; } + + $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDivisions; + $this->XDivisionRatio = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDataRange; + + $XPos = $this->GArea_X1; $YMax = NULL; + for($i=1;$i<=$XDivisions+1;$i++) + { + $this->drawLine($XPos,$this->GArea_Y2,$XPos,$this->GArea_Y2+5,$R,$G,$B); + + $Value = $this->VXMin + ($i-1) * (( $this->VXMax - $this->VXMin ) / $XDivisions); + $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); + if ( $DataDescription["Format"]["Y"] == "number" ) + $Value = $Value.$DataDescription["Unit"]["Y"]; + if ( $DataDescription["Format"]["Y"] == "time" ) + $Value = $this->ToTime($Value); + if ( $DataDescription["Format"]["Y"] == "date" ) + $Value = $this->ToDate($Value); + if ( $DataDescription["Format"]["Y"] == "metric" ) + $Value = $this->ToMetric($Value); + if ( $DataDescription["Format"]["Y"] == "currency" ) + $Value = $this->ToCurrency($Value); + + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextHeight = abs($Position[1])+abs($Position[3]); + + if ( $Angle == 0 ) + { + $YPos = $this->GArea_Y2+18; + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); + } + else + { + $YPos = $this->GArea_Y2+10+$TextHeight; + if ( $Angle <= 90 ) + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + else + imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); + } + + if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } + + $XPos = $XPos + $this->DivisionWidth; + } + + /* Write the Y Axis caption if set */ + if ( isset($DataDescription["Axis"]["Y"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); + $TextHeight = abs($Position[1])+abs($Position[3]); + $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); + imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); + } + + /* Write the X Axis caption if set */ + if ( isset($DataDescription["Axis"]["X"]) ) + { + $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); + $TextWidth = abs($Position[2])+abs($Position[0]); + $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); + imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); + } + } + + /* Compute and draw the scale */ + function drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) + { + /* Draw mosaic */ + if ( $Mosaic ) + { + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Rectangle =$this->AllocateColor($this->Layers[0],250,250,250); + + $YPos = $LayerHeight; //$this->GArea_Y2-1; + $LastY = $YPos; + for($i=0;$i<=$this->DivisionCount;$i++) + { + $LastY = $YPos; + $YPos = $YPos - $this->DivisionHeight; + + if ( $YPos <= 0 ) { $YPos = 1; } + + if ( $i % 2 == 0 ) + { + imagefilledrectangle($this->Layers[0],1,$YPos,$LayerWidth-1,$LastY,$C_Rectangle); + } + } + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + /* Horizontal lines */ + $YPos = $this->GArea_Y2 - $this->DivisionHeight; + for($i=1;$i<=$this->DivisionCount;$i++) + { + if ( $YPos > $this->GArea_Y1 && $YPos < $this->GArea_Y2 ) + $this->drawDottedLine($this->GArea_X1,$YPos,$this->GArea_X2,$YPos,$LineWidth,$R,$G,$B); + + $YPos = $YPos - $this->DivisionHeight; + } + + /* Vertical lines */ + if ( $this->GAreaXOffset == 0 ) + { $XPos = $this->GArea_X1 + $this->DivisionWidth + $this->GAreaXOffset; $ColCount = $this->DataCount-2; } + else + { $XPos = $this->GArea_X1 + $this->GAreaXOffset; $ColCount = floor( ($this->GArea_X2 - $this->GArea_X1) / $this->DivisionWidth ); } + + for($i=1;$i<=$ColCount;$i++) + { + if ( $XPos > $this->GArea_X1 && $XPos < $this->GArea_X2 ) + $this->drawDottedLine(floor($XPos),$this->GArea_Y1,floor($XPos),$this->GArea_Y2,$LineWidth,$R,$G,$B); + $XPos = $XPos + $this->DivisionWidth; + } + } + + /* retrieve the legends size */ + function getLegendBoxSize($DataDescription) + { + if ( !isset($DataDescription["Description"]) ) + return(-1); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($DataDescription["Description"] as $Key => $Value) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 3; + $MaxWidth = $MaxWidth + 32; + + return(array($MaxWidth,$MaxHeight)); + } + + /* Draw the data legends */ + function drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=TRUE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLegend",$DataDescription); + + if ( !isset($DataDescription["Description"]) ) + return(-1); + + $C_TextColor =$this->AllocateColor($this->Picture,$Rt,$Gt,$Bt); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($DataDescription["Description"] as $Key => $Value) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 5; + $MaxWidth = $MaxWidth + 32; + + if ( $Rs == -1 || $Gs == -1 || $Bs == -1 ) + { $Rs = $R-30; $Gs = $G-30; $Bs = $B-30; } + + if ( $Border ) + { + $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$Rs,$Gs,$Bs); + $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); + } + + $YOffset = 4 + $this->FontSize; $ID = 0; + foreach($DataDescription["Description"] as $Key => $Value) + { + $this->drawFilledRoundedRectangle($XPos+10,$YPos+$YOffset-4,$XPos+14,$YPos+$YOffset-4,2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); + imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value); + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextHeight = $Position[1]-$Position[7]; + + $YOffset = $YOffset + $TextHeight + 4; + $ID++; + } + } + + /* Draw the data legends */ + function drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPieLegend",$DataDescription,FALSE); + $this->validateData("drawPieLegend",$Data); + + if ( !isset($DataDescription["Position"]) ) + return(-1); + + $C_TextColor =$this->AllocateColor($this->Picture,0,0,0); + + /* <-10->[8]<-4->Text<-10-> */ + $MaxWidth = 0; $MaxHeight = 8; + foreach($Data as $Key => $Value) + { + $Value2 = $Value[$DataDescription["Position"]]; + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value2); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[1]-$Position[7]; + if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } + + $MaxHeight = $MaxHeight + $TextHeight + 4; + } + $MaxHeight = $MaxHeight - 3; + $MaxWidth = $MaxWidth + 32; + + $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$R-30,$G-30,$B-30); + $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); + + $YOffset = 4 + $this->FontSize; $ID = 0; + foreach($Data as $Key => $Value) + { + $Value2 = $Value[$DataDescription["Position"]]; + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value2); + $TextHeight = $Position[1]-$Position[7]; + $this->drawFilledRectangle($XPos+10,$YPos+$YOffset-6,$XPos+14,$YPos+$YOffset-2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); + + imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value2); + $YOffset = $YOffset + $TextHeight + 4; + $ID++; + } + } + + /* Draw the graph title */ + function drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) + { + $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B); + + if ( $XPos2 != -1 ) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + $XPos = floor(( $XPos2 - $XPos - $TextWidth ) / 2 ) + $XPos; + } + + if ( $YPos2 != -1 ) + { + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); + $TextHeight = $Position[5]-$Position[3]; + $YPos = floor(( $YPos2 - $YPos - $TextHeight ) / 2 ) + $YPos; + } + + if ( $Shadow ) + { + $C_ShadowColor = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); + imagettftext($this->Picture,$this->FontSize,0,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$C_ShadowColor,$this->FontName,$Value); + } + + imagettftext($this->Picture,$this->FontSize,0,$XPos,$YPos,$C_TextColor,$this->FontName,$Value); + } + + /* Draw a text box with text align & alpha properties */ + function drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) + { + $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Text); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = $Position[5]-$Position[3]; + $AreaWidth = $X2 - $X1; + $AreaHeight = $Y2 - $Y1; + + if ( $BgR != -1 && $BgG != -1 && $BgB != -1 ) + $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$BgR,$BgG,$BgB,FALSE,$Alpha); + + if ( $Align == ALIGN_TOP_LEFT ) { $X = $X1+1; $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_TOP_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_TOP_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+$this->FontSize+1; } + if ( $Align == ALIGN_LEFT ) { $X = $X1+1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } + if ( $Align == ALIGN_BOTTOM_LEFT ) { $X = $X1+1; $Y = $Y2-1; } + if ( $Align == ALIGN_BOTTOM_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y2-1; } + if ( $Align == ALIGN_BOTTOM_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y2-1; } + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + $C_ShadowColor =$this->AllocateColor($this->Picture,0,0,0); + if ( $Shadow ) + imagettftext($this->Picture,$this->FontSize,$Angle,$X+1,$Y+1,$C_ShadowColor,$this->FontName,$Text); + + imagettftext($this->Picture,$this->FontSize,$Angle,$X,$Y,$C_TextColor,$this->FontName,$Text); + } + + /* Compute and draw the scale */ + function drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); + $Y = $this->GArea_Y2 - ($Value - $this->VMin) * $this->DivisionRatio; + + if ( $Y <= $this->GArea_Y1 || $Y >= $this->GArea_Y2 ) + return(-1); + + if ( $TickWidth == 0 ) + $this->drawLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$R,$G,$B); + else + $this->drawDottedLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$TickWidth,$R,$G,$B); + + if ( $ShowLabel ) + { + if ( $FreeText == NULL ) + { $Label = $Value; } else { $Label = $FreeText; } + + if ( $ShowOnRight ) + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+2,$Y+($this->FontSize/2),$C_TextColor,$this->FontName,$Label); + else + imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1+2,$Y-($this->FontSize/2),$C_TextColor,$this->FontName,$Label); + } + } + + /* This function put a label on a specific point */ + function setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("setLabel",$DataDescription); + $this->validateData("setLabel",$Data); + $ShadowFactor = 100; + $C_Label =$this->AllocateColor($this->Picture,$R,$G,$B); + $C_Shadow =$this->AllocateColor($this->Picture,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $C_TextColor =$this->AllocateColor($this->Picture,0,0,0); + + $Cp = 0; $Found = FALSE; + foreach ( $Data as $Key => $Value ) + { + if ( $Data[$Key][$DataDescription["Position"]] == $ValueName ) + { $NumericalValue = $Data[$Key][$SerieName]; $Found = TRUE; } + if ( !$Found ) + $Cp++; + } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset + ( $this->DivisionWidth * $Cp ) + 2; + $YPos = $this->GArea_Y2 - ($NumericalValue - $this->VMin) * $this->DivisionRatio; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextHeight = $Position[3] - $Position[5]; + $TextWidth = $Position[2]-$Position[0] + 2; + $TextOffset = floor($TextHeight/2); + + // Shadow + $Poly = array($XPos+1,$YPos+1,$XPos + 9,$YPos - $TextOffset,$XPos + 8,$YPos + $TextOffset + 2); + imagefilledpolygon($this->Picture,$Poly,3,$C_Shadow); + $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos - $TextOffset - .2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + $this->drawFilledRectangle($XPos + 9,$YPos - $TextOffset-.2,$XPos + 13 + $TextWidth,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); + + // Label background + $Poly = array($XPos,$YPos,$XPos + 8,$YPos - $TextOffset - 1,$XPos + 8,$YPos + $TextOffset + 1); + imagefilledpolygon($this->Picture,$Poly,3,$C_Label); + $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos - $TextOffset - 1.2,$R,$G,$B); + $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos + $TextOffset + 1.2,$R,$G,$B); + $this->drawFilledRectangle($XPos + 8,$YPos - $TextOffset - 1.2,$XPos + 12 + $TextWidth,$YPos + $TextOffset + 1.2,$R,$G,$B); + + imagettftext($this->Picture,$this->FontSize,0,$XPos + 10,$YPos + $TextOffset,$C_TextColor,$this->FontName,$Caption); + } + + /* This function draw a plot graph */ + function drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPlotGraph",$DataDescription); + $this->validateData("drawPlotGraph",$Data); + + $GraphID = 0; + $Ro = $R2; $Go = $G2; $Bo = $B2; + + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $R = $this->Palette[$ColorID]["R"]; + $G = $this->Palette[$ColorID]["G"]; + $B = $this->Palette[$ColorID]["B"]; + $R2 = $Ro; $G2 = $Go; $B2 = $Bo; + + if ( isset($DataDescription["Symbol"][$ColName]) ) + { + $Is_Alpha = ((ord ( file_get_contents ($DataDescription["Symbol"][$ColName], false, null, 25, 1)) & 6) & 4) == 4; + + $Infos = getimagesize($DataDescription["Symbol"][$ColName]); + $ImageWidth = $Infos[0]; + $ImageHeight = $Infos[1]; + $Symbol = imagecreatefromgif($DataDescription["Symbol"][$ColName]); + } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $Hsize = round($BigRadius/2); + $R3 = -1; $G3 = -1; $B3 = -1; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-$Hsize,$YPos-$Hsize,$XPos+1+$Hsize,$YPos+$Hsize+1,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Plot"); + + if ( is_numeric($Value) ) + { + if ( !isset($DataDescription["Symbol"][$ColName]) ) + { + + if ( $Shadow ) + { + if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) + $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); + else + { + $R3 = $this->Palette[$ColorID]["R"]-20; if ( $R3 < 0 ) { $R3 = 0; } + $G3 = $this->Palette[$ColorID]["G"]-20; if ( $G3 < 0 ) { $G3 = 0; } + $B3 = $this->Palette[$ColorID]["B"]-20; if ( $B3 < 0 ) { $B3 = 0; } + $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); + } + } + + $this->drawFilledCircle($XPos+1,$YPos+1,$BigRadius,$R,$G,$B); + + if ( $SmallRadius != 0 ) + { + if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) + $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); + else + { + $R2 = $this->Palette[$ColorID]["R"]-15; if ( $R2 < 0 ) { $R2 = 0; } + $G2 = $this->Palette[$ColorID]["G"]-15; if ( $G2 < 0 ) { $G2 = 0; } + $B2 = $this->Palette[$ColorID]["B"]-15; if ( $B2 < 0 ) { $B2 = 0; } + + $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); + } + } + } + else + { + imagecopymerge($this->Picture,$Symbol,$XPos+1-$ImageWidth/2,$YPos+1-$ImageHeight/2,0,0,$ImageWidth,$ImageHeight,100); + } + } + + $XPos = $XPos + $this->DivisionWidth; + } + $GraphID++; + } + } + + /* This function draw a plot graph in an X/Y space */ + function drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=TRUE) + { + $R = $this->Palette[$PaletteID]["R"]; + $G = $this->Palette[$PaletteID]["G"]; + $B = $this->Palette[$PaletteID]["B"]; + $R3 = -1; $G3 = -1; $B3 = -1; + + $YLast = -1; $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) + { + $X = $Data[$Key][$XSerieName]; + $Y = $Data[$Key][$YSerieName]; + + $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); + $X = $this->GArea_X1 + (($X-$this->VXMin) * $this->XDivisionRatio); + + + if ( $Shadow ) + { + if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) + $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); + else + { + $R3 = $this->Palette[$PaletteID]["R"]-20; if ( $R < 0 ) { $R = 0; } + $G3 = $this->Palette[$PaletteID]["G"]-20; if ( $G < 0 ) { $G = 0; } + $B3 = $this->Palette[$PaletteID]["B"]-20; if ( $B < 0 ) { $B = 0; } + $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); + } + } + + $this->drawFilledCircle($X+1,$Y+1,$BigRadius,$R,$G,$B); + + if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) + $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); + else + { + $R2 = $this->Palette[$PaletteID]["R"]+20; if ( $R > 255 ) { $R = 255; } + $G2 = $this->Palette[$PaletteID]["G"]+20; if ( $G > 255 ) { $G = 255; } + $B2 = $this->Palette[$PaletteID]["B"]+20; if ( $B > 255 ) { $B = 255; } + $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); + } + } + } + + } + + /* This function draw an area between two series */ + function drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) + { + /* Validate the Data and DataDescription array */ + $this->validateData("drawArea",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Graph =$this->AllocateColor($this->Layers[0],$R,$G,$B); + + $XPos = $this->GAreaXOffset; + $LastXPos = -1; + foreach ( $Data as $Key => $Values ) + { + $Value1 = $Data[$Key][$Serie1]; + $Value2 = $Data[$Key][$Serie2]; + $YPos1 = $LayerHeight - (($Value1-$this->VMin) * $this->DivisionRatio); + $YPos2 = $LayerHeight - (($Value2-$this->VMin) * $this->DivisionRatio); + + if ( $LastXPos != -1 ) + { + $Points = ""; + $Points[] = $LastXPos; $Points[] = $LastYPos1; + $Points[] = $LastXPos; $Points[] = $LastYPos2; + $Points[] = $XPos; $Points[] = $YPos2; + $Points[] = $XPos; $Points[] = $YPos1; + + imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); + } + + $LastYPos1 = $YPos1; + $LastYPos2 = $YPos2; + $LastXPos = $XPos; + + $XPos = $XPos + $this->DivisionWidth; + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + + /* This function write the values of the specified series */ + function writeValues($Data,$DataDescription,$Series) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("writeValues",$DataDescription); + $this->validateData("writeValues",$Data); + + if ( !is_array($Series) ) { $Series = array($Series); } + + foreach($Series as $Key => $Serie) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $Serie ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$Serie]) && is_numeric($Data[$Key][$Serie])) + { + $Value = $Data[$Key][$Serie]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Value); + $Width = $Positions[2] - $Positions[6]; $XOffset = $XPos - ($Width/2); + $Height = $Positions[3] - $Positions[7]; $YOffset = $YPos - 4; + + $C_TextColor =$this->AllocateColor($this->Picture,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagettftext($this->Picture,$this->FontSize,0,$XOffset,$YOffset,$C_TextColor,$this->FontName,$Value); + } + $XPos = $XPos + $this->DivisionWidth; + } + + } + } + + /* This function draw a line graph */ + function drawLineGraph($Data,$DataDescription,$SerieName="") + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLineGraph",$DataDescription); + $this->validateData("drawLineGraph",$Data); + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + if ( $SerieName == "" || $SerieName == $ColName ) + { + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Line"); + + if (!is_numeric($Value)) { $XLast = -1; } + if ( $XLast != -1 ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + + $XLast = $XPos; + $YLast = $YPos; + if (!is_numeric($Value)) { $XLast = -1; } + } + $XPos = $XPos + $this->DivisionWidth; + } + $GraphID++; + } + } + } + + /* This function draw a line graph */ + function drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) + { + $YLast = -1; $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) + { + $X = $Data[$Key][$XSerieName]; + $Y = $Data[$Key][$YSerieName]; + + $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); + $X = $this->GArea_X1 + (($X-$this->VXMin) * $this->XDivisionRatio); + + if ($XLast != -1 && $YLast != -1) + { + $this->drawLine($XLast,$YLast,$X,$Y,$this->Palette[$PaletteID]["R"],$this->Palette[$PaletteID]["G"],$this->Palette[$PaletteID]["B"],TRUE); + } + + $XLast = $X; + $YLast = $Y; + } + } + } + + /* This function draw a cubic curve */ + function drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawCubicCurve",$DataDescription); + $this->validateData("drawCubicCurve",$Data); + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $SerieName == "" || $SerieName == $ColName ) + { + $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; + $XIn[0] = 0; $YIn[0] = 0; + + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Index = 1; + $XLast = -1; $Missing = ""; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + $XIn[$Index] = $Index; + $YIn[$Index] = $Value; + if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } + $Index++; + } + } + $Index--; + + $Yt[0] = 0; + $Yt[1] = 0; + $U[1] = 0; + for($i=2;$i<=$Index-1;$i++) + { + $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); + $p = $Sig * $Yt[$i-1] + 2; + $Yt[$i] = ($Sig - 1) / $p; + $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); + $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; + } + + $qn = 0; + $un = 0; + $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); + + for($k=$Index-1;$k>=1;$k--) + $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; + + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + for($X=1;$X<=$Index;$X=$X+$Accuracy) + { + $klo = 1; + $khi = $Index; + $k = $khi - $klo; + while($k > 1) + { + $k = $khi - $klo; + If ( $XIn[$k] >= $X ) + $khi = $k; + else + $klo = $k; + } + $klo = $khi - 1; + + $h = $XIn[$khi] - $XIn[$klo]; + $a = ($XIn[$khi] - $X) / $h; + $b = ($X - $XIn[$klo]) / $h; + $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; + + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + if ( $XLast != -1 && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)]) ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + + $XLast = $XPos; + $YLast = $YPos; + $XPos = $XPos + $this->DivisionWidth * $Accuracy; + } + + // Add potentialy missing values + $XPos = $XPos - $this->DivisionWidth * $Accuracy; + if ( $XPos < ($this->GArea_X2 - $this->GAreaXOffset) ) + { + $YPos = $this->GArea_Y2 - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); + $this->drawLine($XLast,$YLast,$this->GArea_X2-$this->GAreaXOffset,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + } + + $GraphID++; + } + } + } + + /* This function draw a filled cubic curve */ + function drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledCubicCurve",$DataDescription); + $this->validateData("drawFilledCubicCurve",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; + $XIn[0] = 0; $YIn[0] = 0; + + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Index = 1; + $XLast = -1; $Missing = ""; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $XIn[$Index] = $Index; + $YIn[$Index] = $Value; + if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } + $Index++; + } + $Index--; + + $Yt[0] = 0; + $Yt[1] = 0; + $U[1] = 0; + for($i=2;$i<=$Index-1;$i++) + { + $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); + $p = $Sig * $Yt[$i-1] + 2; + $Yt[$i] = ($Sig - 1) / $p; + $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); + $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; + } + + $qn = 0; + $un = 0; + $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); + + for($k=$Index-1;$k>=1;$k--) + $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; + + $Points = ""; + $Points[] = $this->GAreaXOffset; + $Points[] = $LayerHeight; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White =$this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $YLast = NULL; + $XPos = $this->GAreaXOffset; $PointsCount = 2; + for($X=1;$X<=$Index;$X=$X+$Accuracy) + { + $klo = 1; + $khi = $Index; + $k = $khi - $klo; + while($k > 1) + { + $k = $khi - $klo; + If ( $XIn[$k] >= $X ) + $khi = $k; + else + $klo = $k; + } + $klo = $khi - 1; + + $h = $XIn[$khi] - $XIn[$klo]; + $a = ($XIn[$khi] - $X) / $h; + $b = ($X - $XIn[$klo]) / $h; + $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; + + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + if ( $YLast != NULL && $AroundZero && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)])) + { + $aPoints = ""; + $aPoints[] = $XLast; + $aPoints[] = $YLast; + $aPoints[] = $XPos; + $aPoints[] = $YPos; + $aPoints[] = $XPos; + $aPoints[] = $YZero; + $aPoints[] = $XLast; + $aPoints[] = $YZero; + + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); + } + + if ( !isset($Missing[floor($X)]) || $YLast == NULL ) + { + $PointsCount++; + $Points[] = $XPos; + $Points[] = $YPos; + } + else + { + $PointsCount++; $Points[] = $XLast; $Points[] = $LayerHeight; + } + + $YLast = $YPos; $XLast = $XPos; + $XPos = $XPos + $this->DivisionWidth * $Accuracy; + } + + // Add potentialy missing values + $XPos = $XPos - $this->DivisionWidth * $Accuracy; + if ( $XPos < ($LayerWidth-$this->GAreaXOffset) ) + { + $YPos = $LayerHeight - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); + + if ( $YLast != NULL && $AroundZero ) + { + $aPoints = ""; + $aPoints[] = $XLast; + $aPoints[] = $YLast; + $aPoints[] = $LayerWidth-$this->GAreaXOffset; + $aPoints[] = $YPos; + $aPoints[] = $LayerWidth-$this->GAreaXOffset; + $aPoints[] = $YZero; + $aPoints[] = $XLast; + $aPoints[] = $YZero; + + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); + } + + if ( $YIn[$klo] != "" && $YIn[$khi] != "" || $YLast == NULL ) + { + $PointsCount++; + $Points[] = $LayerWidth-$this->GAreaXOffset; + $Points[] = $YPos; + } + } + + $Points[] = $LayerWidth-$this->GAreaXOffset; + $Points[] = $LayerHeight; + + if ( !$AroundZero ) + { + $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Points,$PointsCount,$C_Graph); + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + + $this->drawCubicCurve($Data,$DataDescription,$Accuracy,$ColName); + + $GraphID++; + } + } + + /* This function draw a filled line graph */ + function drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) + { + $Empty = -2147483647; + + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledLineGraph",$DataDescription); + $this->validateData("drawFilledLineGraph",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $aPoints = ""; + $aPoints[] = $this->GAreaXOffset; + $aPoints[] = $LayerHeight; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $XPos = $this->GAreaXOffset; + $XLast = -1; $PointsCount = 2; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } + + $YLast = $Empty; + foreach ( $Data as $Key => $Values ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"FLine"); + + if ( !is_numeric($Value) ) + { + $PointsCount++; + $aPoints[] = $XLast; + $aPoints[] = $LayerHeight; + + $YLast = $Empty; + } + else + { + $PointsCount++; + if ( $YLast <> $Empty ) + { $aPoints[] = $XPos; $aPoints[] = $YPos; } + else + { $PointsCount++; $aPoints[] = $XPos; $aPoints[] = $LayerHeight; $aPoints[] = $XPos; $aPoints[] = $YPos; } + + if ($YLast <> $Empty && $AroundZero) + { + $Points = ""; + $Points[] = $XLast; $Points[] = $YLast; + $Points[] = $XPos; + $Points[] = $YPos; + $Points[] = $XPos; + $Points[] = $YZero; + $Points[] = $XLast; + $Points[] = $YZero; + + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); + } + $YLast = $YPos; + } + + $XLast = $XPos; + $XPos = $XPos + $this->DivisionWidth; + } + $aPoints[] = $LayerWidth - $this->GAreaXOffset; + $aPoints[] = $LayerHeight; + + if ( $AroundZero == FALSE ) + { + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$aPoints,$PointsCount,$C_Graph); + } + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + $GraphID++; + $this->drawLineGraph($Data,$DataDescription,$ColName); + } + } + + /* This function draw a bar graph */ + function drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawOverlayBarGraph",$DataDescription); + $this->validateData("drawOverlayBarGraph",$Data); + + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $this->Layers[$GraphID] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[$GraphID],255,255,255); + $C_Graph = $this->AllocateColor($this->Layers[$GraphID],$this->Palette[$GraphID]["R"],$this->Palette[$GraphID]["G"],$this->Palette[$GraphID]["B"]); + imagefilledrectangle($this->Layers[$GraphID],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[$GraphID],$C_White); + + $XWidth = $this->DivisionWidth / 4; + $XPos = $this->GAreaXOffset; + $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); + $XLast = -1; $PointsCount = 2; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + if ( is_numeric($Value) ) + { + $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); + + imagefilledrectangle($this->Layers[$GraphID],$XPos-$XWidth,$YPos,$XPos+$XWidth,$YZero,$C_Graph); + + $X1 = floor($XPos - $XWidth + $this->GArea_X1); $Y1 = floor($YPos+$this->GArea_Y1) + .2; + $X2 = floor($XPos + $XWidth + $this->GArea_X1); $Y2 = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } + if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($X1,min($Y1,$Y2),$X2,max($Y1,$Y2),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"oBar"); + + $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + + $GraphID++; + } + + for($i=0;$i<=($GraphID-1);$i++) + { + imagecopymerge($this->Picture,$this->Layers[$i],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[$i]); + } + } + + /* This function draw a bar graph */ + function drawBarGraph($Data,$DataDescription,$Shadow=FALSE,$Alpha=100) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBarGraph",$DataDescription); + $this->validateData("drawBarGraph",$Data); + + $GraphID = 0; + $Series = count($DataDescription["Values"]); + $SeriesWidth = $this->DivisionWidth / ($Series+1); + $SerieXOffset = $this->DivisionWidth / 2 - $SeriesWidth / 2; + + $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } + + $SerieID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SerieXOffset + $SeriesWidth * $SerieID; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + if ( is_numeric($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + { + $this->addToImageMap($XPos+1,min($YZero,$YPos),$XPos+$SeriesWidth-1,max($YZero,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Bar"); + } + + if ( $Shadow && $Alpha == 100 ) + $this->drawRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,25,25,25,TRUE,$Alpha); + + $this->drawFilledRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + $SerieID++; + } + } + + /* This function draw a stacked bar graph */ + function drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBarGraph",$DataDescription); + $this->validateData("drawBarGraph",$Data); + + $GraphID = 0; + $Series = count($DataDescription["Values"]); + if ( $Contiguous ) + $SeriesWidth = $this->DivisionWidth; + else + $SeriesWidth = $this->DivisionWidth * .8; + + $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); + if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } + + $SerieID = 0; $LastValue = ""; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SeriesWidth / 2; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + if ( is_numeric($Data[$Key][$ColName]) ) + { + $Value = $Data[$Key][$ColName]; + + if ( isset($LastValue[$Key]) ) + { + $YPos = $this->GArea_Y2 - ((($Value+$LastValue[$Key])-$this->VMin) * $this->DivisionRatio); + $YBottom = $this->GArea_Y2 - (($LastValue[$Key]-$this->VMin) * $this->DivisionRatio); + $LastValue[$Key] += $Value; + } + else + { + $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); + $YBottom = $YZero; + $LastValue[$Key] = $Value; + } + + /* Save point into the image map if option activated */ + if ( $this->BuildMap ) + $this->addToImageMap($XPos+1,min($YBottom,$YPos),$XPos+$SeriesWidth-1,max($YBottom,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"sBar"); + + $this->drawFilledRectangle($XPos+1,$YBottom,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); + } + } + $XPos = $XPos + $this->DivisionWidth; + } + $SerieID++; + } + } + + /* This function draw a limits bar graphs */ + function drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawLimitsGraph",$DataDescription); + $this->validateData("drawLimitsGraph",$Data); + + $XWidth = $this->DivisionWidth / 4; + $XPos = $this->GArea_X1 + $this->GAreaXOffset; + + foreach ( $Data as $Key => $Values ) + { + $Min = $Data[$Key][$DataDescription["Values"][0]]; + $Max = $Data[$Key][$DataDescription["Values"][0]]; + $GraphID = 0; $MaxID = 0; $MinID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( isset($Data[$Key][$ColName]) ) + { + if ( $Data[$Key][$ColName] > $Max && is_numeric($Data[$Key][$ColName])) + { $Max = $Data[$Key][$ColName]; $MaxID = $GraphID; } + } + if ( isset($Data[$Key][$ColName]) && is_numeric($Data[$Key][$ColName])) + { + if ( $Data[$Key][$ColName] < $Min ) + { $Min = $Data[$Key][$ColName]; $MinID = $GraphID; } + $GraphID++; + } + } + + $YPos = $this->GArea_Y2 - (($Max-$this->VMin) * $this->DivisionRatio); + $X1 = floor($XPos - $XWidth); $Y1 = floor($YPos) - .2; + $X2 = floor($XPos + $XWidth); + if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } + if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } + + $YPos = $this->GArea_Y2 - (($Min-$this->VMin) * $this->DivisionRatio); + $Y2 = floor($YPos) + .2; + + $this->drawLine(floor($XPos)-.2,$Y1+1,floor($XPos)-.2,$Y2-1,$R,$G,$B,TRUE); + $this->drawLine(floor($XPos)+.2,$Y1+1,floor($XPos)+.2,$Y2-1,$R,$G,$B,TRUE); + $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$MaxID]["R"],$this->Palette[$MaxID]["G"],$this->Palette[$MaxID]["B"],FALSE); + $this->drawLine($X1,$Y2,$X2,$Y2,$this->Palette[$MinID]["R"],$this->Palette[$MinID]["G"],$this->Palette[$MinID]["B"],FALSE); + + $XPos = $XPos + $this->DivisionWidth; + } + } + + /* This function draw radar axis centered on the graph area */ + function drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawRadarAxis",$DataDescription); + $this->validateData("drawRadarAxis",$Data); + + $C_TextColor = $this->AllocateColor($this->Picture,$A_R,$A_G,$A_B); + + /* Draw radar axis */ + $Points = count($Data); + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + /* Draw the mosaic */ + if ( $Mosaic ) + { + $RadiusScale = $Radius / $MaxValue; + for ( $t=1; $t<=$MaxValue-1; $t++) + { + $TRadius = $RadiusScale * $t; + $LastX1 = -1; + + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X1 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y1 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + $X2 = cos($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $XCenter; + $Y2 = sin($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $YCenter; + + if ( $t % 2 == 1 && $LastX1 != -1) + { + $Plots = ""; + $Plots[] = $X1; $Plots[] = $Y1; + $Plots[] = $X2; $Plots[] = $Y2; + $Plots[] = $LastX2; $Plots[] = $LastY2; + $Plots[] = $LastX1; $Plots[] = $LastY1; + + $C_Graph = $this->AllocateColor($this->Picture,250,250,250); + imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_Graph); + } + + $LastX1 = $X1; $LastY1= $Y1; + $LastX2 = $X2; $LastY2= $Y2; + } + } + } + + + /* Draw the spider web */ + for ( $t=1; $t<=$MaxValue; $t++) + { + $TRadius = ( $Radius / $MaxValue ) * $t; + $LastX = -1; + + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + + if ( $LastX != -1 ) + $this->drawDottedLine($LastX,$LastY,$X,$Y,4,$S_R,$S_G,$S_B); + + $LastX = $X; $LastY= $Y; + } + } + + /* Draw the axis */ + for ( $i=0; $i<=$Points; $i++) + { + $Angle = -90 + $i * 360/$Points; + $X = cos($Angle * 3.1418 / 180 ) * $Radius + $XCenter; + $Y = sin($Angle * 3.1418 / 180 ) * $Radius + $YCenter; + + $this->drawLine($XCenter,$YCenter,$X,$Y,$A_R,$A_G,$A_B); + + $XOffset = 0; $YOffset = 0; + if (isset($Data[$i][$DataDescription["Position"]])) + { + $Label = $Data[$i][$DataDescription["Position"]]; + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Label); + $Width = $Positions[2] - $Positions[6]; + $Height = $Positions[3] - $Positions[7]; + + if ( $Angle >= 0 && $Angle <= 90 ) + $YOffset = $Height; + + if ( $Angle > 90 && $Angle <= 180 ) + { $YOffset = $Height; $XOffset = -$Width; } + + if ( $Angle > 180 && $Angle <= 270 ) + { $XOffset = -$Width; } + + imagettftext($this->Picture,$this->FontSize,0,$X+$XOffset,$Y+$YOffset,$C_TextColor,$this->FontName,$Label); + } + } + + /* Write the values */ + for ( $t=1; $t<=$MaxValue; $t++) + { + $TRadius = ( $Radius / $MaxValue ) * $t; + + $Angle = -90 + 360 / $Points; + $X1 = $XCenter; + $Y1 = $YCenter - $TRadius; + $X2 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; + $Y2 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; + + $XPos = floor(($X2-$X1)/2) + $X1; + $YPos = floor(($Y2-$Y1)/2) + $Y1; + + $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$t); + $X = $XPos - ( $X+$Positions[2] - $X+$Positions[6] ) / 2; + $Y = $YPos + $this->FontSize; + + $this->drawFilledRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,240,240,240); + $this->drawRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,220,220,220); + imagettftext($this->Picture,$this->FontSize,0,$X,$Y,$C_TextColor,$this->FontName,$t); + } + } + + /* This function draw a radar graph centered on the graph area */ + function drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawRadar",$DataDescription); + $this->validateData("drawRadar",$Data); + + $Points = count($Data); + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Angle = -90; + $XLast = -1; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + $Strength = ( $Radius / $MaxValue ) * $Value; + + $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; + $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; + + if ( $XLast != -1 ) + $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + + if ( $XLast == -1 ) + { $FirstX = $XPos; $FirstY = $YPos; } + + $Angle = $Angle + (360/$Points); + $XLast = $XPos; + $YLast = $YPos; + } + } + $this->drawLine($XPos,$YPos,$FirstX,$FirstY,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + $GraphID++; + } + } + + /* This function draw a radar graph centered on the graph area */ + function drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFilledRadar",$DataDescription); + $this->validateData("drawFilledRadar",$Data); + + $Points = count($Data); + $LayerWidth = $this->GArea_X2-$this->GArea_X1; + $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; + $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; + $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2; + $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2; + + /* Search for the max value */ + if ( $MaxValue == -1 ) + { + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + if ( $Data[$Key][$ColName] > $MaxValue && is_numeric($Data[$Key][$ColName])) { $MaxValue = $Data[$Key][$ColName]; } + } + } + } + + $GraphID = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + $ID = 0; + foreach ( $DataDescription["Description"] as $keyI => $ValueI ) + { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } + + $Angle = -90; + $XLast = -1; + $Plots = ""; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + { + $Value = $Data[$Key][$ColName]; + if ( !is_numeric($Value) ) { $Value = 0; } + $Strength = ( $Radius / $MaxValue ) * $Value; + + $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; + $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; + + $Plots[] = $XPos; + $Plots[] = $YPos; + + $Angle = $Angle + (360/$Points); + $XLast = $XPos; + $YLast = $YPos; + } + } + + if (isset($Plots[0])) + { + $Plots[] = $Plots[0]; + $Plots[] = $Plots[1]; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + imagefilledpolygon($this->Layers[0],$Plots,(count($Plots)+1)/2,$C_Graph); + + imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + + for($i=0;$i<=count($Plots)-4;$i=$i+2) + $this->drawLine($Plots[$i]+$this->GArea_X1,$Plots[$i+1]+$this->GArea_Y1,$Plots[$i+2]+$this->GArea_X1,$Plots[$i+3]+$this->GArea_Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); + } + + $GraphID++; + } + } + + /* This function draw a flat pie chart */ + function drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawBasicPieGraph",$DataDescription,FALSE); + $this->validateData("drawBasicPieGraph",$Data); + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + RaiseFatal("Pie chart can only accept one serie of data."); + + $SpliceRatio = 360 / $PieSum; + $SplicePercent = 100 / $PieSum; + + /* Calculate all polygons */ + $Angle = 0; $TopPlots = ""; + foreach($iValues as $Key => $Value) + { + $TopPlots[$Key][] = $XPos; + $TopPlots[$Key][] = $YPos; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $YPos + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; + $TopY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos; + + $TopPlots[$Key][] = $TopX; + $TopPlots[$Key][] = $TopY; + } + + $TopPlots[$Key][] = $XPos; + $TopPlots[$Key][] = $YPos; + + $Angle = $iAngle; + } + $PolyPlots = $TopPlots; + + /* Set array values type to float --- PHP Bug with imagefilledpolygon casting to integer */ + foreach ($TopPlots as $Key => $Value) + { foreach ($TopPlots[$Key] as $Key2 => $Value2) { settype($TopPlots[$Key][$Key2],"float"); } } + + /* Draw Top polygons */ + foreach ($PolyPlots as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); + } + + $this->drawCircle($XPos-.5,$YPos-.5,$Radius,$R,$G,$B); + $this->drawCircle($XPos-.5,$YPos-.5,$Radius+.5,$R,$G,$B); + + /* Draw Top polygons */ + foreach ($TopPlots as $Key => $Value) + { + for($j=0;$j<=count($TopPlots[$Key])-4;$j=$j+2) + $this->drawLine($TopPlots[$Key][$j],$TopPlots[$Key][$j+1],$TopPlots[$Key][$j+2],$TopPlots[$Key][$j+3],$R,$G,$B); + } + } + + function drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0) + { + $this->drawFlatPieGraph($Data,$DataDescription,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$Radius,PIE_NOLABEL,$SpliceDistance,$Decimals,TRUE); + $this->drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius,$DrawLabels,$SpliceDistance,$Decimals,FALSE); + } + + /* This function draw a flat pie chart */ + function drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0,$AllBlack=FALSE) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawFlatPieGraph",$DataDescription,FALSE); + $this->validateData("drawFlatPieGraph",$Data); + + $ShadowStatus = $this->ShadowActive ; $this->ShadowActive = FALSE; + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + { + if ( isset($Data[$Key][$ColName])) + $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + { + RaiseFatal("Pie chart can only accept one serie of data."); + return(0); + } + + $SpliceRatio = 360 / $PieSum; + $SplicePercent = 100 / $PieSum; + + /* Calculate all polygons */ + $Angle = 0; $TopPlots = ""; + foreach($iValues as $Key => $Value) + { + $XOffset = cos(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; + $YOffset = sin(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; + + $TopPlots[$Key][] = round($XPos + $XOffset); + $TopPlots[$Key][] = round($YPos + $YOffset); + + if ( $AllBlack ) + { $Rc = $this->ShadowRColor; $Gc = $this->ShadowGColor; $Bc = $this->ShadowBColor; } + else + { $Rc = $this->Palette[$Key]["R"]; $Gc = $this->Palette[$Key]["G"]; $Bc = $this->Palette[$Key]["B"]; } + + $XLineLast = ""; $YLineLast = ""; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $YPos + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+$SpliceDistance+4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + if ( !$AllBlack ) + $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); + else + $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); + + $XLineLast = ""; $YLineLast = ""; + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $PosX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos + $XOffset; + $PosY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos + $YOffset; + + $TopPlots[$Key][] = round($PosX); $TopPlots[$Key][] = round($PosY); + + if ( $iAngle == $Angle || $iAngle == $Angle+$Value*$SpliceRatio || $iAngle +.5 > $Angle+$Value*$SpliceRatio) + $this->drawLine($XPos+$XOffset,$YPos+$YOffset,$PosX,$PosY,$Rc,$Gc,$Bc); + + if ( $XLineLast != "" ) + $this->drawLine($XLineLast,$YLineLast,$PosX,$PosY,$Rc,$Gc,$Bc); + + $XLineLast = $PosX; $YLineLast = $PosY; + } + + $TopPlots[$Key][] = round($XPos + $XOffset); $TopPlots[$Key][] = round($YPos + $YOffset); + + $Angle = $iAngle; + } + $PolyPlots = $TopPlots; + + /* Draw Top polygons */ + foreach ($PolyPlots as $Key => $Value) + { + if ( !$AllBlack ) + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + else + $C_GraphLo = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); + + imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); + } + $this->ShadowActive = $ShadowStatus; + } + + /* This function draw a pseudo-3D pie chart */ + function drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) + { + /* Validate the Data and DataDescription array */ + $this->validateDataDescription("drawPieGraph",$DataDescription,FALSE); + $this->validateData("drawPieGraph",$Data); + + /* Determine pie sum */ + $Series = 0; $PieSum = 0; $rPieSum = 0; + foreach ( $DataDescription["Values"] as $Key2 => $ColName ) + { + if ( $ColName != $DataDescription["Position"] ) + { + $Series++; + foreach ( $Data as $Key => $Values ) + if ( isset($Data[$Key][$ColName])) + { + if ( $Data[$Key][$ColName] == 0 ) + { $iValues[] = 0; $rValues[] = 0; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; } + // Removed : $PieSum++; $rValues[] = 1; + else + { $PieSum += $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; $rValues[] = $Data[$Key][$ColName]; $rPieSum += $Data[$Key][$ColName];} + } + } + } + + /* Validate serie */ + if ( $Series != 1 ) + RaiseFatal("Pie chart can only accept one serie of data."); + + $SpliceDistanceRatio = $SpliceDistance; + $SkewHeight = ($Radius * $Skew) / 100; + $SpliceRatio = (360 - $SpliceDistanceRatio * count($iValues) ) / $PieSum; + $SplicePercent = 100 / $PieSum; + $rSplicePercent = 100 / $rPieSum; + + /* Calculate all polygons */ + $Angle = 0; $CDev = 5; + $TopPlots = ""; $BotPlots = ""; + $aTopPlots = ""; $aBotPlots = ""; + foreach($iValues as $Key => $Value) + { + $XCenterPos = cos(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; + $YCenterPos = sin(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; + $XCenterPos2 = cos(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; + $YCenterPos2 = sin(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; + + $TopPlots[$Key][] = round($XCenterPos); $BotPlots[$Key][] = round($XCenterPos); + $TopPlots[$Key][] = round($YCenterPos); $BotPlots[$Key][] = round($YCenterPos + $SpliceHeight); + $aTopPlots[$Key][] = $XCenterPos; $aBotPlots[$Key][] = $XCenterPos; + $aTopPlots[$Key][] = $YCenterPos; $aBotPlots[$Key][] = $YCenterPos + $SpliceHeight; + + /* Process labels position & size */ + $Caption = ""; + if ( !($DrawLabels == PIE_NOLABEL) ) + { + $TAngle = $Angle+($Value*$SpliceRatio/2); + if ($DrawLabels == PIE_PERCENTAGE) + $Caption = (round($rValues[$Key] * pow(10,$Decimals) * $rSplicePercent)/pow(10,$Decimals))."%"; + elseif ($DrawLabels == PIE_LABELS) + $Caption = $iLabels[$Key]; + elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) + $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; + + $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); + $TextWidth = $Position[2]-$Position[0]; + $TextHeight = abs($Position[1])+abs($Position[3]); + + $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius + 10)+ $XPos; + + if ( $TAngle > 0 && $TAngle < 180 ) + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 10) + $YPos + $SpliceHeight + 4; + else + $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 4) + $YPos - ($TextHeight/2); + + if ( $TAngle > 90 && $TAngle < 270 ) + $TX = $TX - $TextWidth; + + $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); + imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); + } + + /* Process pie slices */ + for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) + { + $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; + $TopY = sin($iAngle * 3.1418 / 180 ) * $SkewHeight + $YPos; + + $TopPlots[$Key][] = round($TopX); $BotPlots[$Key][] = round($TopX); + $TopPlots[$Key][] = round($TopY); $BotPlots[$Key][] = round($TopY + $SpliceHeight); + $aTopPlots[$Key][] = $TopX; $aBotPlots[$Key][] = $TopX; + $aTopPlots[$Key][] = $TopY; $aBotPlots[$Key][] = $TopY + $SpliceHeight; + } + + $TopPlots[$Key][] = round($XCenterPos2); $BotPlots[$Key][] = round($XCenterPos2); + $TopPlots[$Key][] = round($YCenterPos2); $BotPlots[$Key][] = round($YCenterPos2 + $SpliceHeight); + $aTopPlots[$Key][] = $XCenterPos2; $aBotPlots[$Key][] = $XCenterPos2; + $aTopPlots[$Key][] = $YCenterPos2; $aBotPlots[$Key][] = $YCenterPos2 + $SpliceHeight; + + $Angle = $iAngle + $SpliceDistanceRatio; + } + + /* Draw Bottom polygons */ + foreach($iValues as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-20); + imagefilledpolygon($this->Picture,$BotPlots[$Key],(count($BotPlots[$Key])+1)/2,$C_GraphLo); + + if ( $EnhanceColors ) { $En = -10; } else { $En = 0; } + + for($j=0;$j<=count($aBotPlots[$Key])-4;$j=$j+2) + $this->drawLine($aBotPlots[$Key][$j],$aBotPlots[$Key][$j+1],$aBotPlots[$Key][$j+2],$aBotPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); + } + + /* Draw pie layers */ + if ( $EnhanceColors ) { $ColorRatio = 30 / $SpliceHeight; } else { $ColorRatio = 25 / $SpliceHeight; } + for($i=$SpliceHeight-1;$i>=1;$i--) + { + foreach($iValues as $Key => $Value) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-10); + $Plots = ""; $Plot = 0; + foreach($TopPlots[$Key] as $Key2 => $Value2) + { + $Plot++; + if ( $Plot % 2 == 1 ) + $Plots[] = $Value2; + else + $Plots[] = $Value2+$i; + } + imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_GraphLo); + + $Index = count($Plots); + if ($EnhanceColors ) {$ColorFactor = -20 + ($SpliceHeight - $i) * $ColorRatio; } else { $ColorFactor = 0; } + + $this->drawAntialiasPixel($Plots[0],$Plots[1],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + $this->drawAntialiasPixel($Plots[2],$Plots[3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + $this->drawAntialiasPixel($Plots[$Index-4],$Plots[$Index-3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); + } + } + + /* Draw Top polygons */ + for($Key=count($iValues)-1;$Key>=0;$Key--) + { + $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); + imagefilledpolygon($this->Picture,$TopPlots[$Key],(count($TopPlots[$Key])+1)/2,$C_GraphLo); + + if ( $EnhanceColors ) { $En = 10; } else { $En = 0; } + for($j=0;$j<=count($aTopPlots[$Key])-4;$j=$j+2) + $this->drawLine($aTopPlots[$Key][$j],$aTopPlots[$Key][$j+1],$aTopPlots[$Key][$j+2],$aTopPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); + } + } + + /* This function can be used to set the background color */ + function drawBackground($R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_Background); + } + + /* This function can be used to set the background color */ + function drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + if ( $Target == TARGET_GRAPHAREA ) { $X1 = $this->GArea_X1+1; $X2 = $this->GArea_X2-1; $Y1 = $this->GArea_Y1+1; $Y2 = $this->GArea_Y2; } + if ( $Target == TARGET_BACKGROUND ) { $X1 = 0; $X2 = $this->XSize; $Y1 = 0; $Y2 = $this->YSize; } + + /* Positive gradient */ + if ( $Decay > 0 ) + { + $YStep = ($Y2 - $Y1 - 2) / $Decay; + for($i=0;$i<=$Decay;$i++) + { + $R-=1;$G-=1;$B-=1; + $Yi1 = $Y1 + ( $i * $YStep ); + $Yi2 = ceil( $Yi1 + ( $i * $YStep ) + $YStep ); + if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } + + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); + } + } + + /* Negative gradient */ + if ( $Decay < 0 ) + { + $YStep = ($Y2 - $Y1 - 2) / -$Decay; + $Yi1 = $Y1; $Yi2 = $Y1+$YStep; + for($i=-$Decay;$i>=0;$i--) + { + $R+=1;$G+=1;$B+=1; + $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); + + $Yi1+= $YStep; + $Yi2+= $YStep; + if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } + } + } + } + + /* This function create a rectangle with antialias */ + function drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1,$Y1,$X2,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1,$X2,$Y2,$R,$G,$B); + $this->drawLine($X2,$Y2,$X1,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2,$X1,$Y1,$R,$G,$B); + } + + /* This function create a filled rectangle with antialias */ + function drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100,$NoFallBack=FALSE) + { + if ( $X2 < $X1 ) { list($X1, $X2) = array($X2, $X1); } + if ( $Y2 < $Y1 ) { list($Y1, $Y2) = array($Y2, $Y1); } + + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + if ( $Alpha == 100 ) + { + /* Process shadows */ + if ( $this->ShadowActive && !$NoFallBack ) + { + $this->drawFilledRectangle($X1+$this->ShadowXDistance,$Y1+$this->ShadowYDistance,$X2+$this->ShadowXDistance,$Y2+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha,TRUE); + if ( $this->ShadowBlur != 0 ) + { + $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); + + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawFilledRectangle($X1+$this->ShadowXDistance-$i/2,$Y1+$this->ShadowYDistance-$i/2,$X2+$this->ShadowXDistance-$i/2,$Y2+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawFilledRectangle($X1+$this->ShadowXDistance+$i/2,$Y1+$this->ShadowYDistance+$i/2,$X2+$this->ShadowXDistance+$i/2,$Y2+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + } + } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + imagefilledrectangle($this->Picture,round($X1),round($Y1),round($X2),round($Y2),$C_Rectangle); + } + else + { + $LayerWidth = abs($X2-$X1)+2; + $LayerHeight = abs($Y2-$Y1)+2; + + $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); + $C_White = $this->AllocateColor($this->Layers[0],255,255,255); + imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); + imagecolortransparent($this->Layers[0],$C_White); + + $C_Rectangle = $this->AllocateColor($this->Layers[0],$R,$G,$B); + imagefilledrectangle($this->Layers[0],round(1),round(1),round($LayerWidth-1),round($LayerHeight-1),$C_Rectangle); + + imagecopymerge($this->Picture,$this->Layers[0],round(min($X1,$X2)-1),round(min($Y1,$Y2)-1),0,0,$LayerWidth,$LayerHeight,$Alpha); + imagedestroy($this->Layers[0]); + } + + if ( $DrawBorder ) + { + $ShadowSettings = $this->ShadowActive; $this->ShadowActive = FALSE; + $this->drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B); + $this->ShadowActive = $ShadowSettings; + } + } + + /* This function create a rectangle with rounded corners and antialias */ + function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $Step = 90 / ((3.1418 * $Radius)/2); + + for($i=0;$i<=90;$i=$i+$Step) + { + $X = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; + $Y = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; + $Y = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; + $Y = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + + $X = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; + $Y = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + } + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); + $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); + } + + /* This function create a filled rectangle with rounded corners and antialias */ + function drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); + + $Step = 90 / ((3.1418 * $Radius)/2); + + for($i=0;$i<=90;$i=$i+$Step) + { + $Xi1 = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; + $Yi1 = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; + + $Xi2 = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; + $Yi2 = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; + + $Xi3 = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; + $Yi3 = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; + + $Xi4 = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; + $Yi4 = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; + + imageline($this->Picture,$Xi1,$Yi1,$X1+$Radius,$Yi1,$C_Rectangle); + imageline($this->Picture,$X2-$Radius,$Yi2,$Xi2,$Yi2,$C_Rectangle); + imageline($this->Picture,$X2-$Radius,$Yi3,$Xi3,$Yi3,$C_Rectangle); + imageline($this->Picture,$Xi4,$Yi4,$X1+$Radius,$Yi4,$C_Rectangle); + + $this->drawAntialiasPixel($Xi1,$Yi1,$R,$G,$B); + $this->drawAntialiasPixel($Xi2,$Yi2,$R,$G,$B); + $this->drawAntialiasPixel($Xi3,$Yi3,$R,$G,$B); + $this->drawAntialiasPixel($Xi4,$Yi4,$R,$G,$B); + } + + imagefilledrectangle($this->Picture,$X1,$Y1+$Radius,$X2,$Y2-$Radius,$C_Rectangle); + imagefilledrectangle($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y2,$C_Rectangle); + + $X1=$X1-.2;$Y1=$Y1-.2; + $X2=$X2+.2;$Y2=$Y2+.2; + $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); + $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); + $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); + $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); + } + + /* This function create a circle with antialias */ + function drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + { + if ( $Width == 0 ) { $Width = $Height; } + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); + $Step = 360 / (2 * 3.1418 * max($Width,$Height)); + + for($i=0;$i<=360;$i=$i+$Step) + { + $X = cos($i*3.1418/180) * $Height + $Xc; + $Y = sin($i*3.1418/180) * $Width + $Yc; + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + } + } + + /* This function create a filled circle/ellipse with antialias */ + function drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) + { + if ( $Width == 0 ) { $Width = $Height; } + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); + $Step = 360 / (2 * 3.1418 * max($Width,$Height)); + + for($i=90;$i<=270;$i=$i+$Step) + { + $X1 = cos($i*3.1418/180) * $Height + $Xc; + $Y1 = sin($i*3.1418/180) * $Width + $Yc; + $X2 = cos((180-$i)*3.1418/180) * $Height + $Xc; + $Y2 = sin((180-$i)*3.1418/180) * $Width + $Yc; + + $this->drawAntialiasPixel($X1-1,$Y1-1,$R,$G,$B); + $this->drawAntialiasPixel($X2-1,$Y2-1,$R,$G,$B); + + if ( ($Y1-1) > $Yc - max($Width,$Height) ) + imageline($this->Picture,$X1,$Y1-1,$X2-1,$Y2-1,$C_Circle); + } + } + + /* This function will draw a filled ellipse */ + function drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + { $this->drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } + + /* This function will draw an ellipse */ + function drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) + { $this->drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } + + /* This function create a line with antialias */ + function drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) + { + if ( $this->LineDotSize > 1 ) { $this->drawDottedLine($X1,$Y1,$X2,$Y2,$this->LineDotSize,$R,$G,$B,$GraphFunction); return(0); } + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); + if ( $Distance == 0 ) + return(-1); + $XStep = ($X2-$X1) / $Distance; + $YStep = ($Y2-$Y1) / $Distance; + + for($i=0;$i<=$Distance;$i++) + { + $X = $i * $XStep + $X1; + $Y = $i * $YStep + $Y1; + + if ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) + { + if ( $this->LineWidth == 1 ) + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + else + { + $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); + for($j=$StartOffset;$j<=$EndOffset;$j++) + $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); + } + } + } + } + + /* This function create a line with antialias */ + function drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B,$GraphFunction=FALSE) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); + + $XStep = ($X2-$X1) / $Distance; + $YStep = ($Y2-$Y1) / $Distance; + + $DotIndex = 0; + for($i=0;$i<=$Distance;$i++) + { + $X = $i * $XStep + $X1; + $Y = $i * $YStep + $Y1; + + if ( $DotIndex <= $DotSize) + { + if ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) + { + if ( $this->LineWidth == 1 ) + $this->drawAntialiasPixel($X,$Y,$R,$G,$B); + else + { + $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); + for($j=$StartOffset;$j<=$EndOffset;$j++) + $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); + } + } + } + + $DotIndex++; + if ( $DotIndex == $DotSize * 2 ) + $DotIndex = 0; + } + } + + /* Load a PNG file and draw it over the chart */ + function drawFromPNG($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(1,$FileName,$X,$Y,$Alpha); } + + /* Load a GIF file and draw it over the chart */ + function drawFromGIF($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(2,$FileName,$X,$Y,$Alpha); } + + /* Load a JPEG file and draw it over the chart */ + function drawFromJPG($FileName,$X,$Y,$Alpha=100) + { $this->drawFromPicture(3,$FileName,$X,$Y,$Alpha); } + + /* Generic loader function for external pictures */ + function drawFromPicture($PicType,$FileName,$X,$Y,$Alpha=100) + { + if ( file_exists($FileName)) + { + $Infos = getimagesize($FileName); + $Width = $Infos[0]; + $Height = $Infos[1]; + if ( $PicType == 1 ) { $Raster = imagecreatefrompng($FileName); } + if ( $PicType == 2 ) { $Raster = imagecreatefromgif($FileName); } + if ( $PicType == 3 ) { $Raster = imagecreatefromjpeg($FileName); } + + imagecopymerge($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height,$Alpha); + imagedestroy($Raster); + } + } + + /* Draw an alpha pixel */ + function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) + { + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) + return(-1); + + $RGB2 = imagecolorat($this->Picture, $X, $Y); + $R2 = ($RGB2 >> 16) & 0xFF; + $G2 = ($RGB2 >> 8) & 0xFF; + $B2 = $RGB2 & 0xFF; + + $iAlpha = (100 - $Alpha)/100; + $Alpha = $Alpha / 100; + + $Ra = floor($R*$Alpha+$R2*$iAlpha); + $Ga = floor($G*$Alpha+$G2*$iAlpha); + $Ba = floor($B*$Alpha+$B2*$iAlpha); + + $C_Aliased = $this->AllocateColor($this->Picture,$Ra,$Ga,$Ba); + imagesetpixel($this->Picture,$X,$Y,$C_Aliased); + } + + /* Color helper */ + function AllocateColor($Picture,$R,$G,$B,$Factor=0) + { + $R = $R + $Factor; + $G = $G + $Factor; + $B = $B + $Factor; + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + return(imagecolorallocate($Picture,$R,$G,$B)); + } + + /* Add a border to the picture */ + function addBorder($Size=3,$R=0,$G=0,$B=0) + { + $Width = $this->XSize+2*$Size; + $Height = $this->YSize+2*$Size; + + $Resampled = imagecreatetruecolor($Width,$Height); + $C_Background = $this->AllocateColor($Resampled,$R,$G,$B); + imagefilledrectangle($Resampled,0,0,$Width,$Height,$C_Background); + + imagecopy($Resampled,$this->Picture,$Size,$Size,0,0,$this->XSize,$this->YSize); + imagedestroy($this->Picture); + + $this->XSize = $Width; + $this->YSize = $Height; + + $this->Picture = imagecreatetruecolor($this->XSize,$this->YSize); + $C_White = $this->AllocateColor($this->Picture,255,255,255); + imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_White); + imagecolortransparent($this->Picture,$C_White); + imagecopy($this->Picture,$Resampled,0,0,0,0,$this->XSize,$this->YSize); + } + + /* Render the current picture to a file */ + function Render($FileName) + { + if ( $this->ErrorReporting ) + $this->printErrors($this->ErrorInterface); + + /* Save image map if requested */ + if ( $this->BuildMap ) + $this->SaveImageMap(); + + imagepng($this->Picture,$FileName); + } + + /* Render the current picture to STDOUT */ + function Stroke() + { + if ( $this->ErrorReporting ) + $this->printErrors("GD"); + + /* Save image map if requested */ + if ( $this->BuildMap ) + $this->SaveImageMap(); + + header('Content-type: image/png'); + imagepng($this->Picture); + } + + /* Private functions for internal processing */ + function drawAntialiasPixel($X,$Y,$R,$G,$B,$Alpha=100,$NoFallBack=FALSE) + { + /* Process shadows */ + if ( $this->ShadowActive && !$NoFallBack ) + { + $this->drawAntialiasPixel($X+$this->ShadowXDistance,$Y+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha,TRUE); + if ( $this->ShadowBlur != 0 ) + { + $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); + + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawAntialiasPixel($X+$this->ShadowXDistance-$i/2,$Y+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + for($i=1; $i<=$this->ShadowBlur; $i++) + $this->drawAntialiasPixel($X+$this->ShadowXDistance+$i/2,$Y+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); + } + } + + if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } + if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } + if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } + + $Plot = ""; + $Xi = floor($X); + $Yi = floor($Y); + + if ( $Xi == $X && $Yi == $Y) + { + if ( $Alpha == 100 ) + { + $C_Aliased = $this->AllocateColor($this->Picture,$R,$G,$B); + imagesetpixel($this->Picture,$X,$Y,$C_Aliased); + } + else + $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B); + } + else + { + $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; + if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); } + + $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; + if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); } + + $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha; + if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); } + + $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha; + if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); } + } + } + + /* Validate data contained in the description array */ + function validateDataDescription($FunctionName,&$DataDescription,$DescriptionRequired=TRUE) + { + if (!isset($DataDescription["Position"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Y Labels are not set."; + $DataDescription["Position"] = "Name"; + } + + if ( $DescriptionRequired ) + { + if (!isset($DataDescription["Description"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Series descriptions are not set."; + foreach($DataDescription["Values"] as $key => $Value) + { + $DataDescription["Description"][$Value] = $Value; + } + } + + if (count($DataDescription["Description"]) < count($DataDescription["Values"])) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Some series descriptions are not set."; + foreach($DataDescription["Values"] as $key => $Value) + { + if ( !isset($DataDescription["Description"][$Value])) + $DataDescription["Description"][$Value] = $Value; + } + } + } + } + + /* Validate data contained in the data array */ + function validateData($FunctionName,&$Data) + { + $DataSummary = array(); + + foreach($Data as $key => $Values) + { + foreach($Values as $key2 => $Value) + { + if (!isset($DataSummary[$key2])) + $DataSummary[$key2] = 1; + else + $DataSummary[$key2]++; + } + } + + if ( max($DataSummary) == 0 ) + $this->Errors[] = "[Warning] ".$FunctionName." - No data set."; + + foreach($DataSummary as $key => $Value) + { + if ($Value < max($DataSummary)) + { + $this->Errors[] = "[Warning] ".$FunctionName." - Missing data in serie ".$key."."; + } + } + } + + /* Print all error messages on the CLI or graphically */ + function printErrors($Mode="CLI") + { + if (count($this->Errors) == 0) + return(0); + + if ( $Mode == "CLI" ) + { + foreach($this->Errors as $key => $Value) + echo $Value."\r\n"; + } + elseif ( $Mode == "GD" ) + { + $this->setLineStyle($Width=1); + $MaxWidth = 0; + foreach($this->Errors as $key => $Value) + { + $Position = imageftbbox($this->ErrorFontSize,0,$this->ErrorFontName,$Value); + $TextWidth = $Position[2]-$Position[0]; + if ( $TextWidth > $MaxWidth ) { $MaxWidth = $TextWidth; } + } + $this->drawFilledRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,233,185,185); + $this->drawRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,193,145,145); + + $C_TextColor = $this->AllocateColor($this->Picture,133,85,85); + $YPos = $this->YSize - (18 + (count($this->Errors)-1) * ($this->ErrorFontSize + 4)); + foreach($this->Errors as $key => $Value) + { + imagettftext($this->Picture,$this->ErrorFontSize,0,$this->XSize-($MaxWidth+15),$YPos,$C_TextColor,$this->ErrorFontName,$Value); + $YPos = $YPos + ($this->ErrorFontSize + 4); + } + } + } + + /* Activate the image map creation process */ + function setImageMap($Mode=TRUE,$GraphID="MyGraph") + { + $this->BuildMap = $Mode; + $this->MapID = $GraphID; + } + + /* Add a box into the image map */ + function addToImageMap($X1,$Y1,$X2,$Y2,$SerieName,$Value,$CallerFunction) + { + if ( $this->MapFunction == NULL || $this->MapFunction == $CallerFunction ) + { + $this->ImageMap[] = round($X1).",".round($Y1).",".round($X2).",".round($Y2).",".$SerieName.",".$Value; + $this->MapFunction = $CallerFunction; + } + } + + /* Load and cleanup the image map from disk */ + function getImageMap($MapName,$Flush=TRUE) + { + /* Strip HTML query strings */ + $Values = $this->tmpFolder.$MapName; + $Value = split("\?",$Values); + $FileName = $Value[0]; + + if ( file_exists($FileName) ) + { + $Handle = fopen($FileName, "r"); + $MapContent = fread($Handle, filesize($FileName)); + fclose($Handle); + echo $MapContent; + + if ( $Flush ) + unlink($FileName); + + exit(); + } + else + { + header("HTTP/1.0 404 Not Found"); + exit(); + } + } + + /* Save the image map to the disk */ + function SaveImageMap() + { + if ( !$this->BuildMap ) { return(-1); } + + if ( $this->ImageMap == NULL ) + { + $this->Errors[] = "[Warning] SaveImageMap - Image map is empty."; + return(-1); + } + + $Handle = fopen($this->tmpFolder.$this->MapID, 'w'); + if ( !$Handle ) + { + $this->Errors[] = "[Warning] SaveImageMap - Cannot save the image map."; + return(-1); + } + else + { + foreach($this->ImageMap as $Key => $Value) + fwrite($Handle, htmlentities($Value)."\r"); + } + fclose ($Handle); + } + + /* Convert seconds to a time format string */ + function ToTime($Value) + { + $Hour = floor($Value/3600); + $Minute = floor(($Value - $Hour*3600)/60); + $Second = floor($Value - $Hour*3600 - $Minute*60); + + if (strlen($Hour) == 1 ) { $Hour = "0".$Hour; } + if (strlen($Minute) == 1 ) { $Minute = "0".$Minute; } + if (strlen($Second) == 1 ) { $Second = "0".$Second; } + + return($Hour.":".$Minute.":".$Second); + } + + /* Convert to metric system */ + function ToMetric($Value) + { + $Go = floor($Value/1000000000); + $Mo = floor(($Value - $Go*1000000000)/1000000); + $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); + $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); + + if ($Go != 0) { return($Go.".".$Mo."g"); } + if ($Mo != 0) { return($Mo.".".$ko."m"); } + if ($Ko != 0) { return($Ko.".".$o)."k"; } + return($o); + } + + /* Convert to curency */ + function ToCurrency($Value) + { + $Go = floor($Value/1000000000); + $Mo = floor(($Value - $Go*1000000000)/1000000); + $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); + $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); + + if ( strlen($o) == 1 ) { $o = "00".$o; } + if ( strlen($o) == 2 ) { $o = "0".$o; } + + $ResultString = $o; + if ( $Ko != 0 ) { $ResultString = $Ko.".".$ResultString; } + if ( $Mo != 0 ) { $ResultString = $Mo.".".$ResultString; } + if ( $Go != 0 ) { $ResultString = $Go.".".$ResultString; } + + $ResultString = $this->Currency.$ResultString; + return($ResultString); + } + + /* Set date format for axis labels */ + function setDateFormat($Format) + { + $this->DateFormat = $Format; + } + + /* Convert TS to a date format string */ + function ToDate($Value) + { + return(date($this->DateFormat,$Value)); + } + + /* Check if a number is a full integer (for scaling) */ + function isRealInt($Value) + { + if ($Value == floor($Value)) + return(TRUE); + return(FALSE); + } + } + + function RaiseFatal($Message) + { + echo "[FATAL] ".$Message."\r\n"; + exit(); + } +?> \ No newline at end of file diff --git a/libraries/chart/pChart/pData.class b/libraries/chart/pChart/pData.class new file mode 100644 index 000000000..49d2fcc56 --- /dev/null +++ b/libraries/chart/pChart/pData.class @@ -0,0 +1,260 @@ +. + + Class initialisation : + pData() + Data populating methods : + ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) + AddPoint($Value,$Serie="Serie1",$Description="") + Series manipulation methods : + AddSerie($SerieName="Serie1") + AddAllSeries() + RemoveSerie($SerieName="Serie1") + SetAbsciseLabelSerie($SerieName = "Name") + SetSerieName($Name,$SerieName="Serie1") + + SetSerieSymbol($Name,$Symbol) + SetXAxisName($Name="X Axis") + SetYAxisName($Name="Y Axis") + SetXAxisFormat($Format="number") + SetYAxisFormat($Format="number") + SetXAxisUnit($Unit="") + SetYAxisUnit($Unit="") + removeSerieName($SerieName) + removeAllSeries() + Data retrieval methods : + GetData() + GetDataDescription() + */ + + /* pData class definition */ + class pData + { + var $Data; + var $DataDescription; + + function pData() + { + $this->Data = ""; + $this->DataDescription = ""; + $this->DataDescription["Position"] = "Name"; + $this->DataDescription["Format"]["X"] = "number"; + $this->DataDescription["Format"]["Y"] = "number"; + $this->DataDescription["Unit"]["X"] = NULL; + $this->DataDescription["Unit"]["Y"] = NULL; + } + + function ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) + { + $handle = @fopen($FileName,"r"); + if ($handle) + { + $HeaderParsed = FALSE; + while (!feof($handle)) + { + $buffer = fgets($handle, 4096); + $buffer = str_replace(chr(10),"",$buffer); + $buffer = str_replace(chr(13),"",$buffer); + $Values = split($Delimiter,$buffer); + + if ( $buffer != "" ) + { + if ( $HasHeader == TRUE && $HeaderParsed == FALSE ) + { + if ( $DataColumns == -1 ) + { + $ID = 1; + foreach($Values as $key => $Value) + { $this->SetSerieName($Value,"Serie".$ID); $ID++; } + } + else + { + $SerieName = ""; + + foreach($DataColumns as $key => $Value) + $this->SetSerieName($Values[$Value],"Serie".$Value); + } + $HeaderParsed = TRUE; + } + else + { + if ( $DataColumns == -1 ) + { + $ID = 1; + foreach($Values as $key => $Value) + { $this->AddPoint(intval($Value),"Serie".$ID); $ID++; } + } + else + { + $SerieName = ""; + if ( $DataName != -1 ) + $SerieName = $Values[$DataName]; + + foreach($DataColumns as $key => $Value) + $this->AddPoint($Values[$Value],"Serie".$Value,$SerieName); + } + } + } + } + fclose($handle); + } + } + + function AddPoint($Value,$Serie="Serie1",$Description="") + { + if (is_array($Value) && count($Value) == 1) + $Value = $Value[0]; + + $ID = 0; + for($i=0;$i<=count($this->Data);$i++) + { if(isset($this->Data[$i][$Serie])) { $ID = $i+1; } } + + if ( count($Value) == 1 ) + { + $this->Data[$ID][$Serie] = $Value; + if ( $Description != "" ) + $this->Data[$ID]["Name"] = $Description; + elseif (!isset($this->Data[$ID]["Name"])) + $this->Data[$ID]["Name"] = $ID; + } + else + { + foreach($Value as $key => $Val) + { + $this->Data[$ID][$Serie] = $Val; + if (!isset($this->Data[$ID]["Name"])) + $this->Data[$ID]["Name"] = $ID; + $ID++; + } + } + } + + function AddSerie($SerieName="Serie1") + { + if ( !isset($this->DataDescription["Values"]) ) + { + $this->DataDescription["Values"][] = $SerieName; + } + else + { + $Found = FALSE; + foreach($this->DataDescription["Values"] as $key => $Value ) + if ( $Value == $SerieName ) { $Found = TRUE; } + + if ( !$Found ) + $this->DataDescription["Values"][] = $SerieName; + } + } + + function AddAllSeries() + { + unset($this->DataDescription["Values"]); + + if ( isset($this->Data[0]) ) + { + foreach($this->Data[0] as $Key => $Value) + { + if ( $Key != "Name" ) + $this->DataDescription["Values"][] = $Key; + } + } + } + + function RemoveSerie($SerieName="Serie1") + { + if ( !isset($this->DataDescription["Values"]) ) + return(0); + + $Found = FALSE; + foreach($this->DataDescription["Values"] as $key => $Value ) + { + if ( $Value == $SerieName ) + unset($this->DataDescription["Values"][$key]); + } + } + + function SetAbsciseLabelSerie($SerieName = "Name") + { + $this->DataDescription["Position"] = $SerieName; + } + + function SetSerieName($Name,$SerieName="Serie1") + { + $this->DataDescription["Description"][$SerieName] = $Name; + } + + function SetXAxisName($Name="X Axis") + { + $this->DataDescription["Axis"]["X"] = $Name; + } + + function SetYAxisName($Name="Y Axis") + { + $this->DataDescription["Axis"]["Y"] = $Name; + } + + function SetXAxisFormat($Format="number") + { + $this->DataDescription["Format"]["X"] = $Format; + } + + function SetYAxisFormat($Format="number") + { + $this->DataDescription["Format"]["Y"] = $Format; + } + + function SetXAxisUnit($Unit="") + { + $this->DataDescription["Unit"]["X"] = $Unit; + } + + function SetYAxisUnit($Unit="") + { + $this->DataDescription["Unit"]["Y"] = $Unit; + } + + function SetSerieSymbol($Name,$Symbol) + { + $this->DataDescription["Symbol"][$Name] = $Symbol; + } + + function removeSerieName($SerieName) + { + if ( isset($this->DataDescription["Description"][$SerieName]) ) + unset($this->DataDescription["Description"][$SerieName]); + } + + function removeAllSeries() + { + foreach($this->DataDescription["Values"] as $Key => $Value) + unset($this->DataDescription["Values"][$Key]); + } + + function GetData() + { + return($this->Data); + } + + function GetDataDescription() + { + return($this->DataDescription); + } + } +?> \ No newline at end of file diff --git a/libraries/chart/pma_pchart_chart.php b/libraries/chart/pma_pchart_chart.php new file mode 100644 index 000000000..fbf1a1c69 --- /dev/null +++ b/libraries/chart/pma_pchart_chart.php @@ -0,0 +1,25 @@ +imageEncoded.'" />'; + } +} + +?> diff --git a/libraries/chart/pma_pchart_pie.php b/libraries/chart/pma_pchart_pie.php new file mode 100644 index 000000000..f2b305708 --- /dev/null +++ b/libraries/chart/pma_pchart_pie.php @@ -0,0 +1,68 @@ +AddPoint(array_values($data),"Serie1"); + $DataSet->AddPoint(array_keys($data),"Serie2"); + $DataSet->AddAllSeries(); + $DataSet->SetAbsciseLabelSerie("Serie2"); + + // Initialise the graph + $Test = new pChart($this->width, $this->height); + foreach ($this->colors as $key => $color) { + $Test->setColorPalette( + $key, + hexdec(substr($color, 1, 2)), + hexdec(substr($color, 3, 2)), + hexdec(substr($color, 5, 2)) + ); + } + $Test->setFontProperties($this->fontPath.'tahoma.ttf', 8); + $Test->drawFilledRoundedRectangle( + $this->border1Width, + $this->border1Width, + $this->width - $this->border1Width, + $this->height - $this->border1Width, + 5,240,240,240); + $Test->drawRoundedRectangle( + $this->border1Width, + $this->border1Width, + $this->width - $this->border1Width, + $this->height - $this->border1Width, + 5,230,230,230); + + // Draw the pie chart + $Test->AntialiasQuality = 0; + $Test->setShadowProperties(2,2,200,200,200); + //$Test->drawFlatPieGraphWithShadow($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,8); + //$Test->drawBasicPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,255,255,218,2); + $Test->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,160,120,PIE_PERCENTAGE,FALSE,60,30,10,1); + $Test->clearShadow(); + + $Test->drawTitle(10,20,$titleText,0,0,0); + $Test->drawPieLegend(340,15,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250); + + ob_start(); + imagepng($Test->Picture); + $output = ob_get_contents(); + ob_end_clean(); + + $this->imageEncoded = base64_encode($output); + } +} + +?>