Image 文件夹用于处理所有与图形有关的项目。

This commit is contained in:
yucheng.hu 2013-01-30 21:37:30 -05:00
parent 1460f9dfbd
commit bebb3c3f5e
148 changed files with 26441 additions and 0 deletions

733
Image/Canvas.php Normal file
View File

@ -0,0 +1,733 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Canvas based creation of images to facilitate different output formats
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Canvas.php,v 1.7 2006/02/28 22:46:25 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Specfies the path to the system location of font files.
*
* Remember trailing slash!
*
* This is set by default on Windows systems to %SystemRoot%\Fonts\
*/
if (!defined('IMAGE_CANVAS_SYSTEM_FONT_PATH')) {
if (isset($_SERVER['SystemRoot'])) {
define('IMAGE_CANVAS_SYSTEM_FONT_PATH', $_SERVER['SystemRoot'] . '/Fonts/');
} else {
/**
* @ignore
*/
define('IMAGE_CANVAS_SYSTEM_FONT_PATH', '');
}
}
/**
* Class for handling different output formats
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
* @abstract
*/
class Image_Canvas
{
/**
* The leftmost pixel of the element on the canvas
* @var int
* @access private
*/
var $_left = 0;
/**
* The topmost pixel of the element on the canvas
* @var int
* @access private
*/
var $_top = 0;
/**
* The width of the graph
* @var int
* @access private
*/
var $_width = 0;
/**
* The height of the graph
* @var int
* @access private
*/
var $_height = 0;
/**
* Polygon vertex placeholder
* @var array
* @access private
*/
var $_polygon = array();
/**
* The thickness of the line(s)
* @var int
* @access private
*/
var $_thickness = 1;
/**
* The line style
* @var mixed
* @access private
*/
var $_lineStyle = 'transparent';
/**
* The fill style
* @var mixed
* @access private
*/
var $_fillStyle = 'transparent';
/**
* The font options
* @var array
* @access private
*/
var $_font = array();
/**
* The default font
* @var array
* @access private
*/
var $_defaultFont = array('name' => 'Courier New', 'color' => 'black', 'size' => 9);
/**
* Create the canvas.
*
* Parameters available:
*
* 'width' The width of the graph on the canvas
*
* 'height' The height of the graph on the canvas
*
* 'left' The left offset of the graph on the canvas
*
* 'top' The top offset of the graph on the canvas
*
* @param array $params Parameter array
* @abstract
*/
function Image_Canvas($params)
{
if (isset($params['left'])) {
$this->_left = $params['left'];
}
if (isset($params['top'])) {
$this->_top = $params['top'];
}
if (isset($params['width'])) {
$this->_width = $params['width'];
}
if (isset($params['height'])) {
$this->_height = $params['height'];
}
$this->setDefaultFont($this->_defaultFont);
}
/**
* Get the x-point from the relative to absolute coordinates
*
* @param float $x The relative x-coordinate (in percentage of total width)
* @return float The x-coordinate as applied to the canvas
* @access private
*/
function _getX($x)
{
return floor($this->_left + $x);
}
/**
* Get the y-point from the relative to absolute coordinates
*
* @param float $y The relative y-coordinate (in percentage of total width)
* @return float The y-coordinate as applied to the canvas
* @access private
*/
function _getY($y)
{
return floor($this->_top + $y);
}
/**
* Get the width of the canvas
*
* @return int The width
*/
function getWidth()
{
return $this->_width;
}
/**
* Get the height of the canvas
*
* @return int The height
*/
function getHeight()
{
return $this->_height;
}
/**
* Sets the thickness of the line(s) to be drawn
*
* @param int $thickness The actual thickness (in pixels)
*/
function setLineThickness($thickness)
{
$this->_thickness = $thickness;
}
/**
* Sets the color of the line(s) to be drawn
*
* @param mixed $color The color of the line
*/
function setLineColor($color)
{
$this->_lineStyle = $color;
}
/**
* Sets the style of the filling of drawn objects.
*
* This method gives simple access to setFillColor(), setFillImage() and
* setGradientFill()
*
* @param mixed $fill The fill style
*/
function setFill($fill)
{
if (is_array($fill)) {
$this->setGradientFill($fill);
} elseif (file_exists($fill)) {
$this->setFillImage($fill);
} else {
$this->setFillColor($fill);
}
}
/**
* Sets the color of the filling of drawn objects
*
* @param mixed $color The fill color
*/
function setFillColor($color)
{
$this->_fillStyle = $color;
}
/**
* Sets an image that should be used for filling
*
* @param string $filename The filename of the image to fill with
*/
function setFillImage($filename)
{
}
/**
* Sets a gradient fill
*
* @param array $gradient Gradient fill options
*/
function setGradientFill($gradient)
{
$this->_fillStyle = $gradient;
}
/**
* Sets the font options.
*
* The $font array may have the following entries:
*
* 'name' The name of the font. This name must either be supported
* natively by the canvas or mapped to a font using the font-mapping scheme
*
* 'size' Size in pixels
*
* 'angle' The angle with which to write the text
*
* @param array $fontOptions The font options.
*/
function setFont($fontOptions)
{
$this->_font = $fontOptions;
if (!isset($this->_font['color'])) {
$this->_font['color'] = 'black';
}
if (!(isset($this->_font['angle'])) || ($this->_font['angle'] === false)) {
$this->_font['angle'] = 0;
}
if (isset($this->_font['angle'])) {
if ((($this->_font['angle'] > 45) && ($this->_font['angle'] < 135)) ||
(($this->_font['angle'] > 225) && ($this->_font['angle'] < 315))
) {
$this->_font['vertical'] = true;
}
}
if ((!isset($this->_font['file'])) && (isset($this->_font['name']))) {
include_once 'Image/Canvas/Tool.php';
$this->_font['file'] = Image_Canvas_Tool::fontMap($this->_font['name']);
}
}
/**
* Sets the default font options.
*
* The $font array may have the following entries:
*
* 'name' The name of the font. This name must either be supported
* natively by the canvas or mapped to a font using the font-mapping scheme
*
* 'size' Size in pixels
*
* 'angle' The angle with which to write the text
*
* @param array $fontOptions The font options.
*/
function setDefaultFont($fontOptions)
{
$this->setFont($fontOptions);
$this->_defaultFont = $this->_font;
}
/**
* Resets the canvas.
*
* Includes fillstyle, linestyle, thickness and polygon
*
* @access private
*/
function _reset()
{
$this->_lineStyle = false;
$this->_fillStyle = false;
$this->_thickness = 1;
$this->_polygon = array();
$this->_font = $this->_defaultFont;
}
/**
* Reset the canvas.
*
* Includes fillstyle, linestyle, thickness and polygon
*/
function reset()
{
$this->_reset();
}
/**
* Draw a line end
*
* Parameter array:
* 'x': int X point
* 'y': int Y point
* 'end': string The end type of the end
* 'angle': int [optional] The angle with which to draw the end
* @param array $params Parameter array
*/
function drawEnd($params)
{
}
/**
* Draw a line
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'end0': string [optional] The end type of end0 (the start)
* 'end1': string [optional] The end type of end1 (the end)
* 'size0': int [optional] The size of end0
* 'size1': int [optional] The size of end1
* 'color': mixed [optional] The line color
* @param array $params Parameter array
*/
function line($params)
{
$x0 = $this->_getX($params['x0']);
$y0 = $this->_getY($params['y0']);
$x1 = $this->_getX($params['x1']);
$y1 = $this->_getY($params['y1']);
if (isset($params['end0'])) {
$angle = Image_Canvas_Tool::getAngle($x1, $y1, $x0, $y0);
$this->drawEnd(
array(
'end' => $params['end0'],
'x' => $params['x0'],
'y' => $params['y0'],
'angle' => $angle,
'color' => (isset($params['color0']) ? $params['color0'] : false),
'size' => $params['size0']
)
);
}
if (isset($params['end1'])) {
$angle = Image_Canvas_Tool::getAngle($x0, $y0, $x1, $y1);
//print "<pre>"; var_dump($params, $angle); print "</pre>";
$this->drawEnd(
array(
'end' => $params['end1'],
'x' => $params['x1'],
'y' => $params['y1'],
'angle' => $angle,
'color' => (isset($params['color1']) ? $params['color1'] : false),
'size' => $params['size1']
)
);
}
$this->_reset();
}
/**
* Adds vertex to a polygon
*
* Parameter array:
* 'x': int X point
* 'y': int Y point
* 'url': string [optional] URL to link the vertex to (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'alt': string [optional] Alternative text to show in the image map (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'target': string [optional] The link target on the image map (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'mapsize': int [optional] The size of the "map", i.e. the size of the hot spot (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* @param array $params Parameter array
*/
function addVertex($params)
{
$params['X'] = $this->_getX($params['x']);
$params['Y'] = $this->_getY($params['y']);
$this->_polygon[] = $params;
}
/**
* Adds "splined" vertex to a polygon
*
* Parameter array:
* 'x': int X point
* 'y': int Y point
* 'p1x': int X Control point 1
* 'p1y': int Y Control point 1
* 'p2x': int X Control point 2
* 'p2y': int Y Control point 2
* 'url': string [optional] URL to link the vertex to (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'alt': string [optional] Alternative text to show in the image map (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'target': string [optional] The link target on the image map (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* 'mapsize': int [optional] The size of the "map", i.e. the size of the hot spot (must be used with 'map_vertices' in polygon() on a canvas that support image maps)
* @param array $params Parameter array
*/
function addSpline($params)
{
$params['X'] = $this->_getX($params['x']);
$params['Y'] = $this->_getY($params['y']);
$params['P1X'] = $this->_getX($params['p1x']);
$params['P1Y'] = $this->_getY($params['p1y']);
$params['P2X'] = $this->_getX($params['p2x']);
$params['P2Y'] = $this->_getY($params['p2y']);
$this->_polygon[] = $params;
}
/**
* Draws a polygon
*
* Parameter array:
* 'connect': bool [optional] Specifies whether the start point should be
* connected to the endpoint (closed polygon) or not (connected line)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function polygon($params)
{
$this->_reset();
}
/**
* Draw a rectangle
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function rectangle($params)
{
$this->_reset();
}
/**
* Draw an ellipse
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function ellipse($params)
{
$this->_reset();
}
/**
* Draw a pie slice
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'v1': int The starting angle (in degrees)
* 'v2': int The end angle (in degrees)
* 'srx': int [optional] Starting X-radius of the pie slice (i.e. for a doughnut)
* 'sry': int [optional] Starting Y-radius of the pie slice (i.e. for a doughnut)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function pieslice($params)
{
$this->_reset();
}
/**
* Get the width of a text,
*
* @param string $text The text to get the width of
* @return int The width of the text
*/
function textWidth($text)
{
}
/**
* Get the height of a text,
*
* @param string $text The text to get the height of
* @return int The height of the text
*/
function textHeight($text)
{
}
/**
* Writes text
*
* Parameter array:
* 'x': int X-point of text
* 'y': int Y-point of text
* 'text': string The text to add
* 'alignment': array [optional] Alignment
* 'color': mixed [optional] The color of the text
*/
function addText($params)
{
$this->_reset();
}
/**
* Overlay image
*
* Parameter array:
* 'x': int X-point of overlayed image
* 'y': int Y-point of overlayed image
* 'filename': string The filename of the image to overlay
* 'width': int [optional] The width of the overlayed image (resizing if possible)
* 'height': int [optional] The height of the overlayed image (resizing if possible)
* 'alignment': array [optional] Alignment
*/
function image($params)
{
}
/**
* Set clipping to occur
*
* Parameter array:
*
* 'x0': int X point of Upper-left corner
* 'y0': int X point of Upper-left corner
* 'x1': int X point of lower-right corner
* 'y1': int Y point of lower-right corner
*/
function setClipping($params = false)
{
}
/**
* Start a group.
*
* What this does, depends on the canvas/format.
*
* @param string $name The name of the group
*/
function startGroup($name = false)
{
}
/**
* End the "current" group.
*
* What this does, depends on the canvas/format.
*/
function endGroup()
{
}
/**
* Output the result of the canvas to the browser
*
* @param array $params Parameter array, the contents and meaning depends on the actual Canvas
* @abstract
*/
function show($params = false)
{
if ($params === false) {
header('Expires: Tue, 2 Jul 1974 17:41:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header('Cache-Control: no-cache, must-revalidate'); // HTTP/1.1
header('Pragma: no-cache');
}
}
/**
* Save the result of the canvas to a file
*
* Parameter array:
* 'filename': string The file to output to
* @param array $params Parameter array, the contents and meaning depends on the actual Canvas
* @abstract
*/
function save($params = false)
{
}
/**
* Get a canvas specific HTML tag.
*
* This method implicitly saves the canvas to the filename in the
* filesystem path specified and parses it as URL specified by URL path
*
* Parameter array:
* 'filename': string
* 'filepath': string Path to the file on the file system. Remember the final slash
* 'urlpath': string Path to the file available through an URL. Remember the final slash
*/
function toHtml($params)
{
$this->save(array('filename' => $params['filepath'] . $params['filename']));
}
/**
* Canvas factory method.
*
* Supported canvass are:
*
* 'png': output in PNG format (using GD)
*
* 'jpg': output in JPEG format (using GD)
*
* 'pdf': output in PDF format (using PDFlib)
*
* 'svg': output in SVG format
*
* 'imagemap': output as a html image map
*
* An example of usage:
*
* <code>
* <?php
* $Canvas =& Image_Graph::factory('png',
* array('width' => 800, 'height' => 600, 'antialias' => 'native')
* );
* ?>
* </code>
*
* @param string $canvas The canvas type
* @param array $params The parameters for the canvas constructor
* @return Image_Canvas The newly created canvas
* @static
*/
function &factory($canvas, $params)
{
$canvas = strtoupper($canvas);
if (($canvas == 'PNG') || ($canvas == 'GD')) {
$canvas = 'GD_PNG';
}
if (($canvas == 'JPG') || ($canvas == 'JPEG')) {
$canvas = 'GD_JPG';
}
if ($canvas == 'IMAGEMAP') {
$canvas = 'ImageMap';
}
$class = 'Image_Canvas_'. $canvas;
include_once 'Image/Canvas/'. str_replace('_', '/', $canvas) . '.php';
$obj =& new $class($params);
return $obj;
}
}
?>

182
Image/Canvas/Color.php Normal file
View File

@ -0,0 +1,182 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Stefan Neufeind <pear.neufeind@speedpartner.de> |
// +----------------------------------------------------------------------+
//
// $Id: Color.php,v 1.3 2005/09/14 17:25:46 nosey Exp $
/**
* Class for color-handling
*
* @author Stefan Neufeind <pear.neufeind@speedpartner.de>
* @package Image_Canvas
* @category images
* @license The PHP License, version 2.02
*/
/**
* Color class to be extended; from package PEAR::Image_Color
*/
require_once 'Image/Color.php';
/**
* Class for color-handling
*
* This is used to extend the functionality of the current PEAR::Image_Color v0.4.
* I hope to be allowed to incorporate some of the improvements in a new Image_Color release.
*
* @author Stefan Neufeind <pear.neufeind@speedpartner.de>
* @package Image_Canvas
* @access public
*/
class Image_Canvas_Color extends Image_Color
{
/**
* Allocates a color in the given image.
*
* Userdefined color specifications get translated into
* an array of rgb values.
*
* @param resource GD-resource
* @param mixed any color representation supported by color2RGB()
* @return resource Image color handle
* @see color2RGB()
* @access public
* @static
*/
function allocateColor(&$img, $color)
{
$color = Image_Canvas_Color::color2RGB($color);
if (($color[3] == 255) || (!function_exists("imagecolorallocatealpha"))) {
return imagecolorallocate($img, $color[0], $color[1], $color[2]);
} else {
return imagecolorallocatealpha($img, $color[0], $color[1], $color[2], 127-round(($color[3]*127)/255));
}
}
/**
* Convert any color-representation into an array of 4 ints (RGBA).
*
* Userdefined color specifications get translated into
* an array of rgb values.
*
* @param mixed any color representation supported by Image_Canvas_Color::color2RGB()
* @return array Array of 4 ints (RGBA-representation)
* @access public
* @static
*/
function color2RGB($color)
{
if (is_array($color)) {
if (!is_numeric($color[0])) {
return null; // error
}
if (count($color) == 3) { // assume RGB-color
// 255 = alpha-value; full opaque
return array((int) $color[0],
(int) $color[1],
(int) $color[2],
255);
}
if (count($color) == 4) { // assume RGBA-color
// 255 = alpha-value; full opaque
return array((int) $color[0],
(int) $color[1],
(int) $color[2],
(int) $color[3]);
}
return null; // error
} elseif (is_string($color)) {
$alphaPos = strpos($color, '@');
if ($alphaPos === false) {
$alpha = 255;
} else {
$alphaFloat = (float) substr($color, $alphaPos+1);
// restrict to range 0..1
$alphaFloat = max(min($alphaFloat, 1), 0);
$alpha = (int) round((float) 255 * $alphaFloat);
$color = substr($color, 0, $alphaPos);
}
if ($color[0] == '#') { // hex-color given, e.g. #FFB4B4
$tempColor = parent::hex2rgb($color);
return array((int) $tempColor[0],
(int) $tempColor[1],
(int) $tempColor[2],
$alpha);
}
if (strpos($color,'%') !== false) {
$tempColor = parent::percentageColor2RGB($color);
return array((int) $tempColor[0],
(int) $tempColor[1],
(int) $tempColor[2],
$alpha);
} else {
$tempColor = parent::namedColor2RGB($color);
return array((int) $tempColor[0],
(int) $tempColor[1],
(int) $tempColor[2],
$alpha);
}
} else {
return null; // error
}
}
/**
* getRange
* Given a degree, you can get the range of colors between one color and
* another color.
*
* @access public
* @param string How much each 'step' between the colors we should take.
* @return array Returns an array of all the colors, one element for each color.
*/
function getRange ($degrees)
{
$tempColors = parent::getRange($degrees);
// now add alpha-channel information
$steps = count($tempColors);
for($counter=0;$counter<$steps;$counter++) {
$tempColors[$counter] = parent::hex2rgb($tempColors[$counter]);
unset($tempColors[$counter]['hex']);
$tempColors[$counter][3] = (int) round(
(((float) $this->color1[3]*($steps-$counter))+
((float) $this->color2[3]*($counter))
) / $steps
);
}
return $tempColors;
}
/**
* Internal method to correctly set the colors.
*
* @param mixed color 1
* @param mixed color 2
* @access private
*/
function _setColors ( $col1, $col2 )
{
$this->color1 = Image_Canvas_Color::color2RGB($col1);
$this->color2 = Image_Canvas_Color::color2RGB($col2);
}
}
?>

View File

@ -0,0 +1,99 @@
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
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.
Arev Fonts Copyright
------------------------------
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
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 modifications to the Bitstream Vera 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 "Tavmjong Bah" or the word "Arev".
This License becomes null and void to the extent applicable to Fonts
or Font Software that has been modified and is distributed under the
"Tavmjong Bah Arev" 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
TAVMJONG BAH 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 name of Tavmjong Bah 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 Tavmjong Bah. For further information, contact: tavmjong @ free
. fr.
$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

12
Image/Canvas/Fonts/README Normal file
View File

@ -0,0 +1,12 @@
This is where the font files are located.
Font files can be found at:
MS CoreFonts
http://corefonts.sourceforge.net/
Divide By Zero (most are cartoonish)
http://fonts.tom7.com/
MING FDB Fonts
http://ming.sf.net/

BIN
Image/Canvas/Fonts/Vera.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,124 @@
Bitstream Vera Fonts Copyright
The fonts have a generous copyright, allowing derivative works (as
long as "Bitstream" or "Vera" are not in the names), and full
redistribution (so long as they are not *sold* by themselves). They
can be be bundled, redistributed and sold with any software.
The fonts are distributed under the following copyright:
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.
Copyright FAQ
=============
1. I don't understand the resale restriction... What gives?
Bitstream is giving away these fonts, but wishes to ensure its
competitors can't just drop the fonts as is into a font sale system
and sell them as is. It seems fair that if Bitstream can't make money
from the Bitstream Vera fonts, their competitors should not be able to
do so either. You can sell the fonts as part of any software package,
however.
2. I want to package these fonts separately for distribution and
sale as part of a larger software package or system. Can I do so?
Yes. A RPM or Debian package is a "larger software package" to begin
with, and you aren't selling them independently by themselves.
See 1. above.
3. Are derivative works allowed?
Yes!
4. Can I change or add to the font(s)?
Yes, but you must change the name(s) of the font(s).
5. Under what terms are derivative works allowed?
You must change the name(s) of the fonts. This is to ensure the
quality of the fonts, both to protect Bitstream and Gnome. We want to
ensure that if an application has opened a font specifically of these
names, it gets what it expects (though of course, using fontconfig,
substitutions could still could have occurred during font
opening). You must include the Bitstream copyright. Additional
copyrights can be added, as per copyright law. Happy Font Hacking!
6. If I have improvements for Bitstream Vera, is it possible they might get
adopted in future versions?
Yes. The contract between the Gnome Foundation and Bitstream has
provisions for working with Bitstream to ensure quality additions to
the Bitstream Vera font family. Please contact us if you have such
additions. Note, that in general, we will want such additions for the
entire family, not just a single font, and that you'll have to keep
both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
glyphs to the font, they must be stylistically in keeping with Vera's
design. Vera cannot become a "ransom note" font. Jim Lyles will be
providing a document describing the design elements used in Vera, as a
guide and aid for people interested in contributing to Vera.
7. I want to sell a software package that uses these fonts: Can I do so?
Sure. Bundle the fonts with your software and sell your software
with the fonts. That is the intent of the copyright.
8. If applications have built the names "Bitstream Vera" into them,
can I override this somehow to use fonts of my choosing?
This depends on exact details of the software. Most open source
systems and software (e.g., Gnome, KDE, etc.) are now converting to
use fontconfig (see www.fontconfig.org) to handle font configuration,
selection and substitution; it has provisions for overriding font
names and subsituting alternatives. An example is provided by the
supplied local.conf file, which chooses the family Bitstream Vera for
"sans", "serif" and "monospace". Other software (e.g., the XFree86
core server) has other mechanisms for font substitution.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,36 @@
Arial,arial.ttf
Arial Bold,arialbd.ttf
Arial Bold Italic,arialbi.ttf
Arial Italic,ariali.ttf
Courier New,cour.ttf
Courier New Bold,courbd.ttf
Courier New Bold Italic,courbi.ttf
Courier New Italic,couri.ttf
Garamond,gara.ttf
Garamond Bold,garabd.ttf
Garamond Italic,garait.ttf
Gothic,gothic.ttf
Gothic Bold,gothicb.ttf
Gothic Bold Italic,gothicbi.ttf
Gothic Italic,gothici.ttf
Sans Serif,micross.ttf
Reference Sans Serif,refsan.ttf
Times New Roman,times.ttf
Times New Roman Bold,timesbd.ttf
Times New Roman Bold Italic,timesbi.ttf
Times New Roman Italic,timesi.ttf
Vera,Vera.ttf
Vera Bold,VeraBd.ttf
Vera Italic,VeraIt.ttf
Vera Bold Italic,VeraBI.ttf
Vera Mono,VeraMono.ttf
Vera Bold,VeraMoBd.ttf
Vera Italic,VeraMoIt.ttf
Vera Bold Italic,VeraMoBI.ttf
Vera Serif,VeraSe.ttf
Vera Serif Bold,VeraSeBd.ttf
Verdana,verdana.ttf
Verdana Bold,verdanab.ttf
Verdana Bold Italic,verdanaz.ttf
Verdana Italic,verdanai.ttf
Droid Sans Fallback,DroidSansFallback.ttf

1697
Image/Canvas/GD.php Normal file

File diff suppressed because it is too large Load Diff

119
Image/Canvas/GD/JPG.php Normal file
View File

@ -0,0 +1,119 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Canvas class to handle JPEG format.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: JPG.php,v 1.2 2005/08/24 20:37:34 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Include file Image/Canvas/GD.php
*/
require_once 'Image/Canvas/GD.php';
/**
* JPEG Canvas class.
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
class Image_Canvas_GD_JPG extends Image_Canvas_GD
{
/**
* The JPEG quality
* @var int
* @access private
*/
var $_quality = 75;
/**
* Create the JPEG canvas
*
* Additional parameters other than those available for common {@link
* Image_Graph_Canvas_GD} class are:
*
* 'quality' The JPEG quality in as a percentage value from 0 (lowest
* quality, smallest file) to 100 (highest quality, biggest file)
*
* @param array $param Parameter array
*/
function Image_Canvas_GD_JPG($param)
{
parent::Image_Canvas_GD($param);
if (isset($param['quality'])) {
$this->_quality = max(0, min(100, $param['quality']));
}
$this->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_left + $this->_width - 1,
'y1' => $this->_top + $this->_height - 1,
'fill' => 'white',
'line' => 'transparent'
)
);
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
* @abstract
*/
function show($param = false)
{
parent::show($param);
header('Content-type: image/jpg');
header('Content-Disposition: inline; filename = \"'. basename($_SERVER['PHP_SELF'], '.php') . '.jpg\"');
ImageJPEG($this->_canvas, '', $this->_quality);
ImageDestroy($this->_canvas);
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
* @abstract
*/
function save($param = false)
{
parent::save($param);
ImageJPEG($this->_canvas, $param['filename'], $this->_quality);
ImageDestroy($this->_canvas);
}
}
?>

125
Image/Canvas/GD/PNG.php Normal file
View File

@ -0,0 +1,125 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Canvas class to handle PNG format.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: PNG.php,v 1.3 2005/08/24 20:37:34 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Include file Image/Canvas/GD.php
*/
require_once 'Image/Canvas/GD.php';
/**
* PNG Canvas class.
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
class Image_Canvas_GD_PNG extends Image_Canvas_GD
{
/**
* Create the PNG canvas
*
* @param array $param Parameter array
*/
function Image_Canvas_GD_PNG($param)
{
parent::Image_Canvas_GD($param);
if ((isset($param['transparent'])) && ($param['transparent']) &&
($this->_gd2)
) {
if ($param['transparent'] === true) {
$transparent = '#123ABD';
} else {
$transparent = $param['transparent'];
}
$color = $this->_color($transparent);
$trans = ImageColorTransparent($this->_canvas, $color);
$this->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_left + $this->_width - 1,
'y1' => $this->_top + $this->_height - 1,
'fill' => 'opague',
'line' => 'transparent'
)
);
} else {
$this->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_left + $this->_width - 1,
'y1' => $this->_top + $this->_height - 1,
'fill' => 'white',
'line' => 'transparent'
)
);
}
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
* @abstract
*/
function show($param = false)
{
parent::show($param);
header('Content-type: image/png');
header('Content-Disposition: inline; filename = \"'. basename($_SERVER['PHP_SELF'], '.php') . '.png\"');
ImagePNG($this->_canvas);
ImageDestroy($this->_canvas);
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
* @abstract
*/
function save($param = false)
{
parent::save($param);
ImagePNG($this->_canvas, $param['filename']);
ImageDestroy($this->_canvas);
}
}
?>

355
Image/Canvas/ImageMap.php Normal file
View File

