#!/usr/bin/perl

#######################################################################
# LiVES trim_frames plugin v0.1

# rendered plugins should accept:
# <plugin_name> version (return <plugin_name> version <version>)
# <plugin_name> get_capabilities
# <plugin_name> get_description (e.g. "Edge detect|Edge detecting|1|1|")
# and optionally any of: 
# <plugin_name> get_parameters
# <plugin_name> get_param_window
# <plugin_name> get_onchange
# <plugin_name> onchange_<when> (for any triggers, e.g. onchange_init)
#
# they must accept:
# <plugin_name> process <parameters>

# You should not skip any frames, if a frame is not changed you must do:
# `cp $in $out`
#
# for *non-Perl* plugins, LiVES will call:
# <plugin_name> process "<dir>" <in_ext> <out_ext> <start> <end>
#  <width> <height> <parameters>
# first you should chdir to <dir>
# then you should create all output frames %8d$out_ext in numerical 
# from start to end inclusive,
# each time calling sig_progress (see smogrify) - writes current frame number to 
# <dir>/.status
# and checking for pause
#
# Any errors should be transmitted as in sig_error - 
# write "error|msg1|msg2|msg3|" to <dir>/.status
# msgn must not contain "\n", but can be omitted

# output frames should be named %8d$out_ext in the same directory
# after processing, you should leave no gaps in out frames, you should not resize
# or change the palette from RGB24 (LiVES will check and autocorrect this soon)

# Also you must implement your own: &sig_error and &sig_progress


#######################################################################

my $command=$ARGV[0];

if ($command eq "get_capabilities") {
    # capabilities is a bitmap field
    # 0x0001 == slow (hint to GUI)
    # 0x0002 == may resize (all frames to  x )
    # 0x8000 == reserved
    print "32770\n";
    exit 0;
}

if ($command eq "version") {
    print "trim_frames version 1.2 : builder version 0.9.5\n";
    exit 0;
}

if ($command eq "get_description") {
    #format here is "Menu entry|Action description|min_frames|script_file_name|"
    # min_frames==-1 indicates a special "no processing" effect. This allows more
    #general parameter windows which are not really effects (e.g. frame_calculator)
    print "Trim frames/Add border|Trimming|1|1||\n";
    exit 0;
}


if ($command eq "get_parameters") {
    # "name|group|type|default|min|max|"
    # eg. print "Radius|0|num0|1|1|100|";
    # types can be numx,colRGB24,bool,string or string_list
    print "_X Start|0|num0|0|0|10000|\n";
    print "_Y Start|0|num0|0|0|10000|\n";
    print "_X End|0|num0|0|0|10000|\n";
    print "_Y End|0|num0|0|0|10000|\n";
    print "Keep _Centered|0|bool|0|\n";
    print "_Width|0|num0|0|0|10000|\n";
    print "_Height|0|num0|0|0|10000|\n";
    print "Add _Border|0|bool|0|\n";
    print "_Offset X|0|num0|0|0|10000|\n";
    print "_Offset Y|0|num0|0|0|10000|\n";
    exit 0;
}

if ($command eq "get_param_window") {
    print "layout|p1|p2||\n";
    print "layout|p3|p4||\n";
    print "layout|p5||\n";
    print "special|framedraw|rectdemask|1|2|3|4||\n";
    print "layout|hseparator||\n";
    print "layout|p8||\n";
    print "layout|p6|p7||\n";
    print "layout|p9|p10||\n";
    print "special|aspect|6|7||\n";
    exit 0;
}

if ($command eq "get_onchange") {
    print "init|\n";
    print "1|\n";
    print "2|\n";
    print "3|\n";
    print "4|\n";
    print "6|\n";
    print "7|\n";
    print "5|\n";
    exit 0;
}

#######################################################

