#!/usr/bin/perl -w

if($#ARGV!=0) {
  print "Usage: perl dvduncrop_subs.pl <dir>\n";
  exit;
}
my $sourcedir=$ARGV[0];
my $destdir=$sourcedir . "_dvduncrop";
my $framewidth;
my $frameheight;

if($^O eq "MSWin32") {
  @filelist=glob("\"$sourcedir\\\*.xml\"");
} else {
  @filelist=glob("\"$sourcedir/\*.xml\"");
}
my $listsize=@filelist;
if($listsize==0) {
  print "Error: No XML files found in $sourcedir\n";
  exit;
}

mkdir $destdir;

FILELOOP: for $sourcefile (@filelist) {
  my $graphic=0;
  my $x=0;
  my $y=0;
  my $height=0;
  my $width=0;
  my $sub_image="";
  my $token1="";
  my $token2="";
  my @arr;
  if($^O eq "MSWin32") {
    @arr=split(/\\/,$sourcefile);
  } else {
    @arr=split(/\//,$sourcefile);
  }
  my $fname=$arr[-1];
  print "Processing ".$fname."...\n";
  open(OLDXML, "<".$sourcefile);
  my $subframe="";
  if($^O eq "MSWin32") {
    open(NEWXML, '>' . $destdir . '\\' . $fname);
    $subframe=$destdir."\\_tmp_subframe.png";
  } else {
    open(NEWXML, '>' . $destdir . '/' . $fname);
    $subframe=$destdir."/_tmp_subframe.png";
  }
  foreach my $line (<OLDXML>) {
    if (index($line, '<Graphic') != -1) {
      $graphic=1;
    }
    if($graphic==1) {
      if (index($line, "X=") != -1) {
        @arr=split(/X="/,$line);
        $x=$arr[1];
        @arr=split(/"/,$x);
        $x=$arr[0];
        $token1="X=\"".$x;
        $token2="X=\"0";
        $line=~s/$token1/$token2/;
      }
      if (index($line, "Y=") != -1) {
        @arr=split(/Y="/,$line);
        $y=$arr[1];
        @arr=split(/"/,$y);
        $y=$arr[0];
        $token1="Y=\"".$y;
        $token2="Y=\"0";
        $line=~s/$token1/$token2/;
      }
      if (index($line, "Height=") != -1) {
        @arr=split(/Height="/,$line);
        $height=$arr[1];
        @arr=split(/"/,$height);
        $height=$arr[0];
        $token1="Height=\"".$height;
        $token2="Height=\"".$frameheight;
        $line=~s/$token1/$token2/;
      }
      if (index($line, "Width=") != -1) {
        @arr=split(/Width="/,$line);
        $width=$arr[1];
        @arr=split(/"/,$width);
        $width=$arr[0];
        $token1="Width=\"".$width;
        $token2="Width=\"".$framewidth;
        $line=~s/$token1/$token2/;
      }
      if (index($line, ".png") != -1) {
        my $newy=$y;
        @arr=split(/>/,$line);
        $sub_image=$arr[1];
        @arr=split(/</,$sub_image);
        $sub_image=$arr[0];
        if(!(-e $subframe)) {
          system("convert -size ".$framewidth."x".$frameheight." canvas:none -depth 4 ".$subframe);
        }
        if($^O eq "MSWin32") {
          system("composite -geometry +".$x."+".$newy." ".$sourcedir."\\".$sub_image." ".$subframe." -depth 4 ".$destdir."\\".$sub_image);
          unlink($destdir."/_".$sub_image);
        } else {
          system("composite -geometry +".$x."+".$newy." ".$sourcedir."/".$sub_image." ".$subframe." -depth 4 ".$destdir."/".$sub_image);
          unlink($destdir."/_".$sub_image);
        }
        $graphic=0;
      }
      print NEWXML $line;
    } else {
      if (index($line, "VideoFormat") != -1) {
        if (index($line, "480i") != -1) {
          $framewidth=720;
          $frameheight=480;
        } else {
          $framewidth=720;
          $frameheight=576;
        }
      }
      print NEWXML $line;
    }
  }
  close(OLDXML);
  close(NEWXML);
  unlink($subframe);
}

print "Process complete. DVD-uncropped images can be found in $destdir.\n";