@ -0,0 +1,355 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Class for handling output as a HTML imagemap
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: ImageMap.php,v 1.7 2006/02/13 20:53:20 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Class for handling output as a HTML imagemap
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
* @since version 0.2.0
*/
class Image_Canvas_ImageMap extends Image_Canvas
{
/**
* The image map (if any)
* @var array
* @access private
*/
var $_map = array();
/**
* Add a map tag
* @param string $shape The shape, either rect, circle or polygon
* @param string $coords The list of coordinates for the shape
* @param array $params Parameter array
*/
function _addMapTag($shape, $coords, $params)
{
if (isset($params['url'])) {
$url = $params['url'];
$target = (isset($params['target']) ? $params['target'] : false);
$alt = (isset($params['alt']) ? $params['alt'] : false);
$tags = '';
if (isset($params['htmltags'])) {
foreach ($params['htmltags'] as $key => $value) {
$tags .= ' ';
if (strpos($value, '"') !== false) {
$tags .= $key . '=\'' . $value . '\'';
} else {
$tags .= $key . '="' . $value . '"';
}
}
}
$this->_map[] =
'<area shape="' . $shape . '" coords="' . $coords . '" href="' . $url . '"' .
($target ? ' target="' . $target . '"' : '') .
($alt ? ' alt="' . $alt . '"' : '') .
($alt ? ' title="' . $alt .'"': '') . // Fix for http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/5354
(isset($params['id']) ? ' id="' . $params['id'] . '"' : '') .
$tags .
'>';
}
}
/**
* Draw a line
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'color': mixed [optional] The line color
* 'mapsize': int [optional] The size of the image map (surrounding the line)
* @param array $params Parameter array
*/
function line($params)
{
if (isset($params['url'])) {
$mapsize = (isset($params['mapsize']) ? $params['mapsize'] : 2);
$this->_addMapTag(
'polygon',
$this->_getX($params['x0'] - $mapsize) . ',' .
$this->_getY($params['y0'] - $mapsize) . ',' .
$this->_getX($params['x1'] + $mapsize) . ',' .
$this->_getY($params['y1'] - $mapsize) . ',' .
$this->_getX($params['x1'] + $mapsize) . ',' .
$this->_getY($params['y1'] + $mapsize) . ',' .
$this->_getX($params['x0'] - $mapsize) . ',' .
$this->_getY($params['y0'] + $mapsize),
$params
);
}
parent::line($params);
}
/**
* Draws a polygon
*
* Parameter array:
* 'connect': bool [optional] Specifies whether the start point should be
* connected to the endpoint (closed polygon) or not (connected line)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* 'map_vertices': bool [optional] Specifies whether the image map should map the vertices instead of the polygon as a whole
* 'url': string [optional] URL to link the polygon as a whole to (also used for default in case 'map_vertices' is used)
* 'alt': string [optional] Alternative text to show in the image map (also used for default in case 'map_vertices' is used)
* 'target': string [optional] The link target on the image map (also used for default in case 'map_vertices' is used)
* @param array $params Parameter array
*/
function polygon($params)
{
if ((isset($params['map_vertices'])) && ($params['map_vertices'] === true)) {
$mapsize = (isset($params['mapsize']) ? $params['mapsize'] : 2);
foreach ($this->_polygon as $point) {
$vertex_param = $params;
if (isset($point['url'])) {
$vertex_param['url'] = $point['url'];
}
if (isset($point['target'])) {
$vertex_param['target'] = $point['target'];
}
if (isset($point['alt'])) {
$vertex_param['alt'] = $point['alt'];
}
$vertex_mapsize = $mapsize;
if (isset($point['mapsize'])) {
$vertex_mapsize = $point['mapsize'];
}
if (isset($point['htmltags'])) {
$vertex_param['htmltags'] = $point['htmltags'];
}
$this->_addMapTag(
'circle',
$this->_getX($point['X']) . ',' .
$this->_getY($point['Y']) . ',' .
$mapsize,
$vertex_param
);
}
}
else if (isset($params['url'])) {
$points = '';
foreach ($this->_polygon as $point) {
if ($points != '') {
$points .= ',';
}
$points .= $this->_getX($point['X']) . ',' . $this->_getY($point['Y']);
}
$this->_addMapTag('polygon', $points, $params);
}
parent::polygon($params);
}
/**
* Draw a rectangle
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function rectangle($params)
{
if (isset($params['url'])) {
$this->_addMapTag(
'rect',
$this->_getX($params['x0']) . ',' .
$this->_getY($params['y0']) . ',' .
$this->_getX($params['x1']) . ',' .
$this->_getY($params['y1']),
$params
);
}
parent::rectangle($params);
}
/**
* Draw an ellipse
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function ellipse($params)
{
if (isset($params['url'])) {
if ($params['rx'] == $params['ry']) {
$this->_addMapTag(
'circle',
$this->_getX($params['x']) . ',' .
$this->_getY($params['y']) . ',' .
$this->_getX($params['rx']),
$params
);
} else {
$points = '';
for ($v = 0; $v <= 360; $v += 30) {
if ($points != '') {
$points .= ',';
}
$points .=
round($this->_getX($params['x']) + $this->_getX($params['rx']) * cos(deg2rad($v % 360))) . ',' .
round($this->_getY($params['y']) + $this->_getX($params['ry']) * sin(deg2rad($v % 360)));
}
$this->_addMapTag(
'polygon',
$points,
$params
);
}
}
parent::ellipse($params);
}
/**
* Draw a pie slice
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'v1': int The starting angle (in degrees)
* 'v2': int The end angle (in degrees)
* 'srx': int [optional] Starting X-radius of the pie slice (i.e. for a doughnut)
* 'sry': int [optional] Starting Y-radius of the pie slice (i.e. for a doughnut)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function pieslice($params)
{
if (isset($params['url'])) {
$x = $this->_getX($params['x']);
$y = $this->_getY($params['y']);
$rx = $params['rx'];
$ry = $params['ry'];
$v1a = $params['v1'];
$v2a = $params['v2'];
$v1 = min($v1a, $v2a);
$v2 = max($v1a, $v2a);
$srx = (isset($params['srx']) ? $params['srx'] : 0);
$sry = (isset($params['sry']) ? $params['sry'] : 0);
$points =
round(($x + $srx * cos(deg2rad($v1 % 360)))) . ',' .
round(($y + $sry * sin(deg2rad($v1 % 360)))) . ',';
for ($v = $v1; $v < $v2; $v += 30) {
$points .=
round(($x + $rx * cos(deg2rad($v % 360)))) . ',' .
round(($y + $ry * sin(deg2rad($v % 360)))) . ',';
}
$points .=
round(($x + $rx * cos(deg2rad($v2 % 360)))) . ',' .
round(($y + $ry * sin(deg2rad($v2 % 360))));
if (($srx != 0) || ($sry != 0)) {
$points .= ',';
for ($v = $v2; $v > $v1; $v -= 30) {
$points .=
round(($x + $srx * cos(deg2rad($v % 360)))) . ',' .
round(($y + $sry * sin(deg2rad($v % 360)))) . ',';
}
}
$this->_addMapTag('polygon', $points, $params);
}
parent::pieslice($params);
}
/**
* Output the result of the canvas to the browser
*
* @param array $params Parameter array, the contents and meaning depends on the actual Canvas
* @abstract
*/
function show($params = false)
{
parent::show($params);
if (count($this->_map) > 0) {
print $this->toHtml($params);
}
}
/**
* Save the result of the canvas to a file
*
* Parameter array:
* 'filename': string The file to output to
* @param array $params Parameter array, the contents and meaning depends on the actual Canvas
* @abstract
*/
function save($params = false)
{
parent::save($params);
$file = fopen($param['filename'], 'w+');
fwrite($file, $this->toHtml($params));
fclose($file);
}
/**
* Get a canvas specific HTML tag.
*
* Parameter array:
* 'name': string The name of the image map
*/
function toHtml($params)
{
if (count($this->_map) > 0) {
return '<map name="' . $params['name'] . '">' . "\n\t" . implode($this->_map, "\n\t") . "\n</map>";
}
return '';
}
}
?>

1007
Image/Canvas/PDF.php Normal file

File diff suppressed because it is too large Load Diff

919
Image/Canvas/SVG.php Normal file
View File

