]> wagnertech.de Git - timetracker.git/blobdiff - WEB-INF/lib/libchart/classes/view/plot/Plot.php
Initial repo created
[timetracker.git] / WEB-INF / lib / libchart / classes / view / plot / Plot.php
diff --git a/WEB-INF/lib/libchart/classes/view/plot/Plot.php b/WEB-INF/lib/libchart/classes/view/plot/Plot.php
new file mode 100644 (file)
index 0000000..a57d4ff
--- /dev/null
@@ -0,0 +1,415 @@
+<?php
+       /* Libchart - PHP chart library
+        * Copyright (C) 2005-2008 Jean-Marc Trémeaux (jm.tremeaux at gmail.com)
+        * 
+        * 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 <http://www.gnu.org/licenses/>.
+        * 
+        */
+       
+       /**
+        * 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;
+               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