<?php
// affine_rotation_imagemagick.php
// Imagemagick Affine Transformation Rotation and Scale Tutorial - RJM Programming - 2015
// Thanks to http://www.imagemagick.org/Usage/distorts/affine/
// Pdf ideas thanks to http://php.net/manual/en/imagick.setup.php

$convertpath = "";   // fill in path to ImageMagick convert as necessary here

function topdf($image, $inpdff) {
  global $convertpath;
  $things = explode(".", $inpdff);
  $pdff = str_replace("." . $things[sizeof($things) - 1], ".pdf", $inpdff);
  $fhuh = file_get_contents($image);
  $icont = file_put_contents($inpdff, $fhuh);
  exec($convertpath . "convert " . $inpdff . " " . $pdff);
  if (1 == 2) { // ideas from http://php.net/manual/en/imagick.examples-1.php
   $img = new Imagick($image);
   $img->setImageFormat('pdf');
   $success = $img->writeImage($inpdff);
   return file_get_contents($inpdff);
  }
  return $pdff;
}

$scale="1.0";
$angle="0";
$selname = "";
if (isset($_POST['selname'])) $selname = urldecode($_POST['selname']);
if (isset($_GET['selname'])) $selname = urldecode($_GET['selname']);
if (isset($_POST['angle'])) $angle = urldecode($_POST['angle']);
if (isset($_GET['angle'])) $selname = urldecode($_GET['angle']);
if (isset($_POST['scale'])) $scale = urldecode($_POST['scale']);
if (isset($_GET['scale'])) $scale = urldecode($_GET['scale']);

//if (strpos($selname, "/") !== false) $selname = urlencode($selname);

