#!/bin/sh -- # A comment mentioning perl eval 'exec perl -S $0 ${1+"$@"}' if 0; # # slide.pl: amusing example slideshow program for use with x11vnc -rawfb mode. # # E.g. x11vnc -rawfb map:/tmp/foo@640x480x32:ff/ff00/ff0000 -pipeinput slide.pl # # requires: jpegtopnm(1), (maybe LSB too). # @jpegs = qw( dr_fun_new.jpg canon.jpg go_microsoft.jpg jonathan2.jpg michelle1.jpg novm.jpg photo-008.jpg presrange.jpg ); # Or: # @jpegs = @ARGV; # @jpegs = <*.jpg>; # this is x11vnc's -rawfb value: if ($ENV{X11VNC_RAWFB_STR} =~ m,:(.*)@(\d+)x(\d+)x(\d+),) { $fb = $1; # filename $W = $2; # width $H = $3; # height } else { die "No usable X11VNC_RAWFB_STR\n"; } open(FB, ">$fb") || die "$!"; # make a solid background: $ones = "\377" x ($W * 4); $grey = "\340" x ($W * 4); for ($y = 0; $y < $H; $y++) { print FB $grey; } # this is rather slow with many jpegs... oh well. foreach $pic (@jpegs) { print STDERR "loading '$pic' please wait ...\n"; open(JPEG, "jpegtopnm '$pic' 2>/dev/null|") || die "$!"; while () { next if /^P\d/; if (/^(\d+)\s+(\d+)\s*$/) { $Jpeg{$pic}{w} = $1; $Jpeg{$pic}{h} = $2; } last if /^255$/; } $data = ''; while () { $data .= $_; } close(JPEG); # need to put in a 4th 0 byte after RGB for 32bpp. 24bpp doesn't work. # (MSB might be other way around). $new = ''; for ($l = 0; $l < int(length($data)/3); $l++) { $new .= substr($data, $l * 3, 3) . "\0"; } $Jpeg{$pic}{data} = $new; $data = ''; $new = ''; if ($pic eq $jpegs[0]) { showpic(0); } } $N = scalar(@jpegs); print STDERR "\nFinished loading $N images. Click Button or Spacebar for next.\n"; $I = 0; while (<>) { # read the next user input event, watch for button press or spacebar: ###last if /^Keysym.* [qQ] /; next unless /^(Pointer.*ButtonPress|Keysym.*space.*KeyPress)/; $I = ($I + 1) % $N; showpic($I); } sub showpic { my($i) = @_; my $pic = $jpegs[$i]; my $h = $Jpeg{$pic}{h}; my $w = $Jpeg{$pic}{w}; my $dy = int(($H - $h)/2); my $dx = int(($W - $w)/2); print STDERR "showing pic $i: $pic\t$w x $h +$dy+$dx\n"; # clear screen: seek(FB, 0, 0); for ($y = 0; $y < $H; $y++) { print FB $ones; } # insert new picture: for ($y = 0; $y < $h; $y++) { seek(FB, (($y + $dy) * $W + $dx) * 4, 0); $line = substr($Jpeg{$pic}{data}, $y * $w * 4, $w * 4); print FB $line; } } close(FB); ###unlink($fb); # this (probably) won't kill x11vnc print STDERR "$0 done.\n";