@ -0,0 +1,919 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class for handling output in SVG format.
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: SVG.php,v 1.12 2006/02/13 20:53:20 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Include file Image/Canvas.php
*/
global $app_strings;
require_once 'Image/Canvas.php';
/**
* Include file Image/Canvas/Color.php
*/
require_once 'Image/Canvas/Color.php';
/**
* SVG Canvas class.
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
class Image_Canvas_SVG extends Image_Canvas
{
/**
* The SVG elements
* @var string
* @access private
*/
var $_elements = '';
/**
* The SVG defines
* @var string
* @access private
*/
var $_defs = '';
/**
* The current indention level
* @var string
* @access private
*/
var $_indent = ' ';
/**
* A unieuq id counter
* @var int
* @access private
*/
var $_id = 1;
/**
* The current group ids
* @var array
* @access private
*/
var $_groupIDs = array();
/**
* Create the SVG canvas.
*
* Parameters available:
*
* 'width' The width of the graph
*
* 'height' The height of the graph
*
* @param array $param Parameter array
*/
function Image_Canvas_SVG($param)
{
parent::Image_Canvas($param);
$this->_reset();
}
/**
* Add a SVG "element" to the output
*
* @param string $element The element
* @access private
*/
function _addElement($element, $params = array()) {
$elementdata = $this->_indent . $element . "\n";
if (isset($params['url'])) {
$url = $params['url'];
$target = (isset($params['target']) ? $params['target'] : false);
$alt = (isset($params['alt']) ? $params['alt'] : false);
$tags = '';
if (isset($params['htmltags'])) {
foreach ($params['htmltags'] as $key => $value) {
$tags .= ' ';
if (strpos($value, '"') >= 0) {
$tags .= $key . '=\'' . $value . '\'';
} else {
$tags .= $key . '="' . $value . '"';
}
}
}
$elementdata =
$this->_indent . '<a xlink:href="' . $url . '"' . ($target ? ' target="' . $target . '"' : '') . '>' . "\n" .
' ' . $elementdata .
$this->_indent . '</a>' . "\n";
}
$this->_elements .= $elementdata;
}
/**
* Add a SVG "define" to the output
*
* @param string $def The define
* @access private
*/
function _addDefine($def) {
$this->_defs .= ' ' . $def . "\n";
}
/**
* Get the color index for the RGB color
*
* @param int $color The color
* @return int A SVG compatible color
* @access private
*/
function _color($color = false)
{
if ($color === false) {
return 'transparent';
} else {
$color = Image_Canvas_Color::color2RGB($color);
return 'rgb(' . $color[0] . ',' . $color[1] . ',' . $color[2] . ')';
}
}
/**
* Get the opacity for the RGB color
*
* @param int $color The color
* @return int A SVG compatible opacity value
* @access private
*/
function _opacity($color = false)
{
if ($color === false) {
return false;
} else {
$color = Image_Canvas_Color::color2RGB($color);
if ($color[3] != 255) {
return sprintf('%0.1f', $color[3]/255);
} else {
return false;
}
}
}
/**
* Get the SVG applicable linestyle
*
* @param mixed $lineStyle The line style to return, false if the one
* explicitly set
* @return mixed A SVG compatible linestyle
* @access private
*/
function _getLineStyle($lineStyle = false)
{
$result = '';
if ($lineStyle === false) {
$lineStyle = $this->_lineStyle;
}
// TODO Linestyles (i.e. fx. dotted) does not work
if (($lineStyle != 'transparent') && ($lineStyle !== false)) {
$result = 'stroke-width:' . $this->_thickness . ';';
$result .= 'stroke:' .$this->_color($lineStyle) . ';';
if ($opacity = $this->_opacity($lineStyle)) {
$result .= 'stroke-opacity:' . $opacity . ';';
}
}
return $result;
}
/**
* Get the SVG applicable fillstyle
*
* @param mixed $fillStyle The fillstyle to return, false if the one
* explicitly set
* @return mixed A SVG compatible fillstyle
* @access private
*/
function _getFillStyle($fillStyle = false)
{
$result = '';
if ($fillStyle === false) {
$fillStyle = $this->_fillStyle;
}
if (is_array($fillStyle)) {
if ($fillStyle['type'] == 'gradient') {
$id = 'gradient_' . ($this->_id++);
$startColor = $this->_color($fillStyle['start']);
$endColor = $this->_color($fillStyle['end']);
$startOpacity = $this->_opacity($fillStyle['start']);
$endOpacity = $this->_opacity($fillStyle['end']);
switch ($fillStyle['direction']) {
case 'horizontal':
case 'horizontal_mirror':
$x1 = '0%';
$y1 = '0%';
$x2 = '100%';
$y2 = '0%';
break;
case 'vertical':
case 'vertical_mirror':
$x1 = '0%';
$y1 = '100%';
$x2 = '0%';
$y2 = '0%';
break;
case 'diagonal_tl_br':
$x1 = '0%';
$y1 = '0%';
$x2 = '100%';
$y2 = '100%';
break;
case 'diagonal_bl_tr':
$x1 = '0%';
$y1 = '100%';
$x2 = '100%';
$y2 = '0%';
break;
case 'radial':
$cx = '50%';
$cy = '50%';
$r = '100%';
$fx = '50%';
$fy = '50%';
break;
}
if ($fillStyle['direction'] == 'radial') {
$this->_addDefine(
'<radialGradient id="' . $id . '" cx="' .
$cx .'" cy="' . $cy .'" r="' . $r .'" fx="' .
$fx .'" fy="' . $fy .'">'
);
$this->_addDefine(
' <stop offset="0%" style="stop-color:' .
$startColor. ';' . ($startOpacity ? 'stop-opacity:' .
$startOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
' <stop offset="100%" style="stop-color:' .
$endColor. ';' . ($endOpacity ? 'stop-opacity:' .
$endOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
'</radialGradient>'
);
} elseif (($fillStyle['direction'] == 'vertical_mirror') ||
($fillStyle['direction'] == 'horizontal_mirror'))
{
$this->_addDefine(
'<linearGradient id="' . $id . '" x1="' .
$x1 .'" y1="' . $y1 .'" x2="' . $x2 .'" y2="' .
$y2 .'">'
);
$this->_addDefine(
' <stop offset="0%" style="stop-color:' .
$startColor. ';' . ($startOpacity ? 'stop-opacity:' .
$startOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
' <stop offset="50%" style="stop-color:' .
$endColor. ';' . ($endOpacity ? 'stop-opacity:' .
$endOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
' <stop offset="100%" style="stop-color:' .
$startColor. ';' . ($startOpacity ? 'stop-opacity:' .
$startOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
'</linearGradient>'
);
} else {
$this->_addDefine(
'<linearGradient id="' . $id . '" x1="' .
$x1 .'" y1="' . $y1 .'" x2="' . $x2 .'" y2="' .
$y2 .'">'
);
$this->_addDefine(
' <stop offset="0%" style="stop-color:' .
$startColor. ';' . ($startOpacity ? 'stop-opacity:' .
$startOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
' <stop offset="100%" style="stop-color:' .
$endColor. ';' . ($endOpacity ? 'stop-opacity:' .
$endOpacity . ';' : ''). '"/>'
);
$this->_addDefine(
'</linearGradient>'
);
}
return 'fill:url(#' . $id . ');';
}
} elseif (($fillStyle != 'transparent') && ($fillStyle !== false)) {
$result = 'fill:' . $this->_color($fillStyle) . ';';
if ($opacity = $this->_opacity($fillStyle)) {
$result .= 'fill-opacity:' . $opacity . ';';
}
return $result;
} else {
return 'fill:none;';
}
}
/**
* Sets an image that should be used for filling
*
* @param string $filename The filename of the image to fill with
*/
function setFillImage($filename)
{
}
/**
* Sets a gradient fill
*
* @param array $gradient Gradient fill options
*/
function setGradientFill($gradient)
{
$this->_fillStyle = $gradient;
$this->_fillStyle['type'] = 'gradient';
}
/**
* Sets the font options.
*
* The $font array may have the following entries:
* 'type' = 'ttf' (TrueType) or omitted for default<br>
* If 'type' = 'ttf' then the following can be specified<br>
* 'size' = size in pixels<br>
* 'angle' = the angle with which to write the text
* 'file' = the .ttf file (either the basename, filename or full path)
*
* @param array $font The font options.
*/
function setFont($fontOptions)
{
parent::setFont($fontOptions);
if (!isset($this->_font['size'])) {
$this->_font['size'] = 10;
}
}
/**
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'color': mixed [optional] The line color
* @param array $params Parameter array
*/
function line($params)
{
$x0 = $this->_getX($params['x0']);
$y0 = $this->_getY($params['y0']);
$x1 = $this->_getX($params['x1']);
$y1 = $this->_getY($params['y1']);
$color = (isset($params['color']) ? $params['color'] : false);
$style = $this->_getLineStyle($color) . $this->_getFillStyle('transparent');
if ($style != '') {
$this->_addElement(
'<line ' .
'x1="' . round($x0) . '" ' .
'y1="' . round($y0) . '" ' .
'x2="' . round($x1) . '" ' .
'y2="' . round($y1) . '" ' .
'style="' . $style . '"' .
'/>',
$params
);
}
parent::line($params);
}
/**
* Parameter array:
* 'connect': bool [optional] Specifies whether the start point should be
* connected to the endpoint (closed polygon) or not (connected line)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function polygon($params = array())
{
$connectEnds = (isset($params['connect']) ? $params['connect'] : false);
$fillColor = (isset($params['fill']) ? $params['line'] : false);
$lineColor = (isset($params['line']) ? $params['line'] : false);
if (!$connectEnds) {
$fillColor = 'transparent';
}
$style = $this->_getLineStyle($lineColor) . $this->_getFillStyle($fillColor);
$first = true;
$spline = false;
$lastpoint = false;
foreach($this->_polygon as $point) {
if ($first) {
$points = 'M';
} elseif (!$spline) {
$points .= ' L';
}
if (($spline) && ($lastpoint !== false)) {
$points .= ' ' .round($lastpoint['P1X']) . ',' . round($lastpoint['P1Y']) . ' ' .
round($lastpoint['P2X']) . ',' . round($lastpoint['P2Y']);
}
$points .= ' ' . round($point['X']) . ',' . round($point['Y']);
if ((isset($point['P1X'])) && (isset($point['P1Y'])) &&
(isset($point['P2X'])) && (isset($point['P2Y'])))
{
if (($first) || (!$spline)) {
$points .= ' C';
}
$lastpoint = $point;
$spline = true;
} else {
$spline = false;
}
$first = false;
}
if ($connectEnds) {
$point .= ' Z';
}
$this->_addElement(
'<path ' .
'd="' . $points . '" ' .
'style="' . $style . '"' .
'/>',
$params
);
parent::polygon($params);
}
/**
* Draw a rectangle
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function rectangle($params)
{
$x0 = min($this->_getX($params['x0']), $this->_getX($params['x1']));
$y0 = min($this->_getY($params['y0']), $this->_getY($params['y1']));
$x1 = max($this->_getX($params['x0']), $this->_getX($params['x1']));
$y1 = max($this->_getY($params['y0']), $this->_getY($params['y1']));
$fillColor = (isset($params['fill']) ? $params['line'] : false);
$lineColor = (isset($params['line']) ? $params['line'] : false);
$style = $this->_getLineStyle($lineColor) . $this->_getFillStyle($fillColor);
if ($style != '') {
$this->_addElement(
'<rect ' .
'x="' . round($x0) . '" ' .
'y="' . round($y0) . '" ' .
'width="' . round(abs($x1 - $x0)) . '" ' .
'height="' . round(abs($y1 - $y0)) . '" ' .
'style="' . $style . '"' .
'/>',
$params
);
}
parent::rectangle($params);
}
/**
* Draw an ellipse
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function ellipse($params)
{
$x = $this->_getX($params['x']);
$y = $this->_getY($params['y']);
$rx = $this->_getX($params['rx']);
$ry = $this->_getY($params['ry']);
$fillColor = (isset($params['fill']) ? $params['line'] : false);
$lineColor = (isset($params['line']) ? $params['line'] : false);
$style = $this->_getLineStyle($lineColor) . $this->_getFillStyle($fillColor);
if ($style != '') {
$this->_addElement(
'<ellipse ' .
'cx="' . round($x) . '" ' .
'cy="' . round($y) . '" ' .
'rx="' . round($rx) . '" ' .
'ry="' . round($ry) . '" ' .
'style="' . $style . '"' .
'/>',
$params
);
}
parent::ellipse($params);
}
/**
* Draw a pie slice
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'v1': int The starting angle (in degrees)
* 'v2': int The end angle (in degrees)
* 'srx': int [optional] Starting X-radius of the pie slice (i.e. for a doughnut)
* 'sry': int [optional] Starting Y-radius of the pie slice (i.e. for a doughnut)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function pieslice($params)
{
$x = $this->_getX($params['x']);
$y = $this->_getY($params['y']);
$rx = $this->_getX($params['rx']);
$ry = $this->_getY($params['ry']);
$v1 = $this->_getX($params['v1']);
$v2 = $this->_getY($params['v2']);
$srx = (isset($params['srx']) ? $this->_getX($params['srx']) : false);
$sry = (isset($params['sry']) ? $this->_getX($params['sry']) : false);
$fillColor = (isset($params['fill']) ? $params['line'] : false);
$lineColor = (isset($params['line']) ? $params['line'] : false);
$dv = max($v2, $v1) - min($v2, $v1);
if ($dv >= 360) {
$this->ellipse($params);
}
else {
$style = $this->_getLineStyle($lineColor) . $this->_getFillStyle($fillColor);
if ($style != '') {
$x1 = ($x + $rx * cos(deg2rad(min($v1, $v2) % 360)));
$y1 = ($y + $ry * sin(deg2rad(min($v1, $v2) % 360)));
$x2 = ($x + $rx * cos(deg2rad(max($v1, $v2) % 360)));
$y2 = ($y + $ry * sin(deg2rad(max($v1, $v2) % 360)));
$this->_addElement(
'<path d="' .
'M' . round($x) . ',' . round($y) . ' ' .
'L' . round($x1) . ',' . round($y1) . ' ' .
'A' . round($rx) . ',' . round($ry) . ($dv > 180 ? ' 0 1,1 ' : ' 0 0,1 ') .
round($x2) . ',' . round($y2) . ' ' .
'Z" ' .
'style="' . $style . '"' .
'/>',
$params
);
}
parent::pieslice($params);
}
}
/**
* Get the width of a text,
*
* @param string $text The text to get the width of
* @return int The width of the text
*/
function textWidth($text)
{
if ((isset($this->_font['vertical'])) && ($this->_font['vertical'])) {
return $this->_font['size'];
} else {
return round($this->_font['size'] * 0.7 * strlen($text));
}
}
/**
* Get the height of a text,
*
* @param string $text The text to get the height of
* @return int The height of the text
*/
function textHeight($text)
{
if ((isset($this->_font['vertical'])) && ($this->_font['vertical'])) {
return round($this->_font['size'] * 0.7 * strlen($text));
} else {
return $this->_font['size'];
}
}
/**
* Writes text
*
* Parameter array:
* 'x': int X-point of text
* 'y': int Y-point of text
* 'text': string The text to add
* 'alignment': array [optional] Alignment
* 'color': mixed [optional] The color of the text
*/
function addText($params)
{
$x = $this->_getX($params['x']);
$y = $this->_getY($params['y']);
$text = $params['text'];
$color = (isset($params['color']) ? $params['color'] : false);
$alignment = (isset($params['alignment']) ? $params['alignment'] : false);
$textHeight = $this->textHeight($text);
if (!is_array($alignment)) {
$alignment = array('vertical' => 'top', 'horizontal' => 'left');
}
if (!isset($alignment['vertical'])) {
$alignment['vertical'] = 'top';
}
if (!isset($alignment['horizontal'])) {
$alignment['horizontal'] = 'left';
}
$align = '';
if ((isset($this->_font['vertical'])) && ($this->_font['vertical'])) {
// $align .= 'writing-mode: tb-rl;';
if ($alignment['vertical'] == 'bottom') {
$align .= 'text-anchor:end;';
//$y = $y + $textHeight;
} elseif ($alignment['vertical'] == 'center') {
//$y = $y + ($textHeight / 2);
$align .= 'text-anchor:middle;';
}
} else {
if ($alignment['horizontal'] == 'right') {
$align .= 'text-anchor:end;';
} elseif ($alignment['horizontal'] == 'center') {
$align .= 'text-anchor:middle;';
}
if ($alignment['vertical'] == 'top') {
$y = $y + $textHeight;
} elseif ($alignment['vertical'] == 'center') {
$y = $y + ($textHeight / 2);
}
}
if (($color === false) && (isset($this->_font['color']))) {
$color = $this->_font['color'];
}
$textColor = $this->_color($color);
$textOpacity = $this->_opacity($color);
$this->_addElement(
'<g transform="translate(' . round($x) . ', ' . round($y) . ')">' . "\n" .
$this->_indent . ' <text ' .
'x="0" ' .
'y="0" ' .
(isset($this->_font['angle']) && ($this->_font['angle'] > 0) ?
'transform="rotate(' . $this->_font['angle'] . ')" ' :
''
) .
'style="' .
(isset($this->_font['name']) ?
'font-family:' . $this->_font['name'] . ';' : '') .
'font-size:' . $this->_font['size'] . 'px;fill:' .
$textColor . ($textOpacity ? ';fill-opacity:' .
$textOpacity :
''
) . ';' . $align . '">' .
htmlspecialchars($text) .
'</text>' . "\n" .
$this->_indent . '</g>',
$params
);
parent::addText($params);
}
/**
* Overlay image
*
* Parameter array:
* 'x': int X-point of overlayed image
* 'y': int Y-point of overlayed image
* 'filename': string The filename of the image to overlay
* 'width': int [optional] The width of the overlayed image (resizing if possible)
* 'height': int [optional] The height of the overlayed image (resizing if possible)
* 'alignment': array [optional] Alignment
*/
function image($params)
{
$x = $this->_getX($params['x']);
$y = $this->_getY($params['y']);
$filename = $params['filename'];
list($width, $height, $type, $attr) = getimagesize($filename);
$width = (isset($params['width']) ? $params['width'] : $width);
$height = (isset($params['height']) ? $params['height'] : $height);
$alignment = (isset($params['alignment']) ? $params['alignment'] : false);
$file = fopen($filename, 'rb');
$filedata = fread($file, filesize($filename));
fclose($file);
$data = 'data:' . image_type_to_mime_type($type) . ';base64,' . base64_encode($filedata);
$this->_addElement(
'<image xlink:href="' . $data . '" x="' . $x . '" y="' . $y . '"' .
($width ? ' width="' . $width . '"' : '') .
($height ? ' height="' . $height . '"' : '') .
' preserveAspectRatio="none"/>',
$params
);
parent::image($params);
}
/**
* Start a group.
*
* What this does, depends on the canvas/format.
*
* @param string $name The name of the group
*/
function startGroup($name = false)
{
$name = strtolower(str_replace(' ', '_', $name));
if (in_array($name, $this->_groupIDs)) {
$name .= $this->_id;
$this->_id++;
}
$this->_groupIDs[] = $name;
$this->_addElement('<g id="' . htmlspecialchars($name) . '">');
$this->_indent .= ' ';
}
/**
* End the "current" group.
*
* What this does, depends on the canvas/format.
*/
function endGroup()
{
$this->_indent = substr($this->_indent, 0, -4);
$this->_addElement('</g>');
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
*/
function show($param = false)
{
parent::show($param);
$output = '<?xml version="1.0" encoding='.$app_strings['LBL_CHARSET'].'?>' . "\n" .
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"' . "\n\t" .
' "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">' . "\n" .
'<svg width="' . $this->_width . '" height="' . $this->_height .
'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' . "\n" .
($this->_defs ?
' <defs>' . "\n" .
$this->_defs .
' </defs>' . "\n" :
''
) .
$this->_elements .
'</svg>';
header('Content-Type: image/svg+xml');
header('Content-Disposition: inline; filename = "' . basename($_SERVER['PHP_SELF'], '.php') . '.svg"');
print $output;
}
/**
* Output the result of the canvas
*
* @param array $param Parameter array
*/
function save($param = false)
{
parent::save($param);
$output = '<?xml version="1.0" encoding='.$app_strings['LBL_CHARSET'].'?>' . "\n" .
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"' . "\n\t" .
' "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">' . "\n" .
'<svg width="' . $this->_width . '" height="' . $this->_height .
'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' . "\n" .
($this->_defs ?
' <defs>' . "\n" .
$this->_defs .
' </defs>' . "\n" :
''
) .
$this->_elements .
'</svg>';
$file = fopen($param['filename'], 'w+');
fwrite($file, $output);
fclose($file);
}
/**
* Set clipping to occur
*
* Parameter array:
*
* 'x0': int X point of Upper-left corner
* 'y0': int X point of Upper-left corner
* 'x1': int X point of lower-right corner
* 'y1': int Y point of lower-right corner
*/
function setClipping($params = false)
{
if ($params === false) {
$this->_addElement('</g>');
}
else {
$group = "clipping_" . $this->_id;
$this->_id++;
$this->_addElement('<g clip-path="url(#' . $group . ')">');
$this->_addDefine('<clipPath id="' . $group . '">');
$this->_addDefine(' <path d="' .
'M' . $this->_getX($params['x0']) . ' ' . $this->_getY($params['y0']) .
' H' . $this->_getX($params['x1']) .
' V' . $this->_getY($params['y1']) .
' H' . $this->_getX($params['x0']) .
' Z"/>');
$this->_addDefine('</clipPath>');
}
}
/**
* Get a canvas specific HTML tag.
*
* This method implicitly saves the canvas to the filename in the
* filesystem path specified and parses it as URL specified by URL path
*
* Parameter array:
* 'filename': string
* 'filepath': string Path to the file on the file system. Remember the final slash
* 'urlpath': string Path to the file available through an URL. Remember the final slash
* 'width': int The width in pixels
* 'height': int The height in pixels
*/
function toHtml($params)
{
parent::toHtml($params);
return '<embed src="' . $params['urlpath'] . $params['filename'] . '" width=' . $params['width'] . ' height=' . $params['height'] . ' type="image/svg+xml">';
}
}
?>

217
Image/Canvas/Tool.php Normal file
View File

@ -0,0 +1,217 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Canvas based creation of images to facilitate different output formats
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Tool.php,v 1.3 2005/08/22 20:52:11 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* This class contains a set of tool-functions.
*
* These functions are all to be called statically
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
* @abstract
*/
class Image_Canvas_Tool
{
/**
* Maps a font name to an actual font file (fx. a .ttf file)
*
* Used to translate names (i.e. 'Courier New' to 'cour.ttf' or
* '/Windows/Fonts/Cour.ttf')
*
* Font names are translated using the tab-separated file
* Image/Canvas/Tool/fontmap.txt.
*
* The translated font-name (or the original if no translation) exists is
* then returned if it is an existing file, otherwise the file is searched
* first in the path specified by IMAGE_CANVAS_SYSTEM_FONT_PATH defined in
* Image/Canvas.php, then in the Image/Canvas/Fonts folder. If a font is
* still not found and the name is not beginning with a '/' the search is
* left to the library, otherwise the font is deemed non-existing.
*
* @param string $name The name of the font
* @param string $type The needed file type of the font
* @return string The filename of the font
* @static
*/
function fontMap($name, $type = '.ttf')
{
static $_fontMap;
if (!is_array($_fontMap)) {
if (file_exists($fontmap = (dirname(__FILE__) . '/Fonts/fontmap.txt'))) {
$file = file($fontmap);
foreach($file as $fontmapping) {
list($fontname, $filenames) = explode(',', $fontmapping, 2);
$fontname = trim($fontname);
$filenames = trim($filenames);
$filenames = explode(',', $filenames);
foreach ($filenames as $filename) {
$type_pos = strrpos($filename, '.');
$type = substr($filename, $type_pos);
$_fontMap[$fontname][$type] = $filename;
}
}
}
}
$type = strtolower($type);
if ((isset($_fontMap[$name])) && (isset($_fontMap[$name][$type]))) {
$filename = $_fontMap[$name][$type];
} else {
$filename = $name;
}
if (substr($filename, -strlen($type)) !== $type) {
$filename .= $type;
}
$result = false;
if (file_exists($filename)) {
$result = $filename;
} elseif (file_exists($file = (IMAGE_CANVAS_SYSTEM_FONT_PATH . $filename))) {
$result = $file;
} elseif (file_exists($file = (dirname(__FILE__) . '/Fonts/' . $filename))) {
$result = $file;
} elseif (substr($name, 0, 1) !== '/') {
// leave it to the library to find the font
$result = $name;
}
return str_replace('\\', '/', $result);
}
/**
* Return the average of 2 points
*
* @param double P1 1st point
* @param double P2 2nd point
* @return double The average of P1 and P2
* @static
*/
function mid($p1, $p2)
{
return ($p1 + $p2) / 2;
}
/**
* Mirrors P1 in P2 by a amount of Factor
*
* @param double $p1 1st point, point to mirror
* @param double $o2 2nd point, mirror point
* @param double $factor Mirror factor, 0 returns $p2, 1 returns a pure
* mirror, ie $p1 on the exact other side of $p2
* @return double $p1 mirrored in $p2 by Factor
* @static
*/
function mirror($p1, $p2, $factor = 1)
{
return $p2 + $factor * ($p2 - $p1);
}
/**
* Calculates a Bezier control point, this function must be called for BOTH
* X and Y coordinates (will it work for 3D coordinates!?)
*
* @param double $p1 1st point
* @param double $p2 Point to
* @param double $factor Mirror factor, 0 returns P2, 1 returns a pure
* mirror, i.e. P1 on the exact other side of P2
* @return double P1 mirrored in P2 by Factor
* @static
*/
function controlPoint($p1, $p2, $factor, $smoothFactor = 0.75)
{
$sa = Image_Canvas_Tool::mirror($p1, $p2, $smoothFactor);
$sb = Image_Canvas_Tool::mid($p2, $sa);
$m = Image_Canvas_Tool::mid($p2, $factor);
$pC = Image_Canvas_Tool::mid($sb, $m);
return $pC;
}
/**
* Calculates a Bezier point, this function must be called for BOTH X and Y
* coordinates (will it work for 3D coordinates!?)
*
* @param double $t A position between $p2 and $p3, value between 0 and 1
* @param double $p1 Point to use for calculating control points
* @param double $p2 Point 1 to calculate bezier curve between
* @param double $p3 Point 2 to calculate bezier curve between
* @param double $p4 Point to use for calculating control points
* @return double The bezier value of the point t between $p2 and $p3 using
* $p1 and $p4 to calculate control points
* @static
*/
function bezier($t, $p1, $p2, $p3, $p4)
{
// (1-t)^3*p1 + 3*(1-t)^2*t*p2 + 3*(1-t)*t^2*p3 + t^3*p4
return pow(1 - $t, 3) * $p1 +
3 * pow(1 - $t, 2) * $t * $p2 +
3 * (1 - $t) * pow($t, 2) * $p3 +
pow($t, 3) * $p4;
}
/**
* Gets the angle / slope of a line relative to horizontal (left -> right)
*
* @param double $x0 The starting x point
* @param double $y0 The starting y point
* @param double $x1 The ending x point
* @param double $y1 The ending y point
* @param double The angle in degrees of the line
* @static
*/
function getAngle($x0, $y0, $x1, $y1)
{
$dx = ($x1 - $x0);
$dy = ($y1 - $y0);
$l = sqrt($dx * $dx + $dy * $dy);
$v = rad2deg(asin(($y0 - $y1) / $l));
if ($dx < 0) {
$v = 180 - $v;
}
return $v;
}
}
?>

278
Image/Canvas/WithMap.php Normal file
View File

@ -0,0 +1,278 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Canvas
*
* Canvas based creation of images to facilitate different output formats
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: WithMap.php,v 1.3 2005/08/24 20:37:35 nosey Exp $
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
*/
/**
* Class for handling different output formats including a HTML image map
*
* @category Images
* @package Image_Canvas
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: @package_version@
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=212
* @since version 0.2.0
* @abstract
*/
class Image_Canvas_WithMap extends Image_Canvas
{
/**
* The image map
* @var Image_Canvas_ImageMap
* @access private
*/
var $_imageMap = null;
/**
* Create the canvas.
*
* Parameters available:
*
* 'width' The width of the graph on the canvas
*
* 'height' The height of the graph on the canvas
*
* 'left' The left offset of the graph on the canvas
*
* 'top' The top offset of the graph on the canvas
*
* 'usemap' Initialize an image map
*
* @param array $params Parameter array
* @abstract
*/
function Image_Canvas_WithMap($params)
{
parent::Image_Canvas($params);
if ((isset($params['usemap'])) && ($params['usemap'] === true)) {
$this->_imageMap =& Image_Canvas::factory(
'ImageMap',
array(
'left' => $this->_left,
'top' => $this->_top,
'width' => $this->_width,
'height' => $this->_height
)
);
}
}
/**
* Draw a line
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'color': mixed [optional] The line color
* @param array $params Parameter array
*/
function line($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->line($params);
}
parent::line($params);
}
/**
* Adds vertex to a polygon
*
* Parameter array:
* 'x': int X point
* 'y': int Y point
* @param array $params Parameter array
*/
function addVertex($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->addVertex($params);
}
parent::addVertex($params);
}
/**
* Adds "splined" vertex to a polygon
*
* Parameter array:
* 'x': int X point
* 'y': int Y point
* 'p1x': X Control point 1
* 'p1y': Y Control point 1
* 'p2x': X Control point 2
* 'p2y': Y Control point 2
* @param array $params Parameter array
*/
function addSpline($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->addSpline($params);
}
parent::addSpline($params);
}
/**
* Draws a polygon
*
* Parameter array:
* 'connect': bool [optional] Specifies whether the start point should be
* connected to the endpoint (closed polygon) or not (connected line)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function polygon($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->polygon($params);
}
parent::polygon($params);
}
/**
* Draw a rectangle
*
* Parameter array:
* 'x0': int X start point
* 'y0': int Y start point
* 'x1': int X end point
* 'y1': int Y end point
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function rectangle($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->rectangle($params);
}
parent::rectangle($params);
}
/**
* Draw an ellipse
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function ellipse($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->ellipse($params);
}
parent::ellipse($params);
}
/**
* Draw a pie slice
*
* Parameter array:
* 'x': int X center point
* 'y': int Y center point
* 'rx': int X radius
* 'ry': int Y radius
* 'v1': int The starting angle (in degrees)
* 'v2': int The end angle (in degrees)
* 'srx': int [optional] Starting X-radius of the pie slice (i.e. for a doughnut)
* 'sry': int [optional] Starting Y-radius of the pie slice (i.e. for a doughnut)
* 'fill': mixed [optional] The fill color
* 'line': mixed [optional] The line color
* @param array $params Parameter array
*/
function pieslice($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->pieslice($params);
}
parent::pieslice($params);
}
/**
* Writes text
*
* Parameter array:
* 'x': int X-point of text
* 'y': int Y-point of text
* 'text': string The text to add
* 'alignment': array [optional] Alignment
* 'color': mixed [optional] The color of the text
*/
function addText($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->addText($params);
}
parent::addText($params);
}
/**
* Overlay image
*
* Parameter array:
* 'x': int X-point of overlayed image
* 'y': int Y-point of overlayed image
* 'filename': string The filename of the image to overlay
* 'width': int [optional] The width of the overlayed image (resizing if possible)
* 'height': int [optional] The height of the overlayed image (resizing if possible)
* 'alignment': array [optional] Alignment
*/
function image($params)
{
if (isset($this->_imageMap)) {
$this->_imageMap->image($params);
}
parent::image($params);
}
/**
* Get the imagemap
* @return Image_Graph_ImageMap The image map (or false if none)
*/
function &getImageMap()
{
$result = null;
if (isset($this->_imageMap)) {
$result =& $this->_imageMap;
}
return $result;
}
}
?>

719
Image/Color.php Normal file
View File

@ -0,0 +1,719 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Color.php is the implementation of Image_Color.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Image
* @package Image_Color
* @author Jason Lotito <jason@lehighweb.com>
* @author Andrew Morton <drewish@katherinehouse.com>
* @copyright 2003-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: Color.php,v 1.15 2005/09/12 19:12:02 drewish Exp $
* @link http://pear.php.net/package/Image_Color
*/
/**
* Image_Color handles color conversion and mixing.
*
* The class is quick, simple to use, and does its job fairly well but it's got
* some code smells:
* - Call setColors() for some functions but not others.
* - Different functions expect different color formats. setColors() only
* accepts hex while allocateColor() will accept named or hex (provided the
* hex ones start with the # character).
* - Some conversions go in only one direction, ie HSV->RGB but no RGB->HSV.
* I'm going to try to straighten out some of this but I'll be hard to do so
* without breaking backwards compatibility.
*
* @category Image
* @package Image_Color
* @author Jason Lotito <jason@lehighweb.com>
* @author Andrew Morton <drewish@katherinehouse.com>
* @copyright 2003-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 0.1.2
* @link http://pear.php.net/package/Image_Color
*/
class Image_Color
{
/**
* First color that the class handles for ranges and mixes.
* @var array
* @access public
* @see setColors()
*/
var $color1 = array();
/**
* Second color that the class handles for ranges and mixes.
* @var array
* @access public
* @see setColors()
*/
var $color2 = array();
/**
* Boolean value for determining whether colors outputted should be limited
* to the web safe pallet or not.
*
* @var boolean
* @access private
* @see setWebSafe()
*/
var $_websafeb = false;
/**
* Mix two colors together by finding their average. If the colors are not
* passed as parameters, the class's colors will be mixed instead.
*
* @param string $col1 The first color you want to mix
* @param string $col2 The second color you want to mix
* @return string The mixed color.
* @access public
* @author Jason Lotito <jason@lehighweb.com>
* @uses _setColors() to assign the colors if any are passed to the
* class.
*/
function mixColors($col1 = false, $col2 = false)
{
if ($col1) {
$this->_setColors($col1, $col2);
}
// after finding the average, it will be a float. add 0.5 and then
// cast to an integer to properly round it to an integer.
$color3[0] = (int) ((($this->color1[0] + $this->color2[0]) / 2) + 0.5);
$color3[1] = (int) ((($this->color1[1] + $this->color2[1]) / 2) + 0.5);
$color3[2] = (int) ((($this->color1[2] + $this->color2[2]) / 2) + 0.5);
if ($this->_websafeb) {
array_walk($color3, '_makeWebSafe');
}
return Image_Color::rgb2hex($color3);
}
/**
* Determines whether colors the returned by this class will be rounded to
* the nearest web safe value.
*
* @param boolean $bool Indicates if colors should be limited to the
* websafe pallet.
* @return void
* @access public
* @author Jason Lotito <jason@lehighweb.com>
*/
function setWebSafe($bool = true)
{
$this->_websafeb = (boolean) $bool;
}
/**
* Set the two colors this class uses for mixing and ranges.
*
* @param string $col1 The first color in hex format
* @param string $col2 The second color in hex format
* @return void
* @access public
* @author Jason Lotito <jason@lehighweb.com>
*/
function setColors($col1, $col2)
{
$this->_setColors($col1, $col2);
}
/**
* Get the range of colors between the class's two colors, given a degree.
*
* @param integer $degrees How large a 'step' we should take between the
* colors.
* @return array Returns an array of hex strings, one element for each
* color.
* @access public
* @author Jason Lotito <jason@lehighweb.com>
* @todo Allow for degrees for individual parts of the colors.
*/
function getRange($degrees = 2)
{
if ($degrees == 0) {
$degrees = 1;
}
// The degrees give us how much we should advance each color at each
// phase of the loop. This way, the advance is equal throughout all
// the colors.
$red_steps = ($this->color2[0] - $this->color1[0]) / $degrees;
$green_steps = ($this->color2[1] - $this->color1[1]) / $degrees;
$blue_steps = ($this->color2[2] - $this->color1[2]) / $degrees;
$allcolors = array();
/**
* The loop stops once any color has gone beyond the end color.
*/
// Loop through all the degrees between the colors
for ($x = 0; $x < $degrees; $x++) {
$col[0] = $red_steps * $x;
$col[1] = $green_steps * $x;
$col[2] = $blue_steps * $x;
// Loop through each R, G, and B
for ($i = 0; $i < 3; $i++) {
$partcolor = $this->color1[$i] + $col[$i];
// If the color is less than 256
if ($partcolor < 256) {
// Makes sure the colors is not less than 0
if ($partcolor > -1) {
$newcolor[$i] = $partcolor;
} else {
$newcolor[$i] = 0;
}
// Color was greater than 255
} else {
$newcolor[$i] = 255;
}
}
if ($this->_websafeb) {
array_walk($newcolor, '_makeWebSafe');
}
$allcolors[] = Image_Color::rgb2hex($newcolor);
}
return $allcolors;
}
/**
* Change the lightness of the class's two colors.
*
* @param integer $degree The degree of the change. Positive values
* lighten the color while negative values will darken it.
* @return void
* @access public
* @author Jason Lotito <jason@lehighweb.com>
* @uses Image_Color::$color1 as an input and return value.
* @uses Image_Color::$color2 as an input and return value.
*/
function changeLightness($degree = 10)
{
$color1 =& $this->color1;
$color2 =& $this->color2;
for ($x = 0; $x < 3; $x++) {
if (($color1[$x] + $degree) < 256) {
if (($color1[$x] + $degree) > -1) {
$color1[$x] += $degree;
} else {
$color1[$x] = 0;
}
} else {
$color1[$x] = 255;
}
if (($color2[$x] + $degree) < 256) {
if (($color2[$x] + $degree) > -1) {
$color2[$x] += $degree;
} else {
$color2[$x] = 0;
}
} else {
$color2[$x] = 255;
}
}
}
/**
* Determine if a light or dark text color would be more readable on a
* background of a given color. This is determined by the G(reen) value of
* RGB. You can change the dark and the light colors from their default
* black and white.
*
* @param string $color The hex color to analyze
* @param string $light The light color value to return if we should
* have light text.
* @param string $dark The dark color value to return if we should have
* dark text.
* @return string The light or dark value which would make the text most
* readable.
* @access public
* @static
* @author Jason Lotito <jason@lehighweb.com>
*/
function getTextColor($color, $light = '#FFFFFF', $dark = '#000000')
{
$color = Image_Color::_splitColor($color);
if ($color[1] > hexdec('66')) {
return $dark;
} else {
return $light;
}
}
/**
* Internal method to set the colors.
*
* @param string $col1 First color, either a name or hex value
* @param string $col2 Second color, either a name or hex value
* @return void
* @access private
* @author Jason Lotito <jason@lehighweb.com>
*/
function _setColors($col1, $col2)
{
if ($col1) {
$this->color1 = Image_Color::_splitColor($col1);
}
if ($col2) {
$this->color2 = Image_Color::_splitColor($col2);
}
}
/**
* Given a color, properly split it up into a 3 element RGB array.
*
* @param string $color The color.
* @return array A three element RGB array.
* @access private
* @static
* @author Jason Lotito <jason@lehighweb.com>
*/
function _splitColor($color)
{
$color = str_replace('#', '', $color);
$c[] = hexdec(substr($color, 0, 2));
$c[] = hexdec(substr($color, 2, 2));
$c[] = hexdec(substr($color, 4, 2));
return $c;
}
/**
* This is deprecated. Use rgb2hex() instead.
* @access private
* @deprecated Function deprecated after 1.0.1
* @see rgb2hex().
*/
function _returnColor ( $color )
{
return Image_Color::rgb2hex($color);
}
/**
* Convert an RGB array to a hex string.
*
* @param array $color 3 element RGB array.
* @return string Hex color string.
* @access public
* @static
* @author Jason Lotito <jason@lehighweb.com>
* @see hex2rgb()
*/
function rgb2hex($color)
{
return sprintf('%02X%02X%02X',$color[0],$color[1],$color[2]);
}
/**
* Convert a hex color string into an RGB array. An extra fourth element
* will be returned with the original hex value.
*
* @param string $hex Hex color string.
* @return array RGB color array with an extra 'hex' element containing
* the original hex string.
* @access public
* @static
* @author Jason Lotito <jason@lehighweb.com>
* @see rgb2hex()
*/
function hex2rgb($hex)
{
$return = Image_Color::_splitColor($hex);
$return['hex'] = $hex;
return $return;
}
/**
* Convert an HSV (Hue, Saturation, Brightness) value to RGB.
*
* @param integer $h Hue
* @param integer $s Saturation
* @param integer $v Brightness
* @return array RGB array.
* @access public
* @static
* @author Jason Lotito <jason@lehighweb.com>
* @uses hsv2hex() to convert the HSV value to Hex.
* @uses hex2rgb() to convert the Hex value to RGB.
*/
function hsv2rgb($h, $s, $v)
{
return Image_Color::hex2rgb(Image_Color::hsv2hex($h, $s, $v));
}
/**
* Convert HSV (Hue, Saturation, Brightness) to a hex color string.
*
* Originally written by Jurgen Schwietering. Integrated into the class by
* Jason Lotito.
*
* @param integer $h Hue
* @param integer $s Saturation
* @param integer $v Brightness
* @return string The hex string.
* @access public
* @static
* @author Jurgen Schwietering <jurgen@schwietering.com>
* @uses rgb2hex() to convert the return value to a hex string.
*/
function hsv2hex($h, $s, $v)
{
$s /= 256.0;
$v /= 256.0;
if ($s == 0.0) {
$r = $g = $b = $v;
return '';
} else {
$h = $h / 256.0 * 6.0;
$i = floor($h);
$f = $h - $i;
$v *= 256.0;
$p = (integer)($v * (1.0 - $s));
$q = (integer)($v * (1.0 - $s * $f));
$t = (integer)($v * (1.0 - $s * (1.0 - $f)));
switch($i) {
case 0:
$r = $v;
$g = $t;
$b = $p;
break;
case 1:
$r = $q;
$g = $v;
$b = $p;
break;
case 2:
$r = $p;
$g = $v;
$b = $t;
break;
case 3:
$r = $p;
$g = $q;
$b = $v;
break;
case 4:
$r = $t;
$g = $p;
$b = $v;
break;
default:
$r = $v;
$g = $p;
$b = $q;
break;
}
}
return $this->rgb2hex(array($r, $g, $b));
}
/**
* Allocates a color in the given image.
*
* User defined color specifications get translated into an array of RGB
* values.
*
* @param resource $img Image handle
* @param string|array $color Name or hex string or an RGB array.
* @return resource Image color handle.
* @access public
* @static
* @uses ImageColorAllocate() to allocate the color.
* @uses color2RGB() to parse the color into RGB values.
*/
function allocateColor(&$img, $color) {
$color = Image_Color::color2RGB($color);
return ImageColorAllocate($img, $color[0], $color[1], $color[2]);
}
/**
* Convert a named or hex color string to an RGB array. If the color begins
* with the # character it will be treated as a hex value. Everything else
* will be treated as a named color. If the named color is not known, black
* will be returned.
*
* @param string $color
* @return array RGB color
* @access public
* @static
* @author Laurent Laville <pear@laurent-laville.org>
* @uses hex2rgb() to convert colors begining with the # character.
* @uses namedColor2RGB() to convert everything not starting with a #.
*/
function color2RGB($color)
{
$c = array();
if ($color{0} == '#') {
$c = Image_Color::hex2rgb($color);
} else {
$c = Image_Color::namedColor2RGB($color);
}
return $c;
}
/**
* Convert a named color to an RGB array. If the color is unknown black
* is returned.
*
* @param string $color Case insensitive color name.
* @return array RGB color array. If the color was unknown, the result
* will be black.
* @access public
* @static
* @author Sebastian Bergmann <sb@sebastian-bergmann.de>
*/
function namedColor2RGB($color)
{
static $colornames;
if (!isset($colornames)) {
$colornames = array(
'aliceblue' => array(240, 248, 255),
'antiquewhite' => array(250, 235, 215),
'aqua' => array( 0, 255, 255),
'aquamarine' => array(127, 255, 212),
'azure' => array(240, 255, 255),
'beige' => array(245, 245, 220),
'bisque' => array(255, 228, 196),
'black' => array( 0, 0, 0),
'blanchedalmond' => array(255, 235, 205),
'blue' => array( 0, 0, 255),
'blueviolet' => array(138, 43, 226),
'brown' => array(165, 42, 42),
'burlywood' => array(222, 184, 135),
'cadetblue' => array( 95, 158, 160),
'chartreuse' => array(127, 255, 0),
'chocolate' => array(210, 105, 30),
'coral' => array(255, 127, 80),
'cornflowerblue' => array(100, 149, 237),
'cornsilk' => array(255, 248, 220),
'crimson' => array(220, 20, 60),
'cyan' => array( 0, 255, 255),
'darkblue' => array( 0, 0, 13),
'darkcyan' => array( 0, 139, 139),
'darkgoldenrod' => array(184, 134, 11),
'darkgray' => array(169, 169, 169),
'darkgreen' => array( 0, 100, 0),
'darkkhaki' => array(189, 183, 107),
'darkmagenta' => array(139, 0, 139),
'darkolivegreen' => array( 85, 107, 47),
'darkorange' => array(255, 140, 0),
'darkorchid' => array(153, 50, 204),
'darkred' => array(139, 0, 0),
'darksalmon' => array(233, 150, 122),
'darkseagreen' => array(143, 188, 143),
'darkslateblue' => array( 72, 61, 139),
'darkslategray' => array( 47, 79, 79),
'darkturquoise' => array( 0, 206, 209),
'darkviolet' => array(148, 0, 211),
'deeppink' => array(255, 20, 147),
'deepskyblue' => array( 0, 191, 255),
'dimgray' => array(105, 105, 105),
'dodgerblue' => array( 30, 144, 255),
'firebrick' => array(178, 34, 34),
'floralwhite' => array(255, 250, 240),
'forestgreen' => array( 34, 139, 34),
'fuchsia' => array(255, 0, 255),
'gainsboro' => array(220, 220, 220),
'ghostwhite' => array(248, 248, 255),
'gold' => array(255, 215, 0),
'goldenrod' => array(218, 165, 32),
'gray' => array(128, 128, 128),
'green' => array( 0, 128, 0),
'greenyellow' => array(173, 255, 47),
'honeydew' => array(240, 255, 240),
'hotpink' => array(255, 105, 180),
'indianred' => array(205, 92, 92),
'indigo' => array(75, 0, 130),
'ivory' => array(255, 255, 240),
'khaki' => array(240, 230, 140),
'lavender' => array(230, 230, 250),
'lavenderblush' => array(255, 240, 245),
'lawngreen' => array(124, 252, 0),
'lemonchiffon' => array(255, 250, 205),
'lightblue' => array(173, 216, 230),
'lightcoral' => array(240, 128, 128),
'lightcyan' => array(224, 255, 255),
'lightgoldenrodyellow' => array(250, 250, 210),
'lightgreen' => array(144, 238, 144),
'lightgrey' => array(211, 211, 211),
'lightpink' => array(255, 182, 193),
'lightsalmon' => array(255, 160, 122),
'lightseagreen' => array( 32, 178, 170),
'lightskyblue' => array(135, 206, 250),
'lightslategray' => array(119, 136, 153),
'lightsteelblue' => array(176, 196, 222),
'lightyellow' => array(255, 255, 224),
'lime' => array( 0, 255, 0),
'limegreen' => array( 50, 205, 50),
'linen' => array(250, 240, 230),
'magenta' => array(255, 0, 255),
'maroon' => array(128, 0, 0),
'mediumaquamarine' => array(102, 205, 170),
'mediumblue' => array( 0, 0, 205),
'mediumorchid' => array(186, 85, 211),
'mediumpurple' => array(147, 112, 219),
'mediumseagreen' => array( 60, 179, 113),
'mediumslateblue' => array(123, 104, 238),
'mediumspringgreen' => array( 0, 250, 154),
'mediumturquoise' => array(72, 209, 204),
'mediumvioletred' => array(199, 21, 133),
'midnightblue' => array( 25, 25, 112),
'mintcream' => array(245, 255, 250),
'mistyrose' => array(255, 228, 225),
'moccasin' => array(255, 228, 181),
'navajowhite' => array(255, 222, 173),
'navy' => array( 0, 0, 128),
'oldlace' => array(253, 245, 230),
'olive' => array(128, 128, 0),
'olivedrab' => array(107, 142, 35),
'orange' => array(255, 165, 0),
'orangered' => array(255, 69, 0),
'orchid' => array(218, 112, 214),
'palegoldenrod' => array(238, 232, 170),
'palegreen' => array(152, 251, 152),
'paleturquoise' => array(175, 238, 238),
'palevioletred' => array(219, 112, 147),
'papayawhip' => array(255, 239, 213),
'peachpuff' => array(255, 218, 185),
'peru' => array(205, 133, 63),
'pink' => array(255, 192, 203),
'plum' => array(221, 160, 221),
'powderblue' => array(176, 224, 230),
'purple' => array(128, 0, 128),
'red' => array(255, 0, 0),
'rosybrown' => array(188, 143, 143),
'royalblue' => array( 65, 105, 225),
'saddlebrown' => array(139, 69, 19),
'salmon' => array(250, 128, 114),
'sandybrown' => array(244, 164, 96),
'seagreen' => array( 46, 139, 87),
'seashell' => array(255, 245, 238),
'sienna' => array(160, 82, 45),
'silver' => array(192, 192, 192),
'skyblue' => array(135, 206, 235),
'slateblue' => array(106, 90, 205),
'slategray' => array(112, 128, 144),
'snow' => array(255, 250, 250),
'springgreen' => array( 0, 255, 127),
'steelblue' => array( 70, 130, 180),
'tan' => array(210, 180, 140),
'teal' => array( 0, 128, 128),
'thistle' => array(216, 191, 216),
'tomato' => array(255, 99, 71),
'turquoise' => array( 64, 224, 208),
'violet' => array(238, 130, 238),
'wheat' => array(245, 222, 179),
'white' => array(255, 255, 255),
'whitesmoke' => array(245, 245, 245),
'yellow' => array(255, 255, 0),
'yellowgreen' => array(154, 205, 50)
);
}
$color = strtolower($color);
if (isset($colornames[$color])) {
return $colornames[$color];
} else {
return array(0, 0, 0);
}
}
/**
* Convert an RGB percentage string into an RGB array.
*
* @param string $color Percentage color string like "50%,20%,100%".
* @return array RGB color array.
* @access public
* @static
*/
function percentageColor2RGB($color)
{
// remove spaces
$color = str_replace(' ', '', $color);
// remove the percent signs
$color = str_replace('%', '', $color);
// split the string by commas
$color = explode(',', $color);
$ret = array();
foreach ($color as $k => $v) {
// range checks
if ($v <= 0) {
$ret[$k] = 0;
} else if ($v <= 100) {
// add 0.5 then cast to an integer to round the value.
$ret[$k] = (integer) ((2.55 * $v) + 0.5);
} else {
$ret[$k] = 255;
}
}
return $ret;
}
}
// For Array Walk
// {{{
/**
* Function for array_walk() to round colors to the closest web safe value.
*
* @param integer $color One channel of an RGB color.
* @return integer The websafe equivalent of the color channel.
* @author Jason Lotito <jason@lehighweb.com>
* @author Andrew Morton <drewish@katherinehouse.com>
* @access private
* @static
*/
function _makeWebSafe(&$color)
{
if ($color < 0x1a) {
$color = 0x00;
} else if ($color < 0x4d) {
$color = 0x33;
} else if ($color < 0x80) {
$color = 0x66;
} else if ($color < 0xB3) {
$color = 0x99;
} else if ($color < 0xE6) {
$color = 0xCC;
} else {
$color = 0xFF;
}
return $color;
}
// }}}
?>

851
Image/Graph.php Normal file
View File

@ -0,0 +1,851 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Graph.php,v 1.58 2005/11/27 18:48:05 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include PEAR.php
*/
require_once 'PEAR.php';
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* Include file Image/Graph/Constants.php
*/
require_once 'Image/Graph/Constants.php';
/**
* Main class for the graph creation.
*
* This is the main class, it manages the canvas and performs the final output
* by sequentialy making the elements output their results. The final output is
* handled using the {@link Image_Canvas} classes which makes it possible
* to use different engines (fx GD, PDFlib, libswf, etc) for output to several
* formats with a non-intersecting API.
*
* This class also handles coordinates and the correct managment of setting the
* correct coordinates on child elements.
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph extends Image_Graph_Element
{
/**
* Show generation time on graph
* @var bool
* @access private
*/
var $_showTime = false;
/**
* Display errors on the canvas
* @var boolean
* @access private
*/
var $_displayErrors = false;
/**
* Image_Graph [Constructor].
*
* If passing the 3 parameters they are defined as follows:'
*
* Fx.:
*
* $Graph =& new Image_Graph(400, 300);
*
* or using the factory method:
*
* $Graph =& Image_Graph::factory('graph', array(400, 300));
*
* This causes a 'png' canvas to be created by default.
*
* Otherwise use a single parameter either as an associated array or passing
* the canvas along to the constructor:
*
* 1) Create a new canvas with the following parameters:
*
* 'canvas' - The canvas type, can be any of 'gd', 'jpg', 'png' or 'svg'
* (more to come) - if omitted the default is 'gd'
*
* 'width' - The width of the graph
*
* 'height' - The height of the graph
*
* An example of this usage:
*
* $Graph =& Image_Graph::factory('graph', array(array('width' => 400,
* 'height' => 300, 'canvas' => 'jpg')));
*
* NB! In thïs case remember the "double" array (see {@link Image_Graph::
* factory()})
*
* 2) Use the canvas specified, pass a valid Image_Canvas as
* parameter. Remember to pass by reference, i. e. &amp;$canvas, fx.:
*
* $Graph =& new Image_Graph($Canvas);
*
* or using the factory method:
*
* $Graph =& Image_Graph::factory('graph', $Canvas));
*
* @param mixed $params The width of the graph, an indexed array
* describing a new canvas or a valid {@link Image_Canvas} object
* @param int $height The height of the graph in pixels
* @param bool $createTransparent Specifies whether the graph should be
* created with a transparent background (fx for PNG's - note: transparent
* PNG's is not supported by Internet Explorer!)
*/
function Image_Graph($params, $height = false, $createTransparent = false)
{
parent::Image_Graph_Element();
$this->setFont(Image_Graph::factory('Image_Graph_Font'));
if (defined('IMAGE_GRAPH_DEFAULT_CANVAS_TYPE')) {
$canvasType = IMAGE_GRAPH_DEFAULT_CANVAS_TYPE;
} else {
$canvasType = 'png'; // use GD as default, if nothing else is specified
}
if (is_array($params)) {
if (isset($params['canvas'])) {
$canvasType = $params['canvas'];
}
$width = 0;
$height = 0;
if (isset($params['width'])) {
$width = $params['width'];
}
if (isset($params['height'])) {
$height = $params['height'];
}
} elseif (is_a($params, 'Image_Canvas')) {
$this->_canvas =& $params;
$width = $this->_canvas->getWidth();
$height = $this->_canvas->getHeight();
} elseif (is_numeric($params)) {
$width = $params;
}
if ($this->_canvas == null) {
include_once 'Image/Canvas.php';
$this->_canvas =&
Image_Canvas::factory(
$canvasType,
array('width' => $width, 'height' => $height)
);
}
$this->_setCoords(0, 0, $width - 1, $height - 1);
}
/**
* Gets the canvas for this graph.
*
* The canvas is set by either passing it to the constructor {@link
* Image_Graph::ImageGraph()} or using the {@link Image_Graph::setCanvas()}
* method.
*
* @return Image_Canvas The canvas used by this graph
* @access private
* @since 0.3.0dev2
*/
function &_getCanvas()
{
return $this->_canvas;
}
/**
* Sets the canvas for this graph.
*
* Calling this method makes this graph use the newly specified canvas for
* handling output. This method should be called whenever multiple
* 'outputs' are required. Invoke this method after calls to {@link
* Image_Graph:: done()} has been performed, to switch canvass.
*
* @param Image_Canvas $canvas The new canvas
* @return Image_Canvas The new canvas
* @since 0.3.0dev2
*/
function &setCanvas(&$canvas)
{
if (!is_a($this->_canvas, 'Image_Canvas')) {
return $this->_error('The canvas introduced is not an Image_Canvas object');
}
$this->_canvas =& $canvas;
$this->_setCoords(
0,
0,
$this->_canvas->getWidth() - 1,
$this->_canvas->getHeight() - 1
);
return $this->_canvas;
}
/**
* Gets a very precise timestamp
*
* @return The number of seconds to a lot of decimals
* @access private
*/
function _getMicroTime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
/**
* Gets the width of this graph.
*
* The width is returned as 'defined' by the canvas.
*
* @return int the width of this graph
*/
function width()
{
return $this->_canvas->getWidth();
}
/**
* Gets the height of this graph.
*
* The height is returned as 'defined' by the canvas.
*
* @return int the height of this graph
*/
function height()
{
return $this->_canvas->getHeight();
}
/**
* Enables displaying of errors on the output.
*
* Use this method to enforce errors to be displayed on the output. Calling
* this method makes PHP uses this graphs error handler as default {@link
* Image_Graph::_default_error_handler()}.
*/
function displayErrors()
{
$this->_displayErrors = true;
set_error_handler(array(&$this, '_default_error_handler'));
}
/**
* Sets the log method for this graph.
*
* Use this method to enable logging. This causes any errors caught
* by either the error handler {@see Image_Graph::displayErrors()}
* or explicitly by calling {@link Image_Graph_Common::_error()} be
* logged using the specified logging method.
*
* If a filename is specified as log method, a Log object is created (using
* the 'file' handler), with a handle of 'Image_Graph Error Log'.
*
* Logging requires {@link Log}.
*
* @param mixed $log The log method, either a Log object or filename to log
* to
* @since 0.3.0dev2
*/
function setLog($log)
{
}
/**
* Factory method to create Image_Graph objects.
*
* Used for 'lazy including', i.e. loading only what is necessary, when it
* is necessary. If only one parameter is required for the constructor of
* the class simply pass this parameter as the $params parameter, unless the
* parameter is an array or a reference to a value, in that case you must
* 'enclose' the parameter in an array. Similar if the constructor takes
* more than one parameter specify the parameters in an array, i.e
*
* Image_Graph::factory('MyClass', array($param1, $param2, &$param3));
*
* Variables that need to be passed by reference *must* have the &amp;
* before the variable, i.e:
*
* Image_Graph::factory('line', &$Dataset);
*
* or
*
* Image_graph::factory('bar', array(array(&$Dataset1, &$Dataset2),
* 'stacked'));
*
* Class name can be either of the following:
*
* 1 The 'real' Image_Graph class name, i.e. Image_Graph_Plotarea or
* Image_Graph_Plot_Line
*
* 2 Short class name (leave out Image_Graph) and retain case, i.e.
* Plotarea, Plot_Line *not* plot_line
*
* 3 Class name 'alias', the following are supported:
*
* 'graph' = Image_Graph
*
* 'plotarea' = Image_Graph_Plotarea
*
* 'line' = Image_Graph_Plot_Line
*
* 'area' = Image_Graph_Plot_Area
*
* 'bar' = Image_Graph_Plot_Bar
*
* 'pie' = Image_Graph_Plot_Pie
*
* 'radar' = Image_Graph_Plot_Radar
*
* 'step' = Image_Graph_Plot_Step
*
* 'impulse' = Image_Graph_Plot_Impulse
*
* 'dot' or 'scatter' = Image_Graph_Plot_Dot
*
* 'smooth_line' = Image_Graph_Plot_Smoothed_Line
*
* 'smooth_area' = Image_Graph_Plot_Smoothed_Area
* 'dataset' = Image_Graph_Dataset_Trivial
*
* 'random' = Image_Graph_Dataset_Random
*
* 'function' = Image_Graph_Dataset_Function
*
* 'vector' = Image_Graph_Dataset_VectorFunction
*
* 'category' = Image_Graph_Axis_Category
*
* 'axis' = Image_Graph_Axis
*
* 'axis_log' = Image_Graph_Axis_Logarithmic
*
* 'title' = Image_Graph_Title
*
* 'line_grid' = Image_Graph_Grid_Lines
*
* 'bar_grid' = Image_Graph_Grid_Bars
*
* 'polar_grid' = Image_Graph_Grid_Polar
*
* 'legend' = Image_Graph_Legend
*
* 'font' = Image_Graph_Font
*
* 'ttf_font' = Image_Graph_Font
*
* 'Image_Graph_Font_TTF' = Image_Graph_Font (to maintain BC with Image_Graph_Font_TTF)
*
* 'gradient' = Image_Graph_Fill_Gradient
*
* 'icon_marker' = Image_Graph_Marker_Icon
*
* 'value_marker' = Image_Graph_Marker_Value
*
* @param string $class The class for the new object
* @param mixed $params The paramaters to pass to the constructor
* @return object A new object for the class
* @static
*/
function &factory($class, $params = null)
{
static $Image_Graph_classAliases = array(
'graph' => 'Image_Graph',
'plotarea' => 'Image_Graph_Plotarea',
'line' => 'Image_Graph_Plot_Line',
'area' => 'Image_Graph_Plot_Area',
'bar' => 'Image_Graph_Plot_Bar',
'smooth_line' => 'Image_Graph_Plot_Smoothed_Line',
'smooth_area' => 'Image_Graph_Plot_Smoothed_Area',
'pie' => 'Image_Graph_Plot_Pie',
'radar' => 'Image_Graph_Plot_Radar',
'step' => 'Image_Graph_Plot_Step',
'impulse' => 'Image_Graph_Plot_Impulse',
'dot' => 'Image_Graph_Plot_Dot',
'scatter' => 'Image_Graph_Plot_Dot',
'dataset' => 'Image_Graph_Dataset_Trivial',
'random' => 'Image_Graph_Dataset_Random',
'function' => 'Image_Graph_Dataset_Function',
'vector' => 'Image_Graph_Dataset_VectorFunction',
'category' => 'Image_Graph_Axis_Category',
'axis' => 'Image_Graph_Axis',
'axis_log' => 'Image_Graph_Axis_Logarithmic',
'title' => 'Image_Graph_Title',
'line_grid' => 'Image_Graph_Grid_Lines',
'bar_grid' => 'Image_Graph_Grid_Bars',
'polar_grid' => 'Image_Graph_Grid_Polar',
'legend' => 'Image_Graph_Legend',
'font' => 'Image_Graph_Font',
'ttf_font' => 'Image_Graph_Font',
'Image_Graph_Font_TTF' => 'Image_Graph_Font', // BC with Image_Graph_Font_TTF
'gradient' => 'Image_Graph_Fill_Gradient',
'icon_marker' => 'Image_Graph_Marker_Icon',
'value_marker' => 'Image_Graph_Marker_Value'
);
if (substr($class, 0, 11) != 'Image_Graph') {
if (isset($Image_Graph_classAliases[$class])) {
$class = $Image_Graph_classAliases[$class];
} else {
$class = 'Image_Graph_' . $class;
}
}
include_once str_replace('_', '/', $class) . '.php';
$obj = null;
if (is_array($params)) {
switch (count($params)) {
case 1:
$obj =& new $class(
$params[0]
);
break;
case 2:
$obj =& new $class(
$params[0],
$params[1]
);
break;
case 3:
$obj =& new $class(
$params[0],
$params[1],
$params[2]
);
break;
case 4:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3]
);
break;
case 5:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4]
);
break;
case 6:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4],
$params[5]
);
break;
case 7:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4],
$params[5],
$params[6]
);
break;
case 8:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4],
$params[5],
$params[6],
$params[7]
);
break;
case 9:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4],
$params[5],
$params[6],
$params[7],
$params[8]
);
break;
case 10:
$obj =& new $class(
$params[0],
$params[1],
$params[2],
$params[3],
$params[4],
$params[5],
$params[6],
$params[7],
$params[8],
$params[9]
);
break;
default:
$obj =& new $class();
break;
}
} else {
if ($params == null) {
$obj =& new $class();
} else {
$obj =& new $class($params);
}
}
return $obj;
}
/**
* Factory method to create layouts.
*
* This method is used for easy creation, since using {@link Image_Graph::
* factory()} does not work with passing newly created objects from
* Image_Graph::factory() as reference, this is something that is
* fortunately fixed in PHP5. Also used for 'lazy including', i.e. loading
* only what is necessary, when it is necessary.
*
* Use {@link Image_Graph::horizontal()} or {@link Image_Graph::vertical()}
* instead for easier access.
*
* @param mixed $layout The type of layout, can be either 'Vertical'
* or 'Horizontal' (case sensitive)
* @param Image_Graph_Element $part1 The 1st part of the layout
* @param Image_Graph_Element $part2 The 2nd part of the layout
* @param int $percentage The percentage of the layout to split at
* @return Image_Graph_Layout The newly created layout object
* @static
*/
function &layoutFactory($layout, &$part1, &$part2, $percentage = 50)
{
if (($layout != 'Vertical') && ($layout != 'Horizontal')) {
return $this->_error('Layouts must be either \'Horizontal\' or \'Vertical\'');
}
if (!(is_a($part1, 'Image_Graph_Element'))) {
return $this->_error('Part 1 is not a valid Image_Graph element');
}
if (!(is_a($part2, 'Image_Graph_Element'))) {
return $this->_error('Part 2 is not a valid Image_Graph element');
}
if ((!is_numeric($percentage)) || ($percentage < 0) || ($percentage > 100)) {
return $this->_error('Percentage has to be a number between 0 and 100');
}
include_once "Image/Graph/Layout/$layout.php";
$class = "Image_Graph_Layout_$layout";
$obj =& new $class($part1, $part2, $percentage);
return $obj;
}
/**
* Factory method to create horizontal layout.
*
* See {@link Image_Graph::layoutFactory()}
*
* @param Image_Graph_Element $part1 The 1st (left) part of the layout
* @param Image_Graph_Element $part2 The 2nd (right) part of the layout
* @param int $percentage The percentage of the layout to split at
* (percentage of total height from the left side)
* @return Image_Graph_Layout The newly created layout object
* @static
*/
function &horizontal(&$part1, &$part2, $percentage = 50)
{
$obj =& Image_Graph::layoutFactory('Horizontal', $part1, $part2, $percentage);
return $obj;
}
/**
* Factory method to create vertical layout.
*
* See {@link Image_Graph::layoutFactory()}
*
* @param Image_Graph_Element $part1 The 1st (top) part of the layout
* @param Image_Graph_Element $part2 The 2nd (bottom) part of the layout
* @param int $percentage The percentage of the layout to split at
* (percentage of total width from the top edge)
* @return Image_Graph_Layout The newly created layout object
* @static
*/
function &vertical(&$part1, &$part2, $percentage = 50)
{
$obj =& Image_Graph::layoutFactory('Vertical', $part1, $part2, $percentage);
return $obj;
}
/**
* The error handling routine set by set_error_handler().
*
* This method is used internaly by Image_Graph and PHP as a proxy for {@link
* Image_Graph::_error()}.
*
* @param string $error_type The type of error being handled.
* @param string $error_msg The error message being handled.
* @param string $error_file The file in which the error occurred.
* @param integer $error_line The line in which the error occurred.
* @param string $error_context The context in which the error occurred.
* @access private
*/
function _default_error_handler($error_type, $error_msg, $error_file, $error_line, $error_context)
{
switch( $error_type ) {
case E_ERROR:
$level = 'error';
break;
case E_USER_ERROR:
$level = 'user error';
break;
case E_WARNING:
$level = 'warning';
break;
case E_USER_WARNING:
$level = 'user warning';
break;
case E_NOTICE:
$level = 'notice';
break;
case E_USER_NOTICE:
$level = 'user notice';
break;
default:
$level = '(unknown)';
break;
}
$this->_error("PHP $level: $error_msg",
array(
'type' => $error_type,
'file' => $error_file,
'line' => $error_line,
'context' => $error_context
)
);
}
/**
* Displays the errors on the error stack.
*
* Invoking this method cause all errors on the error stack to be displayed
* on the graph-output, by calling the {@link Image_Graph::_displayError()}
* method.
*
* @access private
*/
function _displayErrors()
{
return true;
}
/**
* Display an error from the error stack.
*
* This method writes error messages caught from the {@link Image_Graph::
* _default_error_handler()} if {@Image_Graph::displayErrors()} was invoked,
* and the error explicitly set by the system using {@link
* Image_Graph_Common::_error()}.
*
* @param int $x The horizontal position of the error message
* @param int $y The vertical position of the error message
* @param array $error The error context
*
* @access private
*/
function _displayError($x, $y, $error)
{
}
/**
* Outputs this graph using the canvas.
*
* This causes the graph to make all elements perform their output. Their
* result is 'written' to the output using the canvas, which also performs
* the actual output, fx. it being to a file or directly to the browser
* (in the latter case, the canvas will also make sure the correct HTTP
* headers are sent, making the browser handle the output correctly, if
* supported by it).
*
* Parameters are the ones supported by the canvas, common ones are:
*
* 'filename' To output to a file instead of browser
*
* 'tohtml' Return a HTML string that encompasses the current graph/canvas - this
* implies an implicit save using the following parameters: 'filename' The "temporary"
* filename of the graph, 'filepath' A path in the file system where Image_Graph can
* store the output (this file must be in DOCUMENT_ROOT scope), 'urlpath' The URL that the
* 'filepath' corresponds to (i.e. filepath + filename must be reachable from a browser using
* urlpath + filename)
*
* @param mixed $param The output parameters to pass to the canvas
* @return bool Was the output 'good' (true) or 'bad' (false).
*/
function done($param = false)
{
$result = $this->_reset();
if (PEAR::isError($result)) {
return $result;
}
return $this->_done($param);
}
/**
* Outputs this graph using the canvas.
*
* This causes the graph to make all elements perform their output. Their
* result is 'written' to the output using the canvas, which also performs
* the actual output, fx. it being to a file or directly to the browser
* (in the latter case, the canvas will also make sure the correct HTTP
* headers are sent, making the browser handle the output correctly, if
* supported by it).
*
* @param mixed $param The output parameters to pass to the canvas
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done($param = false)
{
$timeStart = $this->_getMicroTime();
if ($this->_shadow) {
$this->setPadding(20);
$this->_setCoords(
$this->_left,
$this->_top,
$this->_right - 10,
$this->_bottom - 10);
}
$result = $this->_updateCoords();
if (PEAR::isError($result)) {
return $result;
}
if ($this->_getBackground()) {
$this->_canvas->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_right,
'y1' => $this->_bottom
)
);
}
$result = parent::_done();
if (PEAR::isError($result)) {
return $result;
}
if ($this->_displayErrors) {
$this->_displayErrors();
}
$timeEnd = $this->_getMicroTime();
if (($this->_showTime) ||
((isset($param['showtime'])) && ($param['showtime'] === true))
) {
$text = 'Generated in ' .
sprintf('%0.3f', $timeEnd - $timeStart) . ' sec';
$this->write(
$this->_right,
$this->_bottom,
$text,
IMAGE_GRAPH_ALIGN_RIGHT + IMAGE_GRAPH_ALIGN_BOTTOM,
array('color' => 'red')
);
}
if (isset($param['filename'])) {
if ((isset($param['tohtml'])) && ($param['tohtml'])) {
return $this->_canvas->toHtml($param);
}
else {
return $this->_canvas->save($param);
}
} else {
return $this->_canvas->show($param);
}
}
}
?>

1690
Image/Graph/Axis.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,437 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class for axis handling.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Category.php,v 1.19 2006/03/02 12:15:17 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Axis.php
*/
require_once 'Image/Graph/Axis.php';
/**
* A normal axis thats displays labels with a 'interval' of 1.
* This is basically a normal axis where the range is
* the number of labels defined, that is the range is explicitly defined
* when constructing the axis.
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Category extends Image_Graph_Axis
{
/**
* The labels shown on the axis
* @var array
* @access private
*/
var $_labels = false;
/**
* Image_Graph_Axis_Category [Constructor].
*
* @param int $type The type (direction) of the Axis
*/
function Image_Graph_Axis_Category($type = IMAGE_GRAPH_AXIS_X)
{
parent::Image_Graph_Axis($type);
$this->_labels = array();
$this->setlabelInterval(1);
}
/**
* Gets the minimum value the axis will show.
*
* This is always 0
*
* @return double The minumum value
* @access private
*/
function _getMinimum()
{
return 0;
}
/**
* Gets the maximum value the axis will show.
*
* This is always the number of labels passed to the constructor.
*
* @return double The maximum value
* @access private
*/
function _getMaximum()
{
return count($this->_labels) - 1;
}
/**
* Sets the minimum value the axis will show.
*
* A minimum cannot be set on a SequentialAxis, it is always 0.
*
* @param double Minimum The minumum value to use on the axis
* @access private
*/
function _setMinimum($minimum)
{
}
/**
* Sets the maximum value the axis will show
*
* A maximum cannot be set on a SequentialAxis, it is always the number
* of labels passed to the constructor.
*
* @param double Maximum The maximum value to use on the axis
* @access private
*/
function _setMaximum($maximum)
{
}
/**
* Forces the minimum value of the axis
*
* <b>A minimum cannot be set on this type of axis</b>
*
* To modify the labels which are displayed on the axis, instead use
* setLabelInterval($labels) where $labels is an array containing the
* values/labels the axis should display. <b>Note!</b> Only values in
* this array will then be displayed on the graph!
*
* @param double $minimum A minimum cannot be set on this type of axis
*/
function forceMinimum($minimum, $userEnforce = true)
{
}
/**
* Forces the maximum value of the axis
*
* <b>A maximum cannot be set on this type of axis</b>
*
* To modify the labels which are displayed on the axis, instead use
* setLabelInterval($labels) where $labels is an array containing the
* values/labels the axis should display. <b>Note!</b> Only values in
* this array will then be displayed on the graph!
*
* @param double $maximum A maximum cannot be set on this type of axis
*/
function forceMaximum($maximum, $userEnforce = true)
{
}
/**
* Sets an interval for where labels are shown on the axis.
*
* The label interval is rounded to nearest integer value.
*
* @param double $labelInterval The interval with which labels are shown
*/
function setLabelInterval($labelInterval = 'auto', $level = 1)
{
if (is_array($labelInterval)) {
parent::setLabelInterval($labelInterval);
} elseif ($labelInterval == 'auto') {
parent::setLabelInterval(1);
} else {
parent::setLabelInterval(round($labelInterval));
}
}
/**
* Preprocessor for values, ie for using logarithmic axis
*
* @param double $value The value to preprocess
* @return double The preprocessed value
* @access private
*/
function _value($value)
{
// $the_value = array_search($value, $this->_labels);
if (isset($this->_labels[$value])) {
$the_value = $this->_labels[$value];
if ($the_value !== false) {
return $the_value + ($this->_pushValues ? 0.5 : 0);
} else {
return 0;
}
}
}
/**
* Get the minor label interval with which axis label ticks are drawn.
*
* For a sequential axis this is always disabled (i.e false)
*
* @return double The minor label interval, always false
* @access private
*/
function _minorLabelInterval()
{
return false;
}
/**
* Get the size in pixels of the axis.
*
* For an x-axis this is the width of the axis including labels, and for an
* y-axis it is the corrresponding height
*
* @return int The size of the axis
* @access private
*/
function _size()
{
if (!$this->_visible) {
return 0;
}
$this->_canvas->setFont($this->_getFont());
$maxSize = 0;
foreach($this->_labels as $label => $id) {
$labelPosition = $this->_point($label);
if (is_object($this->_dataPreProcessor)) {
$labelText = $this->_dataPreProcessor->_process($label);
} else {
$labelText = $label;
}
if ((($this->_type == IMAGE_GRAPH_AXIS_X) && (!$this->_transpose)) ||
(($this->_type != IMAGE_GRAPH_AXIS_X) && ($this->_transpose)))
{
$maxSize = max($maxSize, $this->_canvas->textHeight($labelText));
} else {
$maxSize = max($maxSize, $this->_canvas->textWidth($labelText));
}
}
if ($this->_title) {
$this->_canvas->setFont($this->_getTitleFont());
if ((($this->_type == IMAGE_GRAPH_AXIS_X) && (!$this->_transpose)) ||
(($this->_type != IMAGE_GRAPH_AXIS_X) && ($this->_transpose)))
{
$maxSize += $this->_canvas->textHeight($this->_title);
} else {
$maxSize += $this->_canvas->textWidth($this->_title);
}
$maxSize += 10;
}
return $maxSize +3;
}
/**
* Apply the dataset to the axis.
*
* This calculates the order of the categories, which is very important
* for fx. line plots, so that the line does not "go backwards", consider
* these X-sets:<p>
* 1: (1, 2, 3, 4, 5, 6)<br>
* 2: (0, 1, 2, 3, 4, 5, 6, 7)<p>
* If they are not ordered, but simply appended, the categories on the axis
* would be:<p>
* X: (1, 2, 3, 4, 5, 6, 0, 7)<p>
* Which would render the a line for the second plot to show incorrectly.
* Instead this algorithm, uses and 'value- is- before' method to see that
* the 0 is before a 1 in the second set, and that it should also be before
* a 1 in the X set. Hence:<p>
* X: (0, 1, 2, 3, 4, 5, 6, 7)
*
* @param Image_Graph_Dataset $dataset The dataset
* @access private
*/
function _applyDataset(&$dataset)
{
$newLabels = array();
$allLabels = array();
$dataset->_reset();
$count = 0;
$count_new = 0;
while ($point = $dataset->_next()) {
if ($this->_type == IMAGE_GRAPH_AXIS_X) {
$data = $point['X'];
} else {
$data = $point['Y'];
}
if (!isset($this->_labels[$data])) {
$newLabels[$data] = $count_new++;
//$this->_labels[] = $data;
}
$allLabels[$data] = $count++;
}
if (count($this->_labels) == 0) {
$this->_labels = $newLabels;
} elseif ((is_array($newLabels)) && (count($newLabels) > 0)) {
// get all intersecting labels
$intersect = array_intersect(array_keys($allLabels), array_keys($this->_labels));
// traverse all new and find their relative position withing the
// intersec, fx value X0 is before X1 in the intersection, which
// means that X0 should be placed before X1 in the label array
foreach($newLabels as $newLabel => $id) {
$key = $allLabels[$newLabel];
reset($intersect);
$this_value = false;
// intersect indexes are the same as in allLabels!
$first = true;
while ((list($id, $value) = each($intersect)) &&
($this_value === false))
{
if (($first) && ($id > $key)) {
$this_value = $value;
} elseif ($id >= $key) {
$this_value = $value;
}
$first = false;
}
if ($this_value === false) {
// the new label was not found before anything in the
// intersection -> append it
$this->_labels[$newLabel] = count($this->_labels);
} else {
// the new label was found before $this_value in the
// intersection, insert the label before this position in
// the label array
// $key = $this->_labels[$this_value];
$keys = array_keys($this->_labels);
$key = array_search($this_value, $keys);
$pre = array_slice($keys, 0, $key);
$pre[] = $newLabel;
$post = array_slice($keys, $key);
$this->_labels = array_flip(array_merge($pre, $post));
}
}
unset($keys);
}
$labels = array_keys($this->_labels);
$i = 0;
foreach ($labels as $label) {
$this->_labels[$label] = $i++;
}
// $this->_labels = array_values(array_unique($this->_labels));
$this->_calcLabelInterval();
}
/**
* Return the label distance.
*
* @return int The distance between 2 adjacent labels
* @access private
*/
function _labelDistance($level = 1)
{
reset($this->_labels);
list($l1) = each($this->_labels);
list($l2) = each($this->_labels);
return abs($this->_point($l2) - $this->_point($l1));
}
/**
* Get next label point
*
* @param doubt $point The current point, if omitted or false, the first is
* returned
* @return double The next label point
* @access private
*/
function _getNextLabel($currentLabel = false, $level = 1)
{
if ($currentLabel === false) {
reset($this->_labels);
}
$result = false;
$count = ($currentLabel === false ? $this->_labelInterval() - 1 : 0);
while ($count < $this->_labelInterval()) {
$result = (list($label) = each($this->_labels));
$count++;
}
if ($result) {
return $label;
} else {
return false;
}
}
/**
* Is the axis numeric or not?
*
* @return bool True if numeric, false if not
* @access private
*/
function _isNumeric()
{
return false;
}
/**
* Output the axis
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
$result = true;
if (Image_Graph_Element::_done() === false) {
$result = false;
}
$this->_canvas->startGroup(get_class($this));
$this->_drawAxisLines();
$this->_canvas->startGroup(get_class($this) . '_ticks');
$label = false;
while (($label = $this->_getNextLabel($label)) !== false) {
$this->_drawTick($label);
}
$this->_canvas->endGroup();
$this->_canvas->endGroup();
return $result;
}
}
?>

View File

@ -0,0 +1,152 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class for axis handling.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Logarithmic.php,v 1.15 2006/03/02 12:35:57 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Axis.php
*/
require_once 'Image/Graph/Axis.php';
/**
* Diplays a logarithmic axis (either X- or Y-axis).
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Logarithmic extends Image_Graph_Axis
{
/**
* Image_Graph_AxisLogarithmic [Constructor].
*
* Normally a manual creation should not be necessary, axis are
* created automatically by the {@link Image_Graph_Plotarea} constructor
* unless explicitly defined otherwise
*
* @param int $type The type (direction) of the Axis, use IMAGE_GRAPH_AXIS_X
* for an X-axis (default, may be omitted) and IMAGE_GRAPH_AXIS_Y for Y-
* axis)
*/
function Image_Graph_Axis_Logarithmic($type = IMAGE_GRAPH_AXIS_X)
{
parent::Image_Graph_Axis($type);
$this->showLabel(IMAGE_GRAPH_LABEL_MINIMUM + IMAGE_GRAPH_LABEL_MAXIMUM);
$this->_minimum = 1;
$this->_minimumSet = true;
}
/**
* Calculate the label interval
*
* If explicitly defined this will be calucated to an approximate best.
*
* @return double The label interval
* @access private
*/
function _calcLabelInterval()
{
$result = parent::_calcLabelInterval();
$this->_axisValueSpan = $this->_value($this->_axisSpan);
return $result;
}
/**
* Preprocessor for values, ie for using logarithmic axis
*
* @param double $value The value to preprocess
* @return double The preprocessed value
* @access private
*/
function _value($value)
{
return log10($value) - log10($this->_minimum);
}
/**
* Get next label point
*
* @param doubt $point The current point, if omitted or false, the first is
* returned
* @return double The next label point
* @access private
*/
function _getNextLabel($currentLabel = false, $level = 1)
{
if (is_array($this->_labelOptions[$level]['interval'])) {
return parent::_getNextLabel($currentLabel, $level);
}
if ($currentLabel !== false) {
$value = log10($currentLabel);
$base = floor($value);
$frac = $value - $base;
for ($i = 2; $i < 10; $i++) {
if ($frac <= (log10($i)-0.01)) {
$label = pow(10, $base)*$i;
if ($label > $this->_getMaximum()) {
return false;
} else {
return $label;
}
}
}
return pow(10, $base+1);
}
return max(1, $this->_minimum);
}
/**
* Get the axis intersection pixel position
*
* This is only to be called prior to output! I.e. between the user
* invokation of Image_Graph::done() and any actual output is performed.
* This is because it can change the axis range.
*
* @param double $value the intersection value to get the pixel-point for
* @return double The pixel position along the axis
* @access private
*/
function _intersectPoint($value)
{
if (($value <= 0) && ($value !== 'max') && ($value !== 'min')) {
$value = 1;
}
return parent::_intersectPoint($value);
}
}
?>