$firstbits = "<!doctype html>\n<html>\n<head>\n<link href='//www.rjmprogramming.com.au/PHP/emboss_h1.css' rel='stylesheet' type='text/css'>\n<meta charset='UTF-8'>\n<title>Affine Transformation Rotation and Scale via ImageMagick Primer Tutorial</title></head>\n<body style='background-color: #b5a5f5;'>\n<div style='z-index:-1;opacity:0.1;position:absolute;top:0;left:0;width:100%;height:1200px;border:13px solid pink;background:url(\"transformation-clipart-rotate.png\") repeat;'></div>\n";
$erroneousbits = "<h1 align='center'>Sorry, but " . $selname . " was not found.</h1><br>";
$formbits = "<div align='center'>\n<form id='myform' action='./affine_rotation_imagemagick.php' method='POST'><h1 align='center'>Affine Transformation Rotation <select id='angle' name='angle'><option value='45'>By 45° ... vs ...</option><option value='0'>By 0°</option><option value='1'>By 1°</option><option value='2'>By 2°</option><option value='3'>By 3°</option><option value='4'>By 4°</option><option value='5'>By 5°</option><option value='6'>By 6°</option><option value='7'>By 7°</option><option value='8'>By 8°</option><option value='9'>By 9°</option><option value='10'>By 10°</option><option value='11'>By 11°</option><option value='12'>By 12°</option><option value='13'>By 13°</option><option value='14'>By 14°</option><option value='15'>By 15°</option><option value='16'>By 16°</option><option value='17'>By 17°</option><option value='18'>By 18°</option><option value='19'>By 19°</option><option value='20'>By 20°</option><option value='21'>By 21°</option><option value='22'>By 22°</option><option value='23'>By 23°</option><option value='24'>By 24°</option><option value='25'>By 25°</option><option value='26'>By 26°</option><option value='27'>By 27°</option><option value='28'>By 28°</option><option value='29'>By 29°</option><option value='30'>By 30°</option><option value='31'>By 31°</option><option value='32'>By 32°</option><option value='33'>By 33°</option><option value='34'>By 34°</option><option value='35'>By 35°</option><option value='36'>By 36°</option><option value='37'>By 37°</option><option value='38'>By 38°</option><option value='39'>By 39°</option><option value='40'>By 40°</option><option value='41'>By 41°</option><option value='42'>By 42°</option><option value='43'>By 43°</option><option value='44'>By 44°</option><option value='45'>By 45°</option><option value='46'>By 46°</option><option value='47'>By 47°</option><option value='48'>By 48°</option><option value='49'>By 49°</option><option value='50'>By 50°</option><option value='51'>By 51°</option><option value='52'>By 52°</option><option value='53'>By 53°</option><option value='54'>By 54°</option><option value='55'>By 55°</option><option value='56'>By 56°</option><option value='57'>By 57°</option><option value='58'>By 58°</option><option value='59'>By 59°</option><option value='60'>By 60°</option><option value='61'>By 61°</option><option value='62'>By 62°</option><option value='63'>By 63°</option><option value='64'>By 64°</option><option value='65'>By 65°</option><option value='66'>By 66°</option><option value='67'>By 67°</option><option value='68'>By 68°</option><option value='69'>By 69°</option><option value='70'>By 70°</option><option value='71'>By 71°</option><option value='72'>By 72°</option><option value='73'>By 73°</option><option value='74'>By 74°</option><option value='75'>By 75°</option><option value='76'>By 76°</option><option value='77'>By 77°</option><option value='78'>By 78°</option><option value='79'>By 79°</option><option value='80'>By 80°</option><option value='81'>By 81°</option><option value='82'>By 82°</option><option value='83'>By 83°</option><option value='84'>By 84°</option><option value='85'>By 85°</option><option value='86'>By 86°</option><option value='87'>By 87°</option><option value='88'>By 88°</option><option value='89'>By 89°</option><option value='90'>By 90°</option><option value='91'>By 91°</option><option value='92'>By 92°</option><option value='93'>By 93°</option><option value='94'>By 94°</option><option value='95'>By 95°</option><option value='96'>By 96°</option><option value='97'>By 97°</option><option value='98'>By 98°</option><option value='99'>By 99°</option><option value='100'>By 100°</option><option value='101'>By 101°</option><option value='102'>By 102°</option><option value='103'>By 103°</option><option value='104'>By 104°</option><option value='105'>By 105°</option><option value='106'>By 106°</option><option value='107'>By 107°</option><option value='108'>By 108°</option><option value='109'>By 109°</option><option value='110'>By 110°</option><option value='111'>By 111°</option><option value='112'>By 112°</option><option value='113'>By 113°</option><option value='114'>By 114°</option><option value='115'>By 115°</option><option value='116'>By 116°</option><option value='117'>By 117°</option><option value='118'>By 118°</option><option value='119'>By 119°</option><option value='120'>By 120°</option><option value='121'>By 121°</option><option value='122'>By 122°</option><option value='123'>By 123°</option><option value='124'>By 124°</option><option value='125'>By 125°</option><option value='126'>By 126°</option><option value='127'>By 127°</option><option value='128'>By 128°</option><option value='129'>By 129°</option><option value='130'>By 130°</option><option value='131'>By 131°</option><option value='132'>By 132°</option><option value='133'>By 133°</option><option value='134'>By 134°</option><option value='135'>By 135°</option><option value='136'>By 136°</option><option value='137'>By 137°</option><option value='138'>By 138°</option><option value='139'>By 139°</option><option value='140'>By 140°</option><option value='141'>By 141°</option><option value='142'>By 142°</option><option value='143'>By 143°</option><option value='144'>By 144°</option><option value='145'>By 145°</option><option value='146'>By 146°</option><option value='147'>By 147°</option><option value='148'>By 148°</option><option value='149'>By 149°</option><option value='150'>By 150°</option><option value='151'>By 151°</option><option value='152'>By 152°</option><option value='153'>By 153°</option><option value='154'>By 154°</option><option value='155'>By 155°</option><option value='156'>By 156°</option><option value='157'>By 157°</option><option value='158'>By 158°</option><option value='159'>By 159°</option><option value='160'>By 160°</option><option value='161'>By 161°</option><option value='162'>By 162°</option><option value='163'>By 163°</option><option value='164'>By 164°</option><option value='165'>By 165°</option><option value='166'>By 166°</option><option value='167'>By 167°</option><option value='168'>By 168°</option><option value='169'>By 169°</option><option value='170'>By 170°</option><option value='171'>By 171°</option><option value='172'>By 172°</option><option value='173'>By 173°</option><option value='174'>By 174°</option><option value='175'>By 175°</option><option value='176'>By 176°</option><option value='177'>By 177°</option><option value='178'>By 178°</option><option value='179'>By 179°</option><option value='180'>By 180°</option><option value='181'>By 181°</option><option value='182'>By 182°</option><option value='183'>By 183°</option><option value='184'>By 184°</option><option value='185'>By 185°</option><option value='186'>By 186°</option><option value='187'>By 187°</option><option value='188'>By 188°</option><option value='189'>By 189°</option><option value='190'>By 190°</option><option value='191'>By 191°</option><option value='192'>By 192°</option><option value='193'>By 193°</option><option value='194'>By 194°</option><option value='195'>By 195°</option><option value='196'>By 196°</option><option value='197'>By 197°</option><option value='198'>By 198°</option><option value='199'>By 199°</option><option value='200'>By 200°</option><option value='201'>By 201°</option><option value='202'>By 202°</option><option value='203'>By 203°</option><option value='204'>By 204°</option><option value='205'>By 205°</option><option value='206'>By 206°</option><option value='207'>By 207°</option><option value='208'>By 208°</option><option value='209'>By 209°</option><option value='210'>By 210°</option><option value='211'>By 211°</option><option value='212'>By 212°</option><option value='213'>By 213°</option><option value='214'>By 214°</option><option value='215'>By 215°</option><option value='216'>By 216°</option><option value='217'>By 217°</option><option value='218'>By 218°</option><option value='219'>By 219°</option><option value='220'>By 220°</option><option value='221'>By 221°</option><option value='222'>By 222°</option><option value='223'>By 223°</option><option value='224'>By 224°</option><option value='225'>By 225°</option><option value='226'>By 226°</option><option value='227'>By 227°</option><option value='228'>By 228°</option><option value='229'>By 229°</option><option value='230'>By 230°</option><option value='231'>By 231°</option><option value='232'>By 232°</option><option value='233'>By 233°</option><option value='234'>By 234°</option><option value='235'>By 235°</option><option value='236'>By 236°</option><option value='237'>By 237°</option><option value='238'>By 238°</option><option value='239'>By 239°</option><option value='240'>By 240°</option><option value='241'>By 241°</option><option value='242'>By 242°</option><option value='243'>By 243°</option><option value='244'>By 244°</option><option value='245'>By 245°</option><option value='246'>By 246°</option><option value='247'>By 247°</option><option value='248'>By 248°</option><option value='249'>By 249°</option><option value='250'>By 250°</option><option value='251'>By 251°</option><option value='252'>By 252°</option><option value='253'>By 253°</option><option value='254'>By 254°</option><option value='255'>By 255°</option><option value='256'>By 256°</option><option value='257'>By 257°</option><option value='258'>By 258°</option><option value='259'>By 259°</option><option value='260'>By 260°</option><option value='261'>By 261°</option><option value='262'>By 262°</option><option value='263'>By 263°</option><option value='264'>By 264°</option><option value='265'>By 265°</option><option value='266'>By 266°</option><option value='267'>By 267°</option><option value='268'>By 268°</option><option value='269'>By 269°</option><option value='270'>By 270°</option><option value='271'>By 271°</option><option value='272'>By 272°</option><option value='273'>By 273°</option><option value='274'>By 274°</option><option value='275'>By 275°</option><option value='276'>By 276°</option><option value='277'>By 277°</option><option value='278'>By 278°</option><option value='279'>By 279°</option><option value='280'>By 280°</option><option value='281'>By 281°</option><option value='282'>By 282°</option><option value='283'>By 283°</option><option value='284'>By 284°</option><option value='285'>By 285°</option><option value='286'>By 286°</option><option value='287'>By 287°</option><option value='288'>By 288°</option><option value='289'>By 289°</option><option value='290'>By 290°</option><option value='291'>By 291°</option><option value='292'>By 292°</option><option value='293'>By 293°</option><option value='294'>By 294°</option><option value='295'>By 295°</option><option value='296'>By 296°</option><option value='297'>By 297°</option><option value='298'>By 298°</option><option value='299'>By 299°</option><option value='300'>By 300°</option><option value='301'>By 301°</option><option value='302'>By 302°</option><option value='303'>By 303°</option><option value='304'>By 304°</option><option value='305'>By 305°</option><option value='306'>By 306°</option><option value='307'>By 307°</option><option value='308'>By 308°</option><option value='309'>By 309°</option><option value='310'>By 310°</option><option value='311'>By 311°</option><option value='312'>By 312°</option><option value='313'>By 313°</option><option value='314'>By 314°</option><option value='315'>By 315°</option><option value='316'>By 316°</option><option value='317'>By 317°</option><option value='318'>By 318°</option><option value='319'>By 319°</option><option value='320'>By 320°</option><option value='321'>By 321°</option><option value='322'>By 322°</option><option value='323'>By 323°</option><option value='324'>By 324°</option><option value='325'>By 325°</option><option value='326'>By 326°</option><option value='327'>By 327°</option><option value='328'>By 328°</option><option value='329'>By 329°</option><option value='330'>By 330°</option><option value='331'>By 331°</option><option value='332'>By 332°</option><option value='333'>By 333°</option><option value='334'>By 334°</option><option value='335'>By 335°</option><option value='336'>By 336°</option><option value='337'>By 337°</option><option value='338'>By 338°</option><option value='339'>By 339°</option><option value='340'>By 340°</option><option value='341'>By 341°</option><option value='342'>By 342°</option><option value='343'>By 343°</option><option value='344'>By 344°</option><option value='345'>By 345°</option><option value='346'>By 346°</option><option value='347'>By 347°</option><option value='348'>By 348°</option><option value='349'>By 349°</option><option value='350'>By 350°</option><option value='351'>By 351°</option><option value='352'>By 352°</option><option value='353'>By 353°</option><option value='354'>By 354°</option><option value='355'>By 355°</option><option value='356'>By 356°</option><option value='357'>By 357°</option><option value='358'>By 358°</option><option value='359'>By 359°</option><option value='360'>By 360°</option></select> &amp; <select id='scale' name='scale'><option value='2.0'> x 2 ... vs ...</option><option value='0.01'> / 100</option><option value='0.1'> / 10</option><option value='0.2'> / 5</option><option value='0.25'> / 4</option><option value='0.5'> / 2</option><option value='1.0'> x 1 (as is)</option><option value='2.0'> x 2</option><option value='4.0'> x 4</option><option value='5.0'> x 5</option><option value='10.0'> x 10</option><option value='100.0'> x 100</option></select> Scale via ImageMagick Image Url</h1><br>Url of image file: <input type='text' name='selname' id='selname' style='width:70%;' value='http://www.rjmprogramming.com.au/MyBusinessUnidad/Welcome_files/logo.jpg'></input><br><br><input type='submit' value='Show Rotated and Scaled Image'></input>&nbsp;<input type='submit' value='Show Rotated and Scaled Image as Pdf' name='pdf' id='pdf'></input></form></div></body></html>";
$suffix = "";
$lastone=0;
$cnt=0;

