1 #!/bin/sh -- # A comment mentioning perl 2 eval '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: 9 if ($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.$$"; 21 open(FB, ">$fb") || die "$!"; 22 23 $ones = "\377" x ($W * 4); 24 for ($y = 0; $y < $H; $y++) { 25 print FB $ones; 26 } 27 28 if (fork) { 29 print "map:$fb\@${W}x${H}x32\n"; 30 exit 0; 31 } 32 33 srand(); 34 while (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 43 sub 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