summaryrefslogtreecommitdiff
path: root/libraries/daguerre/ppm.cpp
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2024-01-20 17:59:40 -0500
committerBenji Dial <benji@benjidial.net>2024-01-20 17:59:40 -0500
commit7199e74aa22e592a3b77bdd81f735edca5470596 (patch)
tree66e935372acc5d6e013f764965f2a9d81814f809 /libraries/daguerre/ppm.cpp
parent53135e2592c21cb9b2609bf95242aaf1f19233da (diff)
downloadhilbert-os-7199e74aa22e592a3b77bdd81f735edca5470596.tar.gz
update
Diffstat (limited to 'libraries/daguerre/ppm.cpp')
-rw-r--r--libraries/daguerre/ppm.cpp52
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;
+
+ }
+
+}