View File

@ -0,0 +1,156 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class file containing a axis marker used for explicitly highlighting a area
* on the graph, based on an interval specified on an axis.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Area.php,v 1.11 2005/08/24 20:36:04 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Grid.php
*/
require_once 'Image/Graph/Grid.php';
/**
* Display a grid
*
* {@link Image_Graph_Grid}
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Marker_Area extends Image_Graph_Grid
{
/**
* The lower bound
* @var double
* @access private
*/
var $_lower = false;
/**
* The upper bound
* @var double
* @access private
*/
var $_upper = false;
/**
* [Constructor]
*/
function Image_Graph_Axis_Marker_Area()
{
parent::Image_Graph_Grid();
$this->_lineStyle = false;
}
/**
* Sets the lower bound of the area (value on the axis)
*
* @param double $lower the lower bound
*/
function setLowerBound($lower)
{
$this->_lower = $lower;
}
/**
* Sets the upper bound of the area (value on the axis)
*
* @param double $upper the upper bound
*/
function setUpperBound($upper)
{
$this->_upper = $upper;
}
/**
* Output the grid
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
if (!$this->_primaryAxis) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$i = 0;
$this->_lower = max($this->_primaryAxis->_getMinimum(), $this->_lower);
$this->_upper = min($this->_primaryAxis->_getMaximum(), $this->_upper);
$secondaryPoints = $this->_getSecondaryAxisPoints();
reset($secondaryPoints);
list ($id, $previousSecondaryValue) = each($secondaryPoints);
while (list ($id, $secondaryValue) = each($secondaryPoints)) {
if ($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_X) {
$p1 = array ('Y' => $secondaryValue, 'X' => $this->_lower);
$p2 = array ('Y' => $previousSecondaryValue, 'X' => $this->_lower);
$p3 = array ('Y' => $previousSecondaryValue, 'X' => $this->_upper);
$p4 = array ('Y' => $secondaryValue, 'X' => $this->_upper);
} else {
$p1 = array ('X' => $secondaryValue, 'Y' => $this->_lower);
$p2 = array ('X' => $previousSecondaryValue, 'Y' => $this->_lower);
$p3 = array ('X' => $previousSecondaryValue, 'Y' => $this->_upper);
$p4 = array ('X' => $secondaryValue, 'Y' => $this->_upper);
}
$this->_canvas->addVertex(array('x' => $this->_pointX($p1), 'y' => $this->_pointY($p1)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p2), 'y' => $this->_pointY($p2)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p3), 'y' => $this->_pointY($p3)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p4), 'y' => $this->_pointY($p4)));
$previousSecondaryValue = $secondaryValue;
$this->_getLineStyle();
$this->_getFillStyle();
$this->_canvas->polygon(array('connect' => true));
}
$this->_canvas->endGroup();
return true;
}
}
?>

View File

@ -0,0 +1,124 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class file containing a axis marker used for explicitly highlighting a point
* (line) on the graph, based on an value specified on an axis.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Line.php,v 1.11 2005/08/03 21:21:58 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Grid.php
*/
require_once 'Image/Graph/Grid.php';
/**
* Display a grid
*
* {@link Image_Graph_Grid}
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Marker_Line extends Image_Graph_Grid
{
/**
* The value
* @var double
* @access private
*/
var $_value = false;
/**
* Sets the value of the line marker (value on the axis)
*
* @param double $value the value
*/
function setValue($value)
{
$this->_value = $value;
}
/**
* Output the grid
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
if (!$this->_primaryAxis) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$i = 0;
$this->_value = min($this->_primaryAxis->_getMaximum(), max($this->_primaryAxis->_getMinimum(), $this->_value));
$secondaryPoints = $this->_getSecondaryAxisPoints();
reset($secondaryPoints);
list ($id, $previousSecondaryValue) = each($secondaryPoints);
while (list ($id, $secondaryValue) = each($secondaryPoints)) {
if ($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_X) {
$p1 = array ('X' => $this->_value, 'Y' => $secondaryValue);
$p2 = array ('X' => $this->_value, 'Y' => $previousSecondaryValue);
} else {
$p1 = array ('X' => $secondaryValue, 'Y' => $this->_value);
$p2 = array ('X' => $previousSecondaryValue, 'Y' => $this->_value);
}
$x1 = $this->_pointX($p1);
$y1 = $this->_pointY($p1);
$x2 = $this->_pointX($p2);
$y2 = $this->_pointY($p2);
$previousSecondaryValue = $secondaryValue;
$this->_getLineStyle();
$this->_canvas->line(array('x0' => $x1, 'y0' => $y1, 'x1' => $x2, 'y1' => $y2));
}
$this->_canvas->endGroup();
return true;
}
}
?>

204
Image/Graph/Axis/Radar.php Normal file
View File

@ -0,0 +1,204 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Class for axis handling.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Radar.php,v 1.6 2005/08/03 21:22:11 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Axis/Category.php
*/
require_once 'Image/Graph/Axis/Category.php';
/**
* Displays an 'X'-axis in a radar plot chart.
*
* This axis maps the number of elements in the dataset to a angle (from 0-
* 360 degrees). Displaying the axis consist of drawing a number of lines from
* center to the edge of the 'circle' than encloses the radar plot. The labels
* are drawn on the 'ends' of these radial lines.
*
* @category Images
* @package Image_Graph
* @subpackage Axis
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Axis_Radar extends Image_Graph_Axis_Category
{
/**
* Specifies the number of pixels, the labels is offsetted from the end of
* the axis
*
* @var int
* @access private
*/
var $_distanceFromEnd = 5;
/**
* Gets the minimum value the axis will show.
*
* This is always 0
*
* @return double The minumum value
* @access private
*/
function _getMinimum()
{
return 0;
}
/**
* Gets the maximum value the axis will show.
*
* This is always the number of labels passed to the constructor.
*
* @return double The maximum value
* @access private
*/
function _getMaximum()
{
return count($this->_labels);
}
/**
* Calculate the delta value (the number of pixels representing one unit
* on the axis)
*
* @return double The label interval
* @access private
*/
function _calcDelta()
{
if (abs($this->_getMaximum() - $this->_getMinimum()) == 0) {
$this->_delta = false;
} else {
$this->_delta = 360 / ($this->_getMaximum() - $this->_getMinimum());
}
}
/**
* Get the pixel position represented by a value on the canvas
*
* @param double $value the value to get the pixel-point for
* @return double The pixel position along the axis
* @access private
*/
function _point($value)
{
return (90 + (int) ($this->_value($value) * $this->_delta)) % 360;
}
/**
* Get the size in pixels of the axis.
*
* For a radar plot this is always 0
*
* @return int The size of the axis
* @access private
*/
function _size()
{
return 0;
}
/**
* Sets the distance from the end of the category lines to the label.
*
* @param int $distance The distance in pixels
*/
function setDistanceFromEnd($distance = 5)
{
$this->_distanceFromEnd = $distance;
}
/**
* Draws axis lines.
*
* @access private
*/
function _drawAxisLines()
{
}
/**
* Output an axis tick mark.
*
* @param int $value The value to output
* @access private
*/
function _drawTick($value, $level = 1)
{
$centerX = (int) (($this->_left + $this->_right) / 2);
$centerY = (int) (($this->_top + $this->_bottom) / 2);
$radius = min($this->height(), $this->width()) / 2;
$endPoint = array ('X' => $value, 'Y' => '#max#');
$dX = $this->_pointX($endPoint);
$dY = $this->_pointY($endPoint);
$offX = ($dX - $centerX);
$offY = ($dY - $centerY);
$hyp = sqrt($offX*$offX + $offY*$offY);
if ($hyp != 0) {
$scale = $this->_distanceFromEnd / $hyp;
} else {
$scale = 1;
}
$adX = $dX + $offX * $scale;
$adY = $dY + $offY * $scale;
if (is_object($this->_dataPreProcessor)) {
$labelText = $this->_dataPreProcessor->_process($value);
} else {
$labelText = $value;
}
if ((abs($dX - $centerX) < 1.5) && ($dY < $centerY)) {
$align = IMAGE_GRAPH_ALIGN_BOTTOM + IMAGE_GRAPH_ALIGN_CENTER_X;
} elseif ((abs($dX - $centerX) < 1.5) && ($dY > $centerY)) {
$align = IMAGE_GRAPH_ALIGN_TOP + IMAGE_GRAPH_ALIGN_CENTER_X;
} elseif ($dX < $centerX) {
$align = IMAGE_GRAPH_ALIGN_RIGHT + IMAGE_GRAPH_ALIGN_CENTER_Y;
} else {
$align = IMAGE_GRAPH_ALIGN_LEFT + IMAGE_GRAPH_ALIGN_CENTER_Y;
}
$this->write($adX, $adY, $labelText, $align);
$this->_getLineStyle();
$this->_canvas->line(array('x0' => $centerX, 'y0' => $centerY, 'x1' => $dX, 'y1' => $dY));
}
}
?>