if ($command eq "process") {

# in case of error, you should do:
# &sig_error("msg1","msg2","msg3","msg4"); [ msg's are optional, but must not
# contain newlines (\n) ]

    $livesexitcode=1;
    $SIG{'HUP'}="dopost";

##### check requirements first #######
    if (&location("convert") eq "") {
      &sig_error("You must install 'convert' before you can use this effect.");
    }

###### handle parameters #############
# autogenerated from get_parameters

    unless (defined($ARGV[1])) {
      $p1=0;
    }
    else {
      $p1=$ARGV[1];
    }
    unless (defined($ARGV[2])) {
      $p2=0;
    }
    else {
      $p2=$ARGV[2];
    }
    unless (defined($ARGV[3])) {
      $p3=0;
    }
    else {
      $p3=$ARGV[3];
    }
    unless (defined($ARGV[4])) {
      $p4=0;
    }
    else {
      $p4=$ARGV[4];
    }
    unless (defined($ARGV[5])) {
      $p5=0;
    }
    else {
      $p5=$ARGV[5];
    }
    unless (defined($ARGV[6])) {
      $p6=0;
    }
    else {
      $p6=$ARGV[6];
    }
    unless (defined($ARGV[7])) {
      $p7=0;
    }
    else {
      $p7=$ARGV[7];
    }
    unless (defined($ARGV[8])) {
      $p8=0;
    }
    else {
      $p8=$ARGV[8];
    }
    unless (defined($ARGV[9])) {
      $p9=0;
    }
    else {
      $p9=$ARGV[9];
    }
    unless (defined($ARGV[10])) {
      $p10=0;
    }
    else {
      $p10=$ARGV[10];
    }
    $p1=int($p1*1+.5)/1;
    if ($p1<0) {
       &sig_error("_X Start must be >= 0");
    }
    if ($p1>10000) {
       &sig_error("_X Start must be <= 10000");
    }
    $p2=int($p2*1+.5)/1;
    if ($p2<0) {
       &sig_error("_Y Start must be >= 0");
    }
    if ($p2>10000) {
       &sig_error("_Y Start must be <= 10000");
    }
    $p3=int($p3*1+.5)/1;
    if ($p3<0) {
       &sig_error("_X End must be >= 0");
    }
    if ($p3>10000) {
       &sig_error("_X End must be <= 10000");
    }
    $p4=int($p4*1+.5)/1;
    if ($p4<0) {
       &sig_error("_Y End must be >= 0");
    }
    if ($p4>10000) {
       &sig_error("_Y End must be <= 10000");
    }
    $p5=~(~$p5);
    $p6=int($p6*1+.5)/1;
    if ($p6<0) {
       &sig_error("_Width must be >= 0");
    }
    if ($p6>10000) {
       &sig_error("_Width must be <= 10000");
    }
    $p7=int($p7*1+.5)/1;
    if ($p7<0) {
       &sig_error("_Height must be >= 0");
    }
    if ($p7>10000) {
       &sig_error("_Height must be <= 10000");
    }
    $p8=~(~$p8);
    $p9=int($p9*1+.5)/1;
    if ($p9<0) {
       &sig_error("_Offset X must be >= 0");
    }
    if ($p9>10000) {
       &sig_error("_Offset X must be <= 10000");
    }
    $p10=int($p10*1+.5)/1;
    if ($p10<0) {
       &sig_error("_Offset Y must be >= 0");
    }
    if ($p10>10000) {
       &sig_error("_Offset Y must be <= 10000");
    }

    $antialias=&rc_get("antialias");
    $resize_ext=$out_ext;
    $nwidth=$p3-$p1+1;
    $nheight=$p4-$p2+1;
    if ($nwidth<1||$nwidth>$width) {
       &sig_error("New width is invalid.");
    }
    if ($nheight<1||$nheight>$height) {
       &sig_error("New height is invalid.");
    }
    
    if ($p8) {
        $bgcolour=&rc_get("bgcolour");
        system("$convert_command -size $p6!x$p7! xc:$bgcolour blank$img_ext");
    }

################# loop through frames #################
    for ($frame=$start;$frame<=$end;$frame++) {
	# sig progress will update the progress bar from $start->$end
	&sig_progress($frame);
	$name=&mkname($frame);
	$in="$name$img_ext";
	$out="$name.mgk";

##################### the all-important bit #######################

        &trim_frame($name,$width,$height,$p1,$p2,$nwidth,$nheight);
        if ($p8) {
            system("$composite_command -compose plus -dissolve 100 -geometry $nwidth!x$nheight!+$p9!+$p10! $out blank$img_ext $out");
        }

###################################################################
        if (! -f $out) {
            print "Warning: effect plugin trim_frames skipped frame $frame !";
            `cp $in $out`;
        }
    }
    $livesexitcode=0;
    &dopost;
    return 1;
}



