Home | History | Annotate | Download | only in misc
      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