313
Image/Graph/Common.php Normal file
View File

@ -0,0 +1,313 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Common.php,v 1.16 2006/02/28 22:48:07 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
if (!function_exists('is_a')) {
/**
* Check if an object is of a given class, this function is available as of PHP 4.2.0, so if it exist it will not be declared
*
* @link http://www.php.net/manual/en/function.is-a.php PHP.net Online Manual for function is_a()
* @param object $object The object to check class for
* @param string $class_name The name of the class to check the object for
* @return bool Returns TRUE if the object is of this class or has this class as one of its parents
*/
function is_a($object, $class_name)
{
if (empty ($object)) {
return false;
}
$object = is_object($object) ? get_class($object) : $object;
if (strtolower($object) == strtolower($class_name)) {
return true;
}
return is_a(get_parent_class($object), $class_name);
}
}
/**
* Include file Image/Canvas.php
*/
require_once 'Image/Canvas.php';
/**
* The ultimate ancestor of all Image_Graph classes.
*
* This class contains common functionality needed by all Image_Graph classes.
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Common
{
/**
* The parent container of the current Image_Graph object
*
* @var Image_Graph_Common
* @access private
*/
var $_parent = null;
/**
* The sub-elements of the current Image_Graph container object
*
* @var array
* @access private
*/
var $_elements;
/**
* The canvas for output.
*
* Enables support for multiple output formats.
*
* @var Image_Canvas
* @access private
*/
var $_canvas = null;
/**
* Is the object visible?
*
* @var bool
* @access private
*/
var $_visible = true;
/**
* Constructor [Image_Graph_Common]
*/
function Image_Graph_Common()
{
}
/**
* Resets the elements
*
* @access private
*/
function _reset()
{
if (is_array($this->_elements)) {
$keys = array_keys($this->_elements);
foreach ($keys as $key) {
if (is_object($this->_elements[$key])) {
$this->_elements[$key]->_setParent($this);
$result =& $this->_elements[$key]->_reset();
if (PEAR::isError($result)) {
return $result;
}
}
}
unset($keys);
}
return true;
}
/**
* Sets the parent. The parent chain should ultimately be a GraPHP object
*
* @see Image_Graph_Common
* @param Image_Graph_Common $parent The parent
* @access private
*/
function _setParent(& $parent)
{
$this->_parent =& $parent;
$this->_canvas =& $this->_parent->_getCanvas();
if (is_array($this->_elements)) {
$keys = array_keys($this->_elements);
foreach ($keys as $key) {
if (is_object($this->_elements[$key])) {
$this->_elements[$key]->_setParent($this);
}
}
unset($keys);
}
}
/**
* Hide the element
*/
function hide()
{
$this->_visible = false;
}
/**
* Get the canvas
*
* @return Image_Canvas The canvas
* @access private
*/
function &_getCanvas()
{
if (($this->_canvas !== null) || ($this->_canvas !== false)) {
return $this->_canvas;
} elseif (is_a($this->_parent, 'Image_Graph_Common')) {
$this->_canvas =& $this->_parent->_getCanvas();
return $this->_canvas;
} else {
$this->_error('Invalid canvas');
$result = null;
return $result;
}
}
/**
* Adds an element to the objects element list.
*
* The new Image_Graph_elements parent is automatically set.
*
* @param Image_Graph_Common $element The new Image_Graph_element
* @return Image_Graph_Common The new Image_Graph_element
*/
function &add(& $element)
{
if (!is_a($element, 'Image_Graph_Font')) {
$this->_elements[] = &$element;
}
$element->_setParent($this);
return $element;
}
/**
* Creates an object from the class and adds it to the objects element list.
*
* Creates an object from the class specified and adds it to the objects
* element list. If only one parameter is required for the constructor of
* the class simply pass this parameter as the $params parameter, unless the
* parameter is an array or a reference to a value, in that case you must
* 'enclose' the parameter in an array. Similar if the constructor takes
* more than one parameter specify the parameters in an array.
*
* @see Image_Graph::factory()
* @param string $class The class for the object
* @param mixed $params The paramaters to pass to the constructor
* @return Image_Graph_Common The new Image_Graph_element
*/
function &addNew($class, $params = null, $additional = false)
{
include_once 'Image/Graph.php';
$element =& Image_Graph::factory($class, $params);
if ($additional === false) {
$obj =& $this->add($element);
} else {
$obj =& $this->add($element, $additional);
}
return $obj;
}
/**
* Shows an error message box on the canvas
*
* @param string $text The error text
* @param array $params An array containing error specific details
* @param int $error_code Error code
* @access private
*/
function _error($text, $params = false, $error_code = IMAGE_GRAPH_ERROR_GENERIC)
{
if ((is_array($params)) && (count($params) > 0)) {
foreach ($params as $name => $key) {
if (isset($parameters)) {
$parameters .= ' ';
}
else {
$parameters = '';
}
$parameters .= $name . '=' . $key;
}
}
$error =& PEAR::raiseError(
$text .
($error_code != IMAGE_GRAPH_ERROR_GENERIC ? ' error:' . IMAGE_GRAPH_ERROR_GENERIC : '') .
(isset($parameters) ? ' parameters:[' . $parameters . ']' : '')
);
}
/**
* Causes the object to update all sub elements coordinates
*
* (Image_Graph_Common, does not itself have coordinates, this is basically
* an abstract method)
*
* @access private
*/
function _updateCoords()
{
if (is_array($this->_elements)) {
$keys = array_keys($this->_elements);
foreach ($keys as $key) {
if (is_object($this->_elements[$key])) {
$this->_elements[$key]->_updateCoords();
}
}
unset($keys);
}
return true;
}
/**
* Causes output to canvas
*
* The last method to call. Calling Done causes output to the canvas. All
* sub elements done() method will be invoked
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (($this->_canvas == null) || (!is_a($this->_canvas, 'Image_Canvas'))) {
return false;
}
if (is_array($this->_elements)) {
$keys = array_keys($this->_elements);
foreach ($keys as $key) {
if (($this->_elements[$key]->_visible) && ($this->_elements[$key]->_done() === false)) {
return false;
}
}
unset($keys);
}
return true;
}
}
?>

30
Image/Graph/Config.php Normal file
View File

@ -0,0 +1,30 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Config.php,v 1.7 2005/08/03 21:21:52 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
?>

225
Image/Graph/Constants.php Normal file
View File

@ -0,0 +1,225 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Constants.php,v 1.7 2005/08/03 21:21:52 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Font.php
*/
require_once 'Image/Graph/Font.php';
// Constant declarations
/**
* Defines an X (horizontal) axis
*/
define('IMAGE_GRAPH_AXIS_X', 1);
/**
* Defines an Y (vertical) axis
*/
define('IMAGE_GRAPH_AXIS_Y', 2);
/**
* Defines an Y (vertical) axis
*/
define('IMAGE_GRAPH_AXIS_Y_SECONDARY', 3);
/**
* Defines an horizontal (X) axis
*/
define('IMAGE_GRAPH_AXIS_HORIZONTAL', 1);
/**
* Defines an vertical (Y) axis
*/
define('IMAGE_GRAPH_AXIS_VERTICAL', 2);
/**
* Define if label should be shown for axis minimum value
*/
define('IMAGE_GRAPH_LABEL_MINIMUM', 1);
/**
* Define if label should be shown for axis 0 (zero) value
*/
define('IMAGE_GRAPH_LABEL_ZERO', 2);
/**
* Define if label should be shown for axis maximum value
*/
define('IMAGE_GRAPH_LABEL_MAXIMUM', 4);
/**
* Defines a horizontal gradient fill
*/
define('IMAGE_GRAPH_GRAD_HORIZONTAL', 1);
/**
* Defines a vertical gradient fill
*/
define('IMAGE_GRAPH_GRAD_VERTICAL', 2);
/**
* Defines a horizontally mirrored gradient fill
*/
define('IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED', 3);
/**
* Defines a vertically mirrored gradient fill
*/
define('IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED', 4);
/**
* Defines a diagonal gradient fill from top-left to bottom-right
*/
define('IMAGE_GRAPH_GRAD_DIAGONALLY_TL_BR', 5);
/**
* Defines a diagonal gradient fill from bottom-left to top-right
*/
define('IMAGE_GRAPH_GRAD_DIAGONALLY_BL_TR', 6);
/**
* Defines a radial gradient fill
*/
define('IMAGE_GRAPH_GRAD_RADIAL', 7);
/**
* Defines the default builtin font
*/
define('IMAGE_GRAPH_FONT', 1);
/**
* Defines a X value should be used
*/
define('IMAGE_GRAPH_VALUE_X', 0);
/**
* Defines a Y value should be used
*/
define('IMAGE_GRAPH_VALUE_Y', 1);
/**
* Defines a min X% value should be used
*/
define('IMAGE_GRAPH_PCT_X_MIN', 2);
/**
* Defines a max X% value should be used
*/
define('IMAGE_GRAPH_PCT_X_MAX', 3);
/**
* Defines a min Y% value should be used
*/
define('IMAGE_GRAPH_PCT_Y_MIN', 4);
/**
* Defines a max Y% value should be used
*/
define('IMAGE_GRAPH_PCT_Y_MAX', 5);
/**
* Defines a total Y% value should be used
*/
define('IMAGE_GRAPH_PCT_Y_TOTAL', 6);
/**
* Defines a ID value should be used
*/
define('IMAGE_GRAPH_POINT_ID', 7);
/**
* Align text left
*/
define('IMAGE_GRAPH_ALIGN_LEFT', 0x1);
/**
* Align text right
*/
define('IMAGE_GRAPH_ALIGN_RIGHT', 0x2);
/**
* Align text center x (horizontal)
*/
define('IMAGE_GRAPH_ALIGN_CENTER_X', 0x4);
/**
* Align text top
*/
define('IMAGE_GRAPH_ALIGN_TOP', 0x8);
/**
* Align text bottom
*/
define('IMAGE_GRAPH_ALIGN_BOTTOM', 0x10);
/**
* Align text center y (vertical)
*/
define('IMAGE_GRAPH_ALIGN_CENTER_Y', 0x20);
/**
* Align text center (both x and y)
*/
define('IMAGE_GRAPH_ALIGN_CENTER', IMAGE_GRAPH_ALIGN_CENTER_X + IMAGE_GRAPH_ALIGN_CENTER_Y);
/**
* Align text top left
*/
define('IMAGE_GRAPH_ALIGN_TOP_LEFT', IMAGE_GRAPH_ALIGN_TOP + IMAGE_GRAPH_ALIGN_LEFT);
/**
* Align text top right
*/
define('IMAGE_GRAPH_ALIGN_TOP_RIGHT', IMAGE_GRAPH_ALIGN_TOP + IMAGE_GRAPH_ALIGN_RIGHT);
/**
* Align text bottom left
*/
define('IMAGE_GRAPH_ALIGN_BOTTOM_LEFT', IMAGE_GRAPH_ALIGN_BOTTOM + IMAGE_GRAPH_ALIGN_LEFT);
/**
* Align text bottom right
*/
define('IMAGE_GRAPH_ALIGN_BOTTOM_RIGHT', IMAGE_GRAPH_ALIGN_BOTTOM + IMAGE_GRAPH_ALIGN_RIGHT);
/**
* Align vertical
*/
define('IMAGE_GRAPH_ALIGN_VERTICAL', IMAGE_GRAPH_ALIGN_TOP);
/**
* Align horizontal
*/
define('IMAGE_GRAPH_ALIGN_HORIZONTAL', IMAGE_GRAPH_ALIGN_LEFT);
// Error codes
define('IMAGE_GRAPH_ERROR_GENERIC', 0);
?>

View File

@ -0,0 +1,74 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: DataPreprocessor.php,v 1.7 2005/08/24 20:35:55 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Data preprocessor used for preformatting a data.
*
* A data preprocessor is used in cases where a value from a dataset or label must be
* displayed in another format or way than entered. This could for example be the need
* to display X-values as a date instead of 1, 2, 3, .. or even worse unix-timestamps.
* It could also be when a {@link Image_Graph_Marker_Value} needs to display values as percentages
* with 1 decimal digit instead of the default formatting (fx. 12.01271 -> 12.0%).
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_DataPreprocessor
{
/**
* Image_Graph_DataPreprocessor [Constructor].
*/
function Image_Graph_DataPreprocessor()
{
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
return $value;
}
}
?>

View File

@ -0,0 +1,103 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Array.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Format data as looked up in an array.
*
* ArrayData is useful when a numercal value is to be translated to
* something thats cannot directly be calculated from this value, this could for
* example be a dataset meant to plot population of various countries. Since x-
* values are numerical and they should really be country names, but there is no
* linear correlation between the number and the name, we use an array to 'map'
* the numbers to the name, i.e. $array[0] = 'Denmark'; $array[1] = 'Sweden';
* ..., where the indexes are the numerical values from the dataset. This is NOT
* usefull when the x-values are a large domain, i.e. to map unix timestamps to
* date-strings for an x-axis. This is because the x-axis will selecte arbitrary
* values for labels, which would in principle require the ArrayData to hold
* values for every unix timestamp. However ArrayData can still be used to solve
* such a situation, since one can use another value for X-data in the dataset
* and then map this (smaller domain) value to a date. That is we for example
* instead of using the unix-timestamp we use value 0 to represent the 1st date,
* 1 to represent the next date, etc.
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Array extends Image_Graph_DataPreprocessor
{
/**
* The data label array
* @var array
* @access private
*/
var $_dataArray;
/**
* Image_Graph_ArrayData [Constructor].
*
* @param array $array The array to use as a lookup table
*/
function Image_Graph_DataPreprocessor_Array($array)
{
parent::Image_Graph_DataPreprocessor();
$this->_dataArray = $array;
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
if ((is_array($this->_dataArray)) && (isset ($this->_dataArray[$value]))) {
return $this->_dataArray[$value];
} else {
return $value;
}
}
}
?>

View File

@ -0,0 +1,66 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Currency.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor/Formatted.php
*/
require_once 'Image/Graph/DataPreprocessor/Formatted.php';
/**
* Format data as a currency.
*
* Uses the {@link Image_Graph_DataPreprocessor_Formatted} to represent the
* values as a currency, i.e. 10 => 10.00
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Currency extends Image_Graph_DataPreprocessor_Formatted
{
/**
* Image_Graph_CurrencyData [Constructor].
*
* @param string $currencySymbol The symbol representing the currency
*/
function Image_Graph_DataPreprocessor_Currency($currencySymbol)
{
parent::Image_Graph_DataPreprocessor_Formatted("$currencySymbol %0.2f");
}
}
?>

View File

@ -0,0 +1,90 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Date.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Formats Unix timestamp as a date using specified format.
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Date extends Image_Graph_DataPreprocessor
{
/**
* The format of the Unix time stamp.
* See <a href = 'http://www.php.net/manual/en/function.date.php'>PHP
* Manual</a> for a description
* @var string
* @access private
*/
var $_format;
/**
* Create a DateData preprocessor [Constructor]
*
* @param string $format See {@link http://www.php.net/manual/en/function.date.php
* PHP Manual} for a description
*/
function Image_Graph_DataPreprocessor_Date($format)
{
parent::Image_Graph_DataPreprocessor();
$this->_format = $format;
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
if (!$value) {
return false;
} else {
return date($this->_format, $value);
}
}
}
?>

View File

@ -0,0 +1,90 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Formatted.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Format data using a (s)printf pattern.
*
* This method is useful when data must displayed using a simple (s) printf
* pattern as described in the {@link http://www.php. net/manual/en/function.
* sprintf.php PHP manual}
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Formatted extends Image_Graph_DataPreprocessor
{
/**
* A (s)printf format string.
* See {@link http://www.php.net/manual/en/function.sprintf.php PHP Manual}
* for a description
* @var string
* @access private
*/
var $_format;
/**
* Create a (s)printf format data preprocessor
*
* @param string $format See {@link http://www.php.net/manual/en/function.sprintf.php
* PHP Manual} for a description
*/
function Image_Graph_DataPreprocessor_Formatted($format)
{
parent::Image_Graph_DataPreprocessor();
$this->_format = $format;
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
return sprintf($this->_format, $value);
}
}
?>

View File

@ -0,0 +1,92 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Function.php,v 1.7 2005/11/11 17:53:44 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Formatting a value using a userdefined function.
*
* Use this method to convert/format a value to a 'displayable' lable using a (perhaps)
* more complex function. An example could be (not very applicable though) if one would
* need for values to be displayed on the reverse order, i.e. 1234 would be displayed as
* 4321, then this method can solve this by creating the function that converts the value
* and use the FunctionData datapreprocessor to make Image_Graph use this function.
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Function extends Image_Graph_DataPreprocessor
{
/**
* The name of the PHP function
* @var string
* @access private
*/
var $_dataFunction;
/**
* Create a FunctionData preprocessor
*
* @param string $function The name of the PHP function to use as
* a preprocessor, this function must take a single parameter and return a
* formatted version of this parameter
*/
function Image_Graph_DataPreprocessor_Function($function)
{
parent::Image_Graph_DataPreprocessor();
$this->_dataFunction = $function;
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
$function = $this->_dataFunction;
return call_user_func($function, $value);
}
}
?>

View File

@ -0,0 +1,89 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: NumberText.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Formatting a number as its written in languages supported by Numbers_Words.
*
* Used to display values as text, i.e. 123 is displayed as one hundred and twenty three.
* Requires Numbers_Words
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_NumberText extends Image_Graph_DataPreprocessor
{
/**
* The language identifier
* @var string
* @access private
*/
var $_language;
/**
* Image_Graph_NumberText [Constructor].
*
* Supported languages see {@link http://pear.php.net/package/Numbers_Words Numbers_Words}
*
* @param string $langugage The language identifier for the language.
*/
function Image_Graph_DataPreprocessor_NumberText($language = 'en_US')
{
parent::Image_Graph_DataPreprocessor();
$this->_language = $language;
require_once 'Numbers/Words.php';
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
return Numbers_Words::toWords($value, $this->_language);
}
}
?>

View File