########## Post loop code ############
sub dopost {
    if (-f "blank$img_ext") {
        unlink ("blank$img_ext");
    }
    if ($p8) {
        $nwidth=$p6;
        $nheight=$p7;
    }
    if ($livesexitcode) {
        exit $livesexitcode;
    }
}

########## Triggers ############

if ($command eq "onchange_6") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p9_max=$p6-$p3+$p1-1;
    if ($p5) {$p9=int($p9_max/2+.5);}
    $p8=1;

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_3") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p9_max=$p6-$p3+$p1-1;
    if ($p5) {$p1=$width-1-$p3;$p9=int($p9_max/2+.5);}
    if ($p3<$p1) {$p1=$p3;}
    $p6_min=$p3-$p1+1;

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_7") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p10_max=$p7-$p4+$p2-1;
    if ($p5) {
        $p10=int($p10_max/2+.5);
    }
    $p8=1;
    

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_2") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p10_max=$p7-$p4+$p2-1;
    if ($p5) {$p4=$height-1-$p2;$p10=int($p10_max/2+.5);}
    if ($p2>$p4) {$p4=$p2;}
    $p7_min=$p4-$p2+1;
    if ($p7==$height&&!$p5) {$p10=$p2;}

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_init") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p1_max=$p3_max=$width-1;
    $p2_max=$p4_max=$height-1;
    $p6=$width;$p7=$height;

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_4") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p10_max=$p7-$p4+$p2-1;
    if ($p5) {$p2=$height-1-$p4; $p10=int($p10_max/2+.5);}
    if ($p4<$p2) {$p2=$p4;}
    $p7_min=$p4-$p2+1;

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_1") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    $p9_max=$p6-$p3+$p1-1;
    if ($p5) {$p3=$width-1-$p1;$p9=int($p9_max/2+.5);}
    if ($p1>$p3) {$p3=$p1;}
    if ($p6==$width&&!$p5) {$p9=$p1;}
    $p6_min=$p3-$p1+1;

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}

if ($command eq "onchange_5") {
    $p1=@ARGV[1];
    $p1_min=@ARGV[2];
    $p1_max=@ARGV[3];
    $p2=@ARGV[4];
    $p2_min=@ARGV[5];
    $p2_max=@ARGV[6];
    $p3=@ARGV[7];
    $p3_min=@ARGV[8];
    $p3_max=@ARGV[9];
    $p4=@ARGV[10];
    $p4_min=@ARGV[11];
    $p4_max=@ARGV[12];
    $p5=@ARGV[13];
    $p6=@ARGV[14];
    $p6_min=@ARGV[15];
    $p6_max=@ARGV[16];
    $p7=@ARGV[17];
    $p7_min=@ARGV[18];
    $p7_max=@ARGV[19];
    $p8=@ARGV[20];
    $p9=@ARGV[21];
    $p9_min=@ARGV[22];
    $p9_max=@ARGV[23];
    $p10=@ARGV[24];
    $p10_min=@ARGV[25];
    $p10_max=@ARGV[26];
    $width=@ARGV[27];
    $height=@ARGV[28];
    $start=@ARGV[29];
    $end=@ARGV[30];
    $last=@ARGV[31];
    $length=$end-$start+1;

    if ($p5) {
     if ($p1<=$width/2) {
         $p3=$width-1-$p1;
        }
      else {
        $p1=$width-1-$p3;
      }
     if ($p2<=$height/2) {
        $p4=$height-1-$p2;
     }
      else {
        $p2=$height-1-$p4;
      }
    }
    

    print "$p1 $p1_min $p1_max $p2 $p2_min $p2_max $p3 $p3_min $p3_max $p4 $p4_min $p4_max $p5 $p6 $p6_min $p6_max $p7 $p7_min $p7_max $p8 $p9 $p9_min $p9_max $p10 $p10_min $p10_max ";
    exit 0;
}
