From 1d153ddfcf97b3b6c47c0593579fe4593da2e1f2 Mon Sep 17 00:00:00 2001 From: Janos SUTO Date: Sun, 4 Sep 2022 13:13:24 +0200 Subject: [PATCH] Removed obsoleted libchart from helpers Signed-off-by: Janos SUTO --- webui/system/helper/libchart/COPYING | 15 - webui/system/helper/libchart/ChangeLog | 69 -- webui/system/helper/libchart/README | 47 -- .../helper/libchart/classes/libchart.php | 43 -- .../libchart/classes/model/ChartConfig.php | 112 --- .../helper/libchart/classes/model/DataSet.php | 28 - .../helper/libchart/classes/model/Point.php | 59 -- .../libchart/classes/model/XYDataSet.php | 56 -- .../classes/model/XYSeriesDataSet.php | 76 -- .../libchart/classes/view/axis/Axis.php | 130 ---- .../libchart/classes/view/axis/Bound.php | 156 ---- .../libchart/classes/view/caption/Caption.php | 112 --- .../libchart/classes/view/chart/BarChart.php | 183 ----- .../libchart/classes/view/chart/Chart.php | 118 --- .../classes/view/chart/HorizontalBarChart.php | 230 ------ .../libchart/classes/view/chart/LineChart.php | 200 ------ .../libchart/classes/view/chart/PieChart.php | 266 ------- .../classes/view/chart/VerticalBarChart.php | 229 ------ .../libchart/classes/view/color/Color.php | 99 --- .../libchart/classes/view/color/ColorSet.php | 88 --- .../libchart/classes/view/color/Palette.php | 156 ---- .../libchart/classes/view/plot/Plot.php | 443 ------------ .../classes/view/primitive/Padding.php | 68 -- .../classes/view/primitive/Primitive.php | 70 -- .../classes/view/primitive/Rectangle.php | 80 --- .../libchart/classes/view/text/Text.php | 129 ---- .../system/helper/libchart/doc/DEJAVU_LICENSE | 51 -- webui/system/helper/libchart/doc/GNU_GPL_V3 | 674 ------------------ .../fonts/DejaVuSansCondensed-Bold.ttf | Bin 62716 -> 0 bytes .../libchart/fonts/DejaVuSansCondensed.ttf | Bin 73144 -> 0 bytes .../helper/libchart/images/PoweredBy.png | Bin 1608 -> 0 bytes 31 files changed, 3987 deletions(-) delete mode 100644 webui/system/helper/libchart/COPYING delete mode 100644 webui/system/helper/libchart/ChangeLog delete mode 100644 webui/system/helper/libchart/README delete mode 100644 webui/system/helper/libchart/classes/libchart.php delete mode 100644 webui/system/helper/libchart/classes/model/ChartConfig.php delete mode 100644 webui/system/helper/libchart/classes/model/DataSet.php delete mode 100644 webui/system/helper/libchart/classes/model/Point.php delete mode 100644 webui/system/helper/libchart/classes/model/XYDataSet.php delete mode 100644 webui/system/helper/libchart/classes/model/XYSeriesDataSet.php delete mode 100644 webui/system/helper/libchart/classes/view/axis/Axis.php delete mode 100644 webui/system/helper/libchart/classes/view/axis/Bound.php delete mode 100644 webui/system/helper/libchart/classes/view/caption/Caption.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/BarChart.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/Chart.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/LineChart.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/PieChart.php delete mode 100644 webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php delete mode 100644 webui/system/helper/libchart/classes/view/color/Color.php delete mode 100644 webui/system/helper/libchart/classes/view/color/ColorSet.php delete mode 100644 webui/system/helper/libchart/classes/view/color/Palette.php delete mode 100644 webui/system/helper/libchart/classes/view/plot/Plot.php delete mode 100644 webui/system/helper/libchart/classes/view/primitive/Padding.php delete mode 100644 webui/system/helper/libchart/classes/view/primitive/Primitive.php delete mode 100644 webui/system/helper/libchart/classes/view/primitive/Rectangle.php delete mode 100644 webui/system/helper/libchart/classes/view/text/Text.php delete mode 100644 webui/system/helper/libchart/doc/DEJAVU_LICENSE delete mode 100644 webui/system/helper/libchart/doc/GNU_GPL_V3 delete mode 100644 webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf delete mode 100644 webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf delete mode 100644 webui/system/helper/libchart/images/PoweredBy.png diff --git a/webui/system/helper/libchart/COPYING b/webui/system/helper/libchart/COPYING deleted file mode 100644 index 0b52bd88..00000000 --- a/webui/system/helper/libchart/COPYING +++ /dev/null @@ -1,15 +0,0 @@ -Open Source License ---------------------------------------------------------------------------- -Libchart is distributed under the terms of the GNU GPL v3. -This includes everything in the source code distribution -except where otherwise stated. -A copy of the GNU GPL v3 can be found in doc/GNU_GPL_V3. - -Third Party Content ---------------------------------------------------------------------------- -The following third party software is distributed with Libchart and -is provided under other licenses and/or has source available from -other locations. - -Files in the fonts directory are distributed under Dejavu font license. -A copy of the Dejavu font license can be found in doc/DEJAVU_LICENSE. diff --git a/webui/system/helper/libchart/ChangeLog b/webui/system/helper/libchart/ChangeLog deleted file mode 100644 index ac608bf2..00000000 --- a/webui/system/helper/libchart/ChangeLog +++ /dev/null @@ -1,69 +0,0 @@ -Libchart ChangeLog -================== -(C) 2005-2011 Jean-Marc Trémeaux - - -VERSION 1.3: (2011-07-27) -========== - FEATURES: - * Customized palette on Horizontal and Vertical Bar charts. - * Add an option to turn off text caption on individual data points. - * Add an option to disable sorting (preserve data points order). - - BUGFIXES: - * Issue #2: DejaVu Fonts don't include license - -VERSION 1.2.2: (2010-10-12) -========== - FEATURES: - * Ability to change colors. - - BUGFIXES: - * Fix #1 : Pie chart filled with solid color when percentage < 1. - -VERSION 1.2.1: (2008-04-10) -========== - BUGFIXES: - * Ability to set the upper/lower bounds (regression). - * HorizontalBarChart: a small box is shown when x = 0 (regression). - * Multiple series charts: when we go over the maximum series count, loop over color. - * Multiple series bar chart: brown color is shown twice. - * Pie chart : if some relative percentage is null, the whole diagram is filled in by one color. - * Ability to use negative values in bar chart. - -VERSION 1.2: (2007-08-13) -========== - LICENSE: - * Change of license to GPL v3 - - FEATURES: - * Multiple line charts - * Multiple vertical and horizontal bar charts - * Customizable layout (plot) - - REFACTORING: - * Support for PHP4 is deprecated, as PHP 4 has reached its end of life. - * Use of PHP5 OO constructs - * Use of setLowerBound(null) if you want to revert to the old behaviour. - - BUGFIXES: - * Removed undefined IMG_ARC_FILL constant - * Added missing default parameter in HorizontalChart::render() - * Fixed decimal values in Bar Charts - * Typo in default logo - * Crashed when no point was defined - * Crashed when all values were set to 0 - -Version 1.0: (2005-09-30) -========== - INITIAL RELEASE - diff --git a/webui/system/helper/libchart/README b/webui/system/helper/libchart/README deleted file mode 100644 index 4f0e0107..00000000 --- a/webui/system/helper/libchart/README +++ /dev/null @@ -1,47 +0,0 @@ - - Libchart - Simple PHP chart drawing library -============================================= - -Libchart is a free chart creation PHP library, that is easy to use. - --------------------------------------------------------------------------------- - - - Features -========== - - * Bar charts (horizontal or vertical). - * Pie charts. - * Line charts. - * Compatibility with PHP 5. - --------------------------------------------------------------------------------- - - - Dependencies -============== - - * PHP 5, compiled with: - * GD 2+ - * FreeType 2+ - --------------------------------------------------------------------------------- - - - Installation -============== - -In order to use Libchart, unpack the archive in you project directory and -include libchart.php. Please have a look at the demo files for more information. -You need to chmod 777 the "generated" directory in order to generate the demos. -There is also a tutorial available at the project homepage. - - --------------------------------------------------------------------------------- - - - Contact info -============== - -WWW: http://naku.dohcrew.com/libchart/ -MAIL: jm.tremeaux at gmail dot com diff --git a/webui/system/helper/libchart/classes/libchart.php b/webui/system/helper/libchart/classes/libchart.php deleted file mode 100644 index 481d920b..00000000 --- a/webui/system/helper/libchart/classes/libchart.php +++ /dev/null @@ -1,43 +0,0 @@ -. - * - */ - - require_once 'model/ChartConfig.php'; - require_once 'model/Point.php'; - require_once 'model/DataSet.php'; - require_once 'model/XYDataSet.php'; - require_once 'model/XYSeriesDataSet.php'; - - require_once 'view/primitive/Padding.php'; - require_once 'view/primitive/Rectangle.php'; - require_once 'view/primitive/Primitive.php'; - require_once 'view/text/Text.php'; - require_once 'view/color/Color.php'; - require_once 'view/color/ColorSet.php'; - require_once 'view/color/Palette.php'; - require_once 'view/axis/Bound.php'; - require_once 'view/axis/Axis.php'; - require_once 'view/plot/Plot.php'; - require_once 'view/caption/Caption.php'; - require_once 'view/chart/Chart.php'; - require_once 'view/chart/BarChart.php'; - require_once 'view/chart/VerticalBarChart.php'; - require_once 'view/chart/HorizontalBarChart.php'; - require_once 'view/chart/LineChart.php'; - require_once 'view/chart/PieChart.php'; -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/ChartConfig.php b/webui/system/helper/libchart/classes/model/ChartConfig.php deleted file mode 100644 index 4e2f026d..00000000 --- a/webui/system/helper/libchart/classes/model/ChartConfig.php +++ /dev/null @@ -1,112 +0,0 @@ -. - * - */ - - /** - * Configuration attributes of the chart. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class ChartConfig { - /** - * Use several colors for a single data set chart (as if it was a multiple data set). - * - * @var Boolean - */ - private $useMultipleColor; - - /** - * Show caption on individual data points. - * - * @var Boolean - */ - private $showPointCaption; - - /** - * Sort data points (only pie charts). - * - * @var Boolean - */ - private $sortDataPoint; - - /** - * Creates a new ChartConfig with default options. - */ - public function ChartConfig() { - $this->useMultipleColor = false; - $this->showPointCaption = true; - $this->sortDataPoint = true; - } - - /** - * If true the chart will use several colors for a single data set chart - * (as if it was a multiple data set). - * - * @param $useMultipleColor Use several colors : boolean - */ - public function setUseMultipleColor($useMultipleColor) { - $this->useMultipleColor = $useMultipleColor; - } - - /** - * If true the chart will use several colors for a single data set chart - * (as if it was a multiple data set). - * - * @return $useMultipleColor Use several colors : boolean - */ - public function getUseMultipleColor() { - return $this->useMultipleColor; - } - - /** - * Set the option to show caption on individual data points. - * - * @param $showPointCaption Show caption on individual data points : boolean - */ - public function setShowPointCaption($showPointCaption) { - $this->showPointCaption = $showPointCaption; - } - - /** - * Get the option to show caption on individual data points. - * - * @return Show caption on individual data points : boolean - */ - public function getShowPointCaption() { - return $this->showPointCaption; - } - - /** - * Set the option to sort data points (only pie charts). - * - * @param $sortDataPoint Sort data points : boolean - */ - public function setSortDataPoint($sortDataPoint) { - $this->sortDataPoint = $sortDataPoint; - } - - /** - * Get the option to sort data points (only pie charts). - * - * @return Sort data points : boolean - */ - public function getSortDataPoint() { - return $this->sortDataPoint; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/DataSet.php b/webui/system/helper/libchart/classes/model/DataSet.php deleted file mode 100644 index d4b332fa..00000000 --- a/webui/system/helper/libchart/classes/model/DataSet.php +++ /dev/null @@ -1,28 +0,0 @@ -. - * - */ - - /** - * Superclass of all data sets. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 10 may 2007 - */ - abstract class DataSet { - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/Point.php b/webui/system/helper/libchart/classes/model/Point.php deleted file mode 100644 index 18aabc09..00000000 --- a/webui/system/helper/libchart/classes/model/Point.php +++ /dev/null @@ -1,59 +0,0 @@ -. - * - */ - - /** - * Point of coordinates (X,Y). - * The value of X isn't really of interest, but X is used as a label to display on the horizontal axis. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class Point { - private $x; - private $y; - - /** - * Creates a new sampling point of coordinates (x, y) - * - * @param integer x coordinate (label) - * @param integer y coordinate (value) - */ - public function Point($x, $y) { - $this->x = $x; - $this->y = $y; - } - - /** - * Gets the x coordinate (label). - * - * @return integer x coordinate (label) - */ - public function getX() { - return $this->x; - } - - /** - * Gets the y coordinate (value). - * - * @return integer y coordinate (value) - */ - public function getY() { - return $this->y; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/XYDataSet.php b/webui/system/helper/libchart/classes/model/XYDataSet.php deleted file mode 100644 index 3b480962..00000000 --- a/webui/system/helper/libchart/classes/model/XYDataSet.php +++ /dev/null @@ -1,56 +0,0 @@ -. - * - */ - - /** - * Set of data in the form of (x, y) items. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 10 may 2007 - */ - class XYDataSet extends DataSet { - private $pointList; - - /** - * Constructor of XYDataSet. - * - */ - public function XYDataSet() { - $this->pointList = array(); - } - - /** - * Add a new point to the dataset. - * - * @param Point Point to add to the dataset - */ - - public function addPoint($point) { - array_push($this->pointList, $point); - } - - /** - * Getter of pointList. - * - * @return List of points. - */ - public function getPointList() { - return $this->pointList; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php b/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php deleted file mode 100644 index 6e8ad3f7..00000000 --- a/webui/system/helper/libchart/classes/model/XYSeriesDataSet.php +++ /dev/null @@ -1,76 +0,0 @@ -. - * - */ - - /** - * This dataset comprises several series of points and is used to plot multiple lines charts. - * Each serie is a XYDataSet. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 20 july 2007 - */ - class XYSeriesDataSet extends DataSet { - /** - * List of titles - */ - private $titleList; - - /** - * List of XYDataSet. - */ - private $serieList; - - /** - * Constructor of XYSeriesDataSet. - * - */ - public function XYSeriesDataSet() { - $this->titleList = array(); - $this->serieList = array(); - } - - /** - * Add a new serie to the dataset. - * - * @param string Title (label) of the serie. - * @param XYDataSet Serie of points to add - */ - public function addSerie($title, $serie) { - array_push($this->titleList, $title); - array_push($this->serieList, $serie); - } - - /** - * Getter of titleList. - * - * @return List of titles. - */ - public function getTitleList() { - return $this->titleList; - } - - /** - * Getter of serieList. - * - * @return List of series. - */ - public function getSerieList() { - return $this->serieList; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/axis/Axis.php b/webui/system/helper/libchart/classes/view/axis/Axis.php deleted file mode 100644 index d6499286..00000000 --- a/webui/system/helper/libchart/classes/view/axis/Axis.php +++ /dev/null @@ -1,130 +0,0 @@ -. - * - */ - - /** - * Automatic axis boundaries and ticks calibration - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class Axis { - private $min; - private $max; - private $guide; - private $delta; - private $magnitude; - private $displayMin; - private $displayMax; - private $tics; - - /** - * Creates a new axis formatter. - * - * @param integer minimum value on the axis - * @param integer maximum value on the axis - */ - public function Axis($min, $max) { - $this->min = $min; - $this->max = $max; - - $this->guide = 10; - } - - /** - * Computes value between two ticks. - */ - public function quantizeTics() { - // Approximate number of decades, in [1..10[ - $norm = $this->delta / $this->magnitude; - - // Approximate number of tics per decade - $posns = $this->guide / $norm; - - if ($posns > 20) { - $tics = 0.05; // e.g. 0, .05, .10, ... - } else if ($posns > 10) { - $tics = 0.2; // e.g. 0, .1, .2, ... - } else if ($posns > 5) { - $tics = 0.4; // e.g. 0, 0.2, 0.4, ... - } else if ($posns > 3) { - $tics = 0.5; // e.g. 0, 0.5, 1, ... - } else if ($posns > 2) { - $tics = 1; // e.g. 0, 1, 2, ... - } else if ($posns > 0.25) { - $tics = 2; // e.g. 0, 2, 4, 6 - } else { - $tics = ceil($norm); - } - - $this->tics = $tics * $this->magnitude; - } - - /** - * Computes automatic boundaries on the axis - */ - public function computeBoundaries() { - // Range - $this->delta = abs($this->max - $this->min); - - // Check for null distribution - if ($this->delta == 0) - $this->delta = 1; - - // Order of magnitude of range - $this->magnitude = pow(10, floor(log10($this->delta))); - - $this->quantizeTics(); - - $this->displayMin = floor($this->min / $this->tics) * $this->tics; - $this->displayMax = ceil($this->max / $this->tics) * $this->tics; - $this->displayDelta = $this->displayMax - $this->displayMin; - - // Check for null distribution - if ($this->displayDelta == 0) { - $this->displayDelta = 1; - } - } - - /** - * Get the lower boundary on the axis3 - * - * @return integer lower boundary on the axis - */ - public function getLowerBoundary() { - return $this->displayMin; - } - - /** - * Get the upper boundary on the axis3 - * - * @return integer upper boundary on the axis - */ - public function getUpperBoundary() { - return $this->displayMax; - } - - /** - * Get the value between two ticks3 - * - * @return integer value between two ticks - */ - public function getTics() { - return $this->tics; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/axis/Bound.php b/webui/system/helper/libchart/classes/view/axis/Bound.php deleted file mode 100644 index 3ecdb12e..00000000 --- a/webui/system/helper/libchart/classes/view/axis/Bound.php +++ /dev/null @@ -1,156 +0,0 @@ -. - * - */ - - /** - * Object representing the bounds of a dataset (its minimal and maximal values) on its vertical axis. - * The bounds are automatically calculated from a XYDataSet or XYSeriesDataSet. - * Default (calculated) bounds can be overriden using the setLowerBound() and setUpperBound() methods. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 25 july 2007 - */ - class Bound { - /** - * Manually set lower bound, overrides the value calculated by computeBound(). - */ - private $lowerBound = null; - - /** - * Manually set upper bound, overrides the value calculated by computeBound(). - */ - private $upperBound = null; - - /** - * Computed min bound. - */ - private $yMinValue = null; - - /** - * Computed max bound. - */ - private $yMaxValue = null; - - /** - * Compute the boundaries on the axis. - * - * @param dataSet The data set - */ - public function computeBound($dataSet) { - // Check if the data set is empty - $dataSetEmpty = true; - $serieList = null; - if ($dataSet instanceof XYDataSet) { - $pointList = $dataSet->getPointList(); - $dataSetEmpty = count($pointList) == 0; - - if (!$dataSetEmpty) { - // Process it as a serie - $serieList = array(); - array_push($serieList, $dataSet); - } - } else if ($dataSet instanceof XYSeriesDataSet) { - $serieList = $dataSet->getSerieList(); - if (count($serieList) > 0) { - $serie = current($serieList); - $dataSetEmpty = count($serie) == 0; - } - } else { - die("Error: unknown dataset type"); - } - - // If the dataset is empty, default some bounds - $yMin = 0; - $yMax = 1; - if (!$dataSetEmpty) { - // Compute lower and upper bound on the value axis - unset($yMin); - unset($yMax); - - foreach ($serieList as $serie) { - foreach ($serie->getPointList() as $point) { - $y = $point->getY(); - - if (!isset($yMin)) { - $yMin = $y; - $yMax = $y; - } else { - if ($y < $yMin) { - $yMin = $y; - } - - if ($y > $yMax) { - $yMax = $y; - } - } - } - } - } - - // If user specified bounds and they are actually greater than computer bounds, override computed bounds - if (isset($this->lowerBound) && $this->lowerBound < $yMin) { - $this->yMinValue = $this->lowerBound; - } else { - $this->yMinValue = $yMin; - } - - if (isset($this->upperBound) && $this->upperBound > $yMax) { - $this->yMaxValue = $this->upperBound; - } else { - $this->yMaxValue = $yMax; - } - } - - /** - * Getter of yMinValue. - * - * @return min bound - */ - public function getYMinValue() { - return $this->yMinValue; - } - - /** - * Getter of yMaxValue. - * - * @return max bound - */ - public function getYMaxValue() { - return $this->yMaxValue; - } - - /** - * Set manually the lower boundary value (overrides the automatic formatting). - * Typical usage is to set the bars starting from zero. - * - * @param double lower boundary value - */ - public function setLowerBound($lowerBound) { - $this->lowerBound = $lowerBound; - } - - /** - * Set manually the upper boundary value (overrides the automatic formatting). - * - * @param double upper boundary value - */ - public function setUpperBound($upperBound) { - $this->upperBound = $upperBound; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/caption/Caption.php b/webui/system/helper/libchart/classes/view/caption/Caption.php deleted file mode 100644 index 7e25bd7d..00000000 --- a/webui/system/helper/libchart/classes/view/caption/Caption.php +++ /dev/null @@ -1,112 +0,0 @@ -. - * - */ - - /** - * Caption. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 30 july 2007 - */ - class Caption { - protected $labelBoxWidth; - protected $labelBoxHeight; - - // Plot - protected $plot; - - // Label list - protected $labelList; - - // Color set - protected $colorSet; - - /** - * Constructor of Caption - */ - public function Caption() { - $this->labelBoxWidth = 15; - $this->labelBoxHeight = 15; - } - - /** - * Render the caption. - */ - public function render() { - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - $primitive = $this->plot->getPrimitive(); - - // Get the caption area - $captionArea = $this->plot->getCaptionArea(); - - // Get the pie color set - $colorSet = $this->colorSet; - $colorSet->reset(); - - $i = 0; - foreach ($this->labelList as $label) { - // Get the next color - $color = $colorSet->currentColor(); - $colorSet->next(); - - $boxX1 = $captionArea->x1; - $boxX2 = $boxX1 + $this->labelBoxWidth; - $boxY1 = $captionArea->y1 + 5 + $i * ($this->labelBoxHeight + 5); - $boxY2 = $boxY1 + $this->labelBoxHeight; - - $primitive->outlinedBox($boxX1, $boxY1, $boxX2, $boxY2, $palette->axisColor[0], $palette->axisColor[1]); - imagefilledrectangle($img, $boxX1 + 2, $boxY1 + 2, $boxX2 - 2, $boxY2 - 2, $color->getColor($img)); - - $text->printText($img, $boxX2 + 5, $boxY1 + $this->labelBoxHeight / 2, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->VERTICAL_CENTER_ALIGN); - - $i++; - } - } - - /** - * Sets the plot. - * - * @param Plot The plot - */ - public function setPlot($plot) { - $this->plot = $plot; - } - - /** - * Sets the label list. - * - * @param Array label list - */ - public function setLabelList($labelList) { - $this->labelList = $labelList; - } - - - /** - * Sets the color set. - * - * @param Array Color set - */ - public function setColorSet($colorSet) { - $this->colorSet = $colorSet; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/BarChart.php b/webui/system/helper/libchart/classes/view/chart/BarChart.php deleted file mode 100644 index 6a275493..00000000 --- a/webui/system/helper/libchart/classes/view/chart/BarChart.php +++ /dev/null @@ -1,183 +0,0 @@ -. - * - */ - - /** - * Base abstract class for rendering both horizontal and vertical bar charts. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - abstract class BarChart extends Chart { - protected $bound; - protected $axis; - protected $hasSeveralSerie; - - /** - * Creates a new bar chart. - * - * @param integer width of the image - * @param integer height of the image - */ - protected function BarChart($width, $height) { - parent::Chart($width, $height); - - // Initialize the bounds - $this->bound = new Bound(); - $this->bound->setLowerBound(0); - } - - /** - * Compute the axis. - */ - protected function computeAxis() { - $this->axis = new Axis($this->bound->getYMinValue(), $this->bound->getYMaxValue()); - $this->axis->computeBoundaries(); - } - - /** - * Create the image. - */ - protected function createImage() { - parent::createImage(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - $primitive = $this->plot->getPrimitive(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Aqua-like background - for ($i = $graphArea->y1; $i < $graphArea->y2; $i++) { - $color = $palette->backgroundColor[($i + 3) % 4]; - $primitive->line($graphArea->x1, $i, $graphArea->x2, $i, $color); - } - - // Axis - imagerectangle($img, $graphArea->x1 - 1, $graphArea->y1, $graphArea->x1, $graphArea->y2, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $graphArea->x1 - 1, $graphArea->y2, $graphArea->x2, $graphArea->y2 + 1, $palette->axisColor[0]->getColor($img)); - } - - /** - * Returns true if the data set has some data. - * @param minNumberOfPoint Minimum number of points (1 for bars, 2 for lines). - * - * @return true if data set empty - */ - protected function isEmptyDataSet($minNumberOfPoint) { - if ($this->dataSet instanceof XYDataSet) { - $pointList = $this->dataSet->getPointList(); - $pointCount = count($pointList); - return $pointCount < $minNumberOfPoint; - } else if ($this->dataSet instanceof XYSeriesDataSet) { - $serieList = $this->dataSet->getSerieList(); - reset($serieList); - if (count($serieList) > 0) { - $serie = current($serieList); - $pointList = $serie->getPointList(); - $pointCount = count($pointList); - return $pointCount < $minNumberOfPoint; - } - } else { - die("Error: unknown dataset type"); - } - } - - /** - * Checks the data model before rendering the graph. - */ - protected function checkDataModel() { - // Check if a dataset was defined - if (!$this->dataSet) { - die("Error: No dataset defined."); - } - - // Bar charts accept both XYDataSet and XYSeriesDataSet - if ($this->dataSet instanceof XYDataSet) { - // The dataset contains only one serie - $this->hasSeveralSerie = false; - } else if ($this->dataSet instanceof XYSeriesDataSet) { - // Check if each series has the same number of points - unset($lastPointCount); - $serieList = $this->dataSet->getSerieList(); - for ($i = 0; $i < count($serieList); $i++) { - $serie = $serieList[$i]; - $pointCount = count($serie->getPointList()); - if (isset($lastPointCount) && $pointCount != $lastPointCount) { - die("Error: serie <" . $i . "> doesn't have the same number of points as last serie (last one: <" . $lastPointCount. ">, this one: <" . $pointCount. ">)."); - } - $lastPointCount = $pointCount; - } - - // The dataset contains several series - $this->hasSeveralSerie = true; - } else { - die("Error: Bar chart accept only XYDataSet and XYSeriesDataSet"); - } - } - - /** - * Return the data as a series list (for consistency). - * - * @return List of series - */ - protected function getDataAsSerieList() { - // Get the data as a series list - $serieList = null; - if ($this->dataSet instanceof XYSeriesDataSet) { - $serieList = $this->dataSet->getSerieList(); - } else if ($this->dataSet instanceof XYDataSet) { - $serieList = array(); - array_push($serieList, $this->dataSet); - } - - return $serieList; - } - - /** - * Return the first serie of the list, or the dataSet itself if there is no serie. - * - * @return XYDataSet - */ - protected function getFirstSerieOfList() { - $pointList = null; - if ($this->dataSet instanceof XYSeriesDataSet) { - // For a series dataset, print the legend from the first serie - $serieList = $this->dataSet->getSerieList(); - reset($serieList); - $serie = current($serieList); - $pointList = $serie->getPointList(); - } else if ($this->dataSet instanceof XYDataSet) { - $pointList = $this->dataSet->getPointList(); - } - - return $pointList; - } - - /** - * Retourns the bound. - * - * @return bound Bound - */ - public function getBound() { - return $this->bound; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/Chart.php b/webui/system/helper/libchart/classes/view/chart/Chart.php deleted file mode 100644 index b55d8422..00000000 --- a/webui/system/helper/libchart/classes/view/chart/Chart.php +++ /dev/null @@ -1,118 +0,0 @@ -. - * - */ - - /*! \mainpage Libchart - * - * This is the reference API, automatically compiled by Doxygen. - * You can find here information that is not covered by the tutorial. - * - */ - - /** - * Base chart class. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - abstract class Chart { - /** - * The chart configuration. - */ - protected $config; - - /** - * The data set. - */ - protected $dataSet; - - /** - * Plot (holds graphical attributes). - */ - protected $plot; - - /** - * Abstract constructor of Chart. - * - * @param integer width of the image - * @param integer height of the image - */ - protected function Chart($width, $height) { - // Initialize the configuration - $this->config = new ChartConfig(); - - // Creates the plot - $this->plot = new Plot($width, $height); - $this->plot->setTitle("Untitled chart"); - } - - /** - * Checks the data model before rendering the graph. - */ - protected function checkDataModel() { - // Check if a dataset was defined - if (!$this->dataSet) { - die("Error: No dataset defined."); - } - - // Maybe no points are defined, but that's ok. This will yield and empty graph with default boundaries. - } - - /** - * Create the image. - */ - protected function createImage() { - $this->plot->createImage(); - } - - /** - * Sets the data set. - * - * @param dataSet The data set - */ - public function setDataSet($dataSet) { - $this->dataSet = $dataSet; - } - - /** - * Return the chart configuration. - * - * @return configuration : ChartConfig - */ - public function getConfig() { - return $this->config; - } - - /** - * Return the plot. - * - * @return plot - */ - public function getPlot() { - return $this->plot; - } - - /** - * Sets the title. - * - * @param string New title - */ - public function setTitle($title) { - $this->plot->setTitle($title); - } - } -?> diff --git a/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php b/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php deleted file mode 100644 index 25cbb2c1..00000000 --- a/webui/system/helper/libchart/classes/view/chart/HorizontalBarChart.php +++ /dev/null @@ -1,230 +0,0 @@ -. - * - */ - - /** - * Horizontal bar chart - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class HorizontalBarChart extends BarChart { - /** - * Ratio of empty space beside the bars. - */ - private $emptyToFullRatio; - - /** - * Creates a new horizontal bar chart. - * - * @param integer width of the image - * @param integer height of the image - */ - public function HorizontalBarChart($width = 600, $height = 250) { - parent::BarChart($width, $height); - - $this->emptyToFullRatio = 1 / 5; - $this->plot->setGraphPadding(new Padding(5, 30, 30, 50)); - } - - /** - * Computes the layout. - */ - protected function computeLayout() { - if ($this->hasSeveralSerie) { - $this->plot->setHasCaption(true); - } - $this->plot->computeLayout(); - } - - /** - * Print the axis. - */ - protected function printAxis() { - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - $stepValue = $this->axis->getTics(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Horizontal axis - for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { - $x = $graphArea->x1 + ($value - $minValue) * ($graphArea->x2 - $graphArea->x1) / ($this->axis->displayDelta); - - imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); - - $text->printText($img, $x, $graphArea->y2 + 5, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN); - } - - // Get first serie of a list - $pointList = $this->getFirstSerieOfList(); - - // Vertical Axis - $pointCount = count($pointList); - reset($pointList); - $rowHeight = ($graphArea->y2 - $graphArea->y1) / $pointCount; - reset($pointList); - for ($i = 0; $i <= $pointCount; $i++) { - $y = $graphArea->y2 - $i * $rowHeight; - - imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); - - if ($i < $pointCount) { - $point = current($pointList); - next($pointList); - - $label = $point->getX(); - - $text->printText($img, $graphArea->x1 - 5, $y - $rowHeight / 2, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); - } - } - } - - /** - * Print the bars. - */ - protected function printBar() { - // Get the data as a list of series for consistency - $serieList = $this->getDataAsSerieList(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - $stepValue = $this->axis->getTics(); - - // Start from the first color for the first serie - $barColorSet = $palette->barColorSet; - $barColorSet->reset(); - - $serieCount = count($serieList); - for ($j = 0; $j < $serieCount; $j++) { - $serie = $serieList[$j]; - $pointList = $serie->getPointList(); - $pointCount = count($pointList); - reset($pointList); - - // Select the next color for the next serie - if (!$this->config->getUseMultipleColor()) { - $color = $barColorSet->currentColor(); - $shadowColor = $barColorSet->currentShadowColor(); - $barColorSet->next(); - } - - $rowHeight = ($graphArea->y2 - $graphArea->y1) / $pointCount; - for ($i = 0; $i < $pointCount; $i++) { - $y = $graphArea->y2 - $i * $rowHeight; - - $point = current($pointList); - next($pointList); - - $value = $point->getY(); - - $xmax = $graphArea->x1 + ($value - $minValue) * ($graphArea->x2 - $graphArea->x1) / ($this->axis->displayDelta); - - // Bar dimensions - $yWithMargin = $y - $rowHeight * $this->emptyToFullRatio; - $rowWidthWithMargin = $rowHeight * (1 - $this->emptyToFullRatio * 2); - $barWidth = $rowWidthWithMargin / $serieCount; - $barOffset = $barWidth * $j; - $y1 = $yWithMargin - $barWidth - $barOffset; - $y2 = $yWithMargin - $barOffset - 1; - - // Select the next color for the next item in the serie - if ($this->config->getUseMultipleColor()) { - $color = $barColorSet->currentColor(); - $shadowColor = $barColorSet->currentShadowColor(); - $barColorSet->next(); - } - - // Draw caption text on bar - if ($this->config->getShowPointCaption()) { - $text->printText($img, $xmax + 5, $y2 - $barWidth / 2, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->VERTICAL_CENTER_ALIGN); - } - - // Draw the horizontal bar - imagefilledrectangle($img, $graphArea->x1 + 1, $y1, $xmax, $y2, $shadowColor->getColor($img)); - - // Prevents drawing a small box when x = 0 - if ($graphArea->x1 != $xmax) { - imagefilledrectangle($img, $graphArea->x1 + 2, $y1 + 1, $xmax - 4, $y2, $color->getColor($img)); - } - } - } - } - - /** - * Renders the caption. - */ - protected function printCaption() { - // Get the list of labels - $labelList = $this->dataSet->getTitleList(); - - // Create the caption - $caption = new Caption(); - $caption->setPlot($this->plot); - $caption->setLabelList($labelList); - - $palette = $this->plot->getPalette(); - $barColorSet = $palette->barColorSet; - $caption->setColorSet($barColorSet); - - // Render the caption - $caption->render(); - } - - /** - * Render the chart image. - * - * @param string name of the file to render the image to (optional) - */ - public function render($fileName = null) { - // Check the data model - $this->checkDataModel(); - - $this->bound->computeBound($this->dataSet); - $this->computeAxis(); - $this->computeLayout(); - $this->createImage(); - $this->plot->printLogo(); - $this->plot->printTitle(); - if (!$this->isEmptyDataSet(1)) { - $this->printAxis(); - $this->printBar(); - if ($this->hasSeveralSerie) { - $this->printCaption(); - } - } - - $this->plot->render($fileName); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/LineChart.php b/webui/system/helper/libchart/classes/view/chart/LineChart.php deleted file mode 100644 index 382e1b1d..00000000 --- a/webui/system/helper/libchart/classes/view/chart/LineChart.php +++ /dev/null @@ -1,200 +0,0 @@ -. - * - */ - - /** - * Line chart. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class LineChart extends BarChart { - /** - * Creates a new line chart. - * Line charts allow for XYDataSet and XYSeriesDataSet in order to plot several lines. - * - * @param integer width of the image - * @param integer height of the image - */ - public function LineChart($width = 600, $height = 250) { - parent::BarChart($width, $height); - - $this->plot->setGraphPadding(new Padding(5, 30, 50, 50)); - } - - /** - * Computes the layout. - */ - protected function computeLayout() { - if ($this->hasSeveralSerie) { - $this->plot->setHasCaption(true); - } - $this->plot->computeLayout(); - } - - /** - * Print the axis. - */ - protected function printAxis() { - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - $stepValue = $this->axis->getTics(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Vertical axis - for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { - $y = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); - - imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); - - $text->printText($img, $graphArea->x1 - 5, $y, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); - } - - // Get first serie of a list - $pointList = $this->getFirstSerieOfList(); - - // Horizontal Axis - $pointCount = count($pointList); - reset($pointList); - $columnWidth = ($graphArea->x2 - $graphArea->x1) / ($pointCount - 1); - - for ($i = 0; $i < $pointCount; $i++) { - $x = $graphArea->x1 + $i * $columnWidth; - - imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); - - $point = current($pointList); - next($pointList); - - $label = $point->getX(); - - $text->printDiagonal($img, $x - 5, $graphArea->y2 + 10, $this->plot->getTextColor(), $label); - } - } - - /** - * Print the lines. - */ - protected function printLine() { - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - - // Get the data as a list of series for consistency - $serieList = $this->getDataAsSerieList(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - $primitive = $this->plot->getPrimitive(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - $lineColorSet = $palette->lineColorSet; - $lineColorSet->reset(); - for ($j = 0; $j < count($serieList); $j++) { - $serie = $serieList[$j]; - $pointList = $serie->getPointList(); - $pointCount = count($pointList); - reset($pointList); - - $columnWidth = ($graphArea->x2 - $graphArea->x1) / ($pointCount - 1); - - $lineColor = $lineColorSet->currentColor(); - $lineColorShadow = $lineColorSet->currentShadowColor(); - $lineColorSet->next(); - $x1 = null; - $y1 = null; - for ($i = 0; $i < $pointCount; $i++) { - $x2 = $graphArea->x1 + $i * $columnWidth; - - $point = current($pointList); - next($pointList); - - $value = $point->getY(); - - $y2 = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); - - // Draw line - if ($x1) { - $primitive->line($x1, $y1, $x2, $y2, $lineColor, 4); - $primitive->line($x1, $y1 - 1, $x2, $y2 - 1, $lineColorShadow, 2); - } - - $x1 = $x2; - $y1 = $y2; - } - } - } - - /** - * Renders the caption. - */ - protected function printCaption() { - // Get the list of labels - $labelList = $this->dataSet->getTitleList(); - - // Create the caption - $caption = new Caption(); - $caption->setPlot($this->plot); - $caption->setLabelList($labelList); - - $palette = $this->plot->getPalette(); - $lineColorSet = $palette->lineColorSet; - $caption->setColorSet($lineColorSet); - - // Render the caption - $caption->render(); - } - - /** - * Render the chart image. - * - * @param string name of the file to render the image to (optional) - */ - public function render($fileName = null) { - // Check the data model - $this->checkDataModel(); - - $this->bound->computeBound($this->dataSet); - $this->computeAxis(); - $this->computeLayout(); - $this->createImage(); - $this->plot->printLogo(); - $this->plot->printTitle(); - if (!$this->isEmptyDataSet(2)) { - $this->printAxis(); - $this->printLine(); - if ($this->hasSeveralSerie) { - $this->printCaption(); - } - } - - $this->plot->render($fileName); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/PieChart.php b/webui/system/helper/libchart/classes/view/chart/PieChart.php deleted file mode 100644 index 9175f71b..00000000 --- a/webui/system/helper/libchart/classes/view/chart/PieChart.php +++ /dev/null @@ -1,266 +0,0 @@ -. - * - */ - - /** - * Pie chart. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class PieChart extends Chart { - protected $pieCenterX; - protected $pieCenterY; - - /** - * Constructor of a pie chart. - * - * @param integer width of the image - * @param integer height of the image - */ - public function PieChart($width = 600, $height = 250) { - parent::Chart($width, $height); - $this->plot->setGraphPadding(new Padding(15, 10, 30, 30)); - } - - /** - * Computes the layout. - */ - protected function computeLayout() { - $this->plot->setHasCaption(true); - $this->plot->computeLayout(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Compute the coordinates of the pie - $this->pieCenterX = $graphArea->x1 + ($graphArea->x2 - $graphArea->x1) / 2; - $this->pieCenterY = $graphArea->y1 + ($graphArea->y2 - $graphArea->y1) / 2; - - $this->pieWidth = round(($graphArea->x2 - $graphArea->x1) * 4 / 5); - $this->pieHeight = round(($graphArea->y2 - $graphArea->y1) * 3.7 / 5); - $this->pieDepth = round($this->pieWidth * 0.05); - } - - /** - * Compare two sampling point values, order from biggest to lowest value. - * - * @param double first value - * @param double second value - * @return integer result of the comparison - */ - protected function sortPie($v1, $v2) { - return $v1[0] == $v2[0] ? 0 : - $v1[0] > $v2[0] ? -1 : - 1; - } - - /** - * Compute pie values in percentage and sort them. - */ - protected function computePercent() { - $this->total = 0; - $this->percent = array(); - - $pointList = $this->dataSet->getPointList(); - foreach ($pointList as $point) { - $this->total += $point->getY(); - } - - foreach ($pointList as $point) { - $percent = $this->total == 0 ? 0 : 100 * $point->getY() / $this->total; - - array_push($this->percent, array($percent, $point)); - } - - // Sort data points - if ($this->config->getSortDataPoint()) { - usort($this->percent, array("PieChart", "sortPie")); - } - } - - /** - * Creates the pie chart image. - */ - protected function createImage() { - parent::createImage(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $primitive = $this->plot->getPrimitive(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Legend box - $primitive->outlinedBox($graphArea->x1, $graphArea->y1, $graphArea->x2, $graphArea->y2, $palette->axisColor[0], $palette->axisColor[1]); - - // Aqua-like background - for ($i = $graphArea->y1 + 2; $i < $graphArea->y2 - 1; $i++) { - $color = $palette->backgroundColor[($i + 3) % 4]; - $primitive->line($graphArea->x1 + 2, $i, $graphArea->x2 - 2, $i, $color); - } - } - - /** - * Renders the caption. - */ - protected function printCaption() { - // Create a list of labels - $labelList = array(); - foreach($this->percent as $percent) { - list($percent, $point) = $percent; - $label = $point->getX(); - - array_push($labelList, $label); - } - - // Create the caption - $caption = new Caption(); - $caption->setPlot($this->plot); - $caption->setLabelList($labelList); - - $palette = $this->plot->getPalette(); - $pieColorSet = $palette->pieColorSet; - $caption->setColorSet($pieColorSet); - - // Render the caption - $caption->render(); - } - - /** - * Draw a 2D disc. - * - * @param integer Center coordinate (y) - * @param array Colors for each portion - * @param bitfield Drawing mode - */ - protected function drawDisc($cy, $colorArray, $mode) { - // Get graphical obects - $img = $this->plot->getImg(); - - $i = 0; - $oldAngle = 0; - $percentTotal = 0; - - foreach ($this->percent as $a) { - list ($percent, $point) = $a; - - // If value is null, don't draw this arc - if ($percent <= 0) { - continue; - } - - $color = $colorArray[$i % count($colorArray)]; - - $percentTotal += $percent; - $newAngle = $percentTotal * 360 / 100; - - // imagefilledarc doesn't like null values (#1) - if ($newAngle - $oldAngle >= 1) { - imagefilledarc($img, $this->pieCenterX, $cy, $this->pieWidth, $this->pieHeight, $oldAngle, $newAngle, $color->getColor($img), $mode); - } - - $oldAngle = $newAngle; - - $i++; - } - } - - /** - * Print the percentage text. - */ - protected function drawPercent() { - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - $primitive = $this->plot->getPrimitive(); - - $angle1 = 0; - $percentTotal = 0; - - foreach ($this->percent as $a) { - list ($percent, $point) = $a; - - // If value is null, the arc isn't drawn, no need to display percent - if ($percent <= 0) { - continue; - } - - $percentTotal += $percent; - $angle2 = $percentTotal * 2 * M_PI / 100; - - $angle = $angle1 + ($angle2 - $angle1) / 2; - $label = number_format($percent) . "%"; - - $x = cos($angle) * ($this->pieWidth + 35) / 2 + $this->pieCenterX; - $y = sin($angle) * ($this->pieHeight + 35) / 2 + $this->pieCenterY; - - $text->printText($img, $x, $y, $this->plot->getTextColor(), $label, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN | $text->VERTICAL_CENTER_ALIGN); - - $angle1 = $angle2; - } - } - - /** - * Print the pie chart. - */ - protected function printPie() { - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - $primitive = $this->plot->getPrimitive(); - - // Get the pie color set - $pieColorSet = $palette->pieColorSet; - $pieColorSet->reset(); - - // Silhouette - for ($cy = $this->pieCenterY + $this->pieDepth / 2; $cy >= $this->pieCenterY - $this->pieDepth / 2; $cy--) { - $this->drawDisc($cy, $palette->pieColorSet->shadowColorList, IMG_ARC_EDGED); - } - - // Top - $this->drawDisc($this->pieCenterY - $this->pieDepth / 2, $palette->pieColorSet->colorList, IMG_ARC_PIE); - - // Top Outline - if ($this->config->getShowPointCaption()) { - $this->drawPercent(); - } - } - - /** - * Render the chart image. - * - * @param string name of the file to render the image to (optional) - */ - public function render($fileName = null) { - $this->computePercent(); - $this->computeLayout(); - $this->createImage(); - $this->plot->printLogo(); - $this->plot->printTitle(); - $this->printPie(); - $this->printCaption(); - - $this->plot->render($fileName); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php b/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php deleted file mode 100644 index 66cae771..00000000 --- a/webui/system/helper/libchart/classes/view/chart/VerticalBarChart.php +++ /dev/null @@ -1,229 +0,0 @@ -. - * - */ - - /** - * Chart composed of vertical bars. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class VerticalBarChart extends BarChart { - /** - * Ratio of empty space beside the bars. - */ - private $emptyToFullRatio; - - /** - * Creates a new vertical bar chart - * - * @param integer width of the image - * @param integer height of the image - */ - public function VerticalBarChart($width = 600, $height = 250) { - parent::BarChart($width, $height); - - $this->emptyToFullRatio = 1 / 5; - $this->plot->setGraphPadding(new Padding(5, 30, 50, 50)); - } - - /** - * Computes the layout. - */ - protected function computeLayout() { - if ($this->hasSeveralSerie) { - $this->plot->setHasCaption(true); - } - $this->plot->computeLayout(); - } - - /** - * Print the horizontal and veritcal axis. - */ - protected function printAxis() { - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - $stepValue = $this->axis->getTics(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Vertical axis - for ($value = $minValue; $value <= $maxValue; $value += $stepValue) { - $y = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); - - imagerectangle($img, $graphArea->x1 - 3, $y, $graphArea->x1 - 2, $y + 1, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $graphArea->x1 - 1, $y, $graphArea->x1, $y + 1, $palette->axisColor[1]->getColor($img)); - - $text->printText($img, $graphArea->x1 - 5, $y, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_RIGHT_ALIGN | $text->VERTICAL_CENTER_ALIGN); - } - - // Get first serie of a list - $pointList = $this->getFirstSerieOfList(); - - // Horizontal Axis - $pointCount = count($pointList); - reset($pointList); - $columnWidth = ($graphArea->x2 - $graphArea->x1) / $pointCount; - for ($i = 0; $i <= $pointCount; $i++) { - $x = $graphArea->x1 + $i * $columnWidth; - - imagerectangle($img, $x - 1, $graphArea->y2 + 2, $x, $graphArea->y2 + 3, $palette->axisColor[0]->getColor($img)); - imagerectangle($img, $x - 1, $graphArea->y2, $x, $graphArea->y2 + 1, $palette->axisColor[1]->getColor($img)); - - if ($i < $pointCount) { - $point = current($pointList); - next($pointList); - - $label = $point->getX(); - - $text->printDiagonal($img, $x + $columnWidth * 1 / 3, $graphArea->y2 + 10, $this->plot->getTextColor(), $label); - } - } - } - - /** - * Print the bars. - */ - protected function printBar() { - // Get the data as a list of series for consistency - $serieList = $this->getDataAsSerieList(); - - // Get graphical obects - $img = $this->plot->getImg(); - $palette = $this->plot->getPalette(); - $text = $this->plot->getText(); - - // Get the graph area - $graphArea = $this->plot->getGraphArea(); - - // Start from the first color for the first serie - $barColorSet = $palette->barColorSet; - $barColorSet->reset(); - - $minValue = $this->axis->getLowerBoundary(); - $maxValue = $this->axis->getUpperBoundary(); - $stepValue = $this->axis->getTics(); - - $serieCount = count($serieList); - for ($j = 0; $j < $serieCount; $j++) { - $serie = $serieList[$j]; - $pointList = $serie->getPointList(); - $pointCount = count($pointList); - reset($pointList); - - // Select the next color for the next serie - if (!$this->config->getUseMultipleColor()) { - $color = $barColorSet->currentColor(); - $shadowColor = $barColorSet->currentShadowColor(); - $barColorSet->next(); - } - - $columnWidth = ($graphArea->x2 - $graphArea->x1) / $pointCount; - for ($i = 0; $i < $pointCount; $i++) { - $x = $graphArea->x1 + $i * $columnWidth; - - $point = current($pointList); - next($pointList); - - $value = $point->getY(); - - $ymin = $graphArea->y2 - ($value - $minValue) * ($graphArea->y2 - $graphArea->y1) / ($this->axis->displayDelta); - - // Bar dimensions - $xWithMargin = $x + $columnWidth * $this->emptyToFullRatio; - $columnWidthWithMargin = $columnWidth * (1 - $this->emptyToFullRatio * 2); - $barWidth = $columnWidthWithMargin / $serieCount; - $barOffset = $barWidth * $j; - $x1 = $xWithMargin + $barOffset; - $x2 = $xWithMargin + $barWidth + $barOffset - 1; - - // Select the next color for the next item in the serie - if ($this->config->getUseMultipleColor()) { - $color = $barColorSet->currentColor(); - $shadowColor = $barColorSet->currentShadowColor(); - $barColorSet->next(); - } - - // Draw caption text on bar - if ($this->config->getShowPointCaption()) { - $text->printText($img, $x1 + $barWidth / 2 , $ymin - 5, $this->plot->getTextColor(), $value, $text->fontCondensed, $text->HORIZONTAL_CENTER_ALIGN | $text->VERTICAL_BOTTOM_ALIGN); - } - - // Draw the vertical bar - imagefilledrectangle($img, $x1, $ymin, $x2, $graphArea->y2 - 1, $shadowColor->getColor($img)); - - // Prevents drawing a small box when y = 0 - if ($ymin != $graphArea->y2) { - imagefilledrectangle($img, $x1 + 1, $ymin + 1, $x2 - 4, $graphArea->y2 - 1, $color->getColor($img)); - } - } - } - } - - /** - * Renders the caption. - */ - protected function printCaption() { - // Get the list of labels - $labelList = $this->dataSet->getTitleList(); - - // Create the caption - $caption = new Caption(); - $caption->setPlot($this->plot); - $caption->setLabelList($labelList); - - $palette = $this->plot->getPalette(); - $barColorSet = $palette->barColorSet; - $caption->setColorSet($barColorSet); - - // Render the caption - $caption->render(); - } - - /** - * Render the chart image. - * - * @param string name of the file to render the image to (optional) - */ - public function render($fileName = null) { - // Check the data model - $this->checkDataModel(); - - $this->bound->computeBound($this->dataSet); - $this->computeAxis(); - $this->computeLayout(); - $this->createImage(); - $this->plot->printLogo(); - $this->plot->printTitle(); - if (!$this->isEmptyDataSet(1)) { - $this->printAxis(); - $this->printBar(); - if ($this->hasSeveralSerie) { - $this->printCaption(); - } - } - - $this->plot->render($fileName); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/Color.php b/webui/system/helper/libchart/classes/view/color/Color.php deleted file mode 100644 index 01bdfd1e..00000000 --- a/webui/system/helper/libchart/classes/view/color/Color.php +++ /dev/null @@ -1,99 +0,0 @@ -. - * - */ - - /** - * Color. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class Color { - private $red; - private $green; - private $blue; - private $alpha; - private $gdColor; - - /** - * Creates a new color - * - * @param integer red [0..255] - * @param integer green [0..255] - * @param integer blue [0..255] - * @param integer alpha [0..255] - */ - public function Color($red, $green, $blue, $alpha = 0) { - $this->red = (int) $red; - $this->green = (int) $green; - $this->blue = (int) $blue; - $this->alpha = (int) round($alpha * 127.0 / 255); - - $this->gdColor = null; - } - - /** - * Get GD color. - * - * @param $img GD image resource - */ - public function getColor($img) { - // Checks if color has already been allocated - if (!$this->gdColor) { - if ($this->alpha == 0 || !function_exists('imagecolorallocatealpha')) { - $this->gdColor = imagecolorallocate($img, $this->red, $this->green, $this->blue); - } else { - $this->gdColor = imagecolorallocatealpha($img, $this->red, $this->green, $this->blue, $this->alpha); - } - } - - // Returns GD color - return $this->gdColor; - } - - /** - * Clip a color component in the interval [0..255] - * - * @param integer Component - * @return Clipped component - */ - public function clip($component) { - if ($component < 0) { - $component = 0; - } else if ($component > 255) { - $component = 255; - } - - return $component; - } - - /** - * Return a new color, which is a shadow of this one. - * - * @param double Multiplication factor - * @return Shadow color - */ - public function getShadowColor($shadowFactor) { - $red = $this->clip($this->red * $shadowFactor); - $green = $this->clip($this->green * $shadowFactor); - $blue = $this->clip($this->blue * $shadowFactor); - $shadowColor = new Color($red, $green, $blue); - - return $shadowColor; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/ColorSet.php b/webui/system/helper/libchart/classes/view/color/ColorSet.php deleted file mode 100644 index e2c7b51d..00000000 --- a/webui/system/helper/libchart/classes/view/color/ColorSet.php +++ /dev/null @@ -1,88 +0,0 @@ -. - * - */ - - /** - * A set of colors, used for drawing series of data. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 26 july 2007 - */ - class ColorSet { - public $colorList; - public $shadowColorList; - - /** - * ColorSet constructor. - * - * @param $shadowFactor Shadow factor - * @param $colorArray Colors as an array - */ - public function ColorSet($colorList, $shadowFactor) { - $this->colorList = $colorList; - $this->shadowColorList = array(); - - // Generate the shadow color set - foreach ($colorList as $color) { - $shadowColor = $color->getShadowColor($shadowFactor); - - array_push($this->shadowColorList, $shadowColor); - } - } - - /** - * Reset the iterator over the collections of colors. - */ - public function reset() { - reset($this->colorList); - reset($this->shadowColorList); - } - - /** - * Iterate over the colors and shadow colors. When we go after the last one, loop over. - * - */ - public function next() { - $value = next($this->colorList); - next($this->shadowColorList); - - // When we go after the last value, loop over. - if ($value == FALSE) { - $this->reset(); - } - } - - /** - * Returns the current color. - * - * @return Current color - */ - public function currentColor() { - return current($this->colorList); - } - - /** - * Returns the current shadow color. - * - * @return Current shadow color - */ - public function currentShadowColor() { - return current($this->shadowColorList); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/color/Palette.php b/webui/system/helper/libchart/classes/view/color/Palette.php deleted file mode 100644 index 0b960f70..00000000 --- a/webui/system/helper/libchart/classes/view/color/Palette.php +++ /dev/null @@ -1,156 +0,0 @@ -. - * - */ - - /** - * Color palette shared by all chart types. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 25 july 2007 - */ - class Palette { - // Plot attributes - public $red; - public $axisColor; - public $backgroundColor; - - // Specific chart attributes - public $barColorSet; - public $lineColorSet; - public $pieColorSet; - - /** - * Palette constructor. - */ - public function Palette() { - $this->red = new Color(255, 0, 0); - - // Set the colors for the horizontal and vertical axis - $this->setAxisColor(array( - new Color(201, 201, 201), - new Color(158, 158, 158) - )); - - // Set the colors for the background - $this->setBackgroundColor(array( - new Color(242, 242, 242), - new Color(231, 231, 231), - new Color(239, 239, 239), - new Color(253, 253, 253) - )); - - // Set the colors for the bars - $this->setBarColor(array( - new Color(42, 71, 181), - new Color(243, 198, 118), - new Color(128, 63, 35), - new Color(195, 45, 28), - new Color(224, 198, 165), - new Color(239, 238, 218), - new Color(40, 72, 59), - new Color(71, 112, 132), - new Color(167, 192, 199), - new Color(218, 233, 202) - )); - - // Set the colors for the lines - $this->setLineColor(array( - new Color(172, 172, 210), - new Color(2, 78, 0), - new Color(148, 170, 36), - new Color(233, 191, 49), - new Color(240, 127, 41), - new Color(243, 63, 34), - new Color(190, 71, 47), - new Color(135, 81, 60), - new Color(128, 78, 162), - new Color(121, 75, 255), - new Color(142, 165, 250), - new Color(162, 254, 239), - new Color(137, 240, 166), - new Color(104, 221, 71), - new Color(98, 174, 35), - new Color(93, 129, 1) - )); - - // Set the colors for the pie - $this->setPieColor(array( - new Color(2, 78, 0), - new Color(148, 170, 36), - new Color(233, 191, 49), - new Color(240, 127, 41), - new Color(243, 63, 34), - new Color(190, 71, 47), - new Color(135, 81, 60), - new Color(128, 78, 162), - new Color(121, 75, 255), - new Color(142, 165, 250), - new Color(162, 254, 239), - new Color(137, 240, 166), - new Color(104, 221, 71), - new Color(98, 174, 35), - new Color(93, 129, 1) - )); - } - - /** - * Set the colors for the axis. - * - * @param colors Array of Color - */ - public function setAxisColor($colors) { - $this->axisColor = $colors; - } - - /** - * Set the colors for the background. - * - * @param colors Array of Color - */ - public function setBackgroundColor($colors) { - $this->backgroundColor = $colors; - } - - /** - * Set the colors for the bar charts. - * - * @param colors Array of Color - */ - public function setBarColor($colors) { - $this->barColorSet = new ColorSet($colors, 0.75); - } - - /** - * Set the colors for the line charts. - * - * @param colors Array of Color - */ - public function setLineColor($colors) { - $this->lineColorSet = new ColorSet($colors, 0.75); - } - - /** - * Set the colors for the pie charts. - * - * @param colors Array of Color - */ - public function setPieColor($colors) { - $this->pieColorSet = new ColorSet($colors, 0.7); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/plot/Plot.php b/webui/system/helper/libchart/classes/view/plot/Plot.php deleted file mode 100644 index 5e1ceaed..00000000 --- a/webui/system/helper/libchart/classes/view/plot/Plot.php +++ /dev/null @@ -1,443 +0,0 @@ -. - * - */ - - /** - * The plot holds graphical attributes, and is responsible for computing the layout of the graph. - * The layout is quite simple right now, with 4 areas laid out like that: - * (of course this is subject to change in the future). - * - * output area------------------------------------------------| - * | (outer padding) | - * | image area--------------------------------------------| | - * | | (title padding) | | - * | | title area----------------------------------------| | | - * | | |-------------------------------------------------| | | - * | | | | - * | | (graph padding) (caption padding) | | - * | | graph area----------------| caption area---------| | | - * | | | | | | | | - * | | | | | | | | - * | | | | | | | | - * | | | | | | | | - * | | | | | | | | - * | | |-------------------------| |--------------------| | | - * | | | | - * | |-----------------------------------------------------| | - * | | - * |----------------------------------------------------------| - * - * All area dimensions are known in advance , and the optional logo is drawn in absolute coordinates. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * Created on 27 july 2007 - */ - class Plot { - // Style properties - protected $title; - - /** - * Location of the logo. Can be overriden to your personalized logo. - */ - protected $logoFileName; - - /** - * Outer area, whose dimension is the same as the PNG returned. - */ - protected $outputArea; - - /** - * Outer padding surrounding the whole image, everything outside is blank. - */ - protected $outerPadding; - - /** - * Coordinates of the area inside the outer padding. - */ - protected $imageArea; - - /** - * Fixed title height in pixels. - */ - protected $titleHeight; - - /** - * Padding of the title area. - */ - protected $titlePadding; - - /** - * Coordinates of the title area. - */ - protected $titleArea; - - /** - * True if the plot has a caption. - */ - protected $hasCaption; - - /** - * Ratio of graph/caption in width. - */ - protected $graphCaptionRatio; - - /** - * Padding of the graph area. - */ - protected $graphPadding; - - /** - * Coordinates of the graph area. - */ - protected $graphArea; - - /** - * Padding of the caption area. - */ - protected $captionPadding; - - /** - * Coordinates of the caption area. - */ - protected $captionArea; - - /** - * Text writer. - */ - protected $text; - - /** - * Color palette. - */ - protected $palette; - - /** - * GD image - */ - protected $img; - - /** - * Drawing primitives - */ - protected $primitive; - - protected $backGroundColor; - protected $textColor; - - /** - * Constructor of Plot. - * - * @param integer width of the image - * @param integer height of the image - */ - public function Plot($width, $height) { - $this->width = $width; - $this->height = $height; - - $this->text = new Text(); - $this->palette = new Palette(); - - // Default layout - $this->outputArea = new Rectangle(0, 0, $width - 1, $height - 1); - $this->outerPadding = new Padding(5); - $this->titleHeight = 26; - $this->titlePadding = new Padding(5); - $this->hasCaption = false; - $this->graphCaptionRatio = 0.50; - $this->graphPadding = new Padding(50); - $this->captionPadding = new Padding(15); - } - - /** - * Compute the area inside the outer padding (outside is white). - */ - private function computeImageArea() { - $this->imageArea = $this->outputArea->getPaddedRectangle($this->outerPadding); - } - - /** - * Compute the title area. - */ - private function computeTitleArea() { - $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; - $titleArea = new Rectangle( - $this->imageArea->x1, - $this->imageArea->y1, - $this->imageArea->x2, - $titleUnpaddedBottom - 1 - ); - $this->titleArea = $titleArea->getPaddedRectangle($this->titlePadding); - } - - /** - * Compute the graph area. - */ - private function computeGraphArea() { - $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; - $graphArea = null; - if ($this->hasCaption) { - $graphUnpaddedRight = $this->imageArea->x1 + ($this->imageArea->x2 - $this->imageArea->x1) * $this->graphCaptionRatio - + $this->graphPadding->left + $this->graphPadding->right; - $graphArea = new Rectangle( - $this->imageArea->x1, - $titleUnpaddedBottom, - $graphUnpaddedRight - 1, - $this->imageArea->y2 - ); - } else { - $graphArea = new Rectangle( - $this->imageArea->x1, - $titleUnpaddedBottom, - $this->imageArea->x2, - $this->imageArea->y2 - ); - } - $this->graphArea = $graphArea->getPaddedRectangle($this->graphPadding); - } - - /** - * Compute the caption area. - */ - private function computeCaptionArea() { - $graphUnpaddedRight = $this->imageArea->x1 + ($this->imageArea->x2 - $this->imageArea->x1) * $this->graphCaptionRatio - + $this->graphPadding->left + $this->graphPadding->right; - $titleUnpaddedBottom = $this->imageArea->y1 + $this->titleHeight + $this->titlePadding->top + $this->titlePadding->bottom; - $captionArea = new Rectangle( - $graphUnpaddedRight, - $titleUnpaddedBottom, - $this->imageArea->x2, - $this->imageArea->y2 - ); - $this->captionArea = $captionArea->getPaddedRectangle($this->captionPadding); - } - - /** - * Compute the layout of all areas of the graph. - */ - public function computeLayout() { - $this->computeImageArea(); - $this->computeTitleArea(); - $this->computeGraphArea(); - if ($this->hasCaption) { - $this->computeCaptionArea(); - } - } - - /** - * Creates and initialize the image. - */ - public function createImage() { - $this->img = imagecreatetruecolor($this->width, $this->height); - - $this->primitive = new Primitive($this->img); - - $this->backGroundColor = new Color(255, 255, 255); - $this->textColor = new Color(0, 0, 0); - - // White background - imagefilledrectangle($this->img, 0, 0, $this->width - 1, $this->height - 1, $this->backGroundColor->getColor($this->img)); - - //imagerectangle($this->img, $this->imageArea->x1, $this->imageArea->y1, $this->imageArea->x2, $this->imageArea->y2, $this->palette->red->getColor($this->img)); - } - - /** - * Print the title to the image. - */ - public function printTitle() { - $yCenter = $this->titleArea->y1 + ($this->titleArea->y2 - $this->titleArea->y1) / 2; - $this->text->printCentered($this->img, $yCenter, $this->textColor, $this->title, $this->text->fontCondensedBold); - } - - /** - * Print the logo image to the image. - */ - public function printLogo() { - @$logoImage = imageCreateFromPNG($this->logoFileName); - - if ($logoImage) { - imagecopymerge($this->img, $logoImage, 2 * $this->outerPadding->left, $this->outerPadding->top, 0, 0, imagesx($logoImage), imagesy($logoImage), 100); - } - } - - /** - * Renders to a file or to standard output. - * - * @param fileName File name (optional) - */ - public function render($fileName) { - if (isset($fileName)) { - imagepng($this->img, $fileName); - } else { - imagepng($this->img); - } - } - - /** - * Sets the title. - * - * @param string New title - */ - public function setTitle($title) { - $this->title = $title; - } - - /** - * Sets the logo image file name. - * - * @param string New logo image file name - */ - public function setLogoFileName($logoFileName) { - $this->logoFileName = $logoFileName; - } - - /** - * Return the GD image. - * - * @return GD Image - */ - public function getImg() { - return $this->img; - } - - /** - * Return the palette. - * - * @return palette - */ - public function getPalette() { - return $this->palette; - } - - /** - * Return the text. - * - * @return text - */ - public function getText() { - return $this->text; - } - - /** - * Return the primitive. - * - * @return primitive - */ - public function getPrimitive() { - return $this->primitive; - } - - /** - * Return the outer padding. - * - * @param integer Outer padding value in pixels - */ - public function getOuterPadding() { - return $outerPadding; - } - - /** - * Set the outer padding. - * - * @param integer Outer padding value in pixels - */ - public function setOuterPadding($outerPadding) { - $this->outerPadding = $outerPadding; - } - - /** - * Return the title height. - * - * @param integer title height - */ - public function setTitleHeight($titleHeight) { - $this->titleHeight = $titleHeight; - } - - /** - * Return the title padding. - * - * @param integer title padding - */ - public function setTitlePadding($titlePadding) { - $this->titlePadding = $titlePadding; - } - - /** - * Return the graph padding. - * - * @param integer graph padding - */ - public function setGraphPadding($graphPadding) { - $this->graphPadding = $graphPadding; - } - - /** - * Set if the graph has a caption. - * - * @param boolean graph has a caption - */ - public function setHasCaption($hasCaption) { - $this->hasCaption = $hasCaption; - } - - /** - * Set the caption padding. - * - * @param integer caption padding - */ - public function setCaptionPadding($captionPadding) { - $this->captionPadding = $captionPadding; - } - - /** - * Set the graph/caption ratio. - * - * @param integer caption padding - */ - public function setGraphCaptionRatio($graphCaptionRatio) { - $this->graphCaptionRatio = $graphCaptionRatio; - } - - /** - * Return the graph area. - * - * @return graph area - */ - public function getGraphArea() { - return $this->graphArea; - } - - /** - * Return the caption area. - * - * @return caption area - */ - public function getCaptionArea() { - return $this->captionArea; - } - - /** - * Return the text color. - * - * @return text color - */ - public function getTextColor() { - return $this->textColor; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/primitive/Padding.php b/webui/system/helper/libchart/classes/view/primitive/Padding.php deleted file mode 100644 index 4fd3613f..00000000 --- a/webui/system/helper/libchart/classes/view/primitive/Padding.php +++ /dev/null @@ -1,68 +0,0 @@ -. - * - */ - - /** - * Primitive geometric object representing a padding. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * @Created on 27 july 2007 - */ - class Padding { - /** - * Top padding. - */ - public $top; - - /** - * Right padding. - */ - public $right; - - /** - * Bottom padding. - */ - public $bottom; - - /** - * Left padding. - */ - public $left; - - /** - * Creates a new padding. - * - * @param integer Top padding - * @param integer Right padding - * @param integer Bottom padding - * @param integer Left padding - */ - public function Padding($top, $right = null, $bottom = null, $left = null) { - $this->top = $top; - if ($right == null) { - $this->right = $top; - $this->bottom = $top; - $this->left = $top; - } else { - $this->right = $right; - $this->bottom = $bottom; - $this->left = $left; - } - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/primitive/Primitive.php b/webui/system/helper/libchart/classes/view/primitive/Primitive.php deleted file mode 100644 index c3f8413c..00000000 --- a/webui/system/helper/libchart/classes/view/primitive/Primitive.php +++ /dev/null @@ -1,70 +0,0 @@ -. - * - */ - - /** - * Graphic primitives, extends GD with chart related primitives. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class Primitive { - private $img; - - /** - * Creates a new primitive object - * - * @param resource GD image resource - */ - public function Primitive($img) { - $this->img = $img; - } - - /** - * Draws a straight line. - * - * @param integer line start (X) - * @param integer line start (Y) - * @param integer line end (X) - * @param integer line end (Y) - * @param Color line color - */ - public function line($x1, $y1, $x2, $y2, $color, $width = 1) { - imagefilledpolygon($this->img, array($x1, $y1 - $width / 2, $x1, $y1 + $width / 2, $x2, $y2 + $width / 2, $x2, $y2 - $width / 2), 4, $color->getColor($this->img)); - // imageline($this->img, $x1, $y1, $x2, $y2, $color->getColor($this->img)); - } - - /** - * Draw a filled gray box with thick borders and darker corners. - * - * @param integer top left coordinate (x) - * @param integer top left coordinate (y) - * @param integer bottom right coordinate (x) - * @param integer bottom right coordinate (y) - * @param Color edge color - * @param Color corner color - */ - public function outlinedBox($x1, $y1, $x2, $y2, $color0, $color1) { - imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $color0->getColor($this->img)); - imagerectangle($this->img, $x1, $y1, $x1 + 1, $y1 + 1, $color1->getColor($this->img)); - imagerectangle($this->img, $x2 - 1, $y1, $x2, $y1 + 1, $color1->getColor($this->img)); - imagerectangle($this->img, $x1, $y2 - 1, $x1 + 1, $y2, $color1->getColor($this->img)); - imagerectangle($this->img, $x2 - 1, $y2 - 1, $x2, $y2, $color1->getColor($this->img)); - } - - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/primitive/Rectangle.php b/webui/system/helper/libchart/classes/view/primitive/Rectangle.php deleted file mode 100644 index 5defa7bf..00000000 --- a/webui/system/helper/libchart/classes/view/primitive/Rectangle.php +++ /dev/null @@ -1,80 +0,0 @@ -. - * - */ - - /** - * A rectangle identified by the top-left and the bottom-right corners. - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - * @Created on 27 july 2007 - */ - class Rectangle { - /** - * Top left X. - */ - public $x1; - - /** - * Top left Y. - */ - public $y1; - - /** - * Bottom right X. - */ - public $x2; - - /** - * Bottom right Y. - */ - public $y2; - - /** - * Constructor of Rectangle. - * - * @param x1 Left edge coordinate - * @param y1 Upper edge coordinate - * @param x2 Right edge coordinate - * @param y2 Bottom edge coordinate - */ - public function Rectangle($x1, $y1, $x2, $y2) { - $this->x1 = $x1; - $this->y1 = $y1; - $this->x2 = $x2; - $this->y2 = $y2; - } - - /** - * Apply a padding and returns the resulting rectangle. - * The result is an enlarged rectangle. - * - * @return Padded rectangle - */ - public function getPaddedRectangle($padding) { - $rectangle = new Rectangle( - $this->x1 + $padding->left, - $this->y1 + $padding->top, - $this->x2 - $padding->right, - $this->y2 - $padding->bottom - ); - - //echo "(" . $this->x1 . "," . $this->y1 . ") (" . $this->x2 . "," . $this->y2 . ")
"; - return $rectangle; - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/classes/view/text/Text.php b/webui/system/helper/libchart/classes/view/text/Text.php deleted file mode 100644 index 6e1db814..00000000 --- a/webui/system/helper/libchart/classes/view/text/Text.php +++ /dev/null @@ -1,129 +0,0 @@ -. - * - */ - - /** - * Text drawing helper - * - * @author Jean-Marc Trémeaux (jm.tremeaux at gmail.com) - */ - class Text { - public $HORIZONTAL_LEFT_ALIGN = 1; - public $HORIZONTAL_CENTER_ALIGN = 2; - public $HORIZONTAL_RIGHT_ALIGN = 4; - public $VERTICAL_TOP_ALIGN = 8; - public $VERTICAL_CENTER_ALIGN = 16; - public $VERTICAL_BOTTOM_ALIGN = 32; - - /** - * Creates a new text drawing helper. - */ - public function Text() { - $baseDir = dirname(__FILE__) . "/../../../"; - - // Free low-res fonts based on Bitstream Vera - $this->fontCondensed = $baseDir . "fonts/DejaVuSansCondensed.ttf"; - $this->fontCondensedBold = $baseDir . "fonts/DejaVuSansCondensed-Bold.ttf"; - } - - /** - * Print text. - * - * @param Image GD image - * @param integer text coordinate (x) - * @param integer text coordinate (y) - * @param Color text color - * @param string text value - * @param string font file name - * @param bitfield text alignment - */ - public function printText($img, $px, $py, $color, $text, $fontFileName, $align = 0) { - if (!($align & $this->HORIZONTAL_CENTER_ALIGN) && !($align & $this->HORIZONTAL_RIGHT_ALIGN)) { - $align |= $this->HORIZONTAL_LEFT_ALIGN; - } - - if (!($align & $this->VERTICAL_CENTER_ALIGN) && !($align & $this->VERTICAL_BOTTOM_ALIGN)) { - $align |= $this->VERTICAL_TOP_ALIGN; - } - - $fontSize = 8; - $lineSpacing = 1; - - list ($llx, $lly, $lrx, $lry, $urx, $ury, $ulx, $uly) = imageftbbox($fontSize, 0, $fontFileName, $text, array("linespacing" => $lineSpacing)); - - $textWidth = $lrx - $llx; - $textHeight = $lry - $ury; - - $angle = 0; - - if ($align & $this->HORIZONTAL_CENTER_ALIGN) { - $px -= $textWidth / 2; - } - - if ($align & $this->HORIZONTAL_RIGHT_ALIGN) { - $px -= $textWidth; - } - - if ($align & $this->VERTICAL_CENTER_ALIGN) { - $py += $textHeight / 2; - } - - if ($align & $this->VERTICAL_TOP_ALIGN) { - $py += $textHeight; - } - - imagettftext($img, $fontSize, $angle, $px, $py, $color->getColor($img), $fontFileName, $text); - } - - /** - * Print text centered horizontally on the image. - * - * @param Image GD image - * @param integer text coordinate (y) - * @param Color text color - * @param string text value - * @param string font file name - */ - public function printCentered($img, $py, $color, $text, $fontFileName) { - $this->printText($img, imagesx($img) / 2, $py, $color, $text, $fontFileName, $this->HORIZONTAL_CENTER_ALIGN | $this->VERTICAL_CENTER_ALIGN); - } - - /** - * Print text in diagonal. - * - * @param Image GD image - * @param integer text coordinate (x) - * @param integer text coordinate (y) - * @param Color text color - * @param string text value - */ - public function printDiagonal($img, $px, $py, $color, $text) { - $fontSize = 8; - $fontFileName = $this->fontCondensed; - - $lineSpacing = 1; - - list ($lx, $ly, $rx, $ry) = imageftbbox($fontSize, 0, $fontFileName, $text, array("linespacing" => $lineSpacing)); - $textWidth = $rx - $lx; - - $angle = -45; - - imagettftext($img, $fontSize, $angle, $px, $py, $color->getColor($img), $fontFileName, $text); - } - } -?> \ No newline at end of file diff --git a/webui/system/helper/libchart/doc/DEJAVU_LICENSE b/webui/system/helper/libchart/doc/DEJAVU_LICENSE deleted file mode 100644 index 6c87df40..00000000 --- a/webui/system/helper/libchart/doc/DEJAVU_LICENSE +++ /dev/null @@ -1,51 +0,0 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME -FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING -ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE -FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -$Id: LICENSE,v 1.1 2004/08/14 15:50:46 src Exp $ - diff --git a/webui/system/helper/libchart/doc/GNU_GPL_V3 b/webui/system/helper/libchart/doc/GNU_GPL_V3 deleted file mode 100644 index 94a9ed02..00000000 --- a/webui/system/helper/libchart/doc/GNU_GPL_V3 +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf b/webui/system/helper/libchart/fonts/DejaVuSansCondensed-Bold.ttf deleted file mode 100644 index 6f4e42ecee285c78e382a287a5ef36b077cdfbb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62716 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 diff --git a/webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf b/webui/system/helper/libchart/fonts/DejaVuSansCondensed.ttf deleted file mode 100644 index 12af35728fd1fc8a6aa16fd9f1f51b9dc9634c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73144 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 Zr9Sl^pZxzo-p@%9{g7EJx%^u0{{;fX5Rm`? diff --git a/webui/system/helper/libchart/images/PoweredBy.png b/webui/system/helper/libchart/images/PoweredBy.png deleted file mode 100644 index 6c5290c879c7fc6b8cfc0549ac2e3343d1eb2e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1608 zcmV-O2DkZ%P)WFU8GbZ8({Xk{QrNlj4iWF>9@00pc`L_t(o!`)bKOjB1B zKd-O+6Rp(%)+`7`Yl#og_6a5}8ga^$7&S{)7ZS=Cw3}rN%LpM;F{o^$aq0rj$e3|1 z6*HzHIu;!eP~tw|f~BEU_}7Pbg3`<5BAKoFNU;do5z9BydEr=M$b zUJn3bRu*6wh7fx8>{)DVti$1$=aj}Udh;yZx6CO^3yaE`{r6aZEk3H(lzi2AyDQ+e z+U<5Om)qRjOp+u?lC7<+0I+@gcDLJo;J|_N=g-@0w!*@~k&%&%j0~AfcJACcdRI!N z^2UuDEW2K>7mLLjjfVA7PoKVi z{rat2w<;?u*-M%gg7TBsXv+^R-Qmktzx+Dzh2ebRh0AySg@Dm<9QSxUZnvAu;B>LQ``2HZQED&*%wXz(m^B=nayUC$s`hq z06;F6U%Ys6!-fq!9?x#KM@B|QMMXV)_z)qa*XsoW0nG&fVAPoF-u*=%C5nB~Uxy~@xloDgF&a$(U-}|$&-_le$)l@iNK3Ycx-NkqVn_e zRVo!plK!0t81~Wuc|E>e7jpSiR#s-QSfo;^--n`ma`Yu);4XxSs<8n+Q*%)zf(P7+WaR|Gs)CUb4}D&AmHbb$Cym-P&-hwc*%@dFlQ>J1i{h)f%R~y!3OM_}p#$<~9k#p!gdA~L5I z1%lPP0_YJ~I;(~u2%@vI)8%rNmX-p5(P$hS8w&~wLI|nV>VbiQ(a}++_@yf)zdC|| zdIXH4zg)k2$9e!5ce?URYCC>9fn-5AUl*JGm{{Q#>Pg3(9N4Slai8TGFfwTGYf*OtSp&KR!~qN z5{c^T>!)rzDJh8|#k>�Df%md0%_-_rZINB{(cX5VLWmAQI=`sj|cma?_VC3Hv|) zHKL{Eo~h>R+s2;W@v$MmFdkp9QA%ju-IXE{2JpXN0m@(L7zfUZ9pQuk0000