summaryrefslogtreecommitdiffstats
path: root/x11vnc/misc/slide.pl
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/misc/slide.pl')
-rwxr-xr-xx11vnc/misc/slide.pl112
1 files changed, 112 insertions, 0 deletions
diff --git a/x11vnc/misc/slide.pl b/x11vnc/misc/slide.pl
new file mode 100755
index 0000000..0c90d0e
--- /dev/null
+++ b/x11vnc/misc/slide.pl
@@ -0,0 +1,112 @@
+ #!/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 (<JPEG>) {
+ next if /^P\d/;
+ if (/^(\d+)\s+(\d+)\s*$/) {
+ $Jpeg{$pic}{w} = $1;
+ $Jpeg{$pic}{h} = $2;
+ }
+ last if /^255$/;
+ }
+ $data = '';
+ while (<JPEG>) {
+ $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";