<?php
 
/*
 
    Created by David Frendin, 2011
 
    Published at http://www.phpclasses.org/
 
    
 
    This class is considered public domain by author as is.
 
    
 
    :: Version history
 
    1.0.1 Fixed issues with possible file locks and real numbers, credits to Jaroslav
 
    1.0.0 Initial release
 
    
 
    :: Usage
 
    See samples included with this package, or download them from phpclasses.
 
    
 
    :: Contact the author
 
    [email protected]
 
*/
 
class TinyPie
 
{
 
    /*
 
        Private properties
 
    */
 
    private $values;
 
    private $width;
 
    private $height;
 
    private $gdimage;
 
    
 
    /*
 
        Constructor
 
    */
 
    public function __construct($size)
 
    {
 
        $this->width = $size;
 
        $this->height = $size;
 
        $this->gdimage = imagecreatetruecolor($this->width, $this->height);
 
        imagealphablending($this->gdimage, true);
 
        $this->values = array();
 
    }
 
    
 
    /*
 
        Destructor
 
    */
 
    public function __destruct()
 
    {
 
        imagedestroy($this->gdimage);
 
    }
 
    
 
    /*
 
        Static method of GetAsImg 
 
    */
 
    public static function QuickImg($size, $values)
 
    {
 
        $g = new TinyPie($size);
 
        foreach ($values as $value)
 
        {
 
            $g->AddValue($value[0], $value[1]);
 
        }
 
        return $g->GetAsImg();
 
    }
 
 
    /*
 
        Static method of GetAsDiv
 
    */
 
    public static function QuickDiv($size, $values)
 
    {
 
        $g = new TinyPie($size);
 
        foreach ($values as $value)
 
        {
 
            $g->AddValue($value[0], $value[1]);
 
        }
 
        return $g->GetAsDiv();
 
    }
 
    
 
    /*
 
        Add values to graph, includes numeric value and a color representation
 
    */
 
    public function AddValue($value, $color)
 
    {
 
        $c = imagecolorallocate($this->gdimage, hexdec(substr($color, 0, 2)), hexdec(substr($color, 2, 2)), hexdec(substr($color, 4, 2)));
 
        $this->values[] = array((int)$value, $c);
 
    }
 
    
 
    /*
 
        Generate a div-element with background style set to base64 of image
 
    */
 
    public function GetAsDiv()
 
    {
 
        return '<div style="background: #fff url(data:image/png;base64,' . $this->GetBase64Image() . ') no-repeat; width: ' . $this->width . 'px; height: ' . $this->height . 'px;"></div>';
 
    }
 
 
    /*
 
        Generate a img-element with url set to base64 of image
 
    */
 
    public function GetAsImg()
 
    {
 
        return '<img src="data:image/png;base64,' . $this->GetBase64Image() . '" width="' . $this->width . '" height="' . $this->height . '" alt="" />';
 
    }
 
    
 
    /*
 
        Save image to disk instead of generating html elements
 
    */
 
    public function SaveToFile($filename)
 
    {
 
        $this->InternalRendering();
 
        imagepng($this->gdimage, $filename);
 
    }
 
    
 
    /*
 
        Determine the sum of all values
 
    */
 
    private function SumValues()
 
    {
 
        $sum = 0;
 
        foreach ($this->values as $value)
 
        {
 
            $sum = (int)$sum + (int)$value[0];
 
        }
 
        return (int)$sum;
 
    }
 
    
 
    /*
 
        Save temporary image to disk and return its contents as a base64 string
 
    */
 
    private function GetBase64Image()
 
    {
 
        $tempfile = str_replace (' ', '_', microtime());
 
        $this->SaveToFile($tempfile);
 
        $imgbinary = fread(fopen($tempfile, "r"), filesize($tempfile));
 
        @unlink ($tempfile);
 
        return base64_encode($imgbinary);
 
    }
 
    /*
 
        The actual code that renders the graph
 
    */
 
    private function InternalRendering()
 
    {
 
        $black = imagecolorallocate($this->gdimage, 0, 0, 0);
 
        imagecolortransparent($this->gdimage, $black);
 
 
        $sum = $this->SumValues();
 
        $totalcovered = 0;
 
        foreach ($this->values as $value)
 
        {
 
            $step = round((((int)$value[0] / $sum) * 360));
 
            $color = (int)$value[1];
 
            imagefilledarc($this->gdimage, $this->width * 0.5, $this->height * 0.5, $this->width-1, $this->height-1, $totalcovered, $step + (int)$totalcovered, $color, IMG_ARC_PIE);
 
            $totalcovered = $totalcovered + $step;
 
        }
 
        imageantialias($this->gdimage, true);
 
    }
 
}
 
 |