summaryrefslogtreecommitdiff
path: root/hw6/src/imageIO.pfm.cpp
diff options
context:
space:
mode:
author53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
committer53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
commitdb072ad4dc181eca5a1458656b130beb43f475bf (patch)
treea3c03c7f5497cb70503e2486662fa85cfb53415a /hw6/src/imageIO.pfm.cpp
downloadcsci427-master.tar.xz
csci427-master.zip
Diffstat (limited to 'hw6/src/imageIO.pfm.cpp')
-rw-r--r--hw6/src/imageIO.pfm.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/hw6/src/imageIO.pfm.cpp b/hw6/src/imageIO.pfm.cpp
new file mode 100644
index 0000000..30d1c23
--- /dev/null
+++ b/hw6/src/imageIO.pfm.cpp
@@ -0,0 +1,88 @@
+/******************************************************************/
+/* This file is part of the homework assignments for CSCI-427/527 */
+/* at The College of William & Mary and authored by Pieter Peers. */
+/* No part of this file, whether altered or in original form, can */
+/* be distributed or used outside the context of CSCI-427/527 */
+/* without consent of either the College of William & Mary or */
+/* Pieter Peers. */
+/******************************************************************/
+#include "imageIO.pfm.h"
+#include "errorMessage.h"
+
+#include <memory>
+#include <cassert>
+#include <fstream>
+
+
+//////////////////////
+// Helper functions //
+//////////////////////
+static void skipToNewline(std::ifstream& ifs)
+{
+ while(ifs.get() != '\n' && ifs.good());
+}
+
+static void skipComments(std::ifstream& ifs)
+{
+ while(!ifs.eof() && ifs.peek() == '#') skipToNewline(ifs);
+}
+
+
+////////////////
+// Import PFM //
+////////////////
+void importPFM(const std::string& name, image& img)
+{
+ // open file
+ std::ifstream ifs(name.c_str(), std::ifstream::binary);
+ if(!ifs.is_open()) errorMessage("Unable to open file: '%s'.", name.c_str());
+
+ // read header
+ std::string magicMark;
+ ifs >> magicMark;
+ skipToNewline(ifs);
+ if(magicMark != "PF") errorMessage("Unsupported PFM format (%s).", magicMark.c_str());
+
+ // read width and height
+ image::size_type width, height;
+ skipComments(ifs);
+ ifs >> width >> height;
+ skipToNewline(ifs);
+
+ // allocate
+ img = image(width, height);
+
+ // check magic number (again)
+ skipComments(ifs);
+ ifs >> magicMark;
+ skipToNewline(ifs);
+ if(magicMark != "-1.000000") errorMessage("Unsupported byte-order in PFM.");
+
+ // read directly in float image
+ ifs.read((char *)(img.begin()), img.size() * sizeof(color));
+
+ // Done.
+}
+
+
+////////////////
+// Export PFM //
+////////////////
+void exportPFM(const std::string& name, const image& img)
+{
+ // sanity check
+ assert(img.width() != 0 && img.height() != 0);
+
+ // open file
+ std::ofstream ofs(name.c_str(), std::ofstream::binary);
+ if(!ofs.is_open()) errorMessage("Unable to open file: '%s'.", name.c_str());
+
+ // write header
+ ofs << "PF\n" << img.width() << " " << img.height() << "\n-1.000000\n";
+
+ // write float buffer
+ ofs.write((const char*)(img.begin()), img.size() * sizeof(color));
+
+ // Done.
+}
+