diff --git a/08/solution.c b/08/solution.c index aa3f083..b7e518f 100644 --- a/08/solution.c +++ b/08/solution.c @@ -1,10 +1,41 @@ #include #include #include +#include #include #include #include +int vis(const char *outpath, const char *in, size_t w, size_t h, size_t stride) { + int fd = open(outpath, O_CREAT | O_RDWR | O_NONBLOCK, 0644); + if (fd == -1) return 1; + + char head[128]; + size_t ps = snprintf(head, 128, "P6\n%lu %lu\n255\n", w, h); + if (ps >= 128) return 1; + size_t mapsiz = ps + w * h * 3; + ftruncate(fd, mapsiz); + unsigned char *o = mmap(NULL, mapsiz, PROT_WRITE, MAP_SHARED, fd, 0); + if (o == MAP_FAILED) return 1; + unsigned char *out = o; + strncpy((char*)out, head, ps); + out += ps; + + for(size_t y = 0; y < h; y++) { + for (size_t x = 0; x < w; x++) { + int val = in[stride * y + x] - '0'; + float v = val * 0.75 / 10.0; + unsigned char *b = out + w * y * 3 + x * 3; + *b++ = 180 * v / 3; + *b++ = 220 * v; + *b++ = 150 * v / 1.8; + } + } + + munmap(o, mapsiz); + return close(fd); +} + int main(int argc, char **argv) { if (argc < 2) return 1; @@ -22,6 +53,16 @@ int main(int argc, char **argv) { size_t visible = w * 2 + (h - 2) * 2; size_t maxscore = 0; + if (argc > 2) { + printf("Writing %s... ", argv[2]); + fflush(stdout); + if (vis(argv[2], in, w, h, stride)) { + perror(""); + return 1; + } + printf("Done!\n"); + } + #pragma omp parallel for reduction(+:visible) reduction(max:maxscore) schedule(runtime) for (size_t y = 1; y < h - 1; y++) { for (size_t x = 1; x < w - 1; x++) {