RefPtr<Handler::Base> MRtrix_GZ::read (Header& H) const { if (!Path::has_suffix (H.name(), ".mif.gz")) return RefPtr<Handler::Base>(); File::GZ zf (H.name(), "r"); std::string first_line = zf.getline(); if (first_line != "mrtrix image") { zf.close(); throw Exception ("invalid first line for compressed image \"" + H.name() + "\" (expected \"mrtrix image\", read \"" + first_line + "\")"); } read_mrtrix_header (H, zf); zf.close(); std::string fname; size_t offset; get_mrtrix_file_path (H, "file", fname, offset); if (fname != H.name()) throw Exception ("GZip-compressed MRtrix format images must have image data within the same file as the header"); std::stringstream header; header << "mrtrix image\n"; write_mrtrix_header (H, header); offset = header.str().size() + size_t(24); offset += ((4 - (offset % 4)) % 4); header << "file: . " << offset << "\nEND\n"; RefPtr<Handler::Base> handler (new Handler::GZ (H, offset)); memcpy (reinterpret_cast<Handler::GZ*>((Handler::Base*)handler)->header(), header.str().c_str(), header.str().size()); memset (reinterpret_cast<Handler::GZ*>((Handler::Base*)handler)->header() + header.str().size(), 0, offset - header.str().size()); handler->files.push_back (File::Entry (H.name(), offset)); return handler; }
std::unique_ptr<ImageIO::Base> MRtrix::create (Header& H) const { File::OFStream out (H.name(), std::ios::out | std::ios::binary); out << "mrtrix image\n"; write_mrtrix_header (H, out); bool single_file = Path::has_suffix (H.name(), ".mif"); int64_t offset = 0; out << "file: "; if (single_file) { offset = out.tellp() + int64_t(18); offset += ((4 - (offset % 4)) % 4); out << ". " << offset << "\nEND\n"; } else out << Path::basename (H.name().substr (0, H.name().size()-4) + ".dat") << "\n"; out.close(); std::unique_ptr<ImageIO::Base> io_handler (new ImageIO::Default (H)); if (single_file) { File::resize (H.name(), offset + footprint(H)); io_handler->files.push_back (File::Entry (H.name(), offset)); } else { std::string data_file (H.name().substr (0, H.name().size()-4) + ".dat"); File::create (data_file, footprint(H)); io_handler->files.push_back (File::Entry (data_file)); } return io_handler; }
std::shared_ptr<Handler::Base> MRtrix_sparse::create (Header& H) const { Header::const_iterator name_it = H.find (Image::Sparse::name_key); if (name_it == H.end()) throw Exception ("Cannot create sparse image " + H.name() + "; no knowledge of underlying data class type"); Header::const_iterator size_it = H.find (Image::Sparse::size_key); if (size_it == H.end()) throw Exception ("Cannot create sparse image " + H.name() + "; no knowledge of underlying data class size"); H.datatype() = DataType::UInt64; H.datatype().set_byte_order_native(); File::OFStream out (H.name(), std::ios::out | std::ios::binary); out << "mrtrix sparse image\n"; write_mrtrix_header (H, out); bool single_file = Path::has_suffix (H.name(), ".msf"); int64_t image_offset = 0, sparse_offset = 0; std::string image_path, sparse_path; if (single_file) { image_offset = out.tellp() + int64_t(54); image_offset += ((4 - (image_offset % 4)) % 4); sparse_offset = image_offset + Image::footprint(H); out << "file: . " << image_offset << "\nsparse_file: . " << sparse_offset << "\nEND\n"; File::resize (H.name(), sparse_offset); image_path = H.name(); sparse_path = H.name(); } else { image_path = Path::basename (H.name().substr (0, H.name().size()-4) + ".dat"); sparse_path = Path::basename (H.name().substr (0, H.name().size()-4) + ".sdat"); out << "file: " << image_path << "\nsparse_file: " << sparse_path << "\nEND\n"; File::create (image_path, Image::footprint(H)); File::create (sparse_path); } Handler::Default base_handler (H); base_handler.files.push_back (File::Entry (image_path, image_offset)); std::shared_ptr<Handler::Base> handler (new Handler::Sparse (base_handler, name_it->second, to<size_t>(size_it->second), File::Entry (sparse_path, sparse_offset))); return handler; }
RefPtr<Image::Handler::Base> MRtrix_GZ::create (Header& H) const { std::stringstream header; header << "mrtrix image\n"; write_mrtrix_header (H, header); int64_t offset = header.tellp() + int64_t(24); offset += ((4 - (offset % 4)) % 4); header << "file: . " << offset << "\nEND\n"; while (header.tellp() < offset) header << '\0'; RefPtr<Handler::GZ> handler (new Handler::GZ (H, offset)); memcpy (handler->header(), header.str().c_str(), offset); File::create (H.name()); handler->files.push_back (File::Entry (H.name(), offset)); return handler; }
RefPtr<Handler::Base> MRtrix::create (Header& H) const { if (!File::is_tempfile (H.name())) File::create (H.name()); std::ofstream out (H.name().c_str(), std::ios::out | std::ios::binary); if (!out) throw Exception ("error creating file \"" + H.name() + "\":" + strerror (errno)); out << "mrtrix image\n"; write_mrtrix_header (H, out); bool single_file = Path::has_suffix (H.name(), ".mif"); int64_t offset = 0; out << "file: "; if (single_file) { offset = out.tellp() + int64_t(18); offset += ((4 - (offset % 4)) % 4); out << ". " << offset << "\nEND\n"; } else out << Path::basename (H.name().substr (0, H.name().size()-4) + ".dat") << "\n"; out.close(); RefPtr<Handler::Base> handler (new Handler::Default (H)); if (single_file) { File::resize (H.name(), offset + Image::footprint(H)); handler->files.push_back (File::Entry (H.name(), offset)); } else { std::string data_file (H.name().substr (0, H.name().size()-4) + ".dat"); File::create (data_file, Image::footprint(H)); handler->files.push_back (File::Entry (data_file)); } return handler; }