#!/usr/bin/perl $s=q^ $width = 150; $height = 150; # these are global just so read knows how many bytes to get. $sep = chr(94); $code="#!/usr/bin/perl\n\n\$s=q".$sep.$s.$sep.";\neval \$s;\n"; if (@ARGV) { $file = shift @ARGV; open(FILE, $file); for ($i=0; $i<3; $i++) { $hdr .= ; } $b = 0; $c = 0; $count = 0; while (read(FILE,$bit,1) && $count < length($code)) { $nb = ord($bit); $c |= ($nb & 0x01) << (7 - $b); $b++; if ($b == 8) { $count++; print chr($c); $b = $c = 0; } } close(FILE); } else { @image = generate_image(); $j = 0; while (length($code) > 0) { $char = substr($code,0,1,''); $b=0; for ($i=7;$i>=0;$i--) { $cd = ord($char); $b = (($cd>>$i) & 0x01); $image[$j] &= ~0x01; $image[$j] |= $b; $j++; } } write_image(@image); } sub generate_image() { my @image = (); @tl = (0x00, 0x00, 0x00); @tr = (0x80, 0x40, 0x30); @bl = (0x00, 0xf0, 0x20); @br = (0x30, 0x30, 0x80); @y_d1 = vec_sub(\@bl, \@tl); @y_d1 = vec_scale(\@y_d1, 1/$height); @y_d2 = vec_sub(\@br, \@tr); @y_d2 = vec_scale(\@y_d2, 1/$height); my @y_s = @tl; my @y_e = @tr; for ($y=0; $y<$height; $y++) { @y_s = vec_add(\@y_s, \@y_d1); @y_e = vec_add(\@y_e, \@y_d2); my @x_d = vec_sub(\@y_e, \@y_s); @x_d = vec_scale(\@x_d, 1/$width); my @x_s = @y_s; for ($x=0; $x<$width; $x++) { @x_s = vec_add(\@x_s, \@x_d); $image[3 * $y * $width + 3 * $x + 0] = $x_s[0]; $image[3 * $y * $width + 3 * $x + 1] = $x_s[1]; $image[3 * $y * $width + 3 * $x + 2] = $x_s[2]; } } return @image; } sub vec_add { my ($v1, $v2) = @_; my @v3 = (); my $i; for ($i=0; $i<3; $i++) { $v3[$i] = @{ $v1 }[$i] + @{ $v2 }[$i]; } return @v3; } sub vec_sub { my ($v1, $v2) = @_; my @v3 = vec_scale($v2, -1); return vec_add($v1, \@v3); } sub vec_scale { my ($v1, $k) = @_; my @v2 = (); my $i; for ($i=0; $i<3; $i++) { $v2[$i] = @{ $v1 }[$i] * $k; } return @v2; } sub write_image { my @image = @_; open(FILE, ">out.ppm"); print FILE "P6\n$width $height\n255\n"; foreach $byte (@image) { print FILE chr($byte); } close(FILE); } ^; eval $s;