Source for file Pie.class.php
Documentation is available at Pie.class.php
* This work is hereby released into the Public Domain.
* To view a copy of the public domain dedication,
* visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
* Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
require_once dirname(__FILE__ ). "/Component.class.php";
* @package linea21.externals
* A colored theme for pies
* Intensity of the 3D effect
* @param array $values Pie values
public function __construct($values, $colors = awPie::COLORED) {
$this->label->setCallbackFunction('callbackPerCent');
* @param array $legend An array of values for each part of the pie
* Set a border all around the pie
* @param awColor $color A color for the border
* Set a border all around the pie
* @param awColor $color A color for the border
awImage::drawError('Class Pie: Method setBorder() has been deprecated since Artichow 1.0.9. Please use setBorderColor() instead.');
* Change 3D effect intensity
* @param int $size Effect size
public function set3D($size) {
$this->size = (int) $size;
* @param int $angle New angle in degrees
$this->angle = (int) $angle;
* @param int $precision New precision
* @param int $position New position in pixels
* @param int $number New number
* @param int $minimum New minimum
public function explode($explode) {
public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) {
$position = $this->angle;
$side = new awSide(0, 0, 0, 0);
foreach($this->values as $key => $value) {
$angle = ($value / $sum * 360);
if($key === $count - 1) {
$middle = 360 - ($position + $angle / 2);
$posX = $this->explode[$key] * cos($middle * M_PI / 180);
$posY = $this->explode[$key] * sin($middle * M_PI / 180) * - 1;
max($side->left, $posX * - 2),
max($side->right, $posX * 2),
max($side->top, $posY * - 2),
max($side->bottom, $posY * 2)
$position, ($position + $angle), $explode
// Add part to the legend
$this->legend->add($parts[$key], $legend, awLegend::BACKGROUND);
// Adds support for antialiased pies on non-white background
$background = $this->getBackground();
if($background instanceof awColor) {
$image->setBackgroundColor($background);
// elseif($background instanceof awGradient) {
// $image->setBackgroundColor(new White(100));
$width + $side->left + $side->right,
$height + $side->top + $side->bottom + $this->size + 1 /* bugs.php.net ! */
$driver = $image->getDriver(
$height / $image->height,
($width / 2 + $side->left) / $image->width,
($height / 2 + $side->top) / $image->height
for($i = $this->size; $i > 0; $i-- ) {
foreach($values as $key => $value) {
list ($from, $to, $explode) = $value;
$driver->filledArc($color, $explode->move($x, $y + $i), $width, $height, $from, $to);
$point = $explode->move($x, $y);
$driver->arc($this->border, $point->move(0, $this->size), $width, $height, $from, $to);
foreach($values as $key => $value) {
list ($from, $to, $explode) = $value;
$driver->filledArc($color, $explode->move($x, $y), $width, $height, $from, $to);
$point = $explode->move($x, $y);
$driver->arc($this->border, $point, $width, $height, $from, $to);
foreach($values as $key => $value) {
$mainDriver->copyResizeImage(
new awPoint($x1 - $side->left / 2, $y1 - $side->top / 2),
new awPoint($x1 - $side->left / 2 + $image->width / 2, $y1 - $side->top / 2 + $image->height/ 2),
new awPoint($image->width, $image->height),
foreach($this->values as $key => $value) {
if($this->label->count() === 0) { // Check that there is no user defined values
foreach($pc as $key => $value) {
// Limit number of labels to display
if($position === $this->number) {
list ($from, $to, $explode) = $values[$key];
$angle = $from + ($to - $from) / 2;
$angleRad = (360 - $angle) * M_PI / 180;
$x + $explode->x + cos($angleRad) * ($width / 2 + $this->position),
$y + $explode->y - sin($angleRad) * ($height / 2 + $this->position)
// We don't display labels on the 3D effect
if($angle > 0 and $angle < 180) {
$point = $point->move(0, - 1 * sin($angleRad) * $this->size);
if($angle >= 45 and $angle < 135) {
} else if($angle >= 135 and $angle < 225) {
} else if($angle >= 225 and $angle < 315) {
* Return margins around the component
* @return array Left, right, top and bottom margins
$leftAxis = $this->padding->left;
$rightAxis = $this->padding->right;
$topAxis = $this->padding->top;
$bottomAxis = $this->padding->bottom;
return array($leftAxis, $rightAxis, $topAxis, $bottomAxis);
* Change values of Y axis
* This method ignores not numeric values
$this->checkArray($values);
* Return values of Y axis
private function checkArray(&$array) {
awImage::drawError("Class Pie: You tried to set values that are not an array.");
foreach($array as $key => $value) {
* @package linea21.externals
* @param awColor $color Pie part color
* Get the background color or gradient of an element of the component
* @return Color, Gradient
|