New file |
0,0 → 1,224 |
<?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__)."/Image.class.php"; |
|
/** |
* AntiSpam |
* String printed on the images are case insensitive. |
* |
* @package Artichow |
*/ |
class awAntiSpam extends awImage { |
|
/** |
* Anti-spam string |
* |
* @var string |
*/ |
protected $string; |
|
/** |
* Noise intensity |
* |
* @var int |
*/ |
protected $noise = 0; |
|
/** |
* Construct a new awAntiSpam image |
* |
* @param string $string A string to display |
*/ |
public function __construct($string = '') { |
|
parent::__construct(); |
|
$this->string = (string)$string; |
|
} |
|
/** |
* Create a random string |
* |
* @param int $length String length |
* @return string String created |
*/ |
public function setRand($length) { |
|
$length = (int)$length; |
|
$this->string = ''; |
|
$letters = 'aAbBCDeEFgGhHJKLmMnNpPqQRsStTuVwWXYZz2345679'; |
$number = strlen($letters); |
|
for($i = 0; $i < $length; $i++) { |
$this->string .= $letters{mt_rand(0, $number - 1)}; |
} |
|
return $this->string; |
|
} |
|
/** |
* Set noise on image |
* |
* @param int $nois Noise intensity (from 0 to 10) |
*/ |
public function setNoise($noise) { |
if($noise < 0) { |
$noise = 0; |
} |
if($noise > 10) { |
$noise = 10; |
} |
$this->noise = (int)$noise; |
} |
|
/** |
* Save string value in session |
* You can use check() to verify the value later |
* |
* @param string $qName A name that identify the anti-spam image |
*/ |
public function save($qName) { |
$this->session(); |
$session = 'artichow_'.(string)$qName; |
$_SESSION[$session] = $this->string; |
} |
|
/** |
* Verify user entry |
* |
* @param string $qName A name that identify the anti-spam image |
* @param string $value User-defined value |
* @param bool $case TRUE for case insensitive check, FALSE for case sensitive check ? (default to TRUE) |
* @return bool TRUE if the value is correct, FALSE otherwise |
*/ |
public function check($qName, $value, $case = TRUE) { |
|
$this->session(); |
|
$session = 'artichow_'.(string)$qName; |
|
return ( |
array_key_exists($session, $_SESSION) === TRUE and |
$case ? |
(strtolower($_SESSION[$session]) === strtolower((string)$value)) : |
($_SESSION[$session] === (string)$value) |
); |
|
} |
|
/** |
* Draw image |
*/ |
public function draw() { |
|
$fonts = array( |
'Tuffy', |
'TuffyBold', |
'TuffyItalic', |
'TuffyBoldItalic' |
); |
|
$sizes = array(12, 12.5, 13, 13.5, 14, 15, 16, 17, 18, 19); |
|
$widths = array(); |
$heights = array(); |
$texts = array(); |
|
// Set up a temporary driver to allow font size calculations... |
$this->setSize(10, 10); |
$driver = $this->getDriver(); |
|
for($i = 0; $i < strlen($this->string); $i++) { |
|
$fontKey = array_rand($fonts); |
$sizeKey = array_rand($sizes); |
|
$font = new awTTFFont( |
$fonts[$fontKey], $sizes[$sizeKey] |
); |
|
$text = new awText( |
$this->string{$i}, |
$font, |
NULL, |
mt_rand(-15, 15) |
); |
|
$widths[] = $driver->getTextWidth($text); |
$heights[] = $driver->getTextHeight($text); |
$texts[] = $text; |
|
} |
|
// ... and get rid of it. |
$this->driver = NULL; |
|
$width = array_sum($widths); |
$height = array_max($heights); |
|
$totalWidth = $width + 10 + count($texts) * 10; |
$totalHeight = $height + 20; |
|
$this->setSize($totalWidth, $totalHeight); |
|
$this->create(); |
|
for($i = 0; $i < strlen($this->string); $i++) { |
|
$this->driver->string( |
$texts[$i], |
new awPoint( |
5 + array_sum(array_slice($widths, 0, $i)) + $widths[$i] / 2 + $i * 10, |
10 + ($height - $heights[$i]) / 2 |
) |
); |
|
} |
|
$this->drawNoise($totalWidth, $totalHeight); |
|
$this->send(); |
|
} |
|
protected function drawNoise($width, $height) { |
|
$points = $this->noise * 30; |
$color = new awColor(0, 0, 0); |
|
for($i = 0; $i < $points; $i++) { |
$this->driver->point( |
$color, |
new awPoint( |
mt_rand(0, $width), |
mt_rand(0, $height) |
) |
); |
} |
|
} |
|
protected function session() { |
|
// Start session if needed |
if(!session_id()) { |
session_start(); |
} |
|
} |
|
} |
|
registerClass('AntiSpam'); |
?> |