TuringImage.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2004-2008 by Dmitry E. Demidov                          *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU Lesser General Public License as        *
00007  *   published by the Free Software Foundation; either version 3 of the    *
00008  *   License, or (at your option) any later version.                       *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00015     final class TuringImage
00016     {
00017         private $textColors         = null;
00018         private $backgroundColors   = null;
00019         
00020         private $font       = null;
00021         
00022         private $imageId    = null;
00023         
00024         private $width      = null;
00025         private $height     = null;
00026         
00027         private $generator  = null;
00028         
00029         private $drawer             = null;
00030         private $backgroundDrawer   = null;
00031         
00032         private $code       = null;
00033         
00034         public function __construct($width, $height)
00035         {
00036             $this->width = $width;
00037             $this->height = $height;
00038             
00039             $this->generator = new CodeGenerator();
00040             $this->textColors = new ColorArray();
00041             $this->backgroundColors = new ColorArray();
00042         }
00043         
00047         public function setGeneratedCode($code)
00048         {
00049             $this->code = $code;
00050             
00051             return $this;
00052         }
00053         
00054         public function getGeneratedCode()
00055         {
00056             if (!$this->code)
00057                 $this->code = $this->generator->generate();
00058                 
00059             return $this->code;
00060         }
00061         
00062         public function getTextColors()
00063         {
00064             return $this->textColors;
00065         }
00066         
00067         public function getBackgroundColors()
00068         {
00069             return $this->backgroundColors;
00070         }
00071         
00072         public function getWidth()
00073         {
00074             return $this->width;
00075         }
00076         
00077         public function getHeight()
00078         {
00079             return $this->height;
00080         }
00081         
00082         public function getImageId()
00083         {
00084             return $this->imageId;
00085         }
00086         
00087         public function getFont()
00088         {
00089             return $this->font;
00090         }
00091         
00092         public function setFont($font)
00093         {
00094             $this->font = $font;
00095             
00096             return $this;
00097         }
00098         
00102         public function setTextDrawer(TextDrawer $drawer)
00103         {
00104             $drawer->setTuringImage($this);
00105             $this->drawer = $drawer;
00106             
00107             return $this;
00108         }
00109         
00113         public function setBackgroundDrawer(BackgroundDrawer $drawer)
00114         {
00115             $drawer->setTuringImage($this);
00116             $this->backgroundDrawer = $drawer;
00117             
00118             return $this;
00119         }
00120         
00124         public function getCodeGenerator()
00125         {
00126             return $this->generator;
00127         }
00128         
00129         public function getColorIdentifier(Color $color)
00130         {
00131             $colorId =
00132                 imagecolorexact(
00133                     $this->imageId,
00134                     $color->getRed(),
00135                     $color->getGreen(),
00136                     $color->getBlue()
00137                 );
00138             
00139             if ($colorId === -1)
00140                 $colorId =
00141                     imagecolorallocate(
00142                         $this->imageId,
00143                         $color->getRed(),
00144                         $color->getGreen(),
00145                         $color->getBlue()
00146                     );
00147             
00148             return $colorId;
00149         }
00150         
00151         public function getOneCharacterColor()
00152         {
00153             $textColor=$this->textColors->getRandomTextColor();
00154             
00155             return $this->getColorIdentifier($textColor);
00156         }
00157         
00161         public function toImage(ImageType $imageType)
00162         {
00163             if ($this->drawer === null)
00164                 throw new WrongStateException('drawer must present');
00165             
00166             $this->init();
00167             
00168             $this->drawBackGround();
00169             
00170             $this->drawer->draw($this->getGeneratedCode());
00171             
00172             $this->outputImage($imageType);
00173             
00174             imagedestroy($this->getImageId());
00175             
00176             return $this;
00177         }
00178         
00182         private function init()
00183         {
00184             $imageId = imagecreate($this->getWidth(), $this->getHeight());
00185             $this->imageId = $imageId;
00186             
00187             $this->getColorIdentifier(new Color('FFFFFF')); // white background
00188             
00189             return $this;
00190         }
00191         
00195         private function drawBackGround()
00196         {
00197             if (!$this->backgroundColors->isEmpty()) {
00198                 $backgroundColor = $this->backgroundColors->getRandomTextColor();
00199                 
00200                 if ($backgroundColor !== null) {
00201                     $backgroundColorId = $this->getColorIdentifier($backgroundColor);
00202                     
00203                     imagefilledrectangle(
00204                         $this->imageId,
00205                         0,
00206                         0,
00207                         $this->getWidth(),
00208                         $this->getHeight(),
00209                         $backgroundColorId
00210                     );
00211                 }
00212             }
00213             
00214             if ($this->backgroundDrawer !== null)
00215                 $this->backgroundDrawer->draw();
00216             
00217             return $this;
00218         }
00219         
00223         private function outputImage(ImageType $imageType)
00224         {
00225             $gdImageTypes = imagetypes();
00226             
00227             switch ($imageType->getId()) {
00228                 
00229                 case ImageType::WBMP:
00230                     
00231                     if ($gdImageTypes & IMG_WBMP) {
00232                         header("Content-type: image/vnd.wap.wbmp");
00233                         imagewbmp($this->imageId);
00234                         break;
00235                     }
00236                 
00237                 case ImageType::PNG:
00238                     
00239                     if ($gdImageTypes & IMG_PNG) {
00240                         header("Content-type: image/png");
00241                         imagepng($this->imageId);
00242                         break;
00243                     }
00244                 
00245                 case ImageType::JPEG:
00246                 
00247                     if ($gdImageTypes & IMG_JPG) {
00248                         header("Content-type: image/jpeg");
00249                         imagejpeg($this->imageId);
00250                         break;
00251                     }
00252                 
00253                 case ImageType::GIF:
00254                     
00255                     if ($gdImageTypes & IMG_GIF ) {
00256                         header("Content-type: image/gif");
00257                         imagegif($this->imageId);
00258                         break;
00259                     }
00260                 
00261                 default:
00262                     
00263                     throw new UnimplementedFeatureException(
00264                         'requesting non-supported format'
00265                     );
00266             }
00267             
00268             return $this;
00269         }
00270     }
00271 ?>