#include namespace daguerre { image get_hilbert_framebuffer() { uint32_t width, height, pitch; hilbert_color *ptr = __euler_get_framebuffer(width, height, pitch); return image(ptr, width, height, pitch, false); } //TODO: make this more robust unsigned read_text_int(std::FILE *input) { unsigned n = 0; char ch; std::fread(&ch, 1, 1, input); if (ch == '#') { do std::fread(&ch, 1, 1, input); while (ch != '\n'); std::fread(&ch, 1, 1, input); } do { n = n * 10 + ch - '0'; std::fread(&ch, 1, 1, input); } while (ch >= '0' && ch <= '9'); return n; } bool try_load_ppm(std::FILE *input, image &into) { char header[3]; if (std::fread(header, 1, 3, input) != 3) return false; if (header[0] != 'P' || header[1] != '6' || header[2] != '\n') return false; unsigned width = read_text_int(input); unsigned height = read_text_int(input); unsigned max = read_text_int(input); into = image(width, height); for (unsigned y = 0; y < height; ++y) for (unsigned x = 0; x < width; ++x) { if (std::fread(&into.buffer[y * width + x].r, 1, 1, input) != 1) return false; if (std::fread(&into.buffer[y * width + x].g, 1, 1, input) != 1) return false; if (std::fread(&into.buffer[y * width + x].b, 1, 1, input) != 1) return false; } if (max != 255) for (unsigned v = 0; v < width * height; ++v) { into.buffer[v].r = ((uint16_t)into.buffer[v].r * 255) / max; into.buffer[v].g = ((uint16_t)into.buffer[v].g * 255) / max; into.buffer[v].b = ((uint16_t)into.buffer[v].b * 255) / max; } return true; } }