X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fvidwhacker;h=b4378354fee7f73ecee5ddcc254d030632d368e5;hb=4cecfc89e5e889c7232693897c06168fb378bd5c;hp=5dc85b67b0a9e2025701bcb64abf5f7aaa4e1df6;hpb=585e1a6717d1dd9b90fbb53acaaae82106354d33;p=xscreensaver diff --git a/hacks/vidwhacker b/hacks/vidwhacker index 5dc85b67..b4378354 100755 --- a/hacks/vidwhacker +++ b/hacks/vidwhacker @@ -21,7 +21,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.17 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.21 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $verbose = 0; my $use_stdin = 0; @@ -54,6 +54,10 @@ my @displayer_programs = ( # "xsri -scale -keep-aspect -center-horizontal -center-vertical", ); +# apparently some versions of netpbm call it "pamoil" instead of "pgmoil"... +# +my $pgmoil = (which("pamoil") ? "pamoil" : "pgmoil"); + # List of interesting PPM filter pipelines. # In this list, the following magic words may be used: @@ -68,7 +72,7 @@ my @displayer_programs = ( my @filters = ( "ppmtopgm FILE1 | pgmedge | pgmtoppm COLORS | ppmnorm", "ppmtopgm FILE1 | pgmenhance | pgmtoppm COLORS", - "ppmtopgm FILE1 | pgmoil | pgmtoppm COLORS", + "ppmtopgm FILE1 | $pgmoil | pgmtoppm COLORS", "ppmtopgm FILE1 | pgmbentley | pgmtoppm COLORS", "ppmrelief FILE1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |" . @@ -110,7 +114,7 @@ my @filters = ( " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " . " pnmarith -multiply FILE1 FILE2", - "ppmshift 30 FILE1 | ppmtopgm | pgmoil | pgmedge | " . + "ppmshift 30 FILE1 | ppmtopgm | $pgmoil | pgmedge | " . " pgmtoppm COLORS > FILE2 ; " . " pnmarith -difference FILE1 FILE2", @@ -157,6 +161,19 @@ sub pick_displayer { } +# returns the full path of the named program, or undef. +# +sub which { + my ($prog) = @_; + foreach (split (/:/, $ENV{PATH})) { + if (-x "$_/$prog") { + return $prog; + } + } + return undef; +} + + # Choose random foreground and background colors # sub randcolors { @@ -249,7 +266,7 @@ sub read_config { local *IN; open (IN, "<$conf") || error "reading $conf: $!"; while () { - if (!$imagedir && m/^imageDirectory:\s+([^\s]+)\s*$/i) { $imagedir = $1; } + if (!$imagedir && m/^imageDirectory:\s+(.*)\s*$/i) { $imagedir = $1; } elsif (m/^grabVideoFrames:\s+true\s*$/i) { $video_p = 1; } elsif (m/^grabVideoFrames:\s+false\s*$/i) { $video_p = 0; } elsif (m/^chooseRandomImages:\s+true\s*$/i) { $file_p = 1; } @@ -259,6 +276,7 @@ sub read_config { $file_p = 1 if $had_dir; + $imagedir = undef unless ($imagedir && $imagedir ne ''); if (!$file_p && !$video_p) { # error "neither grabVideoFrames nor chooseRandomImages are set\n\t" . @@ -305,7 +323,7 @@ sub get_ppm { my $v = ($verbose <= 1 ? "" : "-" . ("v" x ($verbose-1))); my $cmd; if ($do_file_p) { - $cmd = "xscreensaver-getimage-file $v --name $imagedir"; + $cmd = "xscreensaver-getimage-file $v --name \"$imagedir\""; } else { $cmd = "xscreensaver-getimage-video $v --stdout"; } @@ -314,26 +332,31 @@ sub get_ppm { if ($do_file_p) { - print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: running: $cmd\n" if ($verbose > 1); my $fn = `$cmd`; $fn =~ s/\n$//s; error "didn't get a file?" if ($fn eq ""); print STDERR "$progname: selected file $fn\n" if ($verbose > 1); - if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < $fn"; } - elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < $fn"; } + if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; } + elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < \"$fn\""; } + elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; } + elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; } + elsif ($fn =~ m/\.bmp/i) { $cmd = "bmptoppm < \"$fn\""; } + elsif ($fn =~ m/\.tiff?/i) { $cmd = "tifftopnm < \"$fn\""; } + elsif ($fn =~ m/\.p[bgp]m/i) { return `cat \"$fn\"`; } else { error "unrecognized file extension on $fn"; } - print STDERR "$progname: converting with \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: converting with: $cmd\n" if ($verbose > 1); $cmd .= " 2>/dev/null" unless ($verbose > 1); $ppm = `$cmd`; } else { - print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: running: $cmd\n" if ($verbose > 1); $ppm = `$cmd`; error "no data?" if ($ppm eq ""); error "not a PPM file" unless ($ppm =~ m/^P\d\n/s); @@ -393,7 +416,14 @@ sub vidwhack { } $ppm = $stdin_ppm; } else { - $ppm = get_ppm(); + my $max_err_count = 20; + my $err_count = 0; + while (!defined($ppm)) { + $ppm = get_ppm(); + $err_count++ if (!defined ($ppm)); + error ("too many errors, too few images!") + if ($err_count > $max_err_count); + } } $ppm = frob_ppm ($ppm); @@ -435,7 +465,7 @@ sub main { read_config; if (!$use_stdout) { - $_ = `xdpyinfo 2>-`; + $_ = `xdpyinfo 2>&-`; ($screen_width) =~ m/ dimensions: +(\d+)x(\d+) pixels/; $screen_width = 800 unless $screen_width > 0; }