@ -0,0 +1,79 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: RomanNumerals.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor.php
*/
require_once 'Image/Graph/DataPreprocessor.php';
/**
* Formatting a value as a roman numerals.
*
* Values are formatted as roman numeral, i.e. 1 = I, 2 = II, 9 = IX, 2004 = MMIV.
* Requires Numbers_Roman
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_RomanNumerals extends Image_Graph_DataPreprocessor
{
/**
* Create a RomanNumerals preprocessor
*
* See {@link http://pear.php.net/package/Numbers_Roman Numbers_Roman}
*/
function Image_Graph_DataPreprocessor_RomanNumerals()
{
parent::Image_Graph_DataPreprocessor();
include_once 'Numbers/Roman.php';
}
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
return Numbers_Roman::toNumeral($value);
}
}
?>

View File

@ -0,0 +1,67 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Sequential.php,v 1.5 2005/02/21 20:49:50 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataPreprocessor/Array.php
*/
require_once 'Image/Graph/DataPreprocessor/Array.php';
/**
* Formatting values using a sequential data label array, ie. returning the
* 'next label' when asked for any label.
*
* @category Images
* @package Image_Graph
* @subpackage DataPreprocessor
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataPreprocessor_Sequential extends Image_Graph_DataPreprocessor_Array
{
/**
* Process the value
*
* @param var $value The value to process/format
* @return string The processed value
* @access private
*/
function _process($value)
{
list ($id, $value) = each($this->_dataArray);
return $value;
}
}
?>

View File

@ -0,0 +1,67 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: DataSelector.php,v 1.7 2005/08/24 20:35:56 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Filter used for selecting which data to show as markers
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataSelector
{
/**
* Image_Graph_DataSelector [Constructor]
*/
function Image_Graph_DataSelector()
{
}
/**
* Check if a specified value should be 'selected', ie shown as a marker
*
* @param array $values The values to check
* @return bool True if the Values should cause a marker to be shown, false if not
* @access private
*/
function _select($values)
{
return true;
}
}
?>

View File

@ -0,0 +1,97 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: EveryNthPoint.php,v 1.6 2005/08/24 20:35:59 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataSelector.php
*/
require_once 'Image/Graph/DataSelector.php';
/**
* Filter out all points except every Nth point.
*
* Use this dataselector if you have a large number of datapoints, but only want to
* show markers for a small number of them, say every 10th.
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataSelector_EveryNthPoint extends Image_Graph_DataSelector
{
/**
* The number of points checked
* @var int
* @access private
*/
var $_pointNum = 0;
/**
* The number of points between every 'show', default: 10
* @var int
* @access private
*/
var $_pointInterval = 10;
/**
* EvertNthPoint [Constructor]
*
* @param int $pointInterval The number of points between every 'show',
* default: 10
*/
function Image_Graph_DataSelector_EveryNthpoint($pointInterval = 10)
{
parent::Image_Graph_DataSelector();
$this->_pointInterval = $pointInterval;
}
/**
* Check if a specified value should be 'selected', ie shown as a marker
*
* @param array $values The values to check
* @return bool True if the Values should cause a marker to be shown,
* false if not
* @access private
*/
function _select($values)
{
$oldPointNum = $this->_pointNum;
$this->_pointNum++;
return (($oldPointNum % $this->_pointInterval) == 0);
}
}
?>

View File

@ -0,0 +1,68 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: NoZeros.php,v 1.5 2005/02/21 20:49:58 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataSelector.php
*/
require_once 'Image/Graph/DataSelector.php';
/**
* Filter out all zero's.
*
* Display all Y-values as markers, except those with Y = 0
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataSelector_NoZeros extends Image_Graph_DataSelector
{
/**
* Check if a specified value should be 'selected', ie shown as a marker
*
* @param array $values The values to check
* @return bool True if the Values should cause a marker to be shown, false
* if not
* @access private
*/
function _select($values)
{
return ($values['Y'] != 0);
}
}
?>

View File

@ -0,0 +1,90 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Values.php,v 1.2 2005/10/05 20:51:21 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/DataSelector.php
*/
require_once 'Image/Graph/DataSelector.php';
/**
* Filter out all but the specified values.
*
* @category Images
* @package Image_Graph
* @subpackage DataSelector
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_DataSelector_Values extends Image_Graph_DataSelector {
/**
* The array with values that should be included
* @var array
* @access private
*/
var $_values;
/**
* ValueArray [Constructor]
*
* @param array $valueArray The array to use as filter (default empty)
*/
function &Image_Graph_DataSelector_Values($values)
{
parent::Image_Graph_DataSelector();
$this->_values = $values;
}
/**
* Sets the array to use
*/
function setValueArray($values)
{
$this->_values = $values;
}
/**
* Check if a specified value should be 'selected', ie shown as a marker
*
* @param array $values The values to check
* @return bool True if the Values should cause a marker to be shown, false
* if not
* @access private
*/
function _select($values)
{
return ( in_array($values['Y'], $this->_values) );
}
}
?>

483
Image/Graph/Dataset.php Normal file
View File

@ -0,0 +1,483 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Dataset.php,v 1.10 2005/08/24 20:35:55 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Data set used to represent a data collection to plot in a chart
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Dataset
{
/**
* The pointer of the data set
* @var int
* @access private
*/
var $_posX = 0;
/**
* The minimum X value of the dataset
* @var int
* @access private
*/
var $_minimumX = 0;
/**
* The maximum X value of the dataset
* @var int
* @access private
*/
var $_maximumX = 0;
/**
* The minimum Y value of the dataset
* @var int
* @access private
*/
var $_minimumY = 0;
/**
* The maximum Y value of the dataset
* @var int
* @access private
*/
var $_maximumY = 0;
/**
* The number of points in the dataset
* @var int
* @access private
*/
var $_count = 0;
/**
* The name of the dataset, used for legending
* @var string
* @access private
*/
var $_name = '';
/**
* Image_Graph_Dataset [Constructor]
*/
function Image_Graph_Dataset()
{
}
/**
* Sets the name of the data set, used for legending
*
* @param string $name The name of the dataset
*/
function setName($name)
{
$this->_name = $name;
}
/**
* Add a point to the dataset
*
* $ID can contain either the ID of the point, i.e. 'DK', 123, 'George', etc. or it can contain
* values used for creation of the HTML image map. This is achieved using is an an associated array
* with the following values:
*
* 'url' The URL to create the link to
*
* 'alt' [optional] The alt text on the link
*
* 'target' [optional] The target of the link
*
* 'htmltags' [optional] An associated array with html tags (tag as key), fx. 'onMouseOver' => 'history.go(-1);', 'id' => 'thelink'
*
* @param int $x The X value to add
* @param int $y The Y value to add, can be omited
* @param var $ID The ID of the point
*/
function addPoint($x, $y = false, $ID = false)
{
if ($y !== null) {
if (is_array($y)) {
$maxY = max($y);
$minY = min($y);
} else {
$maxY = $y;
$minY = $y;
}
}
if ($this->_count) {
$this->_minimumX = min($x, $this->_minimumX);
$this->_maximumX = max($x, $this->_maximumX);
if ($y !== null) {
$this->_minimumY = min($minY, $this->_minimumY);
$this->_maximumY = max($maxY, $this->_maximumY);
}
} else {
$this->_minimumX = $x;
$this->_maximumX = $x;
if ($y !== null) {
$this->_minimumY = $minY;
$this->_maximumY = $maxY;
}
}
$this->_count++;
}
/**
* The number of values in the dataset
*
* @return int The number of values in the dataset
*/
function count()
{
return $this->_count;
}
/**
* Gets a X point from the dataset
*
* @param var $x The variable to return an X value from, fx in a vector
* function data set
* @return var The X value of the variable
* @access private
*/
function _getPointX($x)
{
return $x;
}
/**
* Gets a Y point from the dataset
*
* @param var $x The variable to return an Y value from, fx in a vector
* function data set
* @return var The Y value of the variable
* @access private
*/
function _getPointY($x)
{
return $x;
}
/**
* Gets a ID from the dataset
*
* @param var $x The variable to return an Y value from, fx in a vector
* function data set
* @return var The ID value of the variable
* @access private
*/
function _getPointID($x)
{
return false;
}
/**
* Gets point data from the dataset
*
* @param var $x The variable to return an Y value from, fx in a vector
* function data set
* @return array The data for the point
* @access private
*/
function _getPointData($x)
{
return false;
}
/**
* The minimum X value
*
* @return var The minimum X value
*/
function minimumX()
{
return $this->_minimumX;
}
/**
* The maximum X value
*
* @return var The maximum X value
*/
function maximumX()
{
return $this->_maximumX;
}
/**
* The minimum Y value
*
* @return var The minimum Y value
*/
function minimumY()
{
return $this->_minimumY;
}
/**
* The maximum Y value
*
* @return var The maximum Y value
*/
function maximumY()
{
return $this->_maximumY;
}
/**
* The first point
*
* @return array The last point
*/
function first()
{
return array('X' => $this->minimumX(), 'Y' => $this->minimumY());
}
/**
* The last point
*
* @return array The first point
*/
function last()
{
return array('X' => $this->maximumX(), 'Y' => $this->maximumY());
}
/**
* The minimum X value
*
* @param var $value The minimum X value
* @access private
*/
function _setMinimumX($value)
{
$this->_minimumX = $value;
}
/**
* The maximum X value
*
* @param var $value The maximum X value
* @access private
*/
function _setMaximumX($value)
{
$this->_maximumX = $value;
}
/**
* The minimum Y value
*
* @param var $value The minimum X value
* @access private
*/
function _setMinimumY($value)
{
$this->_minimumY = $value;
}
/**
* The maximum Y value
*
* @param var $value The maximum X value
* @access private
*/
function _setMaximumY($value)
{
$this->_maximumY = $value;
}
/**
* The interval between 2 adjacent X values
*
* @return var The interval
* @access private
*/
function _stepX()
{
return 1;
}
/**
* The interval between 2 adjacent Y values
*
* @return var The interval
* @access private
*/
function _stepY()
{
return 1;
}
/**
* Reset the intertal dataset pointer
*
* @return var The first X value
* @access private
*/
function _reset()
{
$this->_posX = $this->_minimumX;
return $this->_posX;
}
/**
* Get a point close to the internal pointer
*
* @param int Step Number of points next to the internal pointer, negative
* Step is towards lower X values, positive towards higher X values
* @return array The point
* @access private
*/
function _nearby($step = 0)
{
$x = $this->_getPointX($this->_posX + $this->_stepX() * $step);
$y = $this->_getPointY($this->_posX + $this->_stepX() * $step);
$ID = $this->_getPointID($this->_posX + $this->_stepX() * $step);
$data = $this->_getPointData($this->_posX + $this->_stepX() * $step);
if (($x === false) || ($y === false)) {
return false;
} else {
return array ('X' => $x, 'Y' => $y, 'ID' => $ID, 'data' => $data);
}
}
/**
* Get the next point the internal pointer refers to and advance the pointer
*
* @return array The next point
* @access private
*/
function _next()
{
if ($this->_posX > $this->_maximumX) {
return false;
}
$x = $this->_getPointX($this->_posX);
$y = $this->_getPointY($this->_posX);
$ID = $this->_getPointID($this->_posX);
$data = $this->_getPointData($this->_posX);
$this->_posX += $this->_stepX();
return array ('X' => $x, 'Y' => $y, 'ID' => $ID, 'data' => $data);
}
/**
* Get the average of the dataset's Y points
*
* @return var The Y-average across the dataset
* @access private
*/
function _averageY()
{
$posX = $this->_minimumX;
$count = 0;
$total = 0;
while ($posX < $this->_maximumX) {
$count ++;
$total += $this->_getPointY($posX);
$posX += $this->_stepX();
}
if ($count != 0) {
return $total / $count;
} else {
return false;
}
}
/**
* Get the median of the array passed Y points
*
* @param array $data The data-array to get the median from
* @param int $quartile The quartile to return the median from
* @return var The Y-median across the dataset from the specified quartile
* @access private
*/
function _median($data, $quartile = 'second')
{
sort($data);
$point = (count($data) - 1) / 2;
if ($quartile == 'first') {
$lowPoint = 0;
$highPoint = floor($point);
} elseif ($quartile == 'third') {
$lowPoint = round($point);
$highPoint = count($data) - 1;
} else {
$lowPoint = 0;
$highPoint = count($data) - 1;
}
$point = ($lowPoint + $highPoint) / 2;
if (floor($point) != $point) {
$point = floor($point);
return ($data[$point] + $data[($point + 1)]) / 2;
} else {
return $data[$point];
}
}
/**
* Get the median of the datasets Y points
*
* @param int $quartile The quartile to return the median from
* @return var The Y-median across the dataset from the specified quartile
* @access private
*/
function _medianY($quartile = 'second')
{
$pointsY = array();
$posX = $this->_minimumX;
while ($posX <= $this->_maximumX) {
$pointsY[] = $this->_getPointY($posX);
$posX += $this->_stepX();
}
return $this->_median($pointsY, $quartile);
}
}
?>

View File

@ -0,0 +1,147 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Function.php,v 1.7 2005/08/24 20:35:57 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Dataset.php
*/
require_once 'Image/Graph/Dataset.php';
/**
* Function data set, points are generated by calling an external function.
*
* The function must be a single variable function and return a the result,
* builtin functions that are fx sin() or cos(). User defined function can be
* used if they are such, i.e: function myFunction($variable)
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Dataset_Function extends Image_Graph_Dataset
{
/**
* The name of the function
* @var string
* @access private
*/
var $_dataFunction;
/**
* Image_Graph_FunctionDataset [Constructor]
*
* @param double $minimumX The minimum X value
* @param double $maximumX The maximum X value
* @param string $function The name of the function, if must be a single
* parameter function like fx sin(x) or cos(x)
* @param int $points The number of points to create
*/
function Image_Graph_Dataset_Function($minimumX, $maximumX, $function, $points)
{
parent::Image_Graph_Dataset();
$this->_minimumX = $minimumX;
$this->_maximumX = $maximumX;
$this->_dataFunction = $function;
$this->_count = $points;
$this->_calculateMaxima();
}
/**
* Add a point to the dataset.
*
* You can't add points to a function dataset
*
* @param int $x The X value to add
* @param int $y The Y value to add, can be omited
* @param var $ID The ID of the point
*/
function addPoint($x, $y = false, $ID = false)
{
}
/**
* Gets a Y point from the dataset
*
* @param var $x The variable to apply the function to
* @return var The function applied to the X value
* @access private
*/
function _getPointY($x)
{
$function = $this->_dataFunction;
return $function ($x);
}
/**
* The number of values in the dataset
*
* @return int The number of values in the dataset
* @access private
*/
function _count()
{
return $this->_count;
}
/**
* The interval between 2 adjacent Y values
*
* @return var The interval
* @access private
*/
function _stepX()
{
return ($this->_maximumX - $this->_minimumX) / $this->_count();
}
/**
* Calculates the Y extrema of the function
*
* @access private
*/
function _calculateMaxima()
{
$x = $this->_minimumX;
while ($x <= $this->_maximumX) {
$y = $this->_getPointY($x);
$this->_minimumY = min($y, $this->_minimumY);
$this->_maximumY = max($y, $this->_maximumY);
$x += $this->_stepX();
}
}
}
?>

View File

@ -0,0 +1,77 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Random.php,v 1.6 2005/08/24 20:35:57 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Dataset/Trivial.php
*/
require_once 'Image/Graph/Dataset/Trivial.php';
/**
* Random data set, points are generated by random.
*
* This dataset is mostly (if not solely) used for demo-purposes.
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Dataset_Random extends Image_Graph_Dataset_Trivial
{
/**
* RandomDataset [Constructor]
*
* @param int $count The number of points to create
* @param double $minimum The minimum value the random set can be
* @param double $maximum The maximum value the random set can be
* @param bool $includeZero Whether 0 should be included or not as an X
* value, may be omitted, default: false</false>
*/
function Image_Graph_Dataset_Random($count, $minimum, $maximum, $includeZero = false)
{
parent::Image_Graph_Dataset_Trivial();
$i = 0;
while ($i < $count) {
$this->addPoint(
$ixc = ($includeZero ? $i : $i +1),
rand($minimum, $maximum)
);
$i ++;
}
}
}
?>

View File

@ -0,0 +1,114 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Sequential.php,v 1.7 2005/08/24 20:35:58 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Dataset/Trivial.php
*/
require_once 'Image/Graph/Dataset/Trivial.php';
/**
* Sequential data set, simply add points (y) 1 by 1.
*
* This is a single point (1D) dataset, all points are of the type (0, y1), (1,
* y2), (2, y3)... Where the X-value is implicitly incremented. This is useful
* for example for barcharts, where you could fx. use an {@link
* Image_Graph_Dataset_Array} datapreprocessor to make sence of the x-values.
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Dataset_Sequential extends Image_Graph_Dataset_Trivial
{
/**
* Image_Graph_SequentialDataset [Constructor]
*/
function Image_Graph_Dataset_Sequential($dataArray = false)
{
parent::Image_Graph_Dataset_Trivial();
if (is_array($dataArray)) {
reset($dataArray);
foreach ($dataArray as $value) {
$this->addPoint($value);
}
}
}
/**
* Add a point to the dataset
*
* @param int $y The Y value to add, can be omited
* @param var $ID The ID of the point
*/
function addPoint($y, $ID = false)
{
parent::addPoint($this->count(), $y);
}
/**
* Gets a X point from the dataset
*
* @param var $x The variable to return an X value from, fx in a
* vector function data set
* @return var The X value of the variable
* @access private
*/
function _getPointX($x)
{
return ((int) $x);
}
/**
* The minimum X value
* @return var The minimum X value
*/
function minimumX()
{
return 0;
}
/**
* The maximum X value
* @return var The maximum X value
*/
function maximumX()
{
return $this->count();
}
}
?>

View File

@ -0,0 +1,260 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Trivial.php,v 1.10 2005/09/25 18:08:56 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Dataset.php
*/
require_once 'Image/Graph/Dataset.php';
/**
* Trivial data set, simply add points (x, y) 1 by 1
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Dataset_Trivial extends Image_Graph_Dataset
{
/**
* Data storage
* @var array
* @access private
*/
var $_data;
/**
* Image_Graph_Dataset_Trivial [Constructor]
*
* Pass an associated array ($data[$x] = $y) to the constructor for easy
* data addition. Alternatively (if multiple entries with same x value is
* required) pass an array with (x, y) values: $data[$id] = array('x' => $x,
* 'y' => $y);
*
* NB! If passing the 1st type array at this point, the x-values will also
* be used for ID tags, i.e. when using {@link Image_Graph_Fill_Array}. In
* the 2nd type the key/index of the "outermost" array will be the id tag
* (i.e. $id in the example)
*
* @param array $dataArray An associated array with values to the dataset
*/
function Image_Graph_Dataset_Trivial($dataArray = false)
{
parent::Image_Graph_Dataset();
$this->_data = array ();
if (is_array($dataArray)) {
reset($dataArray);
$keys = array_keys($dataArray);
foreach ($keys as $x) {
$y =& $dataArray[$x];
if ((is_array($y)) && (isset($y['x'])) && (isset($y['y']))) {
$this->addPoint($y['x'], $y['y'], (isset($y['id']) ? $y['id'] : $x));
} else {
$this->addPoint($x, $y, $x);
}
}
}
}
/**
* Add a point to the dataset
*
* $ID can contain either the ID of the point, i.e. 'DK', 123, 'George', etc. or it can contain
* values used for creation of the HTML image map. This is achieved using is an an associated array
* with the following values:
*
* 'url' The URL to create the link to
*
* 'alt' [optional] The alt text on the link
*
* 'target' [optional] The target of the link
*
* 'htmltags' [optional] An associated array with html tags (tag as key), fx. 'onMouseOver' => 'history.go(-1);', 'id' => 'thelink'
*
* @param int $x The X value to add
* @param int $y The Y value to add, can be omited
* @param var $ID The ID of the point
*/
function addPoint($x, $y = false, $ID = false)
{
parent::addPoint($x, $y, $ID);
if (is_array($ID)) {
$data = $ID;
$ID = (isset($data['id']) ? $data['id'] : false);
} else {
$data = false;
}
$this->_data[] = array ('X' => $x, 'Y' => $y, 'ID' => $ID, 'data' => $data);
if (!is_numeric($x)) {
$this->_maximumX = count($this->_data);
}
}
/**
* The first point
*
* @return array The last point
*/
function first()
{
reset($this->_data);
return current($this->_data);
}
/**
* The last point
*
* @return array The first point
*/
function last()
{
return end($this->_data);
}
/**
* Gets a X point from the dataset
*
* @param var $x The variable to return an X value from, fx in a
* vector function data set
* @return var The X value of the variable
* @access private
*/
function _getPointX($x)
{
if (isset($this->_data[$x])) {
return $this->_data[$x]['X'];
} else {
return false;
}
}
/**
* Gets a Y point from the dataset
*
* @param var $x The variable to return an Y value from, fx in a
* vector function data set
* @return var The Y value of the variable
* @access private
*/
function _getPointY($x)
{
if (isset($this->_data[$x])) {
return $this->_data[$x]['Y'];
} else {
return false;
}
}
/**
* Gets a ID from the dataset
*
* @param var $x The variable to return an Y value from, fx in a
* vector function data set
* @return var The ID value of the variable
* @access private
*/
function _getPointID($x)
{
if (isset($this->_data[$x])) {
return $this->_data[$x]['ID'];
} else {
return false;
}
}
/**
* Gets point data from the dataset
*
* @param var $x The variable to return an Y value from, fx in a vector
* function data set
* @return array The data for the point
* @access private
*/
function _getPointData($x)
{
if (isset($this->_data[$x])) {
return $this->_data[$x]['data'];
} else {
return false;
}
}
/**
* The number of values in the dataset
*
* @return int The number of values in the dataset
*/
function count()
{
return count($this->_data);
}
/**
* Reset the intertal dataset pointer
*
* @return var The first X value
* @access private
*/
function _reset()
{
$this->_posX = 0;
return $this->_posX;
}
/**
* Get the next point the internal pointer refers to and advance the pointer
*
* @return array The next point
* @access private
*/
function _next()
{
if ($this->_posX >= $this->count()) {
return false;
}
$x = $this->_getPointX($this->_posX);
$y = $this->_getPointY($this->_posX);
$ID = $this->_getPointID($this->_posX);
$data = $this->_getPointData($this->_posX);
$this->_posX += $this->_stepX();
return array('X' => $x, 'Y' => $y, 'ID' => $ID, 'data' => $data);
}
}
?>

View File

@ -0,0 +1,185 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: VectorFunction.php,v 1.6 2005/08/24 20:35:57 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Dataset.php
*/
require_once 'Image/Graph/Dataset.php';
/**
* Vector Function data set.
*
* Points are generated by calling 2 external functions, fx. x = sin(t) and y =
* cos(t)
*
* @category Images
* @package Image_Graph
* @subpackage Dataset
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Dataset_VectorFunction extends Image_Graph_Dataset
{
/**
* The name of the X function
* @var string
* @access private
*/
var $_functionX;
/**
* The name of the Y function
* @var string
* @access private
*/
var $_functionY;
/**
* The minimum of the vector function variable
* @var double
* @access private
*/
var $_minimumT;
/**
* The maximum of the vector function variable
* @var double
* @access private
*/
var $_maximumT;
/**
* Image_Graph_VectorFunctionDataset [Constructor]
*
* @param double $minimumT The minimum value of the vector function variable
* @param double $maximumT The maximum value of the vector function variable
* @param string $functionX The name of the X function, if must be a single
* parameter function like fx sin(x) or cos(x)
* @param string $functionY The name of the Y function, if must be a single
* parameter function like fx sin(x) or cos(x)
* @param int $points The number of points to create
*/
function Image_Graph_Dataset_VectorFunction($minimumT, $maximumT, $functionX, $functionY, $points)
{
parent::Image_Graph_Dataset();
$this->_minimumT = $minimumT;
$this->_maximumT = $maximumT;
$this->_functionX = $functionX;
$this->_functionY = $functionY;
$this->_count = $points;
$this->_calculateMaxima();
}
/**
* Add a point to the dataset
*
* @param int $x The X value to add
* @param int $y The Y value to add, can be omited
* @param var $ID The ID of the point
*/
function addPoint($x, $y = false, $ID = false)
{
}
/**
* Gets a X point from the dataset
*
* @param var $x The variable to apply the X function to
* @return var The X function applied to the X value
* @access private
*/
function _getPointX($x)
{
$functionX = $this->_functionX;
return $functionX ($x);
}
/**
* Gets a Y point from the dataset
*
* @param var $x The variable to apply the Y function to
* @return var The Y function applied to the X value
* @access private
*/
function _getPointY($x)
{
$functionY = $this->_functionY;
return $functionY ($x);
}
/**
* Reset the intertal dataset pointer
*
* @return var The first T value
* @access private
*/
function _reset()
{
$this->_posX = $this->_minimumT;
return $this->_posX;
}
/**
* The interval between 2 adjacent T values
*
* @return var The interval
* @access private
*/
function _stepX()
{
return ($this->_maximumT - $this->_minimumT) / $this->count();
}
/**
* Calculates the X and Y extrema of the functions
*
* @access private
*/
function _calculateMaxima()
{
$t = $this->_minimumT;
while ($t <= $this->_maximumT) {
$x = $this->_getPointX($t);
$y = $this->_getPointY($t);
$this->_minimumX = min($x, $this->_minimumX);
$this->_maximumX = max($x, $this->_maximumX);
$this->_minimumY = min($y, $this->_minimumY);
$this->_maximumY = max($y, $this->_maximumY);
$t += $this->_stepX();
}
}
}
?>

770
Image/Graph/Element.php Normal file
View File

