<?
//Captcha-code (c) 2006 J. Domburg/Sprite_tm. This software is licensed under the
//GNU LGPL. See http://www.gnu.org/licenses/lgpl.html for more info.

//Config
//Size of the captcha
$SIZEX=180;
$SIZEY=75;
//Font number
$FONT=5;
//Magnification by n times. Must be an integer.
$MAGN=3;
//Limit to detect pixels that are the same before and after the text has been
//written to them
$SAMELIMIT=0;
//Transparancy of the text. 0=invisible, 1=opaque
$TRANS=.7;

//Text to be embedded
$txt=$_REQUEST["secret"];

//Pick a pic: first, read the dir, filter out all pngs and then pick one.
$d=opendir("pics");
$pngnames=array();
//Filter out all .png-pics to $pngnames
while ($aname=readdir($d)) {
    if (
preg_match('/\.png/i',$aname)) {
    
$pngnames[]=$aname;
    }
}
closedir($d);
if (
count($pngnames)==0) die("No pics found!");
//and pick a random one
$chosenpic=$pngnames[array_rand($pngnames)];

//Create captcha from a piece of $chosenpic
$src=imagecreatefrompng("pics/".$chosenpic);
$captcha=imagecreatetruecolor($SIZEX,$SIZEY);

//Pick a random part of the pic and copy to the captcha image
$xpos=rand(0,imagesx($src)-$SIZEX);
$ypos=rand(0,imagesy($src)-$SIZEY);
imagecopy($captcha,$src,0,0,$xpos,$ypos,$SIZEX,$SIZEY);

//Create an image containing the text.
$textfield=imagecreate(imagefontwidth($FONT)*strlen($txt),imagefontheight($FONT));
imagestring($textfield,$FONT,0,0,$txt,1);


//And here the fun starts: The rendering kernel :) Basically, we iterate
//along every pixel in the textfield 
$dr=rand(20,50);  //swirly-ness
$doff=rand(0,3.14); //offset of swirly-ness of start of image
//rgb values of color to fade the active pixels into
$pr=rand(0,255);
$pg=rand(0,255);
$pb=rand(0,255);
//X-offset
$ox=rand(0,$SIZEX-(imagesx($textfield)*$MAGN));
for (
$x=0$x<imagesx($textfield)*$MAGN$x++) {
    
//Calculate Y-offset by using a sine function to get the swirlyness idea :)
    
$offs=($SIZEY/2)-(imagesy($textfield)*$MAGN/2)+sin($x/$dr+$doff)*(($SIZEY/2)-(imagesy($textfield)*$MAGN/2));
    for (
$y=0$y<imagesy($textfield)*$MAGN$y++) {
    
//Do we have an active pixel?
    
if (imagecolorat($textfield,$x/$MAGN,$y/$MAGN)==1) {
        
//Yes. Get the color...
        
$p=imagecolorat($captcha,$x+$ox,$y+$offs);
        
//...split it into rgb vals....
        
$r=(($p)&0xff);
        
$g=(($p>>8)&0xff);
        
$b=(($p>>16)&0xff);
        
//and fade it to the chosen color.
        
$r=($r*(1-$TRANS)+$pr*$TRANS);
        if (
abs($pr-$r)<$SAMELIMIT$r+=$SAMELIMIT;
        
$g=($g*(1-$TRANS)+$pg*$TRANS);
        if (
abs($pg-$g)<$SAMELIMIT$g+=$SAMELIMIT;
        
$b=($b*(1-$TRANS)+$pb*$TRANS);
        if (
abs($pb-$b)<$SAMELIMIT$b+=$SAMELIMIT;
        if (
$g>255$r-=255;
        if (
$g>255$g-=255;
        if (
$b>255$b-=255;
        
//And put back to the captcha image.
        
imagesetpixel($captcha,$x+$ox,$y+$offs,$r+($g<<8)+($b<<16));
    }
    }
}
//And spit out the image.
header("Content-type: image/png");
imagepng($captcha);

?>