diff options
author | Benji Dial <benji@benjidial.net> | 2024-01-20 17:59:40 -0500 |
---|---|---|
committer | Benji Dial <benji@benjidial.net> | 2024-01-20 17:59:40 -0500 |
commit | 7199e74aa22e592a3b77bdd81f735edca5470596 (patch) | |
tree | 66e935372acc5d6e013f764965f2a9d81814f809 /libraries/daguerre/ppm.cpp | |
parent | 53135e2592c21cb9b2609bf95242aaf1f19233da (diff) | |
download | hilbert-os-7199e74aa22e592a3b77bdd81f735edca5470596.tar.gz |
update
Diffstat (limited to 'libraries/daguerre/ppm.cpp')
-rw-r--r-- | libraries/daguerre/ppm.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libraries/daguerre/ppm.cpp b/libraries/daguerre/ppm.cpp new file mode 100644 index 0000000..e909503 --- /dev/null +++ b/libraries/daguerre/ppm.cpp @@ -0,0 +1,52 @@ +#include <daguerre/image.hpp> +#include <cctype> + +namespace daguerre { + + static unsigned read_int(std::FILE *from) { + unsigned out = 0; + int ch; + do + ch = std::fgetc(from); + while (std::isspace(ch)); + while (true) { + if (ch == EOF) + return out; + if (ch < '0' || ch > '9') { + std::ungetc(ch, from); + return out; + } + out = out * 10 + (ch - '0'); + ch = std::fgetc(from); + } + } + + bool try_load_ppm(std::FILE *from, image<color24> &into) { + + if (std::fgetc(from) != 'P' || std::fgetc(from) != '6' || + std::fgetc(from) != '\n') + return false; + + unsigned width = read_int(from); + unsigned height = read_int(from); + unsigned max = read_int(from); + std::fgetc(from);//newline + + if (max != 255) + return false; + + into = image<color24>(width, height); + color24 *buffer = into.get_buffer(); + + for (unsigned y = 0; y < height; ++y) + for (unsigned x = 0; x < width; ++x) { + buffer[y * width + x].r = std::fgetc(from); + buffer[y * width + x].g = std::fgetc(from); + buffer[y * width + x].b = std::fgetc(from); + } + + return true; + + } + +} |