summaryrefslogtreecommitdiffstats
path: root/make-kroete2
diff options
context:
space:
mode:
Diffstat (limited to 'make-kroete2')
-rw-r--r--make-kroete2541
1 files changed, 541 insertions, 0 deletions
diff --git a/make-kroete2 b/make-kroete2
new file mode 100644
index 0000000..9441376
--- /dev/null
+++ b/make-kroete2
@@ -0,0 +1,541 @@
+#!/usr/bin/perl
+#
+
+use strict;
+use GD;
+
+my ($size, $imgfile, $file) = @ARGV;
+open my $f, ">$file" or usage();
+binmode $f;
+my ($buf);
+my $res;
+
+my $image = GD::Image->new($imgfile);
+
+my $width = $image->width;
+my $height = $image->height;
+
+my $limit = 200;
+my $middlex = int($width / 2);
+my $middley = int($height / 2);
+print "$width $middlex, $height $middley\n";
+my $index = $image->getPixel($middlex,$middley);
+my ($r,$g,$b) = $image->rgb($index);
+
+if ($r > $limit && $g > $limit && $b > $limit) {
+ die "FATAL: pixel $middlex, $middley must not be white ($r, $g, $b)\n"
+}
+my @data;
+my ($x, $y) = ($middlex, $middley);
+#my @dir = ( [ 2, 0, ['00', '00'] ], [ -2, 0, ['01', '01']], [ 0, 2, ['11', '11']], [0, -2, ['10', '10']], [ 1, 0, ['00'] ], [ -1, 0, ['01'] ], [ 0, 1, ['11'] ], [ 0, -1, ['10']] );
+my @dir = (
+ [ 1, 0, ['00'] ], [ -1, 0, ['01'] ], [ 0, -1, ['11'] ], [ 0, 1, ['10']]
+);
+
+my %done;
+my $prev = $dir[0];
+while (@data < $size * 4) {
+ my $sc = $size;
+ my ($X, $Y);
+ my $cmd;
+ my @d = sort { rand 1 <=> rand 1 } @dir;
+ for my $d ($prev, @d) {
+ my ($dx, $dy, $c) = @$d;
+ my ($nx, $ny) = ($x + $dx, $y + $dy);
+ next if $nx > $width || $nx < 0 || $ny > $height || $ny < 0;
+ my $index = $image->getPixel($nx,$ny);
+ ($r,$g,$b) = $image->rgb($index);
+ #print "Testing $nx, $ny ($r, $g, $b): ";
+ if ($r < $limit && $g < $limit & $b < $limit) {
+ if ($done{$nx}{$ny} <= $sc) {
+ # print "ok";
+ $sc = $done{$nx}{$ny};
+ $cmd = $c;
+ $X = $nx;
+ $Y = $ny;
+ $prev = $d
+ }
+ }
+ #print "\n"
+ }
+ $X || $Y or die "FATAL: wrong pixel use ($X, $Y)";
+ push @data, @$cmd;
+ # mark the neighborhood
+ $done{$X}{$Y} += 4;
+ my $index = $image->getPixel($X+2,$Y);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X+1}{$Y} += 2
+ }
+ my $index = $image->getPixel($X+2,$Y+2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X+1}{$Y+1} += 1;
+ }
+ my $index = $image->getPixel($X+2,$Y-2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X+1}{$Y-1} += 1;
+ }
+ my $index = $image->getPixel($X-2,$Y);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X-1}{$Y} += 2;
+ }
+ my $index = $image->getPixel($X-2,$Y+2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X-1}{$Y+1} += 1;
+ }
+ my $index = $image->getPixel($X-2,$Y-2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r < $limit && $g > $limit && $b > $limit) {
+ $done{$X-1}{$Y-1} += 1;
+ }
+ my $index = $image->getPixel($X,$Y+2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X}{$Y+1} += 2;
+ }
+ my $index = $image->getPixel($X,$Y-2);
+ ($r,$g,$b) = $image->rgb($index);
+ if ($r > $limit && $g > $limit && $b > $limit) {
+ $done{$X}{$Y-1} += 2;
+ }
+ $x = $X;
+ $y = $Y;
+ #print "$X, $Y ($r, $g, $b)\n";
+}
+
+# my $png_data = $image->png;
+# open (DISPLAY,"| display -") || die;
+# binmode DISPLAY;
+# print DISPLAY $png_data;
+# close DISPLAY;
+
+my $im = new GD::Image($width,$height) || die;
+my $black = $im->colorAllocate(0,0,0);
+my $white = $im->colorAllocate(255,255,255);
+my $x = $middlex;
+my $y = $middley;
+
+for (my $i; $i < @data; $i += 4) {
+ my $cmd;
+ for (my $j; $j < 4; $j++) {
+ my $n = $data[$i+$j];
+ $cmd .= $n;
+ if ($n eq '00') {
+ $x++
+ } elsif ($n eq '01') {
+ $x--
+ } elsif ($n eq '10') {
+ $y++
+ } elsif ($n eq '11') {
+ $y--
+ }
+ $im->setPixel($x,$y,$white)
+ }
+ my $val = unpack('C', pack('b8', $cmd));
+ my $cal = $val ^ 0xaa;
+ print $f pack('C', $cal);
+}
+my $png_data = $im->png;
+open (DISPLAY,"| display -") || die;
+binmode DISPLAY;
+print DISPLAY $png_data;
+close DISPLAY;
+
+my $left = (($size * 4) - @data);
+$buf = '00010001' x $left;
+my $count = $left*8;
+$res = pack("b$count", $buf);
+print $f $res;
+close $f;
+exit;
+
+# 00 right
+# 01 left
+# 10 bottom
+# 11 top
+
+my @data = (qw(
+ # moon
+01010101
+01100110
+01100110
+01100110
+01100110
+01011001
+01011001
+01010110
+01010110
+01010101
+10010101
+01010101
+10010101
+01010101
+01010111
+01010111
+01011101
+01110111
+01110111
+01110111
+01111111
+01111111
+01111111
+11111111
+11111101
+11111101
+11111111
+11111111
+11111111
+11111100
+11111111
+11111111
+11111100
+11111111
+11111100
+11111100
+11111100
+11111100
+11001100
+11111100
+11001100
+11111100
+11111100
+11001100
+11001100
+11111111
+01110111
+01010110
+01100110
+01100110
+01100110
+10100110
+01101010
+01100110
+01101010
+10101010
+10011010
+01101010
+10101010
+10100110
+10101010
+10100110
+10101010
+10101010
+10101010
+10101010
+10101010
+10101010
+10101010
+10101000
+10101010
+10101010
+10101000
+10101010
+10101000
+10101000
+10101000
+10001000
+10101000
+10001000
+10001000
+10000000
+10001000
+10000000
+10001000
+10000000
+10000000
+10000000
+00000000
+10000000
+00000000
+00000011
+00000011
+00110011
+00110011
+00110011
+00110011
+11110011
+11001100
+11001100
+11111100
+11111100
+11111111
+11111100
+11111111
+11111111
+00001000
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00100010
+00110011
+00111111
+11111111
+11111111
+11111111
+11111101
+11111111
+11111111
+11111111
+11111111
+11111111
+11111101
+11111111
+11111111
+11111111
+11001111
+11001111
+11001100
+11001100
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+11000000
+10101001
+10101001
+10101001
+10101001
+10101001
+00100010
+00000011
+11111100
+11111100
+11111100
+11111100
+11111100
+10001000
+10001010
+10001000
+10001010
+10001000
+10001010
+00000011
+11110111
+01110111
+01111111
+01110111
+01111111
+11110000
+00000000
+00000000
+00000011
+00111101
+11010101
+01010101
+01010101
+01010101
+11001100
+11111100
+11001100
+11111100
+11001100
+11111111
+11010111
+01100110
+10101001
+10101001
+10011001
+10101001
+10011001
+10011011
+11011101
+11111101
+11011101
+11111101
+11011101
+11011101
+10011001
+00101010
+10001000
+10001000
+10101000
+10001000
+10101000
+11011101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11010101
+11011101
+11011111
+11011101
+11011111
+11011111
+11011111
+11011111
+11011111
+11111111
+11011111
+11111111
+11011111
+11111111
+11011111
+11111111
+11011101
+11010101
+01100110
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100110
+01101010
+01100101
+01011101
+01011101
+01001101
+01011101
+01010101
+01011101
+01010101
+01011101
+01010101
+01010101
+01110101
+01010101
+01110101
+01100110
+10100010
+10100010
+10001000
+10001010
+10001000
+10001010
+10001000
+10001010
+10001000
+10001010
+10001000
+10001010
+10011010
+10101001
+10101010
+10011010
+10011001
+10101001
+10011001
+10101001
+10011001
+10101001
+10011001
+10101001
+10011001
+10101001
+10100010
+10001000
+00000011
+00000000
+00000011
+00000000
+00000011
+00000000
+00000011
+00000000
+00000011
+00000000
+00000011
+00000000
+00000010
+10001000
+)
+);
+
+# my $c;
+# for (my $i; $i < 256; $i++) {
+# for (my $j; $j < 32; $j++) {
+# my $cal = $c ^ 0xaa;
+# print $f pack('C', $cal);
+# }
+# for (my $j; $j < 32; $j++) {
+# my $val = unpack('C', pack('b8', '00000000'));
+# my $cal = $val ^ 0xaa;
+# print $f pack('C', $cal);
+# }
+# $c++;
+# }
+my $im = new GD::Image(400,400) || die;
+my $black = $im->colorAllocate(0,0,0);
+my $white = $im->colorAllocate(255,255,255);
+my $x = 200;
+my $y = 200;
+for (my $i; $i < @data; $i++) {
+ foreach my $n ($data[$i] =~ /([01]{2})/g){
+ if ($n eq '00') {
+ $x++
+ } elsif ($n eq '01') {
+ $x--
+ } elsif ($n eq '10') {
+ $y++
+ } elsif ($n eq '11') {
+ $y--
+ }
+ $im->setPixel($x,$y,$white)
+ }
+ my $val = unpack('C', pack('b8', $data[$i]));
+ my $cal = $val ^ 0xaa;
+ print $f pack('C', $cal);
+}
+my $png_data = $im->png;
+open (DISPLAY,"| display -") || die;
+binmode DISPLAY;
+print DISPLAY $png_data;
+close DISPLAY;
+
+my $left = (16384 - @data);
+$buf = '00010001' x $left;
+my $count = $left*8;
+$res = pack("b$count", $buf);
+print $f $res;
+close $f;
+exit;
+
+sub usage {
+ print "\nusage:\n\n\t\tperl-kroete <size> <image file> <output file>\n\n";
+ exit
+}
+