1  #!/bin/sh -- # A comment mentioning perl
2eval 'exec perl -S $0 ${1+"$@"}'
3        if 0;
4
5# ranfb.pl: example -rawfb setup program.
6# E.g.  x11vnc -rawfb setup:./ranfb.pl
7
8# can supply WxH or W H on cmd line:
9if ($ARGV[0] =~ /^(\d+)x(\d+)$/) {
10	$W = $1;
11	$H = $2;
12} else {
13	$W = shift;
14	$H = shift;
15}
16
17$W = 480 unless $W;
18$H = 360 unless $H;
19
20$fb = "/tmp/ranfb.$$";
21open(FB, ">$fb") || die "$!";
22
23$ones = "\377" x ($W * 4);
24for ($y = 0; $y < $H; $y++) {
25	print FB $ones;
26}
27
28if (fork) {
29	print "map:$fb\@${W}x${H}x32\n";
30	exit 0;
31}
32
33srand();
34while (1) {
35	showpic();
36	if (! kill 0, $ENV{X11VNC_PID}) {
37		print STDERR "PID $ENV{X11VNC_PID} gone\n";
38		unlink($fb);
39		exit;
40	}
41}
42
43sub showpic {
44
45	#  0 < x,y < 1;  R1, R2, ... B4 random & scaled so R,G,B < 255:
46	# R(x,y) = R1 + R2 * x + R3 * y + R4 * x * y
47	# G(x,y) = G1 + G2 * x + G3 * y + G4 * x * y
48	# B(x,y) = B1 + B2 * x + B3 * y + B4 * x * y
49
50	$minfac = 0.25;
51	foreach $c ('R', 'G', 'B') {
52		$a1 = rand() * $minfac;
53		$a2 = rand();
54		$a3 = rand();
55		$a4 = rand();
56		$at = $a1 + $a2 + $a3 + $a4;
57		$a1 = 255 * ($a1/$at);
58		$a2 = 255 * ($a2/$at);
59		$a3 = 255 * ($a3/$at);
60		$a4 = 255 * ($a4/$at);
61		# invert axes randomly
62		$ax = 0; $ax = 1 if rand() < 0.5;
63		$ay = 0; $ay = 1 if rand() < 0.5;
64		eval "\$${c}1 = \$a1";
65		eval "\$${c}2 = \$a2";
66		eval "\$${c}3 = \$a3";
67		eval "\$${c}4 = \$a4";
68		eval "\$${c}x = \$ax";
69		eval "\$${c}y = \$ay";
70	}
71
72	for ($i = 0; $i < 256; $i++) {
73		$p[$i] = pack("c", $i);
74	}
75
76	$Winv = 1.0/$W;
77	$Hinv = 1.0/$H;
78
79	$str = '';
80	for ($y = 0; $y < $H; $y++) {
81		$yr = $yg = $yb = $y;
82		$yr = $H - $yr if $Ry;
83		$yg = $H - $yg if $Gy;
84		$yb = $H - $yb if $By;
85		$yr = $yr * $Hinv;
86		$yg = $yg * $Hinv;
87		$yb = $yb * $Hinv;
88
89		$Y[3*$y+0] = $yr;
90		$Y[3*$y+1] = $yg;
91		$Y[3*$y+2] = $yb;
92	}
93
94	for ($x = 0; $x < $W; $x++) {
95		$xr = $xg = $xb = $x;
96		$xr = $W - $xr if $Rx;
97		$xg = $W - $xg if $Gx;
98		$xb = $W - $xb if $Bx;
99		$xr = $xr * $Winv;
100		$xg = $xg * $Winv;
101		$xb = $xb * $Winv;
102
103		$X[3*$x+0] = $xr;
104		$X[3*$x+1] = $xg;
105		$X[3*$x+2] = $xb;
106	}
107
108	for ($y = 0; $y < $H; $y++) {
109		#$yr = $yg = $yb = $y;
110		#$yr = $H - $yr if $Ry;
111		#$yg = $H - $yg if $Gy;
112		#$yb = $H - $yb if $By;
113		#$yr = $yr * $Hinv;
114		#$yg = $yg * $Hinv;
115		#$yb = $yb * $Hinv;
116
117		$yr = $Y[3*$y+0];
118		$yg = $Y[3*$y+1];
119		$yb = $Y[3*$y+2];
120
121		$RY1 = $R1 + $yr * $R3;
122		$GY1 = $G1 + $yg * $G3;
123		$BY1 = $B1 + $yb * $B3;
124
125		$RY2 = $R2 + $yr * $R4;
126		$GY2 = $G2 + $yg * $G4;
127		$BY2 = $B2 + $yb * $B4;
128
129		for ($x = 0; $x < $W; $x++) {
130			#$xr = $xg = $xb = $x;
131			#$xr = $W - $xr if $Rx;
132			#$xg = $W - $xg if $Gx;
133			#$xb = $W - $xb if $Bx;
134			#$xr = $xr * $Winv;
135			#$xg = $xg * $Winv;
136			#$xb = $xb * $Winv;
137
138			$n = 3 * $x;
139
140			#$v = int($R1 + $xr*$R2 + $yr*$R3 + $xr*$yr*$R4);
141			$v  = int($RY1 + $X[$n]*$RY2);
142			$str .= $p[$v];
143
144			#$v = int($G1 + $xg*$G2 + $yg*$G3 + $xg*$yg*$G4);
145			$v  = int($GY1 + $X[$n+1]*$GY2);
146			$str .= $p[$v];
147
148			#$v = int($B1 + $xb*$B2 + $yb*$B3 + $xb*$yb*$B4);
149			$v  = int($BY1 + $X[$n+2]*$BY2);
150			$str .= $p[$v];
151
152			$str .= "\0";
153		}
154	}
155	seek(FB, 0, 0);
156	print FB $str;
157}
158