Initial Kohana install
[speedfreak] / Server / system / libraries / drivers / Captcha / Alpha.php
1 <?php defined('SYSPATH') OR die('No direct access allowed.');
2 /**
3  * Captcha driver for "alpha" style.
4  *
5  * $Id: Alpha.php 4367 2009-05-27 21:23:57Z samsoir $
6  *
7  * @package    Captcha
8  * @author     Kohana Team
9  * @copyright  (c) 2007-2008 Kohana Team
10  * @license    http://kohanaphp.com/license.html
11  */
12 class Captcha_Alpha_Driver extends Captcha_Driver {
13
14         /**
15          * Generates a new Captcha challenge.
16          *
17          * @return  string  the challenge answer
18          */
19         public function generate_challenge()
20         {
21                 // Complexity setting is used as character count
22                 return text::random('distinct', max(1, Captcha::$config['complexity']));
23         }
24
25         /**
26          * Outputs the Captcha image.
27          *
28          * @param   boolean  html output
29          * @return  mixed
30          */
31         public function render($html)
32         {
33                 // Creates $this->image
34                 $this->image_create(Captcha::$config['background']);
35
36                 // Add a random gradient
37                 if (empty(Captcha::$config['background']))
38                 {
39                         $color1 = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
40                         $color2 = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
41                         $this->image_gradient($color1, $color2);
42                 }
43
44                 // Add a few random circles
45                 for ($i = 0, $count = mt_rand(10, Captcha::$config['complexity'] * 3); $i < $count; $i++)
46                 {
47                         $color = imagecolorallocatealpha($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255), mt_rand(80, 120));
48                         $size = mt_rand(5, Captcha::$config['height'] / 3);
49                         imagefilledellipse($this->image, mt_rand(0, Captcha::$config['width']), mt_rand(0, Captcha::$config['height']), $size, $size, $color);
50                 }
51
52                 // Calculate character font-size and spacing
53                 $default_size = min(Captcha::$config['width'], Captcha::$config['height'] * 2) / strlen($this->response);
54                 $spacing = (int) (Captcha::$config['width'] * 0.9 / strlen($this->response));
55
56                 // Background alphabetic character attributes
57                 $color_limit = mt_rand(96, 160);
58                 $chars = 'ABEFGJKLPQRTVY';
59
60                 // Draw each Captcha character with varying attributes
61                 for ($i = 0, $strlen = strlen($this->response); $i < $strlen; $i++)
62                 {
63                         // Use different fonts if available
64                         $font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])];
65
66                         $angle = mt_rand(-40, 20);
67                         // Scale the character size on image height
68                         $size = $default_size / 10 * mt_rand(8, 12);
69                         $box = imageftbbox($size, $angle, $font, $this->response[$i]);
70
71                         // Calculate character starting coordinates
72                         $x = $spacing / 4 + $i * $spacing;
73                         $y = Captcha::$config['height'] / 2 + ($box[2] - $box[5]) / 4;
74
75                         // Draw captcha text character
76                         // Allocate random color, size and rotation attributes to text
77                         $color = imagecolorallocate($this->image, mt_rand(150, 255), mt_rand(200, 255), mt_rand(0, 255));
78
79                         // Write text character to image
80                         imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $this->response[$i]);
81
82                         // Draw "ghost" alphabetic character
83                         $text_color = imagecolorallocatealpha($this->image, mt_rand($color_limit + 8, 255), mt_rand($color_limit + 8, 255), mt_rand($color_limit + 8, 255), mt_rand(70, 120));
84                         $char = $chars[mt_rand(0, 14)];
85                         imagettftext($this->image, $size * 2, mt_rand(-45, 45), ($x - (mt_rand(5, 10))), ($y + (mt_rand(5, 10))), $text_color, $font, $char);
86                 }
87
88                 // Output
89                 return $this->image_render($html);
90         }
91
92 } // End Captcha Alpha Driver Class