#!/usr/bin/perl -l

my $dim = "notwide";
#my $dim = "wide";

if ($dim eq "wide") {
  $width = 2560;
  $yd = 140;
  $xd = 100;
  $binary = asc2bin($ARGV[0]);
  my $x = 0;
  my $y = 0;
  my $xmax = 27;
  my $xblur = 23.5;
  my $yblur = 10;
  my $xoffset = 350;
  my $yoffset = -300;
  
  my $bgcolor = "00578E";
  my $color = "00BBFF";
  my $hlcolor = "FFFFFF";
  }
else {
  $width = 1920;
  $yd = 140;
  $xd = 100;
  $binary = asc2bin($ARGV[0]);
  my $x = 0;
  my $y = 0;
  my $xmax = 20;
  my $xblur = 17.5;
  my $yblur = 10;
  my $xoffset = 350;
  my $yoffset = -300;
  
  my $bgcolor = "00578E";
  my $color = "00BBFF";
  my $hlcolor = "FFFFFF";
  }

  
  
  
  
  
  
  
  print '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
  print '<svg xmlns="http://www.w3.org/2000/svg" width="'.$width.'" height="1600" id="binary" version="1.0">';
#  print '<svg xmlns="http://www.w3.org/2000/svg" width="800" height="600" id="binary" version="1.0">';
  
  print '<defs id="defs">';
  print '    <linearGradient id="shade"> <stop style="stop-color:#000000;stop-opacity:0.7;" offset="0" id="stop1" /> <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop2" /> </linearGradient>';
  print '    <filter id="blur0"></filter>';
  for (1 .. 100){
    print '    <filter x="-'.($_*10).'%" width="'.($_*20+100).'%" y="-'.($_*5).'%" height="'.($_*10+100).'%" id="blur'.$_.'"> <feGaussianBlur stdDeviation="'.$_.'" id="feGaussianBlur'.$_.'" />  </filter>';
    }

  print '</defs>';

  
  print '    <rect style="fill:#'.$bgcolor.';stroke-width:0;" width="'.$width.'" height="1600" x="0" y="0" ry="0"/>';

  
  
  
  for (split //, $binary) {
    my $blur = int(abs($xblur-$x)+abs($yblur-$y));
    my $yloc = $y*$yd+$yoffset+sqrt($x)*100-(10*$x);
    my $xloc = $x*$xd+$xoffset-sqrt($y+3)*200+(30*$y);
    my $curcolor = $color;
    if ((abs($x-$xblur)<1)&& $y == $yblur) {$curcolor = $hlcolor;}
    if($_ eq "0"){
        print  '    <rect style="fill:none;stroke:#'.$curcolor.';stroke-width:20;filter:url(#blur'.$blur.')" width="60" height="100" x="'.($xloc+20).'" y="'.($yloc+20).'" ry="30"/>';
        }
    if($_ eq "1"){
        print  '    <path style="fill:none;stroke:#'.$curcolor.';stroke-width:20;stroke-linecap:round;filter:url(#blur'.$blur.')" d="M '.($xloc+50).','.($yloc+20).' L '.($xloc+50).','.($yloc+120).'" />';
        }
    $x++;
    if ($x>$xmax){$x=0;$y++;}
    }
  print '    <rect style="fill:url(#shade);stroke-width:0;" width="'.$width.'" height="1600" x="0" y="0" ry="0"/>';
  
  print '</svg>';
  exit;



sub asc2bin {
    my $str = shift(@_);
    my @bytes;
    for (split //, $str) {
      vec(my($byte), 0, 8) = ord;
      push @bytes, unpack "B8", $byte;
    }
    return join "", @bytes;
  }
