summaryrefslogtreecommitdiff
path: root/libraries/daguerre/ppm.cpp
diff options
context:
space:
mode:
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;
+
+ }
+
+}