@ -0,0 +1,770 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Element.php,v 1.18 2006/02/28 22:48:07 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Common.php
*/
require_once 'Image/Graph/Common.php';
/**
* Representation of a element.
*
* The Image_Graph_Element can be drawn on the canvas, ie it has coordinates,
* {@link Image_Graph_Line}, {@link Image_Graph_Fill}, border and background -
* although not all of these may apply to all children.
*
* @category Images
* @package Image_Graph
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Element extends Image_Graph_Common
{
/**
* The leftmost pixel of the element on the canvas
* @var int
* @access private
*/
var $_left = 0;
/**
* The topmost pixel of the element on the canvas
* @var int
* @access private
*/
var $_top = 0;
/**
* The rightmost pixel of the element on the canvas
* @var int
* @access private
*/
var $_right = 0;
/**
* The bottommost pixel of the element on the canvas
* @var int
* @access private
*/
var $_bottom = 0;
/**
* Background of the element. Default: None
* @var FillStyle
* @access private
*/
var $_background = null;
/**
* Borderstyle of the element. Default: None
* @var LineStyle
* @access private
*/
var $_borderStyle = null;
/**
* Line style of the element. Default: None
* @var LineStyle
* @access private
*/
var $_lineStyle = 'black';
/**
* Fill style of the element. Default: None
* @var FillStyle
* @access private
*/
var $_fillStyle = 'white';
/**
* Font of the element. Default: Standard font - FONT
* @var Font
* @access private
* @see $IMAGE_GRAPH_FONT
*/
var $_font = null;
/**
* Font options
* @var array
* @access private
*/
var $_fontOptions = array();
/**
* Default font options
*
* This option is included for performance reasons. The value is calculated
* before output and reused in default cases to avoid unnecessary recursive
* calls.
*
* @var array
* @access private
*/
var $_defaultFontOptions = false;
/**
* Shadows options of the element
* @var mixed
* @access private
*/
var $_shadow = false;
/**
* The padding displayed on the element
* @var int
* @access private
*/
var $_padding = array('left' => 0, 'top' => 0, 'right' => 0, 'bottom' => 0);
/**
* Constructor
*/
function Image_Graph_Element() {
parent::__construct();
}
/**
* Sets the background fill style of the element
*
* @param Image_Graph_Fill $background The background
* @see Image_Graph_Fill
*/
function setBackground(& $background)
{
if (!is_a($background, 'Image_Graph_Fill')) {
$this->_error(
'Could not set background for ' . get_class($this) . ': ' .
get_class($background), array('background' => &$background)
);
} else {
$this->_background =& $background;
$this->add($background);
}
}
/**
* Shows shadow on the element
*/
function showShadow($color = 'black@0.2', $size = 5)
{
$this->_shadow = array(
'color' => $color,
'size' => $size
);
}
/**
* Sets the background color of the element.
*
* See colors.txt in the docs/ folder for a list of available named colors.
*
* @param mixed $color The color
*/
function setBackgroundColor($color)
{
$this->_background = $color;
}
/**
* Gets the background fill style of the element
*
* @return int A GD fillstyle representing the background style
* @see Image_Graph_Fill
* @access private
*/
function _getBackground()
{
if (is_object($this->_background)) {
$this->_canvas->setFill($this->_background->_getFillStyle());
} elseif ($this->_background != null) {
$this->_canvas->setFill($this->_background);
} else {
return false;
}
return true;
}
/**
* Sets the border line style of the element
*
* @param Image_Graph_Line $borderStyle The line style of the border
* @see Image_Graph_Line
*/
function setBorderStyle(& $borderStyle)
{
if (!is_a($borderStyle, 'Image_Graph_Line')) {
$this->_error(
'Could not set border style for ' . get_class($this) . ': ' .
get_class($borderStyle), array('borderstyle' => &$borderStyle)
);
} else {
$this->_borderStyle =& $borderStyle;
$this->add($borderStyle);
}
}
/**
* Sets the border color of the element.
*
* See colors.txt in the docs/ folder for a list of available named colors.
* @param mixed $color The color
*/
function setBorderColor($color)
{
$this->_borderStyle = $color;
}
/**
* Gets the border line style of the element
*
* @return int A GD linestyle representing the borders line style
* @see Image_Graph_Line
* @access private
*/
function _getBorderStyle()
{
if (is_object($this->_borderStyle)) {
$result = $this->_borderStyle->_getLineStyle();
$this->_canvas->setLineThickness($result['thickness']);
$this->_canvas->setLineColor($result['color']);
} elseif ($this->_borderStyle != null) {
$this->_canvas->setLineThickness(1);
$this->_canvas->setLineColor($this->_borderStyle);
} else {
return false;
}
return true;
}
/**
* Sets the line style of the element
*
* @param Image_Graph_Line $lineStyle The line style of the element
* @see Image_Graph_Line
*/
function setLineStyle(& $lineStyle)
{
if (!is_object($lineStyle)) {
$this->_error(
'Could not set line style for ' . get_class($this) . ': ' .
get_class($lineStyle), array('linestyle' => &$lineStyle)
);
} else {
$this->_lineStyle =& $lineStyle;
$this->add($lineStyle);
}
}
/**
* Sets the line color of the element.
*
* See colors.txt in the docs/ folder for a list of available named colors.
*
* @param mixed $color The color
*/
function setLineColor($color)
{
$this->_lineStyle = $color;
}
/**
* Gets the line style of the element
*
* @return int A GD linestyle representing the line style
* @see Image_Graph_Line
* @access private
*/
function _getLineStyle($ID = false)
{
if (is_object($this->_lineStyle)) {
$result = $this->_lineStyle->_getLineStyle($ID);
if (is_array($result)) {
$this->_canvas->setLineThickness($result['thickness']);
$this->_canvas->setLineColor($result['color']);
} else {
$this->_canvas->setLineThickness(1);
$this->_canvas->setLineColor($result);
}
} elseif ($this->_lineStyle != null) {
$this->_canvas->setLineThickness(1);
$this->_canvas->setLineColor($this->_lineStyle);
} else {
return false;
}
return true;
}
/**
* Sets the fill style of the element
*
* @param Image_Graph_Fill $fillStyle The fill style of the element
* @see Image_Graph_Fill
*/
function setFillStyle(& $fillStyle)
{
if (!is_a($fillStyle, 'Image_Graph_Fill')) {
$this->_error(
'Could not set fill style for ' . get_class($this) . ': ' .
get_class($fillStyle), array('fillstyle' => &$fillStyle)
);
} else {
$this->_fillStyle =& $fillStyle;
$this->add($fillStyle);
}
}
/**
* Sets the fill color of the element.
*
* See colors.txt in the docs/ folder for a list of available named colors.
*
* @param mixed $color The color
*/
function setFillColor($color)
{
$this->_fillStyle = $color;
}
/**
* Gets the fill style of the element
*
* @return int A GD filestyle representing the fill style
* @see Image_Graph_Fill
* @access private
*/
function _getFillStyle($ID = false)
{
if (is_object($this->_fillStyle)) {
$this->_canvas->setFill($this->_fillStyle->_getFillStyle($ID));
} elseif ($this->_fillStyle != null) {
$this->_canvas->setFill($this->_fillStyle);
} else {
return false;
}
return true;
}
/**
* Gets the font of the element.
*
* If not font has been set, the parent font is propagated through it's
* children.
*
* @return array An associated array used for canvas
* @access private
*/
function _getFont($options = false)
{
if (($options === false) && ($this->_defaultFontOptions !== false)) {
return $this->_defaultFontOptions;
}
if ($options === false) {
$saveDefault = true;
} else {
$saveDefault = false;
}
if ($options === false) {
$options = $this->_fontOptions;
} else {
$options = array_merge($this->_fontOptions, $options);
}
if ($this->_font == null) {
$result = $this->_parent->_getFont($options);
} else {
$result = $this->_font->_getFont($options);
}
if ((isset($result['size'])) && (isset($result['size_rel']))) {
$result['size'] += $result['size_rel'];
unset($result['size_rel']);
}
if ($saveDefault) {
$this->_defaultFontOptions = $result;
}
return $result;
}
/**
* Sets the font of the element
*
* @param Image_Graph_Font $font The font of the element
* @see Image_Graph_Font
*/
function setFont(& $font)
{
if (!is_a($font, 'Image_Graph_Font')) {
$this->_error('Invalid font set on ' . get_class($this));
} else {
$this->_font =& $font;
$this->add($font);
}
}
/**
* Sets the font size
*
* @param int $size The size of the font
*/
function setFontSize($size)
{
$this->_fontOptions['size'] = $size;
}
/**
* Sets the font angle
*
* @param int $angle The angle of the font
*/
function setFontAngle($angle)
{
if ($angle == 'vertical') {
$this->_fontOptions['vertical'] = true;
$this->_fontOptions['angle'] = 90;
} else {
$this->_fontOptions['angle'] = $angle;
}
}
/**
* Sets the font color
*
* @param mixed $color The color of the font
*/
function setFontColor($color)
{
$this->_fontOptions['color'] = $color;
}
/**
* Clip the canvas to the coordinates of the element
*
* @param $enable bool Whether clipping should be enabled or disabled
* @access protected
*/
function _clip($enable)
{
$this->_canvas->setClipping(
($enable ?
array(
'x0' => min($this->_left, $this->_right),
'y0' => min($this->_top, $this->_bottom),
'x1' => max($this->_left, $this->_right),
'y1' => max($this->_top, $this->_bottom)
)
: false
)
);
}
/**
* Sets the coordinates of the element
*
* @param int $left The leftmost pixel of the element on the canvas
* @param int $top The topmost pixel of the element on the canvas
* @param int $right The rightmost pixel of the element on the canvas
* @param int $bottom The bottommost pixel of the element on the canvas
* @access private
*/
function _setCoords($left, $top, $right, $bottom)
{
if ($left === false) {
$left = $this->_left;
}
if ($top === false) {
$top = $this->_top;
}
if ($right === false) {
$right = $this->_right;
}
if ($bottom === false) {
$bottom = $this->_bottom;
}
$this->_left = min($left, $right);
$this->_top = min($top, $bottom);
$this->_right = max($left, $right);
$this->_bottom = max($top, $bottom);
}
/**
* Moves the element
*
* @param int $deltaX Number of pixels to move the element to the right
* (negative values move to the left)
* @param int $deltaY Number of pixels to move the element downwards
* (negative values move upwards)
* @access private
*/
function _move($deltaX, $deltaY)
{
$this->_left += $deltaX;
$this->_right += $deltaX;
$this->_top += $deltaY;
$this->_bottom += $deltaY;
}
/**
* Sets the width of the element relative to the left side
*
* @param int $width Number of pixels the element should be in width
* @access private
*/
function _setWidth($width)
{
$this->_right = $this->_left + $width;
}
/**
* Sets the height of the element relative to the top
*
* @param int $width Number of pixels the element should be in height
* @access private
*/
function _setHeight($height)
{
$this->_bottom = $this->_top + $height;
}
/**
* Sets padding of the element
*
* @param mixed $padding Number of pixels the element should be padded with
* or an array of paddings (left, top, right and bottom as index)
*/
function setPadding($padding)
{
if (is_array($padding)) {
$this->_padding = array();
$this->_padding['left'] = (isset($padding['left']) ? $padding['left'] : 0);
$this->_padding['top'] = (isset($padding['top']) ? $padding['top'] : 0);
$this->_padding['right'] = (isset($padding['right']) ? $padding['right'] : 0);
$this->_padding['bottom'] = (isset($padding['bottom']) ? $padding['bottom'] : 0);
}
else {
$this->_padding = array(
'left' => $padding,
'top' => $padding,
'right' => $padding,
'bottom' => $padding
);
}
}
/**
* The width of the element on the canvas
*
* @return int Number of pixels representing the width of the element
*/
function width()
{
return abs($this->_right - $this->_left) + 1;
}
/**
* The height of the element on the canvas
*
* @return int Number of pixels representing the height of the element
*/
function height()
{
return abs($this->_bottom - $this->_top) + 1;
}
/**
* Left boundary of the background fill area
*
* @return int Leftmost position on the canvas
* @access private
*/
function _fillLeft()
{
return $this->_left + $this->_padding['left'];
}
/**
* Top boundary of the background fill area
*
* @return int Topmost position on the canvas
* @access private
*/
function _fillTop()
{
return $this->_top + $this->_padding['top'];
}
/**
* Right boundary of the background fill area
*
* @return int Rightmost position on the canvas
* @access private
*/
function _fillRight()
{
return $this->_right - $this->_padding['right'];
}
/**
* Bottom boundary of the background fill area
*
* @return int Bottommost position on the canvas
* @access private
*/
function _fillBottom()
{
return $this->_bottom - $this->_padding['bottom'];
}
/**
* Returns the filling width of the element on the canvas
*
* @return int Filling width
* @access private
*/
function _fillWidth()
{
return $this->_fillRight() - $this->_fillLeft() + 1;
}
/**
* Returns the filling height of the element on the canvas
*
* @return int Filling height
* @access private
*/
function _fillHeight()
{
return $this->_fillBottom() - $this->_fillTop() + 1;
}
/**
* Draws a shadow 'around' the element
*
* Not implemented yet.
*
* @access private
*/
function _displayShadow()
{
if (is_array($this->_shadow)) {
$this->_canvas->startGroup(get_class($this) . '_shadow');
$this->_canvas->setFillColor($this->_shadow['color']);
$this->_canvas->addVertex(array('x' => $this->_right + 1, 'y' => $this->_top + $this->_shadow['size']));
$this->_canvas->addVertex(array('x' => $this->_right + $this->_shadow['size'], 'y' => $this->_top + $this->_shadow['size']));
$this->_canvas->addVertex(array('x' => $this->_right + $this->_shadow['size'], 'y' => $this->_bottom + $this->_shadow['size']));
$this->_canvas->addVertex(array('x' => $this->_left + $this->_shadow['size'], 'y' => $this->_bottom + $this->_shadow['size']));
$this->_canvas->addVertex(array('x' => $this->_left + $this->_shadow['size'], 'y' => $this->_bottom + 1));
$this->_canvas->addVertex(array('x' => $this->_right + 1, 'y' => $this->_bottom + 1));
$this->_canvas->polygon(array('connect' => true));
$this->_canvas->endGroup();
}
}
/**
* Writes text to the canvas.
*
* @param int $x The x position relative to alignment
* @param int $y The y position relative to alignment
* @param string $text The text
* @param int $alignmen The text alignment (both vertically and horizontally)
*/
function write($x, $y, $text, $alignment = false, $font = false)
{
if (($font === false) && ($this->_defaultFontOptions !== false)) {
$font = $this->_defaultFontOptions;
} else {
$font = $this->_getFont($font);
}
if ($alignment === false) {
$alignment = IMAGE_GRAPH_ALIGN_LEFT + IMAGE_GRAPH_ALIGN_TOP;
}
$align = array();
if (($alignment & IMAGE_GRAPH_ALIGN_TOP) != 0) {
$align['vertical'] = 'top';
} else if (($alignment & IMAGE_GRAPH_ALIGN_BOTTOM) != 0) {
$align['vertical'] = 'bottom';
} else {
$align['vertical'] = 'center';
}
if (($alignment & IMAGE_GRAPH_ALIGN_LEFT) != 0) {
$align['horizontal'] = 'left';
} else if (($alignment & IMAGE_GRAPH_ALIGN_RIGHT) != 0) {
$align['horizontal'] = 'right';
} else {
$align['horizontal'] = 'center';
}
$this->_canvas->setFont($font);
$this->_canvas->addText(array('x' => $x, 'y' => $y, 'text' => $text, 'alignment' => $align));
}
/**
* Output the element to the canvas
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @see Image_Graph_Common
* @access private
*/
function _done()
{
$background = $this->_getBackground();
$border = $this->_getBorderStyle();
if (($background) || ($border)) {
$this->_canvas->rectangle(array('x0' => $this->_left, 'y0' => $this->_top, 'x1' => $this->_right, 'y1' => $this->_bottom));
}
$result = parent::_done();
if ($this->_shadow !== false) {
$this->_displayShadow();
}
return $result;
}
}
?>

View File

@ -0,0 +1,64 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Circle.php,v 1.6 2005/08/24 20:36:01 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Figure/Ellipse.php
*/
require_once 'Image/Graph/Figure/Ellipse.php';
/**
* Circle to draw on the canvas
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Figure_Circle extends Image_Graph_Figure_Ellipse
{
/**
* Image_Graph_Circle [Constructor]
*
* @param int $x The center pixel of the circle on the canvas
* @param int $y The center pixel of the circle on the canvas
* @param int $radius The radius in pixels of the circle
*/
function Image_Graph_Figure_Circle($x, $y, $radius)
{
parent::Image_Graph_Ellipse($x, $y, $radius, $radius);
}
}
?>

View File

@ -0,0 +1,97 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Ellipse.php,v 1.9 2005/08/24 20:36:00 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* Ellipse to draw on the canvas
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Figure_Ellipse extends Image_Graph_Element
{
/**
* Ellipse [Constructor]
*
* @param int $x The center pixel of the ellipse on the canvas
* @param int $y The center pixel of the ellipse on the canvas
* @param int $radiusX The width in pixels of the box on the canvas
* @param int $radiusY The height in pixels of the box on the canvas
*/
function Image_Graph_Figure_Ellipse($x, $y, $radiusX, $radiusY)
{
parent::Image_Graph_Element();
$this->_setCoords($x - $radiusX, $y - $radiusY, $x + $radiusX, $y + $radiusY);
}
/**
* Output the ellipse
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$this->_getFillStyle();
$this->_getLineStyle();
$this->_canvas->ellipse(
array(
'x' => ($this->_left + $this->_right) / 2,
'y' => ($this->_top + $this->_bottom) / 2,
'rx' => $this->width(),
'ry' => $this->height()
)
);
$this->_canvas->endGroup();
return true;
}
}
?>

View File

@ -0,0 +1,94 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Polygon.php,v 1.8 2005/08/03 21:21:57 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* Polygon to draw on the canvas
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Figure_Polygon extends Image_Graph_Element
{
/**
* Polygon vertices
*
* @var array
* @access private
*/
var $_polygon = array ();
/**
* Add a vertex to the polygon
*
* @param int $x X-coordinate
* @param int $y Y-coordinate
*/
function addVertex($x, $y)
{
$this->_canvas->addVertex(array('x' => $x, 'y' => $y));
}
/**
* Output the polygon
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$this->_getFillStyle();
$this->_getLineStyle();
$this->_canvas->polygon(array('connect' => true));
$this->_canvas->endGroup();
return true;
}
}
?>

View File

@ -0,0 +1,96 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Rectangle.php,v 1.9 2005/08/24 20:36:01 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* Rectangle to draw on the canvas
*
* @category Images
* @package Image_Graph
* @subpackage Figure
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Figure_Rectangle extends Image_Graph_Element
{
/**
* Rectangle [Construcor]
*
* @param int $x The leftmost pixel of the box on the canvas
* @param int $y The topmost pixel of the box on the canvas
* @param int $width The width in pixels of the box on the canvas
* @param int $height The height in pixels of the box on the canvas
*/
function Image_Graph_Figure_Rectangle($x, $y, $width, $height)
{
parent::Image_Graph_Element();
$this->_setCoords($x, $y, $x + $width, $y + $height);
}
/**
* Output the box
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$this->_getFillStyle();
$this->_getLineStyle();
$this->_canvas->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_right,
'y1' => $this->_bottom
)
);
$this->_canvas->endGroup();
return true;
}
}
?>

70
Image/Graph/Fill.php Normal file
View File

@ -0,0 +1,70 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Fill.php,v 1.6 2005/02/21 20:49:46 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* Style used for filling elements.
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Fill extends Image_Graph_Common
{
/**
* Constructor
*/
function Image_Graph_Fill() {
parent::__construct();
}
/**
* Resets the fillstyle
*
* @access private
*/
function _reset()
{
}
}
?>

137
Image/Graph/Fill/Array.php Normal file
View File

@ -0,0 +1,137 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Array.php,v 1.8 2005/08/24 20:36:03 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Fill.php
*/
require_once 'Image/Graph/Fill.php';
/**
* A sequential array of fillstyles.
*
* This is used for filling multiple objects within the same element with
* different styles. This is done by adding multiple fillstyles to a FillArrray
* structure. The fillarray will then when requested return the 'next' fillstyle
* in sequential order. It is possible to specify ID tags to each fillstyle,
* which is used to make sure some data uses a specific fillstyle (i.e. in a
* multiple-/stackedbarchart you name the {@link Image_Graph_Dataset}s and uses
* this name as ID tag when adding the dataset's associated fillstyle to the
* fillarray.
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Fill_Array extends Image_Graph_Fill
{
/**
* The fill array
* @var array
* @access private
*/
var $_fillStyles = array ();
/**
* Resets the fillstyle
*
* @access private
*/
function _reset()
{
reset($this->_fillStyles);
}
/**
* Add a fill style to the array
*
* @param Image_Graph_Fill $style The style to add
* @param string $id The id or name of the style
*/
function &add(& $style, $id = '')
{
if ($id == '') {
$this->_fillStyles[] =& $style;
} else {
$this->_fillStyles[$id] =& $style;
}
reset($this->_fillStyles);
return $style;
}
/**
* Add a color to the array
*
* @param int $color The color
* @param string $id The id or name of the color
*/
function addColor($color, $id = false)
{
if ($id !== false) {
$this->_fillStyles[$id] = $color;
} else {
$this->_fillStyles[] = $color;
}
reset($this->_fillStyles);
}
/**
* Return the fillstyle
*
* @return int A GD fillstyle
* @access private
*/
function _getFillStyle($ID = false)
{
if (($ID === false) || (!isset($this->_fillStyles[$ID]))) {
$ID = key($this->_fillStyles);
if (!next($this->_fillStyles)) {
reset($this->_fillStyles);
}
}
$fillStyle =& $this->_fillStyles[$ID];
if (is_object($fillStyle)) {
return $fillStyle->_getFillStyle($ID);
} elseif ($fillStyle !== null) {
return $fillStyle;
} else {
return parent::_getFillStyle($ID);
}
}
}
?>

View File

@ -0,0 +1,149 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Gradient.php,v 1.15 2005/08/24 20:36:03 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Fill/Image.php
*/
require_once 'Image/Graph/Fill/Image.php';
/**
* Fill using a gradient color.
* This creates a scaled fillstyle with colors flowing gradiently between 2
* specified RGB values. Several directions are supported:
*
* 1 Vertically (IMAGE_GRAPH_GRAD_VERTICAL)
*
* 2 Horizontally (IMAGE_GRAPH_GRAD_HORIZONTAL)
*
* 3 Mirrored vertically (the color grades from a- b-a vertically)
* (IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED)
*
* 4 Mirrored horizontally (the color grades from a-b-a horizontally)
* IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED
*
* 5 Diagonally from top-left to right-bottom
* (IMAGE_GRAPH_GRAD_DIAGONALLY_TL_BR)
*
* 6 Diagonally from bottom-left to top-right
* (IMAGE_GRAPH_GRAD_DIAGONALLY_BL_TR)
*
* 7 Radially (concentric circles in the center) (IMAGE_GRAPH_GRAD_RADIAL)
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Fill_Gradient extends Image_Graph_Fill //Image_Graph_Fill_Image
{
/**
* The direction of the gradient
* @var int
* @access private
*/
var $_direction;
/**
* The first color to gradient
* @var mixed
* @access private
*/
var $_startColor;
/**
* The last color to gradient
* @var mixed
* @access private
*/
var $_endColor;
/**
* Image_Graph_GradientFill [Constructor]
*
* @param int $direction The direction of the gradient
* @param mixed $startColor The value of the starting color
* @param mixed $endColor The value of the ending color
*/
function Image_Graph_Fill_Gradient($direction, $startColor, $endColor)
{
parent::Image_Graph_Fill();
$this->_direction = $direction;
$this->_startColor = $startColor;
$this->_endColor = $endColor;
}
/**
* Return the fillstyle
*
* @return int A GD fillstyle
* @access private
*/
function _getFillStyle($ID = false)
{
switch ($this->_direction) {
case IMAGE_GRAPH_GRAD_HORIZONTAL:
$direction = 'horizontal';
break;
case IMAGE_GRAPH_GRAD_VERTICAL:
$direction = 'vertical';
break;
case IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED:
$direction = 'horizontal_mirror';
break;
case IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED:
$direction = 'vertical_mirror';
break;
case IMAGE_GRAPH_GRAD_DIAGONALLY_TL_BR:
$direction = 'diagonal_tl_br';
break;
case IMAGE_GRAPH_GRAD_DIAGONALLY_BL_TR:
$direction = 'diagonal_bl_tr';
break;
case IMAGE_GRAPH_GRAD_RADIAL:
$direction = 'radial';
break;
}
return array(
'type' => 'gradient',
'start' => $this->_startColor,
'end' => $this->_endColor,
'direction' => $direction
);
}
}
?>

View File

@ -0,0 +1,97 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Image.php,v 1.7 2005/08/24 20:36:03 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Fill.php
*/
require_once 'Image/Graph/Fill.php';
/**
* Fill using an image.
*
* @category Images
* @package Image_Graph
* @subpackage Fill
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Fill_Image extends Image_Graph_Fill
{
/**
* The file name
* @var stirng
* @access private
*/
var $_filename;
/**
* The GD Image resource
* @var resource
* @access private
*/
var $_image;
/**
* Resize the image to the bounding box of the area to fill
* @var bool
* @access private
*/
var $_resize = true;
/**
* Image_Graph_ImageFill [Constructor]
*
* @param string $filename The filename and path of the image to use for filling
*/
function Image_Graph_Fill_Image($filename)
{
parent::Image_Graph_Fill();
$this->_filename = $filename;
}
/**
* Return the fillstyle
*
* @param (something) $ID (Add description)
* @return int A GD fillstyle
* @access private
*/
function _getFillStyle($ID = false)
{
return $this->_filename;
}
}
?>

158
Image/Graph/Font.php Normal file
View File

@ -0,0 +1,158 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Text
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Font.php,v 1.8 2005/08/24 20:35:55 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Common.php
*/
require_once 'Image/Graph/Common.php';
/**
* A font.
*
* @category Images
* @package Image_Graph
* @subpackage Text
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Font extends Image_Graph_Common
{
/**
* The name of the font
* @var string
* @access private
*/
var $_name = false;
/**
* The angle of the output
* @var int
* @access private
*/
var $_angle = false;
/**
* The size of the font
* @var int
* @access private
*/
var $_size = 11;
/**
* The color of the font
* @var Color
* @access private
*/
var $_color = 'black';
/**
* Image_Graph_Font [Constructor]
*/
function Image_Graph_Font($name = false, $size = false)
{
parent::Image_Graph_Common();
if ($name !== false) {
$this->_name = $name;
}
if ($size !== false) {
$this->_size = $size;
}
}
/**
* Set the color of the font
*
* @param mixed $color The color object of the Font
*/
function setColor($color)
{
$this->_color = $color;
}
/**
* Set the angle slope of the output font.
*
* 0 = normal, 90 = bottom and up, 180 = upside down, 270 = top and down
*
* @param int $angle The angle in degrees to slope the text
*/
function setAngle($angle)
{
$this->_angle = $angle;
}
/**
* Set the size of the font
*
* @param int $size The size in pixels of the font
*/
function setSize($size)
{
$this->_size = $size;
}
/**
* Get the font 'array'
*
* @return array The font 'summary' to pass to the canvas
* @access private
*/
function _getFont($options = false)
{
if ($options === false) {
$options = array();
}
if ($this->_name !== false) {
$options['name'] = $this->_name;
}
if (!isset($options['color'])) {
$options['color'] = $this->_color;
}
if (!isset($options['size'])) {
$options['size'] = $this->_size;
}
if ((!isset($options['angle'])) && ($this->_angle !== false)) {
$options['angle'] = $this->_angle;
}
return $options;
}
}
?>

182
Image/Graph/Grid.php Normal file
View File

@ -0,0 +1,182 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Grid.php,v 1.8 2005/02/21 20:49:47 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Element.php
*/
require_once 'Image/Graph/Element.php';
/**
* A grid displayed on the plotarea.
*
* A grid is associated with a primary and a secondary axis. The grid is
* displayed in context of the primary axis' label interval - meaning that a
* grid for an Y-axis displays a grid for every label on the y-axis (fx. a {@link
* Image_Graph_Grid_Lines}, which displays horizontal lines for every label on
* the y-axis from the x-axis minimum to the x-axis maximum). You should always
* add the grid as one of the first elements to the plotarea. This is due to the
* fact that elements are 'outputted' in the order they are added, i.e. if an
* grid is added *after* a chart, the grid will be displayed on top of the chart
* which is (probably) not desired.
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Grid extends Image_Graph_Plotarea_Element
{
/**
* Constructor
*/
function Image_Graph_Grid() {
parent::__construct();
}
/**
* The primary axis: the grid 'refers' to
* @var Axis
* @access private
*/
var $_primaryAxis = null;
/**
* The secondary axis
* @var Axis
* @access private
*/
var $_secondaryAxis = null;
/**
* Set the primary axis: the grid should 'refer' to
*
* @param Image_Graph_Axis $axis The axis
* @access private
*/
function _setPrimaryAxis(& $axis)
{
$this->_primaryAxis =& $axis;
}
/**
* Set the secondary axis
*
* @param Image_Graph_Axis $axis The axis
* @access private
*/
function _setSecondaryAxis(& $axis)
{
$this->_secondaryAxis =& $axis;
}
/**
* Get the points on the secondary axis that the grid should 'connect'
*
* @return array The secondary data values that should mark the grid 'end points'
* @access private
*/
function _getSecondaryAxisPoints()
{
if (is_a($this->_secondaryAxis, 'Image_Graph_Axis_Radar')) {
$secondaryValue = false;
$firstValue = $secondaryValue;
while (($secondaryValue = $this->_secondaryAxis->_getNextLabel($secondaryValue)) !== false) {
$secondaryAxisPoints[] = $secondaryValue;
}
$secondaryAxisPoints[] = $firstValue;
} else {
$secondaryAxisPoints = array ('#min#', '#max#');
}
return $secondaryAxisPoints;
}
/**
* Get the X pixel position represented by a value
*
* @param double $point the value to get the pixel-point for
* @return double The pixel position along the axis
* @access private
*/
function _pointX($point)
{
if (($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y) ||
($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y_SECONDARY))
{
$point['AXIS_Y'] = $this->_primaryAxis->_type;
} else {
$point['AXIS_Y'] = $this->_secondaryAxis->_type;
}
return parent::_pointX($point);
}
/**
* Get the Y pixel position represented by a value
*
* @param double $point the value to get the pixel-point for
* @return double The pixel position along the axis
* @access private
*/
function _pointY($point)
{
if (($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y) ||
($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y_SECONDARY))
{
$point['AXIS_Y'] = $this->_primaryAxis->_type;
} else {
$point['AXIS_Y'] = $this->_secondaryAxis->_type;
}
return parent::_pointY($point);
}
/**
* Causes the object to update all sub elements coordinates.
*
* @access private
*/
function _updateCoords()
{
$this->_setCoords(
$this->_parent->_plotLeft,
$this->_parent->_plotTop,
$this->_parent->_plotRight,
$this->_parent->_plotBottom
);
parent::_updateCoords();
}
}
?>

117
Image/Graph/Grid/Bars.php Normal file
View File

