#!/usr/bin/perl

#######################################################################
# LiVES skip_forwards plugin, version 1.7
# RFX version 1.7
# autogenerated from script by Salsaman|

# rendered plugins should accept:
# <plugin_name> version (return <plugin_name> version <version>)
# <plugin_name> get_define
# <plugin_name> get_capabilities
# <plugin_name> get_description (e.g. "Edge detect|Edge detecting|1|1|")
# <plugin_name> clear (clean up any plugin generated temp files)
# 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


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

use POSIX;

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 )
    # 0x0004 == block mode generator
    # 0x8000 == reserved
    print "32768\n";
    exit 0;
}

if ($command eq "version") {
    print "skip_forwards version 1 : builder version 1.0.10\n";
    exit 0;
}

if ($command eq "get_define") {
    print "|1.7\n";
    exit 0;
}

if ($command eq "get_description") {
    #format here is "Menu entry|Action description|min_frames|number_of_in_channels|"
    # 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 "Skip forward|Applying forward skip to|1|1|\n";
    exit 0;
}


if ($command eq "get_parameters") {
    # "name|label|type|other fields..."
    # eg. print "radius|_radius|num0|1|1|100|";
    # types can be numx,colRGB24,bool,string or string_list
    print "skipahead|_Skip ahead|num0|10|1|100|\n";
    print "fadestart|_Fade start|num0|50|0|100|\n";
    print "fadeend|Fade _end|num0|50|0|100|\n";
    exit 0;
}

if ($command eq "get_param_window") {
    exit 0;
}

if ($command eq "get_onchange") {
    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) ]

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

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

    unless (defined($ARGV[1])) {
      $p0=10;
    }
    else {
      $p0=$ARGV[1];
    }
    unless (defined($ARGV[2])) {
      $p1=50;
    }
    else {
      $p1=$ARGV[2];
    }
    unless (defined($ARGV[3])) {
      $p2=50;
    }
    else {
      $p2=$ARGV[3];
    }
    $!=0;
    $p0=int(POSIX::strtod($p0)*1+.5)/1;
    if ($p0<1) {
       &sig_error("skipahead must be >= 1");
       exit 1;
    }
    if ($p0>100) {
       &sig_error("skipahead must be <= 100");
       exit 1;
    }
    $!=0;
    $p1=int(POSIX::strtod($p1)*1+.5)/1;
    if ($p1<0) {
       &sig_error("fadestart must be >= 0");
       exit 1;
    }
    if ($p1>100) {
       &sig_error("fadestart must be <= 100");
       exit 1;
    }
    $!=0;
    $p2=int(POSIX::strtod($p2)*1+.5)/1;
    if ($p2<0) {
       &sig_error("fadeend must be >= 0");
       exit 1;
    }
    if ($p2>100) {
       &sig_error("fadeend must be <= 100");
       exit 1;
    }

    $diff=$p0;
    $pc_start=$p1; # fade amount
    $pc_step=($p2-$p1)/$p0;

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

 while (! -f $in) {
     sleep 1;
 }

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

        if (($frame+$diff>$end)||$diff==0) {
          `cp $in $out`;
        }
        else {
             $from=&mkname(int($frame+$diff));
             if (-f "$from$img_ext") {
            	     $fromimg="$from$img_ext";
            	   `$composite_command -compose plus -dissolve $pc_start $fromimg -size $width!x$height! $in $out >/dev/null 2>&1`;
        	   }
        	   else {
             	   	`cp $in $out`;
             		}
        }
        $diff--;
        $pc_start+=$pc_step;
        if ($diff<0) {
           $diff=$p0;
           $pc_start=$p1;
        }
        

###################################################################
        if (! -f $out) {
            print STDERR "Warning: effect plugin skip_forwards skipped frame $frame !";
            `cp $in $out`;
        }
	&sig_progress($frame);
    }
    return 1;
}



########## Post loop code ############
if ($command eq "clear") {
}
