// Generate random images from a DAG quadtree. // Except this is doing the iteration inside-out, with a very interesting effect
#include <stdio.h> #include <stdlib.h> #include <unistd.h> enum { n_levels = 9, n_nodes = 8 }; static unsigned char tree[n_levels][n_nodes][4]; /* static unsigned char palette[256][3]; */ static void randomize() { fread(tree, sizeof(tree), 1, stdin); /* for (size_t ii = 0; ii < sizeof(tree); ii++) */ /* ((char*)tree)[ii] = random(); */ /* for (size_t ii = 0; ii < sizeof(palette); ii++) */ /* ((char*)palette)[ii] = random(); */ } static int pixel(int zorder) { int nn = 0; for (int ii = 0; ii < n_levels; ii++) nn = tree[ii][nn & (n_nodes - 1)][zorder >> 2 * ii & 3]; return nn; } // Copied and pasted from Hacker's Delight: // Perfect outer shuffle coded as swaps [GLS] (30 Brisc instructions). unsigned shuffle2(unsigned x) { unsigned t; t = (x ^ (x >> 8)) & 0x0000FF00; x = x ^ t ^ (t << 8); t = (x ^ (x >> 4)) & 0x00F000F0; x = x ^ t ^ (t << 4); t = (x ^ (x >> 2)) & 0x0C0C0C0C; x = x ^ t ^ (t << 2); t = (x ^ (x >> 1)) & 0x22222222; x = x ^ t ^ (t << 1); return x; } static void generate_ppm() { printf("P6\n%d %d\n255\n", 1 << n_levels, 1 << n_levels); for (int yy = 0; yy < 1 << n_levels; yy++) for (int xx = 0; xx < 1 << n_levels; xx++) { int pix = pixel(shuffle2(yy << 16 | xx)); putchar(pix); putchar(pix); putchar(pix); /* fwrite(&palette[pix], 3, 1, stdout); */ } } int main(int argc, char **argv) { srandom((argc == 1) ? getpid() : atoi(argv[1])); randomize(); generate_ppm(); return 0; } -- To unsubscribe: http://lists.canonical.org/mailman/listinfo/kragen-hacks