--- /dev/null
+#include <creaImageIORFImageReader.h>
+#include <creaVtk.h>
+#include <creaImageIOSystem.h>
+#include "boost/filesystem/path.hpp"
+
+namespace creaImageIO
+{
+#define HEADER_SIZE 19
+
+ void read_header_rf_file(FILE *rf_file,int *w,int *h,int *n_frame)
+ {
+ int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+ fread(header,sizeof(int),HEADER_SIZE,rf_file);
+ *n_frame=header[1];
+ *w=header[2];
+ *h=header[3];
+ free(header);
+ }
+
+ //=====================================================================
+ RFImageReader::RFImageReader()
+ {
+ SetName("rf");
+ }
+ //=====================================================================
+
+ //=====================================================================
+ RFImageReader::~RFImageReader()
+ {
+ }
+ //=====================================================================
+
+ //=====================================================================
+ struct rf_header
+ {
+ // frames, width, height
+ int frame,width,height;
+ };
+ //=====================================================================
+
+
+ //=====================================================================
+ bool ReadHeader( FILE *rf_file, rf_header& h )
+ {
+ int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+ fread(header,sizeof(int),HEADER_SIZE,rf_file);
+ h.frame = header[1];
+ h.width = header[2];
+ h.height = header[3];
+ free(header);
+ return true;
+ }
+ //=====================================================================
+
+ //=====================================================================
+ bool RFImageReader::CanRead(const std::string& filename)
+ {
+ bool ok = false;
+ FILE *rf_file=fopen(filename.c_str(),"rb");
+ if (rf_file)
+ {
+ rf_header h;
+ ok = ReadHeader(rf_file,h);
+ }
+ fclose(rf_file);
+ return ok;
+ }
+ //=====================================================================
+
+ //=====================================================================
+ vtkImageData* RFImageReader::ReadImage(const std::string& filename)
+ {
+ FILE *rf_file=fopen(filename.c_str(),"rb");
+ if (!rf_file) return false;
+ rf_header h;
+ if (!ReadHeader(rf_file,h))
+ {
+ fclose(rf_file);
+ return 0;
+ }
+
+ long im_size = h.height * h.width * h.frame;
+ short* data = (short*)malloc(sizeof(short)*im_size);
+
+ long frame_size = h.height * h.width * sizeof(short);
+ short* ptr = data;
+ for (int k=0; k<h.frame; k++) {
+ int frame_number;
+ fread(&frame_number,sizeof(int),1,rf_file);
+ fread(ptr,sizeof(short),frame_size,rf_file);
+ ptr += frame_size;
+ }
+ fclose(rf_file);
+
+
+ return crea::NewVtkImageDataFromRaw( data,
+ im_size);
+
+ }
+ //=====================================================================
+
+
+ //=====================================================================
+ void RFImageReader::PushBackExtensions(std::vector<std::string>& v)
+ {
+ v.push_back("rf");
+ }
+ //=====================================================================
+
+
+
+ //=====================================================================
+ void RFImageReader::ReadAttributes(const std::string& filename,
+ std::map<std::string,std::string>& attr)
+ {
+ // std::cout << "RFImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
+ GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
+
+
+ FILE *rf_file=fopen(filename.c_str(),"rb");
+ if (!rf_file) return;
+ rf_header h;
+ if (!ReadHeader(rf_file,h))
+ {
+ fclose(rf_file);
+ return;
+ }
+ fclose(rf_file);
+
+ // Columns
+ char cols[128];
+ sprintf(cols,"%i",h.width);
+ // Rows
+ char rows[128];
+ sprintf(rows,"%i",h.height);
+ // Planes
+ char planes[128];
+ sprintf(planes,"%i",h.frame);
+
+
+ //
+ std::map<std::string,std::string>::iterator i;
+ if ( (i = attr.find("FullFileName")) != attr.end())
+ {
+ // boost::filesystem::path full_path(filename);
+ // std::string f = full_path.leaf();
+ i->second = filename;
+ }
+ if ( (i = attr.find("D0004_1500")) != attr.end())
+ {
+ boost::filesystem::path full_path(filename);
+ std::string f = full_path.leaf();
+ i->second = f;
+ }
+ if ( (i = attr.find("D0028_0010")) != attr.end())
+ {
+ i->second = rows;
+ }
+ if ( (i = attr.find("D0028_0011")) != attr.end())
+ {
+ i->second = cols;
+ }
+
+ if ( (i = attr.find("D0028_0012")) != attr.end())
+ {
+ i->second = planes;
+ }
+
+ GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
+ }
+ //=====================================================================
+
+} // namespace creaImageIO
--- /dev/null
+#ifndef __creaImageIORFImageReader_h_INCLUDED__
+#define __creaImageIORFImageReader_h_INCLUDED__
+
+
+#include <creaImageIOAbstractImageReader.h>
+
+
+namespace creaImageIO
+{
+
+
+ /**
+ * \ingroup IO
+ */
+
+ //=====================================================================
+ /// Concrete image reader for ultrasonix 'rf' files
+ class RFImageReader : virtual public AbstractImageReader
+ {
+ public:
+ RFImageReader();
+
+ virtual ~RFImageReader();
+
+ virtual void PushBackExtensions(std::vector<std::string>&);
+ virtual bool CanRead(const std::string& filename);
+ virtual vtkImageData* ReadImage(const std::string& filename);
+ virtual void ReadAttributes(const std::string& filename,
+ tree::AttributeMapType& attr);
+
+ };
+ //=====================================================================
+
+
+
+} // namespace creaImageIO
+
+
+
+#endif // #ifndef __creaImageIORFImageReader_h_INCLUDED__