if ($selname != "") {
        exec('echo y > affine_rotate_imagemagick.png; echo y > affine_rotate_imagemagick.png; rm -f affine_rotate_imagemagick-*.pdf < affine_rotate_imagemagick.png 2> /dev/null;  rm -f affine_rotate_imagemagick-*.pdf < affine_rotate_imagemagick.png 2> /dev/null; rm -f affine_rotate_imagemagick-*.png < affine_rotate_imagemagick.png 2> /dev/null; rm -f affine_rotate_imagemagick.png < affine_rotate_imagemagick.png 2> /dev/null; angle=' . $angle . '; scale=' . $scale . ';   radians=`perl -e "print $angle * atan2(1,1)/45"`
    sx=`python -c "import math; print math.cos( $radians ) * $scale"`
    rx=`perl -e "print sin( $radians ) * $scale"`
    ry=`python -c "print -($rx)"`
    sy="$sx" 
  ' . $convertpath . 'convert ' . $selname . ' -matte -virtual-pixel Transparent \
          -affine $sx,$rx,$ry,$sy,0,0 -transform  +repage  affine_rotate_imagemagick.png');
         
        sleep(5); 
        if (!file_exists("affine_rotate_imagemagick.png") && !file_exists("affine_rotate_imagemagick-0.png")) {
          while ($cnt < 10 && !file_exists("affine_rotate_imagemagick.png") && !file_exists("affine_rotate_imagemagick-0.png")) {
            sleep(20);
            $cnt++;
          }
        }
          
        if (!file_exists("affine_rotate_imagemagick.png") && !file_exists("affine_rotate_imagemagick-0.png")) {
        $selname=$selname;
        } else if (file_exists("affine_rotate_imagemagick-0.png")) {
        if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
                    $fpdf = topdf('affine_rotate_imagemagick-0.png', 'affine_rotate_imagemagick-0.pdf');
        }
        while (file_exists("affine_rotate_imagemagick-" . $lastone . ".png")) {
          $lastone++;
          if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
           if (file_exists("affine_rotate_imagemagick-" . $lastone . ".png")) {
            topdf('affine_rotate_imagemagick-' . $lastone . '.png', 'affine_rotate_imagemagick-' . $lastone . '.pdf');
           }
          }
        }
        if (1 == 2) $lastone--;
        $sbits = "<script type='text/javascript'>\n";
        $sbits .= " var wo=null, worig=null, zero=0, upto=" . $lastone . ";\n";
        $sbits .= " function repeatit() {\n";
        $sbits .= "   zero=eval((1 + zero) % " . $lastone . ");\n";
        $sbits .= "   if (zero == 0) document.title='Start of Animated GIF Slideshow';\n";
        $sbits .= "   if (zero == 1) document.title='Animated GIF Slideshow';\n";
        if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
        $sbits .= "   document.getElementById('slideshow').src='affine_rotate_imagemagick-' + zero + '.pdf'; \n";
        $sbits .= "   setTimeout(repeatit,5000);\n";
        } else {
        $sbits .= "   document.getElementById('slideshow').src='affine_rotate_imagemagick-' + zero + '.png'; \n";
        $sbits .= "   setTimeout(repeatit,1000);\n";
        }
        $sbits .= " }\n";
        $sbits .= " function wopen() {\n";
        $sbits .= "   document.title='Start of Animated GIF Slideshow';\n";
        if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
        $sbits .= "   setTimeout(repeatit,5000);\n";
        } else {
        $sbits .= "   setTimeout(repeatit,1000);\n";
        }
        $sbits .= "   document.getElementById('selname').value='" . $selname . "';\n";
        $sbits .= "   document.getElementById('angle').value='" . $angle . "';\n";
        $sbits .= "   document.getElementById('scale').value='" . $scale . "';\n";
        $sbits .= " }\n";
        $sbits .= "</script>\n";
        $erroneousbits = "";
        $firstbits = str_replace("<body", "<body onload='wopen();'", $firstbits);
        $firstbits = str_replace("</head>", $sbits . "</head>", $firstbits);
        if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
        $formbits=str_replace("</body>",  "<br><br><div align='center'><iframe frameborder=0 width=700 height=700 id='slideshow' src='affine_rotate_imagemagick-0.pdf'></iframe></div></body>", $formbits);
		} else {
        $formbits=str_replace("</body>",  "<br><br><div align='center'><iframe frameborder=0 width=700 height=700 id='slideshow' src='affine_rotate_imagemagick-0.png'></iframe></div></body>", $formbits);
        }
        echo $firstbits;
        $firstbits="";
        } else {
    
        $sbits = "<script type='text/javascript'>\n";
        $sbits .= " var wo=null, worig=null;\n";
        $sbits .= " function wopen() {\n";
        $sbits .= "   document.getElementById('angle').value='" . $angle . "';\n";
        $sbits .= "   document.getElementById('selname').value='" . $selname . "';\n";
        $sbits .= "   document.getElementById('scale').value='" . $scale . "';\n";
        $sbits .= "   worig = window.open('" . $selname . "', '" . 'original' . "', 'top=260,left=10,width=300,height=300,resizable=yes');\n";
        if (isset($_POST['pdf']) || isset($_GET['pdf'])) {
                    $suffix = " in PDF format";
                    $fpdf = topdf('affine_rotate_imagemagick.png', 'affine_rotate_imagemagick.pdf');
                    //$sbits .= "   wo.document.write('<embed style=\"width=600px;height=600px;\" type=\"application/pdf\" src=\"http://" . $_SERVER['SERVER_NAME'] . ":" . $_SERVER['SERVER_PORT'] . "/" . str_replace("/affine_rotation_imagemagick.php", "", $_SERVER['REQUEST_URI']) . "/" . $fpdf . "\" />');\n";
                    //$sbits .= "   wo.document.write('<img src=\"" . 'affine_rotate_imagemagick.png' . "\" />');\n";
                    $sbits .= "   wo = window.open('affine_rotate_imagemagick.pdf', '" . 'affine_rotate_imagemagick' . "', 'top=500,left=400,width=600,height=500,resizable=yes');\n";
        } else {
                    $sbits .= "   wo = window.open('', '" . 'affine_rotate_imagemagick' . "', 'top=500,left=400,width=600,height=500,resizable=yes');\n";
                    $sbits .= "   wo.document.write('<img src=\"" . 'affine_rotate_imagemagick.png' . "\" />');\n";
        }
        $sbits .= " }\n";
        $sbits .= "</script>\n";
        $erroneousbits = "";
        $firstbits = str_replace("<body", "<body onload='wopen();'", $firstbits);
        $firstbits = str_replace("</head>", $sbits . "</head>", $firstbits);
        echo $firstbits;
        $firstbits="";
        }
} else {
		$erroneousbits = "";
}

echo $firstbits;
echo $erroneousbits;
echo $formbits;
?> 

