<?php

@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('display_errors', true);
@ini_set('html_errors', false);
@ini_set('error_reporting', E_ALL ^ E_NOTICE);

function clean_url ($url) {

  if ($url == '') return;

  $url = str_replace("http://", "", $url);
  if (strtolower(substr($url, 0, 4)) == 'www.')  $url = substr($url, 4);
  $url = explode('/', $url);
  $url = reset($url);
  $url = explode(':', $url);
  $url = reset($url);

  return $url;
}

if (clean_url($_SERVER['HTTP_REFERER']) != clean_url($_SERVER['HTTP_HOST'])) return;

session_start();
$font=imagecreatefrompng("fonts/font.png");
imagealphablending($font, true);
$fontfile_width=imagesx($font);
$fontfile_height=imagesy($font)-1;
$font_metrics=array();
$symbol=0;
$reading_symbol=false;

$alphabet = "0123456789";
$alphabet_length = strlen($alphabet);

for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
    $transparent = (imagecolorat($font, $i, 0) >> 24) == 127;

    if(!$reading_symbol && !$transparent){
        $font_metrics[$alphabet{$symbol}]=array('start'=>$i);
        $reading_symbol=true;
        continue;
    }

    if($reading_symbol && $transparent){
        $font_metrics[$alphabet{$symbol}]['end']=$i;
        $reading_symbol=false;
        $symbol++;
        continue;
    }
}

$image = imagecreatetruecolor(165,60);
$width = ImageSX($image);
$height = ImageSY($image);

imagealphablending($image, true);

$background_color = array(247,247,247);
$foreground_color = array(70,70,70);

$white=imagecolorallocate($image, 255, 255, 255);
$black=imagecolorallocate($image, 128, 128, 0);

imagefilledrectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $white);

$string = '';
$x = 5;
$y = 5;

for ($i=0;$i<6;$i++) {
    $char = rand(0,9);
    $string .= $char;
    if ($x > 15) $x = $x - 2;
    imagecopy($image,$font,$x,$y,$font_metrics[$char]['start'],1,$font_metrics[$char]['end']-$font_metrics[$char]['start'],42);
    $x += $font_metrics[$char]['end']-$font_metrics[$char]['start'];
}

for ($i=0;$i<10;$i++) {
    ImageSmoothAlphaLine($image,Rand(5,$width*0.5),Rand(5,$height-5),rand($width*0.5,$width-5),rand(5,$height-5),255,255,255);
}

for ($i=0;$i<2;$i++) {
    ImageSmoothAlphaLine($image,rand(5,10),Rand(5,$height-5),rand($width-10,$width-5),rand(5,$height-5),0,0,0);
}

$center=$x/2;

$img2=imagecreatetruecolor(ImageSX($image), ImageSY($image));


$rand1=mt_rand(750000,1200000)/10000000;
$rand2=mt_rand(750000,1200000)/10000000;
$rand3=mt_rand(750000,1200000)/10000000;
$rand4=mt_rand(750000,1200000)/10000000;

$rand5=mt_rand(0,3141592)/500000;
$rand6=mt_rand(0,3141592)/500000;
$rand7=mt_rand(0,3141592)/500000;
$rand8=mt_rand(0,3141592)/500000;

$rand9=mt_rand(330,420)/110;
$rand10=mt_rand(330,450)/110;


for($x=0;$x<ImageSX($image);$x++){
    for($y=0;$y<ImageSY($image);$y++){
        $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
        $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
        if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
            $color=255;
            $color_x=255;
            $color_y=255;
            $color_xy=255;
        }else{
            $color=imagecolorat($image, $sx, $sy) & 0xFF;
            $color_x=imagecolorat($image, $sx+1, $sy) & 0xFF;
            $color_y=imagecolorat($image, $sx, $sy+1) & 0xFF;
            $color_xy=imagecolorat($image, $sx+1, $sy+1) & 0xFF;
        }
        if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
            $newred=$foreground_color[0];
            $newgreen=$foreground_color[1];
            $newblue=$foreground_color[2];
        }else if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
            $newred=$background_color[0];
            $newgreen=$background_color[1];
            $newblue=$background_color[2];
        }else{
            $frsx=$sx-floor($sx);
            $frsy=$sy-floor($sy);
            $frsx1=1-$frsx;
            $frsy1=1-$frsy;
            $newcolor=(
                $color*$frsx1*$frsy1+
                $color_x*$frsx*$frsy1+
                $color_y*$frsx1*$frsy+
                $color_xy*$frsx*$frsy);

            if($newcolor>255) $newcolor=255;

            $newcolor=$newcolor/255;
            $newcolor0=1-$newcolor;
            $newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
            $newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
            $newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
        }
        imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
    }
}
$_SESSION['captcha'] = $string;


header("content-type: image/png");
imagepng($img2);

imagedestroy($img2);

function ImageSmoothAlphaLine ($image, $x1, $y1, $x2, $y2, $r, $g, $b, $alpha=0) {
  $icr = $r;
  $icg = $g;
  $icb = $b;
  $dcol = imagecolorallocatealpha($image, $icr, $icg, $icb, $alpha);

  if ($y1 == $y2 || $x1 == $x2)
    imageline($image, $x1, $y2, $x1, $y2, $dcol);
  else {
    $m = ($y2 - $y1) / ($x2 - $x1);
    $b = $y1 - $m * $x1;

    if (abs ($m) <2) {
      $x = min($x1, $x2);
      $endx = max($x1, $x2) + 1;

      while ($x < $endx) {
        $y = $m * $x + $b;
        $ya = ($y == floor($y) ? 1: $y - floor($y));
        $yb = ceil($y) - $y;

        $trgb = ImageColorAt($image, $x, floor($y));
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, $x, floor($y), imagecolorallocatealpha($image, ($tcr * $ya + $icr * $yb), ($tcg * $ya + $icg * $yb), ($tcb * $ya + $icb * $yb), $alpha));

        $trgb = ImageColorAt($image, $x, ceil($y));
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, $x, ceil($y), imagecolorallocatealpha($image, ($tcr * $yb + $icr * $ya), ($tcg * $yb + $icg * $ya), ($tcb * $yb + $icb * $ya), $alpha));

        $x++;
      }
    } else {
      $y = min($y1, $y2);
      $endy = max($y1, $y2) + 1;

      while ($y < $endy) {
        $x = ($y - $b) / $m;
        $xa = ($x == floor($x) ? 1: $x - floor($x));
        $xb = ceil($x) - $x;

        $trgb = ImageColorAt($image, floor($x), $y);
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, floor($x), $y, imagecolorallocatealpha($image, ($tcr * $xa + $icr * $xb), ($tcg * $xa + $icg * $xb), ($tcb * $xa + $icb * $xb), $alpha));

        $trgb = ImageColorAt($image, ceil($x), $y);
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel ($image, ceil($x), $y, imagecolorallocatealpha($image, ($tcr * $xb + $icr * $xa), ($tcg * $xb + $icg * $xa), ($tcb * $xb + $icb * $xa), $alpha));

        $y ++;
      }
    }
  }
}

?>