TuttleOFX  1
J2KReader.hpp
Go to the documentation of this file.
00001 #ifndef _J2KREADER_HPP_
00002 #define _J2KREADER_HPP_
00003 
00004 #include "J2KCommon.hpp"
00005 
00006 #include <tuttle/plugin/global.hpp>
00007 
00008 #include <openjpeg.h>
00009 
00010 #include <boost/scoped_array.hpp>
00011 #include <boost/filesystem/fstream.hpp>
00012 
00013 #include <string>
00014 
00015 namespace tuttle {
00016 namespace io {
00017 
00018 class J2KReader
00019 {
00020 public:
00021         J2KReader();
00022         virtual ~J2KReader();
00023 
00024         void open(const std::string & filename);
00025         void decode(bool headeronly = false);
00026         void close();
00027         inline bool componentsConform();                                                        ///< Check if components have the same properties
00028         // Getters
00029         inline const size_t components() const;                                         ///< Get number of components
00030         inline const size_t width(const size_t nc = 0) const;           ///< Get width of nc component
00031         inline const size_t height(const size_t nc = 0) const;          ///< Get height of nc component
00032         inline const size_t precision(const size_t nc = 0) const;       ///< Get precision of nc component
00033         inline const uint8_t *compData(const size_t nc) const;          ///< Get the nc component data
00034         inline bool imageReady() const;                                                         ///< Is image ready?
00035 private:
00036         OpenJpegStuffs _openjpeg;   ///< OpenJpeg 2000 structs
00037         uint8_t *_fileData;                     ///< Image data
00038         std::ssize_t   _dataLength;      ///< Data length
00039 };
00040 
00041 inline bool J2KReader::imageReady() const
00042 {
00043         return _openjpeg.image && _fileData;
00044 }
00045 
00046 inline bool J2KReader::componentsConform()
00047 {
00048         size_t nc = components();
00049         if (nc > 0)
00050         {
00051                 size_t i = 1;
00052                 bool ret = true;
00053                 size_t w = width();
00054                 size_t h = height();
00055                 size_t prec = precision();
00056                 while(ret && i < nc)
00057                 {
00058                         if (width(i) != w || height(i) != h || precision(i) != prec)
00059                         {
00060                                 ret = false;
00061                         }
00062                         ++i;
00063                 }
00064                 return ret;
00065         }
00066         return false;
00067 }
00068 
00069 inline const size_t J2KReader::components() const
00070 {
00071         if (!_openjpeg.image)
00072         {
00073                 return 0;
00074         }
00075         else
00076         {
00077                 return _openjpeg.image->numcomps;
00078         }
00079 }
00080 
00081 inline const size_t J2KReader::width(const size_t nc /*= 0*/) const
00082 {
00083         if (!_openjpeg.image)
00084         {
00085                 return 0;
00086         }
00087         else
00088         {
00089                 return _openjpeg.image->x1 - _openjpeg.image->x0;
00090         }
00091 }
00092 
00093 inline const size_t J2KReader::height(const size_t nc /*= 0*/) const
00094 {
00095         if (!_openjpeg.image)
00096         {
00097                 return 0;
00098         }
00099         else
00100         {
00101                 return _openjpeg.image->y1 - _openjpeg.image->y0;
00102         }
00103 }
00104 
00105 inline const size_t J2KReader::precision(const size_t nc /*= 0*/) const
00106 {
00107         if (!_openjpeg.image)
00108         {
00109                 return 0;
00110         }
00111         else
00112         {
00113                 assert(nc < components());
00114                 return _openjpeg.image->comps[nc].prec;
00115         }
00116 }
00117 
00118 /// @warning data are int packed!
00119 inline const uint8_t *J2KReader::compData(const size_t nc) const
00120 {
00121         if (!_openjpeg.image)
00122         {
00123                 return NULL;
00124         }
00125         else
00126         {
00127                 assert(nc < components());
00128                 return (uint8_t *)_openjpeg.image->comps[nc].data;
00129         }
00130 }
00131 
00132 }
00133 }
00134 
00135 #endif
00136