@ -0,0 +1,117 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Bars.php,v 1.10 2005/09/14 20:27:25 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Grid.php
*/
require_once 'Image/Graph/Grid.php';
/**
* Display alternating bars on the plotarea.
*
* {@link Image_Graph_Grid}
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Grid_Bars extends Image_Graph_Grid
{
/**
* Output the grid
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
if (!$this->_primaryAxis) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$i = 0;
$value = false;
$previousValue = 0;
$secondaryPoints = $this->_getSecondaryAxisPoints();
while (($value = $this->_primaryAxis->_getNextLabel($value)) !== false) {
if ($i == 1) {
reset($secondaryPoints);
list ($id, $previousSecondaryValue) = each($secondaryPoints);
while (list ($id, $secondaryValue) = each($secondaryPoints)) {
if ($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_X) {
$p1 = array ('Y' => $secondaryValue, 'X' => $value);
$p2 = array ('Y' => $previousSecondaryValue, 'X' => $value);
$p3 = array ('Y' => $previousSecondaryValue, 'X' => $previousValue);
$p4 = array ('Y' => $secondaryValue, 'X' => $previousValue);
} else {
$p1 = array ('X' => $secondaryValue, 'Y' => $value);
$p2 = array ('X' => $previousSecondaryValue, 'Y' => $value);
$p3 = array ('X' => $previousSecondaryValue, 'Y' => $previousValue);
$p4 = array ('X' => $secondaryValue, 'Y' => $previousValue);
}
$this->_canvas->addVertex(array('x' => $this->_pointX($p1), 'y' => $this->_pointY($p1)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p2), 'y' => $this->_pointY($p2)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p3), 'y' => $this->_pointY($p3)));
$this->_canvas->addVertex(array('x' => $this->_pointX($p4), 'y' => $this->_pointY($p4)));
$this->_getFillStyle();
$this->_canvas->polygon(array('connect' => true));
$previousSecondaryValue = $secondaryValue;
}
}
$i = 1 - $i;
$previousValue = $value;
}
$this->_canvas->endGroup();
return true;
}
}
?>

114
Image/Graph/Grid/Lines.php Normal file
View File

@ -0,0 +1,114 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Lines.php,v 1.10 2005/08/24 20:36:04 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Grid.php
*/
require_once 'Image/Graph/Grid.php';
/**
* Display a line grid on the plotarea.
*
* {@link Image_Graph_Grid}
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Grid_Lines extends Image_Graph_Grid
{
/**
* GridLines [Constructor]
*/
function Image_Graph_Grid_Lines()
{
parent::Image_Graph_Grid();
$this->_lineStyle = 'lightgrey';
}
/**
* Output the grid
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
if (!$this->_primaryAxis) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$value = false;
$secondaryPoints = $this->_getSecondaryAxisPoints();
while (($value = $this->_primaryAxis->_getNextLabel($value)) !== false) {
reset($secondaryPoints);
list ($id, $previousSecondaryValue) = each($secondaryPoints);
while (list ($id, $secondaryValue) = each($secondaryPoints)) {
if ($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y) {
$p1 = array ('X' => $secondaryValue, 'Y' => $value);
$p2 = array ('X' => $previousSecondaryValue, 'Y' => $value);
} else {
$p1 = array ('X' => $value, 'Y' => $secondaryValue);
$p2 = array ('X' => $value, 'Y' => $previousSecondaryValue);
}
$x1 = $this->_pointX($p1);
$y1 = $this->_pointY($p1);
$x2 = $this->_pointX($p2);
$y2 = $this->_pointY($p2);
$previousSecondaryValue = $secondaryValue;
$this->_getLineStyle();
$this->_canvas->line(array('x0' => $x1, 'y0' => $y1, 'x1' => $x2, 'y1' => $y2));
}
}
$this->_canvas->endGroup();
return true;
}
}
?>

111
Image/Graph/Grid/Polar.php Normal file
View File

@ -0,0 +1,111 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Polar.php,v 1.10 2005/08/24 20:36:04 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
* @since File available since Release 0.3.0dev2
*/
/**
* Include file Image/Graph/Grid.php
*/
require_once 'Image/Graph/Grid.php';
/**
* Display a line grid on the plotarea.
*
* {@link Image_Graph_Grid}
*
* @category Images
* @package Image_Graph
* @subpackage Grid
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @since Class available since Release 0.3.0dev2
*/
class Image_Graph_Grid_Polar extends Image_Graph_Grid
{
/**
* GridLines [Constructor]
*/
function Image_Graph_Grid_Polar()
{
parent::Image_Graph_Grid();
$this->_lineStyle = 'lightgrey';
}
/**
* Output the grid
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (parent::_done() === false) {
return false;
}
if (!$this->_primaryAxis) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$value = false;
$p0 = array ('X' => '#min#', 'Y' => '#min#');
if ($this->_primaryAxis->_type == IMAGE_GRAPH_AXIS_Y) {
$p1 = array ('X' => '#min#', 'Y' => '#max#');
$r0 = abs($this->_pointY($p1) - $this->_pointY($p0));
} else {
$p1 = array ('X' => '#max#', 'Y' => '#min#');
$r0 = abs($this->_pointX($p1) - $this->_pointX($p0));
}
$cx = $this->_pointX($p0);
$cy = $this->_pointY($p0);
$span = $this->_primaryAxis->_axisSpan;
while (($value = $this->_primaryAxis->_getNextLabel($value)) !== false) {
$r = $r0 * ($value - $this->_primaryAxis->_getMinimum()) / $span;
$this->_getLineStyle();
$this->_canvas->ellipse(array('x' => $cx, 'y' => $cy, 'rx' => $r, 'ry' => $r));
}
$this->_canvas->endGroup();
return true;
}
}
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

View File

@ -0,0 +1,17 @@
In this folder the files for the Image_Graph_Plot_Map are located. They should be the
following format:
[map name].png
[map name].txt
The [map name].png (fx. europe.png) is the actual image presenting the map. The
[map name].txt file is the location -> (x,y) conversion table. In this file the
named locations is written on every line with the x and y coordinates after the
name (with a TAB), i.e.:
Denmark 10 30
England 4 30
Where Denmark will be 'located' on (10, 30) on the map, and England at (4, 30).
No maps are released by default due to we want to avoid possible copyright issues.

219
Image/Graph/Layout.php Normal file
View File

@ -0,0 +1,219 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Layout.php,v 1.12 2006/02/28 22:48:07 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Plotarea/Element.php
*/
require_once 'Image/Graph/Plotarea/Element.php';
/**
* Defines an area of the graph that can be layout'ed.
*
* Any class that extends this abstract class can be used within a layout on the canvas.
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
* @abstract
*/
class Image_Graph_Layout extends Image_Graph_Plotarea_Element
{
/**
* Has the coordinates already been updated?
* @var bool
* @access private
*/
var $_updated = false;
/**
* Alignment of the area for each vertice (left, top, right, bottom)
* @var array
* @access private
*/
var $_alignSize = array ('left' => 0, 'top' => 0, 'right' => 0, 'bottom' => 0);
/**
* Image_Graph_Layout [Constructor]
*/
function Image_Graph_Layout()
{
parent::Image_Graph_Element();
$this->_padding = array('left' => 2, 'top' => 2, 'right' => 2, 'bottom' => 2);
}
/**
* Resets the elements
*
* @access private
*/
function _reset()
{
parent::_reset();
$this->_updated = false;
}
/**
* Calculate the edge offset for a specific edge
* @param array $alignSize The alignment of the edge
* @param int $offset The offset/posision of the at 0% edge
* @param int $total The total size (width or height) of the element
* @param int $multiplier +/- 1 if the edge should pushed either toward more
* negative or positive values
* @since 0.3.0dev2
* @access private
*/
function _calcEdgeOffset($alignSize, $offset, $total, $multiplier)
{
if ($alignSize['unit'] == 'percentage') {
return $offset + $multiplier * ($total * $alignSize['value'] / 100);
} elseif ($alignSize['unit'] == 'pixels') {
if (($alignSize['value'] == 'auto_part1') || ($alignSize['value'] == 'auto_part2')) {
$alignSize['value'] = $multiplier * $this->_parent->_getAbsolute($alignSize['value']);
}
if ($alignSize['value'] < 0) {
return $offset + $multiplier * ($total + $alignSize['value']);
} else {
return $offset + $multiplier * $alignSize['value'];
}
}
return $offset;
}
/**
* Calculate the edges
*
* @access private
*/
function _calcEdges()
{
if ((is_array($this->_alignSize)) && (!$this->_updated)) {
$left = $this->_calcEdgeOffset(
$this->_alignSize['left'],
$this->_parent->_fillLeft(),
$this->_parent->_fillWidth(),
+1
);
$top = $this->_calcEdgeOffset(
$this->_alignSize['top'],
$this->_parent->_fillTop(),
$this->_parent->_fillHeight(),
+1
);
$right = $this->_calcEdgeOffset(
$this->_alignSize['right'],
$this->_parent->_fillRight(),
$this->_parent->_fillWidth(),
-1
);
$bottom = $this->_calcEdgeOffset(
$this->_alignSize['bottom'],
$this->_parent->_fillBottom(),
$this->_parent->_fillHeight(),
-1
);
$this->_setCoords(
$left + $this->_padding['left'],
$top + $this->_padding['top'],
$right - $this->_padding['right'],
$bottom - $this->_padding['bottom']
);
}
}
/**
* Update coordinates
*
* @access private
*/
function _updateCoords()
{
$this->_calcEdges();
parent::_updateCoords();
}
/**
* Pushes an edge of area a specific distance 'into' the canvas
*
* @param int $edge The edge of the canvas to align relative to
* @param int $size The number of pixels or the percentage of the canvas total size to occupy relative to the selected alignment edge
* @access private
*/
function _push($edge, $size = '100%')
{
$result = array();
if (ereg("([0-9]*)\%", $size, $result)) {
$this->_alignSize[$edge] = array(
'value' => min(100, max(0, $result[1])),
'unit' => 'percentage'
);
} else {
$this->_alignSize[$edge] = array(
'value' => $size,
'unit' => 'pixels'
);
}
}
/**
* Sets the coordinates of the element
*
* @param int $left The leftmost pixel of the element on the canvas
* @param int $top The topmost pixel of the element on the canvas
* @param int $right The rightmost pixel of the element on the canvas
* @param int $bottom The bottommost pixel of the element on the canvas
* @access private
*/
function _setCoords($left, $top, $right, $bottom)
{
parent::_setCoords($left, $top, $right, $bottom);
$this->_updated = true;
}
/**
* Returns the calculated "auto" size
*
* @return int The calculated auto size
* @access private
*/
function _getAutoSize()
{
return false;
}
}
?>

View File

@ -0,0 +1,186 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Horizontal.php,v 1.11 2006/02/28 22:48:07 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Layout.php
*/
require_once 'Image/Graph/Layout.php';
/**
* Layout for displaying two elements side by side.
*
* This splits the area contained by this element in two, side by side by
* a specified percentage (relative to the left side). A layout can be nested.
* Fx. a HorizontalLayout can layout two {@link Image_Graph_Layout_Vertical}s to
* make a 2 by 2 matrix of 'element-areas'.
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Layout_Horizontal extends Image_Graph_Layout
{
/**
* Part1 of the layout
* @var GraPHPElemnt
* @access private
*/
var $_part1 = false;
/**
* Part2 of the layout
* @var GraPHPElemnt
* @access private
*/
var $_part2 = false;
/**
* The percentage of the graph where the split occurs
* @var int
* @access private
*/
var $_percentage;
/**
* An absolute position where the split occurs
* @var int
* @access private
*/
var $_absolute;
/**
* HorizontalLayout [Constructor]
*
* @param Image_Graph_Element $part1 The 1st part of the layout
* @param Image_Graph_Element $part2 The 2nd part of the layout
* @param int $percentage The percentage of the layout to split at
*/
function Image_Graph_Layout_Horizontal(& $part1, & $part2, $percentage = 50)
{
parent::Image_Graph_Layout();
if (!is_a($part1, 'Image_Graph_Layout')) {
$this->_error(
'Cannot create layout on non-layouable parts: ' . get_class($part1),
array('part1' => &$part1, 'part2' => &$part2)
);
} elseif (!is_a($part2, 'Image_Graph_Layout')) {
$this->_error(
'Cannot create layout on non-layouable parts: ' . get_class($part2),
array('part1' => &$part1, 'part2' => &$part2)
);
} else {
$this->_part1 =& $part1;
$this->_part2 =& $part2;
$this->add($this->_part1);
$this->add($this->_part2);
};
if ($percentage === 'auto') {
$this->_percentage = false;
$this->_absolute = 'runtime';
} else {
$this->_absolute = false;
$this->_percentage = max(0, min(100, $percentage));
}
$this->_split();
$this->_padding = array('left' => 0, 'top' => 0, 'right' => 0, 'bottom' => 0);
}
/**
* Gets the absolute size of one of the parts.
*
* @param string $part The name of the part - auto_part(1|2)
* @return int The number of pixels the edge should be pushed
* @since 0.3.0dev2
* @access private
*/
function _getAbsolute(&$part)
{
$part1Size = $this->_part1->_getAutoSize();
$part2Size = $this->_part2->_getAutoSize();
$this->_percentage = false;
if (($part1Size !== false) and ($part2Size !== false)) {
$width = $this->_fillWidth() * $part1Size / ($part1Size + $part2Size);
} elseif ($part1Size !== false) {
$width = $part1Size;
} elseif ($part2Size !== false) {
$width = -$part2Size;
} else {
$width = $this->_fillWidth() / 2;
}
if ($part == 'auto_part2') {
$width = -$width;
}
return $width;
}
/**
* Splits the layout between the parts, by the specified percentage
*
* @access private
*/
function _split()
{
if (($this->_part1) && ($this->_part2)) {
if ($this->_percentage !== false) {
$split1 = 100 - $this->_percentage;
$split2 = $this->_percentage;
$this->_part1->_push('right', "$split1%");
$this->_part2->_push('left', "$split2%");
} else {
$this->_part1->_push('right', 'auto_part1');
$this->_part2->_push('left', 'auto_part2');
}
}
}
/**
* Output the layout to the canvas
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (($this->_part1) && ($this->_part2)) {
return (($this->_part1->_done()) && ($this->_part2->_done()));
}
return true;
}
}
?>

View File

@ -0,0 +1,201 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Matrix.php,v 1.8 2005/08/24 20:35:58 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Layout.php
*/
require_once 'Image/Graph/Layout.php';
/**
* Layout for displaying elements in a matix.
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Layout_Matrix extends Image_Graph_Layout
{
/**
* Layout matrix
* @var array
* @access private
*/
var $_matrix = false;
/**
* The number of rows
* @var int
* @access private
*/
var $_rows = false;
/**
* The number of columns
* @var int
* @access private
*/
var $_cols = false;
/**
* Image_Graph_Layout_Matrix [Constructor]
*
* @param int $rows The number of rows
* @param int $cols The number of cols
* @param bool $autoCreate Specifies whether the matrix should automatically
* be filled with newly created Image_Graph_Plotares objects, or they will
* be added manually
*/
function Image_Graph_Layout_Matrix($rows, $cols, $autoCreate = true)
{
parent::Image_Graph_Layout();
$this->_rows = $rows;
$this->_cols = $cols;
if (($this->_rows > 0) && ($this->_cols > 0)) {
$this->_matrix = array(array());
for ($i = 0; $i < $this->_rows; $i++) {
for ($j = 0; $j < $this->_cols; $j++) {
if ($autoCreate) {
$this->_matrix[$i][$j] =& $this->addNew('plotarea');
$this->_pushEdges($i, $j);
} else {
$this->_matrix[$i][$j] = false;
}
}
}
}
}
/**
* Pushes the edges on the specified position in the matrix
*
* @param int $row The row
* @param int $col The column
* @access private
*/
function _pushEdges($row, $col)
{
if ((isset($this->_matrix[$row])) && (isset($this->_matrix[$row][$col]))) {
$height = 100/$this->_rows;
$width = 100/$this->_cols;
if ($col > 0) {
$this->_matrix[$row][$col]->_push('left', round($col*$width) . '%');
}
if ($col+1 < $this->_cols) {
$this->_matrix[$row][$col]->_push('right', round(100-($col+1)*$width) . '%');
}
if ($row > 0) {
$this->_matrix[$row][$col]->_push('top', round($row*$height) . '%');
}
if ($row+1 < $this->_rows) {
$this->_matrix[$row][$col]->_push('bottom', round(100-($row+1)*$height) . '%');
}
}
}
/**
* Get the area on the specified position in the matrix
*
* @param int $row The row
* @param int $col The column
* @return Image_Graph_Layout The element of position ($row, $col) in the
* matrix
*/
function &getEntry($row, $col)
{
if ((isset($this->_matrix[$row])) && (isset($this->_matrix[$row][$col]))) {
return $this->_matrix[$row][$col];
} else {
$result = null;
return $result;
}
}
/**
* Get the area on the specified position in the matrix
*
* @param int $row The row
* @param int $col The column
* @param Image_Graph_Layout $element The element to set in the position
* ($row, $col) in the matrix
*/
function setEntry($row, $col, &$element)
{
$this->_matrix[$row][$col] =& $element;
$this->_pushEdges($row, $col);
}
/**
* Update coordinates
*
* @access private
*/
function _updateCoords()
{
for ($i = 0; $i < $this->_rows; $i++) {
for ($j = 0; $j < $this->_cols; $j++) {
$element =& $this->getEntry($i, $j);
$this->add($element);
}
}
parent::_updateCoords();
}
/**
* Output the layout to the canvas
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
$result = true;
for ($i = 0; $i < $this->_rows; $i++) {
for ($j = 0; $j < $this->_cols; $j++) {
$element =& $this->getEntry($i, $j);
if ($element) {
if (!$element->_done()) {
$result = false;
}
}
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,108 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Vertical.php,v 1.6 2005/02/21 20:49:55 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Layout/Horizontal.php
*/
require_once 'Image/Graph/Layout/Horizontal.php';
/**
* Layout for displaying two elements on top of each other.
*
* This splits the area contained by this element in two on top of each other
* by a specified percentage (relative to the top). A layout can be nested.
* Fx. a {@link Image_Graph_Layout_Horizontal} can layout two VerticalLayout's to
* make a 2 by 2 matrix of 'element-areas'.
*
* @category Images
* @package Image_Graph
* @subpackage Layout
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Layout_Vertical extends Image_Graph_Layout_Horizontal
{
/**
* Gets the absolute size of one of the parts.
*
* @param string $part The name of the part - auto_part(1|2)
* @return int The number of pixels the edge should be pushed
* @since 0.3.0dev2
* @access private
*/
function _getAbsolute(&$part)
{
$part1Size = $this->_part1->_getAutoSize();
$part2Size = $this->_part2->_getAutoSize();
$this->_percentage = false;
if (($part1Size !== false) and ($part2Size !== false)) {
$height = $this->_fillHeight() * $part1Size / ($part1Size + $part2Size);
} elseif ($part1Size !== false) {
$height = $part1Size;
} elseif ($part2Size !== false) {
$height = -$part2Size;
} else {
$height = $this->_fillHeight() / 2;
}
if ($part == 'auto_part2') {
// $height = $this->_fillHeight() - $height;
}
return $height;
}
/**
* Splits the layout between the parts, by the specified percentage
*
* @access private
*/
function _split()
{
if (($this->_part1) && ($this->_part2)) {
if ($this->_percentage !== false) {
$split1 = 100 - $this->_percentage;
$split2 = $this->_percentage;
$this->_part1->_push('bottom', "$split1%");
$this->_part2->_push('top', "$split2%");
} else {
$this->_part1->_push('bottom', 'auto_part1');
$this->_part2->_push('top', 'auto_part2');
}
}
}
}
?>

385
Image/Graph/Legend.php Normal file
View File

@ -0,0 +1,385 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - Main class for the graph creation.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Legend
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Legend.php,v 1.16 2006/02/28 22:48:07 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Layout.php
*/
require_once 'Image/Graph/Layout.php';
/**
* Displays a legend for a plotarea.
*
* A legend can be displayed in two ways:
*
* 1 As an overlayed box within the plotarea
*
* 2 Layout'ed on the canvas smewhere next to the plotarea.
*
* @category Images
* @package Image_Graph
* @subpackage Legend
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Legend extends Image_Graph_Layout
{
/**
* Alignment of the text
* @var int
* @access private
*/
var $_alignment = false;
/**
* The plotarea(s) to show the legend for
* @var array
* @access private
*/
var $_plotareas = array();
/**
* Should markers be shown or not on this legend
* @var bool
* @access private
*/
var $_showMarker = false;
/**
* Image_Graph_Legend [Constructor]
*/
function Image_Graph_Legend()
{
parent::Image_Graph_Layout();
$this->_padding = array('left' => 5, 'top' => 5, 'right' => 5, 'bottom' => 5);
}
/**
* The number of actual plots in the plot area
*
* @return int The number of plotes
* @access private
*/
function _plotCount()
{
$count = 0;
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
if (is_a($plotarea, 'Image_Graph_Plotarea')) {
$keys2 = array_keys($plotarea->_elements);
foreach ($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$count ++;
}
}
unset($keys2);
}
}
unset($keys);
return $count;
}
/**
* Get a default parameter array for legendSamples
* @param bool $simulate Whether the array should be used for simulation or
* not
* @return array Default parameter array
* @access private
*/
function _parameterArray($simulate = false)
{
$param['left'] = $this->_left + $this->_padding['left'];
$param['top'] = $this->_top + $this->_padding['top'];
$param['right'] = $this->_right - $this->_padding['right'];
$param['bottom'] = $this->_bottom - $this->_padding['bottom'];
$param['align'] = $this->_alignment;
$param['x'] = $this->_left + $this->_padding['left'];
$param['y'] = $this->_top + $this->_padding['top'];
$param['width'] = 16;
$param['height'] = 16;
$param['show_marker'] = $this->_showMarker;
$param['maxwidth'] = 0;
$param['font'] = $this->_getFont();
if ($simulate) {
$param['simulate'] = true;
}
return $param;
}
/**
* The height of the element on the canvas
*
* @return int Number of pixels representing the height of the element
* @access private
*/
function _height()
{
$parent = (is_object($this->_parent) ? get_class($this->_parent) : $this->_parent);
if (strtolower($parent) == 'image_graph_plotarea') {
$param = $this->_parameterArray(true);
$param['align'] = IMAGE_GRAPH_ALIGN_VERTICAL;
$param0 = $param;
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
$keys2 = array_keys($plotarea->_elements);
foreach($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$element->_legendSample($param);
}
}
unset($keys2);
}
unset($keys);
return abs($param['y'] - $param0['y']) + $this->_padding['top'] + $this->_padding['bottom'];
} else {
return parent::height();
}
}
/**
* The width of the element on the canvas
*
* @return int Number of pixels representing the width of the element
* @access private
*/
function _width()
{
$parent = (is_object($this->_parent) ? get_class($this->_parent) : $this->_parent);
if (strtolower($parent) == 'image_graph_plotarea') {
$param = $this->_parameterArray(true);
$param['align'] = IMAGE_GRAPH_ALIGN_VERTICAL;
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
$keys2 = array_keys($plotarea->_elements);
foreach($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$element->_legendSample($param);
}
}
unset($keys2);
}
unset($keys);
return $param['maxwidth'];
} else {
return parent::width();
}
}
/**
* Set the alignment of the legend
*
* @param int $alignment The alignment
*/
function setAlignment($alignment)
{
$this->_alignment = $alignment;
}
/**
* Update coordinates
*
* @access private
*/
function _updateCoords()
{
parent::_updateCoords();
$parent = (is_object($this->_parent) ? get_class($this->_parent) : $this->_parent);
if (strtolower($parent) == 'image_graph_plotarea') {
$w = $this->_width();
$h = $this->_height();
if ($this->_alignment === false) {
$this->_alignment = IMAGE_GRAPH_ALIGN_TOP + IMAGE_GRAPH_ALIGN_RIGHT;
}
if (($this->_alignment & IMAGE_GRAPH_ALIGN_BOTTOM) != 0) {
$y = $this->_parent->_fillBottom() - $h - $this->_padding['bottom'];
} else {
$y = $this->_parent->_fillTop() + $this->_padding['top'];
}
if (($this->_alignment & IMAGE_GRAPH_ALIGN_LEFT) != 0) {
$x = $this->_parent->_fillLeft() + $this->_padding['left'];
} else {
$x = $this->_parent->_fillRight() - $w - $this->_padding['right'];
}
$this->_setCoords($x, $y, $x + $w, $y + $h);
}
}
/**
* Sets Plotarea
*
* @param Image_Graph_Plotarea $plotarea The plotarea
*/
function setPlotarea(& $plotarea)
{
if (is_a($plotarea, 'Image_Graph_Plotarea')) {
$this->_plotareas[] =& $plotarea;
}
}
/**
* Sets the parent. The parent chain should ultimately be a GraPHP object
*
* @see Image_Graph
* @param Image_Graph_Common $parent The parent
* @access private
*/
function _setParent(& $parent)
{
parent::_setParent($parent);
if (count($this->_plotareas) == 0) {
$this->setPlotarea($parent);
}
}
/**
* Set if this legends should show markers
*
* @param bool $showMarker True if markers are to be shown, false is not
*/
function setShowMarker($showMarker)
{
$this->_showMarker = $showMarker;
}
/**
* Output the plot
*
* @return bool Was the output 'good' (true) or 'bad' (false).
* @access private
*/
function _done()
{
if (Image_Graph_Element::_done() === false) {
return false;
}
$this->_canvas->startGroup(get_class($this));
$param = $this->_parameterArray();
$parent = (is_object($this->_parent) ?
get_class($this->_parent) :
$this->_parent
);
if (strtolower($parent) == 'image_graph_plotarea') {
$this->_getFillStyle();
$this->_getLineStyle();
$this->_canvas->rectangle(
array(
'x0' => $this->_left,
'y0' => $this->_top,
'x1' => $this->_right,
'y1' => $this->_bottom
)
);
$param = $this->_parameterArray();
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
$keys2 = array_keys($plotarea->_elements);
foreach($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$element->_legendSample($param);
}
}
unset($keys2);
}
unset($keys);
} else {
$param0 = $param;
$param0['simulate'] = true;
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
$keys2 = array_keys($plotarea->_elements);
foreach($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$element->_legendSample($param0);
}
}
unset($keys2);
}
unset($keys);
if (($this->_alignment & IMAGE_GRAPH_ALIGN_VERTICAL) != 0) {
if ($param0['x'] == $param['x']) {
$param['y'] = $param['y'] + ($this->_height() - ($param0['y'] - $param['y']))/2;
}
} else {
if ($param0['y'] == $param['y']) {
$param['x'] = $param['x'] + ($this->_width() - ($param0['x'] - $param['x']))/2;
}
}
$keys = array_keys($this->_plotareas);
foreach($keys as $key) {
$plotarea =& $this->_plotareas[$key];
$keys2 = array_keys($plotarea->_elements);
foreach($keys2 as $key) {
$element =& $plotarea->_elements[$key];
if (is_a($element, 'Image_Graph_Plot')) {
$element->_legendSample($param);
}
}
unset($keys2);
}
unset($keys);
}
$this->_canvas->endGroup();
return true;
}
}
?>

129
Image/Graph/Line/Array.php Normal file
View File

@ -0,0 +1,129 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Line
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Array.php,v 1.7 2005/02/21 20:49:42 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Common.php
*/
require_once 'Image/Graph/Common.php';
/**
* A sequential array of linestyles.
*
* This is used for multiple objects within the same element with different line
* styles. This is done by adding multiple line styles to a LineArrray
* structure. The linearray will then when requested return the 'next' linestyle
* in sequential order. It is possible to specify ID tags to each linestyle,
* which is used to make sure some data uses a specific linestyle (i.e. in a
* multiple-/stackedbarchart you name the {@link Image_Graph_Dataset}s and uses
* this name as ID tag when adding the dataset's associated linestyle to the
* linearray.
*
* @category Images
* @package Image_Graph
* @subpackage Line
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Line_Array extends Image_Graph_Common
{
/**
* The fill array
* @var array
* @access private
*/
var $_lineStyles = array ();
/**
* Add a line style to the array
*
* @param Image_Graph_Line $style The style to add
*/
function add(& $style, $id = false)
{
if (is_a($style, 'Image_Graph_Element')) {
parent::add($style);
}
if ($id === false) {
$this->_lineStyles[] =& $style;
} else {
$this->_lineStyles[$id] =& $style;
}
reset($this->_lineStyles);
}
/**
* Add a color to the array
*
* @param int $color The color
* @param string $id The id or name of the color
*/
function addColor($color, $id = false)
{
if ($id !== false) {
$this->_lineStyles[$id] = $color;
} else {
$this->_lineStyles[] = $color;
}
reset($this->_lineStyles);
}
/**
* Return the linestyle
*
* @return int A GD Linestyle
* @access private
*/
function _getLineStyle($ID = false)
{
if (($ID === false) || (!isset($this->_lineStyles[$ID]))) {
$ID = key($this->_lineStyles);
if (!next($this->_lineStyles)) {
reset($this->_lineStyles);
}
}
$lineStyle =& $this->_lineStyles[$ID];
if (is_object($lineStyle)) {
return $lineStyle->_getLineStyle($ID);
} elseif ($lineStyle !== null) {
return $lineStyle;
} else {
return parent::_getLineStyle($ID);
}
}
}
?>

View File

@ -0,0 +1,76 @@
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Image_Graph - PEAR PHP OO Graph Rendering Utility.
*
* PHP versions 4 and 5
*
* LICENSE: This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version. This library 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 Lesser
* General Public License for more details. You should have received a copy of
* the GNU Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
* @category Images
* @package Image_Graph
* @subpackage Line
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version CVS: $Id: Dashed.php,v 1.6 2005/08/24 20:35:52 nosey Exp $
* @link http://pear.php.net/package/Image_Graph
*/
/**
* Include file Image/Graph/Line/Formatted.php
*/
require_once 'Image/Graph/Line/Formatted.php';
/**
* Dashed line style.
*
* This style displays as a short line with a shorter space afterwards, i.e
* 4px color1, 2px color2, 4px color1, etc.
*
* @category Images
* @package Image_Graph
* @subpackage Line
* @author Jesper Veggerby <pear.nosey@veggerby.dk>
* @copyright Copyright (C) 2003, 2004 Jesper Veggerby Hansen
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version Release: 0.7.2
* @link http://pear.php.net/package/Image_Graph
*/
class Image_Graph_Line_Dashed extends Image_Graph_Line_Formatted
{
/**
* Image_Graph_DashedLine [Constructor]
*
* @param mixed $color1 The color for the 'dashes'
* @param mixed $color2 The color for the 'spaces'
*/
function Image_Graph_Line_Dashed($color1, $color2)
{
parent::Image_Graph_Line_Formatted(
array(
$color1,
$color1,
$color1,
$color1,
$color2,
$color2
)
);
}
}
?>

Some files were not shown because too many files have changed in this diff Show More