#include #include #include #include #include #include #include #include #include #include #include #include #define FILENAME "Areas" #define MAPW 800 #define MAPH 720 #define FASTCOLUMNS typedef int int32; typedef struct { int32 width, height; int32 next_x, next_y; } header_t; unsigned char map[MAPH*MAPW]; unsigned char *Data; header_t *header; double scale; void Error(char *msg) { fprintf(stderr, "%s\n", msg); exit(1); } void openmap(const char *filename) { int Data_fd = open(filename, O_RDONLY); off_t Data_length; if (Data_fd == -1) Error("open failed"); Data_length = lseek(Data_fd, 0, SEEK_END); fprintf(stderr, "%ld bytes\n", (long) Data_length); lseek(Data_fd, 0, SEEK_SET); Data = mmap(NULL, Data_length, PROT_READ, MAP_SHARED, Data_fd, 0); if (Data == MAP_FAILED) Error("mmap failed"); #ifndef FASTCOLUMNS if (madvise(Data, Data_length, MADV_SEQUENTIAL) < 0) perror("madvise warning"); #endif header = (header_t*) Data; double scale1 = (MAPW-0.5) / (header->width * 5); double scale2 = (MAPH-0.5) / header->height; if (scale1 < scale2) scale = scale1; else scale = scale2; fprintf(stderr, "scaling down %.1f times\n", 1.0 / scale); } void processmap(void) { int width = header->width; int height = header->height; int x, y, i; unsigned char *p = Data + height; unsigned char *mapcolumn, *prevcol; double dx = 0.0; double dy; memset(map, 255, sizeof(map)); x = ((int)(width * scale * 5.0)) - 1; for (y=0; y= 0 && y > 0) { int mx = (int) x * scale * 5.0; int my = (int) y * scale; while (my < MAPH) { map[mx * MAPH + my] = 192; my++; } } offset += PAGESIZE - 1; x = offset / height - 1; y = offset % height; if (1) { int mx = (int) x * scale * 5.0; int my = (int) y * scale; while (my >= 0) { map[mx * MAPH + my] = 192; my--; } } } prevcol = NULL; for (x=1; xwidth * scale * 5.0); int maph = (int)(header->height * scale); printf("P5\n"); printf("%d %d\n", mapw, maph); printf("255\n"); for (y=0; y 1) filename = argv[1]; else filename = FILENAME; openmap(filename); processmap(); outputpgm(); return 0; }