/******************************************************************/ /* 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 #include #include ////////////////////// // 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. }