osg::DATImageFileType Class Reference
[Image]

DAT File Handler. Used to read/write DAT/RAW files. See Image for a detailed description. More...

#include <OSGDATImageFileType.h>

Inheritance diagram for osg::DATImageFileType:

osg::ImageFileType

List of all members.

Safe Store/Restore



UInt64 store (const ImagePtr &image, UChar8 *buffer, Int32 memSize=-1)
virtual UInt64 maxBufferSize (const ImagePtr &image)
static UInt64 restore (ImagePtr &image, const UChar8 *buffer, Int32 memSize=-1)
static UInt64 store (const ImagePtr &image, const char *mimeType, UChar8 *buffer, Int32 memSize=-1)

Public Types

Flags


enum  { OSG_READ_SUPPORTED = 1, OSG_WRITE_SUPPORTED = 2 }

Public Member Functions

Destructor


virtual ~DATImageFileType (void)
Read/Write


virtual bool read (ImagePtr &image, const Char8 *fileName)
virtual bool write (const ImagePtr &image, const Char8 *fileName)
Buffer


virtual UInt64 restoreData (ImagePtr &image, const UChar8 *buffer, Int32 memSize=-1)
virtual UInt64 storeData (const ImagePtr &image, UChar8 *buffer, Int32 memSize=-1)
Set


void setOptions (const Char8 *options)
Get Methods


const Char8getMimeType (void) const
const std::list< IDString > & getSuffixList (void) const
virtual UInt32 getFlags (void) const
const Char8getOptions (void)
Read/Write


virtual bool read (ImagePtr &image, std::istream &is, const std::string &mimetype)
virtual bool write (const ImagePtr &image, std::ostream &os, const std::string &mimetype)
virtual bool validateHeader (const Char8 *fileName, bool &implemented)
virtual std::string determineMimetypeFromStream (std::istream &is)
dump


void dump (void)

Static Public Member Functions

Get Methods


static DATImageFileTypethe (void)

Protected Member Functions

Default Constructor


 DATImageFileType (const Char8 *mimeType, const Char8 *suffixArray[], UInt16 suffixByteCount)

Protected Attributes

MTD Header


std::string _options

Private Types

enum  KeyType {
  UNKNOWN_KT = 0, OBJECT_FILE_NAME_KT, RESOLUTION_KT, SLICE_THICKNESS_KT,
  FORMAT_KT, FILE_OFFSET_KT, CHANNEL_KT, ENDIAN_KT
}

Private Member Functions

Copy Constructor


 DATImageFileType (const DATImageFileType &obj)
Copy Operator


const DATImageFileTypeoperator= (const DATImageFileType &obj)

Static Private Member Functions

static void initTypeMap (void)

Static Private Attributes

static DATImageFileType _the
static std::map< std::string,
KeyType
_keyStrMap
static std::map< std::string,
FormatDesc
_formatStrMap

Classes

struct  FormatDesc


Detailed Description

Image File Type to read/write and store/restore Image objects as PNM/RAW data.

All the type specific code is included in the class. Does not depend on external libs.

Definition at line 55 of file OSGDATImageFileType.h.


Member Enumeration Documentation

Enumerator:
UNKNOWN_KT 
OBJECT_FILE_NAME_KT 
RESOLUTION_KT 
SLICE_THICKNESS_KT 
FORMAT_KT 
FILE_OFFSET_KT 
CHANNEL_KT 
ENDIAN_KT 

Definition at line 126 of file OSGDATImageFileType.h.

00127     { 
00128       UNKNOWN_KT = 0,
00129 
00130       OBJECT_FILE_NAME_KT,
00131       RESOLUTION_KT,
00132       SLICE_THICKNESS_KT,
00133       FORMAT_KT,
00134       FILE_OFFSET_KT,
00135       CHANNEL_KT,
00136       ENDIAN_KT
00137     };

anonymous enum [inherited]

Enumerator:
OSG_READ_SUPPORTED 
OSG_WRITE_SUPPORTED 

Definition at line 66 of file OSGImageFileType.h.

00067     {
00068         OSG_READ_SUPPORTED = 1,
00069         OSG_WRITE_SUPPORTED = 2
00070     };


Constructor & Destructor Documentation

DATImageFileType::~DATImageFileType ( void   )  [virtual]

Destructor

Definition at line 571 of file OSGDATImageFileType.cpp.

00571 {}

DATImageFileType::DATImageFileType ( const Char8 mimeType,
const Char8 suffixArray[],
UInt16  suffixByteCount 
) [protected]

Constructor used for the singleton object

Definition at line 561 of file OSGDATImageFileType.cpp.

00564     : ImageFileType ( mimeType, suffixArray, suffixByteCount )
00565 {}

osg::DATImageFileType::DATImageFileType ( const DATImageFileType obj  )  [private]


Member Function Documentation

DATImageFileType & DATImageFileType::the ( void   )  [static]

Class method to get the singleton Object

Definition at line 104 of file OSGDATImageFileType.cpp.

References _the.

00105 {
00106   return _the;
00107 }

bool DATImageFileType::read ( ImagePtr image,
const Char8 fileName 
) [virtual]

Tries to fill the image object with the data read from the given fileName. Returns true on success.

Reimplemented from osg::ImageFileType.

Definition at line 118 of file OSGDATImageFileType.cpp.

References _formatStrMap, _keyStrMap, osg::beginEditCP(), CHANNEL_KT, osg::endEditCP(), ENDIAN_KT, FILE_OFFSET_KT, osg::PathHandler::findFile(), FINFO, FLOG, FNOTICE, FORMAT_KT, FWARNING, osg::ImageFileHandler::getPathHandler(), initTypeMap(), osg::isGZip(), OBJECT_FILE_NAME_KT, osg::Image::OSG_FLOAT32_IMAGEDATA, osg::Image::OSG_INVALID_IMAGEDATATYPE, osg::Image::OSG_L_PF, osg::Image::OSG_LA_PF, osg::Image::OSG_RGB_PF, osg::Image::OSG_RGBA_PF, osg::Image::OSG_UINT16_IMAGEDATA, osg::Image::OSG_UINT32_IMAGEDATA, osg::Image::OSG_UINT8_IMAGEDATA, RESOLUTION_KT, SFATAL, SLICE_THICKNESS_KT, osg::ImageFileHandler::the(), and UNKNOWN_KT.

00120 {
00121     bool retCode = false;
00122 
00123     std::ifstream inDat(fileName), inVolS;
00124     std::istream *inVol;
00125     std::string keyStr, objectFileName;
00126     const UInt32 lineBufferSize = 1024;
00127     Char8 *value, *keySepPos, lineBuffer[lineBufferSize];
00128     const Char8 keySep = ':';
00129     int fileOffset, keyL, valueL;
00130     std::map<std::string, KeyType>::iterator keyI;
00131     std::map<std::string, FormatDesc>::iterator formatI;
00132     KeyType key;
00133     Image::Type formatType;
00134     UInt32 channel = 1;
00135     UInt32 res[3];
00136     UInt32 dataSize = 0;
00137     Image::PixelFormat pixelFormat;
00138     char *dataBuffer = 0;
00139     bool needConversion = false;
00140     // default endian type is big endian
00141     bool big_endian = true;
00142 
00143     res[0] = res[1] = res[2] = 0;
00144     fileOffset = 0;
00145     formatType = Image::OSG_INVALID_IMAGEDATATYPE;
00146     dataSize = 0;
00147     dataBuffer = 0;
00148 
00149     initTypeMap();
00150 
00151     beginEditCP(image);
00152 
00153     // read the data file 
00154     for ( lineBuffer[0] = 0; 
00155           inDat.getline ( lineBuffer, lineBufferSize);
00156           lineBuffer[0] = 0 ) 
00157     {        
00158         if ((keySepPos = strchr(lineBuffer,keySep))) 
00159         {
00160             keyL = keySepPos - lineBuffer;
00161             keyStr.assign( lineBuffer, keyL );        
00162             keyI = _keyStrMap.find(keyStr);
00163             key = ((keyI == _keyStrMap.end()) ? UNKNOWN_KT : keyI->second);
00164             value = keySepPos + 1;        
00165             while (value && isspace(*value))
00166                 value++;
00167             valueL = strlen(value);
00168             while (isspace(value[valueL-1]))
00169                 value[--valueL] = 0;
00170             switch (key)
00171             {
00172                 case OBJECT_FILE_NAME_KT:
00173                     objectFileName = value;
00174                     image->setAttachmentField ( keyStr, value );
00175                     break;
00176                 case CHANNEL_KT:
00177                     sscanf ( value, "%d", &(channel) );
00178                     image->setAttachmentField ( keyStr, value );
00179                     break;
00180                 case RESOLUTION_KT:
00181                     sscanf ( value, "%d %d %d", 
00182                              &(res[0]), &(res[1]), &(res[2]));
00183                     image->setAttachmentField ( keyStr, value );
00184                     break;
00185                 case FORMAT_KT:
00186                     formatI = _formatStrMap.find(value);
00187                     if (formatI != _formatStrMap.end())
00188                     {
00189                         formatType = formatI->second.type;
00190                     }
00191                     else 
00192                     {
00193                         formatType = Image::OSG_INVALID_IMAGEDATATYPE;
00194                     }
00195                     image->setAttachmentField ( keyStr, value );
00196                     break;
00197                 case ENDIAN_KT:
00198                     if(!strcmp(value, "LITTLE"))
00199                         big_endian = false;
00200                     image->setAttachmentField ( keyStr, value );
00201                     break;
00202                 case FILE_OFFSET_KT:
00203                     sscanf ( value, "%d", &fileOffset );
00204                     image->setAttachmentField ( keyStr, value );
00205                     break;
00206                 case UNKNOWN_KT:
00207                     FNOTICE (( "Uknown DAT file key: >%s<\n",
00208                                  keyStr.c_str() ));
00209                     image->setAttachmentField ( keyStr, value );
00210                     break;
00211                 case SLICE_THICKNESS_KT:
00212                 default:
00213                     image->setAttachmentField ( keyStr, value );
00214                     break;
00215             }
00216         }
00217         else 
00218         {        
00219             FINFO (("Skip DAT line\n"));
00220         }
00221     }
00222   
00223     // set pixelformat
00224     switch (channel) {
00225     case 4:
00226       pixelFormat = osg::Image::OSG_RGBA_PF;
00227       break;
00228     case 3:
00229       pixelFormat = osg::Image::OSG_RGB_PF;
00230       break;
00231     case 2:
00232       pixelFormat = osg::Image::OSG_LA_PF;
00233       break;
00234     default:
00235       pixelFormat = osg::Image::OSG_L_PF;
00236       break;
00237     }
00238 
00239     // check the setting and read the raw vol data
00240     if (objectFileName.empty() == false) 
00241     {
00242         if ( (res[0] > 0) && (res[1] > 0) && (res[2] > 0) ) 
00243         {
00244             if (formatType != Image::OSG_INVALID_IMAGEDATATYPE) 
00245             {
00246                 inVolS.open(objectFileName.c_str(), 
00247                            std::ios::in | std::ios::binary );
00248                 if (inVolS.fail() && ImageFileHandler::the().getPathHandler())
00249                 {
00250                     // Try to find the file in the search path
00251                     inVolS.clear(); // reset the error state
00252                     PathHandler * ph = ImageFileHandler::the().getPathHandler();
00253                     inVolS.open(ph->findFile(objectFileName.c_str()).c_str(),
00254                                std::ios::in | std::ios::binary );
00255                 }
00256                 if (inVolS.fail())
00257                 {
00258                     // Maybe compressed and name not changed?
00259                     std::string gzname = objectFileName + ".gz";
00260                     inVolS.clear(); // reset the error state
00261                     inVolS.open(gzname.c_str(), 
00262                            std::ios::in | std::ios::binary );
00263                     if (inVolS.fail() && 
00264                         ImageFileHandler::the().getPathHandler())
00265                     {
00266                         // Try to find the file in the search path
00267                         inVolS.clear(); // reset the error state
00268                         PathHandler * ph = ImageFileHandler::the().getPathHandler();
00269                         inVolS.open(ph->findFile(gzname.c_str()).c_str(),
00270                                    std::ios::in | std::ios::binary );
00271                     }
00272                 } 
00273                 if (inVolS.good())
00274                 {                    
00275 #ifdef OSG_ZSTREAM_SUPPORTED
00276                     zip_istream *unzipper = NULL;
00277 #endif
00278 
00279                     image->set ( pixelFormat, res[0], res[1], res[2], 1, 1, 0.0, 0, formatType);
00280                     image->clear();
00281                     
00282                     dataSize = image->getSize();
00283                     
00284                     UInt32 fileDataSize = dataSize;
00285 
00286                     if(isGZip(inVolS))
00287                     {
00288 #ifdef OSG_ZSTREAM_SUPPORTED
00289                         unzipper = new zip_istream(inVolS);
00290                         inVol = unzipper;
00291 #else
00292                         SFATAL << "Compressed streams are not supported! Configure with --enable-png --with-png=DIR options." << std::endl;
00293 #endif
00294                     }
00295                     else
00296                     {
00297                         inVol = &inVolS;
00298 
00299                         // get length of the stream.
00300                         inVol->seekg(0, std::ios::end);
00301                         UInt64 length = inVol->tellg();
00302                         inVol->seekg(0, std::ios::beg);
00303 
00304                         if(length < dataSize - fileOffset)
00305                         {
00306                             // correct dataSize.
00307                             fileDataSize = length;
00308                             FWARNING (( "RAW file length to small!\n" ));
00309                         }
00310                         else if(length > dataSize - fileOffset)
00311                         {
00312                             FWARNING (( "RAW file length to big!\n" ));
00313                         }
00314                     }
00315 
00316                     if (needConversion)
00317                         dataBuffer = new char [ dataSize ];
00318                     else
00319                         dataBuffer = ((char *)(image->getData()));
00320 
00321                     if(fileOffset != 0)
00322                         inVol->ignore ( fileOffset );
00323                     inVol->read ( dataBuffer, fileDataSize );
00324 
00325 #ifdef OSG_ZSTREAM_SUPPORTED
00326                     if(unzipper != NULL)
00327                         delete unzipper;
00328 #endif
00329                 }
00330                 else 
00331                 {
00332                     FWARNING (( "Can not open %s image data\n", 
00333                              objectFileName.c_str() ));
00334                 }
00335             }
00336             else 
00337             {
00338                 FWARNING (( "Invalid/Missing DAT Format\n" ));
00339             }
00340         }
00341         else 
00342         {
00343             FWARNING (( "Invalid/Missing DAT Resolution\n" ));
00344         }
00345     }
00346     else 
00347     {
00348         FWARNING (( "Invalid/Missing DAT ObjectFileName\n" ));
00349     }
00350 
00351     // check/reformat vol data
00352     if (dataSize && dataBuffer)
00353     {
00354         // check host endian type
00355         UInt16 word = 0x0001;
00356         UInt8 *byte = (UInt8 *) &word;
00357         bool host_big_endian = byte[0] ? false : true;
00358 
00359         if(big_endian != host_big_endian)
00360             image->swapDataEndian();
00361     
00362         if (needConversion) 
00363         {
00364             FLOG (("DAT-Data convert not impl. yet !\n"));
00365             {
00366                 switch (formatType)
00367                 {
00368                     case Image::OSG_UINT8_IMAGEDATA:
00369                         break;
00370                     case Image::OSG_UINT16_IMAGEDATA:
00371                         break;
00372                     case Image::OSG_UINT32_IMAGEDATA:
00373                         break;
00374                     case Image::OSG_FLOAT32_IMAGEDATA:
00375                         break;
00376                     default:
00377                         ;
00378                 }
00379             }
00380         }
00381         else 
00382         {
00383             retCode = true;
00384         }
00385     }
00386 
00387 
00388     /* TODO
00389        std::ifstream in(fileName);
00390        Head head;
00391        void *headData = (void*)(&head);
00392        unsigned dataSize, headSize = sizeof(Head);
00393 
00394        if ( in &&        
00395        in.read(static_cast<char *>(headData), 
00396        headSize) && head.netToHost() &&
00397        image.set ( Image::PixelFormat(head.pixelFormat), 
00398        head.width, head.height, head.depth, head.mipmapCount, 
00399        head.frameCount, float(head.frameDelay) / 1000.0) &&
00400        (dataSize = image.getSize()) && 
00401        in.read((char *)(image.getData()), dataSize ))
00402        retCode = true;
00403        else
00404        retCode = false;
00405     */
00406 
00407     endEditCP(image);
00408 
00409     return retCode;
00410 }

bool DATImageFileType::write ( const ImagePtr image,
const Char8 fileName 
) [virtual]

Tries to write the image object to the given fileName. Returns true on success.

Reimplemented from osg::ImageFileType.

Definition at line 417 of file OSGDATImageFileType.cpp.

References _formatStrMap, initTypeMap(), and SWARNING.

00419 {
00420     initTypeMap();
00421 
00422     // ok we write always in big endian.
00423 #if BYTE_ORDER == LITTLE_ENDIAN
00424     image->swapDataEndian();
00425 #endif
00426 
00427     std::ofstream dat(fileName, std::ios::binary);
00428     if(!dat)
00429     {
00430         SWARNING << "DATImageFileType::write : Can not open output stream for file '" << fileName << "'!" << std::endl;
00431         return false;
00432     }
00433 
00434     Real64 sT[3];
00435     sT[0] = sT[1] = sT[2] = 1.0;
00436     const std::string *attr = image->findAttachmentField("SliceThickness");
00437     if(attr != NULL)
00438          sscanf(attr->c_str(), "%lf %lf %lf", &sT[0], &sT[1], &sT[2]);
00439     
00440     std::string format = "UCHAR";
00441     for(std::map<std::string, FormatDesc>::iterator it = _formatStrMap.begin();
00442         it != _formatStrMap.end();++it)
00443     {
00444         if((*it).second.type == image->getDataType())
00445         {
00446             format = (*it).first;
00447             break;
00448         }
00449     }
00450 
00451     std::string basename = fileName;
00452     std::string::size_type i = basename.rfind(".");
00453     if(i != std::string::npos)
00454         basename = basename.substr(0, i);
00455     basename += ".raw";
00456     
00457     std::string name = basename;
00458     i = name.rfind("/");
00459     // on windows also a / is possible!
00460 #if defined(WIN32)
00461     if(i == std::string::npos)
00462         i = name.rfind("\\");
00463 #endif
00464     if(i != std::string::npos)
00465         name = name.substr(i+1);
00466 
00467     dat << "ObjectFileName: " << name << "\n";
00468     dat << "TaggedFileName: ---\n";
00469     dat << "Resolution:     " << image->getWidth() << " " << image->getHeight()
00470                               << " " << image->getDepth() << "\n";
00471     dat << "SliceThickness: " << sT[0] << " " << sT[1] << " " << sT[2] << "\n";
00472     dat << "Format:         " << format << "\n";
00473     dat << "NbrTags:        0\n";
00474     dat << "ObjectType:     TEXTURE_VOLUME_OBJECT\n";
00475     dat << "ObjectModel:    DENSITY\n";
00476     dat << "GridType:       EQUIDISTANT\n";
00477 
00478     if (image->getBpp() > 1)
00479       dat << "Channel: " << image->getBpp() << "\n";
00480 
00481     dat.close();
00482     
00483     std::ofstream raw(basename.c_str(), std::ios::binary);
00484     if(!raw)
00485     {
00486         SWARNING << "DATImageFileType::write : Can not open output stream for file '" << basename << "'!" << std::endl;
00487         return false;
00488     }
00489     
00490     raw.write ((const char *) image->getData(), image->getSize());
00491     raw.close();
00492 
00493     // restore to original endian
00494 #if BYTE_ORDER == LITTLE_ENDIAN
00495     image->swapDataEndian();
00496 #endif
00497 
00498     /*
00499     ofstream out(fileName);
00500     Head head;
00501     const void *headData = (void*)(&head);
00502     unsigned dataSize = image.getSize(), headSize = sizeof(Head);
00503 
00504     head.pixelFormat  = image.getPixelFormat();
00505     head.width        = image.getWidth();
00506     head.height       = image.getHeight();
00507     head.depth        = image.getDepth();
00508     head.mipmapCount  = image.getMipMapCount();
00509     head.frameCount   = image.getFrameCount();
00510     head.frameDelay   = short(image.getFrameDelay() * 1000.0);
00511     head.hostToNet();
00512   
00513     if ( out && out.write(static_cast<const char *>(headData), headSize) && 
00514          dataSize &&
00515              out.write((char *)(image.getData()), dataSize) )
00516             retCode = true;
00517     else
00518         retCode = false;    
00519     */
00520 
00521     return true;
00522 }

UInt64 DATImageFileType::restoreData ( ImagePtr image,
const UChar8 buffer,
Int32  memSize = -1 
) [virtual]

Tries to restore the image data from the given memblock. Returns the amount of data read.

Reimplemented from osg::ImageFileType.

Definition at line 529 of file OSGDATImageFileType.cpp.

00532 {
00533     image->setData(buffer);
00534 
00535     return image->getSize();
00536 }

UInt64 DATImageFileType::storeData ( const ImagePtr image,
UChar8 buffer,
Int32  memSize = -1 
) [virtual]

Tries to store the image data to the given memblock. Returns the amount of data written.

Reimplemented from osg::ImageFileType.

Definition at line 543 of file OSGDATImageFileType.cpp.

00546 {
00547     UInt32 dataSize = image->getSize();
00548     const UChar8 *src = image->getData();
00549 
00550     if ( dataSize && src && buffer )
00551         memcpy( buffer, src, dataSize);
00552   
00553     return dataSize;
00554 } 

const DATImageFileType& osg::DATImageFileType::operator= ( const DATImageFileType obj  )  [private]

void DATImageFileType::initTypeMap ( void   )  [static, private]

Helper to initialize the type map;

Definition at line 577 of file OSGDATImageFileType.cpp.

References _formatStrMap, _keyStrMap, osg::DATImageFileType::FormatDesc::bpv, CHANNEL_KT, ENDIAN_KT, FILE_OFFSET_KT, FORMAT_KT, osg::DATImageFileType::FormatDesc::needConversion, OBJECT_FILE_NAME_KT, osg::Image::OSG_FLOAT32_IMAGEDATA, osg::Image::OSG_L_PF, osg::Image::OSG_UINT16_IMAGEDATA, osg::Image::OSG_UINT32_IMAGEDATA, osg::Image::OSG_UINT8_IMAGEDATA, osg::DATImageFileType::FormatDesc::pixelFormat, RESOLUTION_KT, SLICE_THICKNESS_KT, and osg::DATImageFileType::FormatDesc::type.

Referenced by read(), and write().

00578 {
00579   FormatDesc *desc;
00580 
00581   if (_keyStrMap.empty())
00582     {
00583       _keyStrMap["ObjectFileName"]  = OBJECT_FILE_NAME_KT;
00584       _keyStrMap["Resolution"]      = RESOLUTION_KT;
00585       _keyStrMap["Channel"]         = CHANNEL_KT;
00586       _keyStrMap["SliceThickness"]  = SLICE_THICKNESS_KT;
00587       _keyStrMap["Format"]          = FORMAT_KT;
00588       _keyStrMap["Endian"]          = ENDIAN_KT;
00589       _keyStrMap["FileOffset"]      = FILE_OFFSET_KT;
00590      }
00591 
00592   if (_formatStrMap.empty())
00593     {
00594       desc = &(_formatStrMap["UCHAR"]);
00595       desc->type = Image::OSG_UINT8_IMAGEDATA;
00596       desc->bpv  = 1;
00597       desc->pixelFormat = Image::OSG_L_PF;
00598       desc->needConversion = false;
00599 
00600       desc = &(_formatStrMap["USHORT"]);
00601       desc->type = Image::OSG_UINT16_IMAGEDATA;
00602       desc->bpv  = 2;
00603       desc->pixelFormat = Image::OSG_L_PF;
00604       desc->needConversion = false;
00605 
00606       desc = &(_formatStrMap["UINT"]);
00607       desc->type = Image::OSG_UINT32_IMAGEDATA;
00608       desc->bpv  = 4; // TODO; is this right ?
00609       desc->pixelFormat = Image::OSG_L_PF;
00610       desc->needConversion = false;
00611 
00612       desc = &(_formatStrMap["ULONG"]);
00613       desc->type = Image::OSG_UINT32_IMAGEDATA;
00614       desc->bpv  = 4;
00615       desc->pixelFormat = Image::OSG_L_PF;
00616       desc->needConversion = false;
00617 
00618       desc = &(_formatStrMap["FLOAT"]);
00619       desc->type = Image::OSG_FLOAT32_IMAGEDATA;
00620       desc->bpv  = 4;
00621       desc->pixelFormat = Image::OSG_L_PF;
00622       desc->needConversion = false;
00623 
00624       desc = &(_formatStrMap["DOUBLE"]);
00625       desc->type = Image::OSG_FLOAT32_IMAGEDATA; // we have no OSG_FLOAT64_IMAGEDATA
00626       desc->bpv  = 8;
00627       desc->pixelFormat = Image::OSG_L_PF;
00628       desc->needConversion = false;
00629     }
00630 
00631 }

void ImageFileType::setOptions ( const Char8 options  )  [inherited]

Definition at line 243 of file OSGImageFileType.cpp.

References osg::ImageFileType::_options.

Referenced by osg::ImageFileHandler::setOptions().

00244 {
00245     _options = options;
00246 }

const Char8 * ImageFileType::getMimeType ( void   )  const [inherited]

Get method for the mime type

Definition at line 107 of file OSGImageFileType.cpp.

References osg::ImageFileType::_mimeType, and osg::IDString::str().

Referenced by osg::ImageFileHandler::addImageFileType(), osg::TIFImageFileType::determineMimetypeFromStream(), osg::SGIImageFileType::determineMimetypeFromStream(), osg::PSDImageFileType::determineMimetypeFromStream(), osg::PNMImageFileType::determineMimetypeFromStream(), osg::PNGImageFileType::determineMimetypeFromStream(), osg::MNGImageFileType::determineMimetypeFromStream(), osg::JPGImageFileType::determineMimetypeFromStream(), osg::JP2ImageFileType::determineMimetypeFromStream(), osg::GIFImageFileType::determineMimetypeFromStream(), osg::DDSImageFileType::determineMimetypeFromStream(), osg::BMPImageFileType::determineMimetypeFromStream(), osg::ImageFileType::dump(), osg::TIFImageFileType::read(), osg::PNGImageFileType::read(), osg::JPGImageFileType::read(), osg::JP2ImageFileType::read(), osg::ImageFileType::read(), osg::ImageFileHandler::read(), osg::EXRImageFileType::read(), osg::PNGImageFileType::restoreData(), osg::JPGImageFileType::restoreData(), osg::ImageFileType::restoreData(), osg::ImageFileHandler::store(), osg::PNGImageFileType::storeData(), osg::JPGImageFileType::storeData(), osg::ImageFileType::storeData(), osg::TIFImageFileType::write(), osg::PNGImageFileType::write(), osg::JPGImageFileType::write(), osg::ImageFileType::write(), osg::ImageFileHandler::write(), and osg::EXRImageFileType::write().

00108 {
00109     return _mimeType.str();
00110 }

const std::list< IDString > & ImageFileType::getSuffixList ( void   )  const [inherited]

Get method for the suffix list container

Definition at line 134 of file OSGImageFileType.cpp.

References osg::ImageFileType::_suffixList.

Referenced by osg::ImageFileHandler::addImageFileType().

00135 {
00136     return _suffixList; 
00137 }

UInt32 ImageFileType::getFlags ( void   )  const [virtual, inherited]

Get method for the flags indicating read/write support. Most image types only support reading.

Definition at line 117 of file OSGImageFileType.cpp.

References osg::ImageFileType::_flags.

Referenced by osg::ImageFileHandler::getSuffixList().

00118 {
00119     return _flags;
00120 }

const Char8 * ImageFileType::getOptions ( void   )  [inherited]

Get method for the mime type

Definition at line 124 of file OSGImageFileType.cpp.

References osg::ImageFileType::_options.

Referenced by osg::ImageFileHandler::getOptions().

00125 {
00126     return _options.c_str();
00127 }

bool ImageFileType::read ( ImagePtr image,
std::istream &  is,
const std::string &  mimetype 
) [virtual, inherited]

Tries to fill the image object with the data read from the given input stream. Returns true on success.

Reimplemented in osg::BMPImageFileType, osg::DDSImageFileType, osg::EXRImageFileType, osg::GIFImageFileType, osg::HDRImageFileType, osg::JP2ImageFileType, osg::JPGImageFileType, osg::MTDImageFileType, osg::NRRDImageFileType, osg::PNGImageFileType, osg::PNMImageFileType, osg::PSDImageFileType, osg::SGIImageFileType, osg::TGAImageFileType, and osg::TIFImageFileType.

Definition at line 172 of file OSGImageFileType.cpp.

References osg::endLog(), osg::ImageFileType::getMimeType(), and SWARNING.

00173 {
00174     SWARNING << getMimeType()
00175              << " read from stream is not implemented"
00176              << endLog;
00177     return false;
00178 }

bool ImageFileType::write ( const ImagePtr image,
std::ostream &  os,
const std::string &  mimetype 
) [virtual, inherited]

Tries to write the image object to the given output stream. Returns true on success.

Reimplemented in osg::BMPImageFileType, osg::EXRImageFileType, osg::HDRImageFileType, osg::JPGImageFileType, osg::MTDImageFileType, osg::PNGImageFileType, osg::PNMImageFileType, and osg::TIFImageFileType.

Definition at line 185 of file OSGImageFileType.cpp.

References osg::endLog(), osg::ImageFileType::getMimeType(), and SWARNING.

00186 {
00187     SWARNING << getMimeType()
00188              << " write to stream is not implemented"
00189              << endLog;
00190     return false;
00191 }

bool ImageFileType::validateHeader ( const Char8 fileName,
bool &  implemented 
) [virtual, inherited]

Reimplemented in osg::GIFImageFileType, osg::JPGImageFileType, osg::PNGImageFileType, osg::SGIImageFileType, and osg::TIFImageFileType.

Definition at line 161 of file OSGImageFileType.cpp.

Referenced by osg::ImageFileHandler::getFileType().

00162 {
00163     implemented = false;
00164     return true;
00165 }

std::string ImageFileType::determineMimetypeFromStream ( std::istream &  is  )  [virtual, inherited]

Tries to determine the mime type of the data provided by an input stream by searching for magic bytes. Returns the mime type or an empty string when the function could not determine the mime type.

Reimplemented in osg::BMPImageFileType, osg::DDSImageFileType, osg::GIFImageFileType, osg::JP2ImageFileType, osg::JPGImageFileType, osg::MNGImageFileType, osg::PNGImageFileType, osg::PNMImageFileType, osg::PSDImageFileType, osg::SGIImageFileType, and osg::TIFImageFileType.

Definition at line 199 of file OSGImageFileType.cpp.

00200 {
00201     return std::string();
00202 }

UInt64 ImageFileType::restore ( ImagePtr image,
const UChar8 buffer,
Int32  memSize = -1 
) [static, inherited]

Tries to restore the Imagedata from the given memblock. The buffer must include a ImageFileType::Head data block.

Definition at line 283 of file OSGImageFileType.cpp.

References osg::ImageFileType::Head::dataType, osg::ImageFileType::Head::depth, osg::ImageFileHandler::determineMimetypeFromSuffix(), FDEBUG, osg::ImageFileType::Head::frameCount, osg::ImageFileType::Head::frameDelay, FWARNING, osg::ImageFileType::Head::height, osg::ImageFileType::Head::mipmapCount, osg::ImageFileType::Head::netToHost(), osg::NullFC, osg::Image::OSG_UINT8_IMAGEDATA, osg::ImageFileType::Head::pixelFormat, osg::ImageFileType::Head::sideCount, osg::ImageFileType::Head::suffix, osg::ImageFileHandler::the(), and osg::ImageFileType::Head::width.

Referenced by osg::ClusterViewBuffer::recv(), osg::ImageFileHandler::restore(), and osg::SimpleSceneManager::useOpenSGLogo().

00285 {
00286     unsigned long   imageSize, headSize = sizeof(Head);
00287     unsigned long   size = 0, attachmentSize;
00288     Head            head;
00289     const UChar8    *data = buffer ? (buffer + headSize) : 0;
00290     ImageFileType   *type;
00291     std::string     mimeType;
00292     Image::Type     dataType;
00293 
00294     if ((image != osg::NullFC) && buffer && (memSize >= headSize)) {
00295 
00296         // Copy header. Otherwise netToHost would change the original
00297         // data structur.
00298         memcpy(&head,buffer,sizeof(Head));
00299         head.netToHost();
00300         mimeType = ImageFileHandler::the().determineMimetypeFromSuffix(head.suffix);
00301         
00302         if((type = ImageFileHandler::the().getFileType(mimeType.c_str(), 0)))
00303         {
00304             if (head.dataType)
00305               dataType = Image::Type(head.dataType);
00306             else
00307               dataType = Image::OSG_UINT8_IMAGEDATA;
00308 
00309             image->set(Image::PixelFormat(head.pixelFormat), head.width,
00310                        head.height, head.depth, head.mipmapCount,
00311                        head.frameCount, float(head.frameDelay) / 1000.0, 0,
00312                        dataType,true,head.sideCount );
00313             imageSize = static_cast<unsigned long>(
00314                 type->restoreData(image, data, memSize - headSize));
00315             attachmentSize = 0; // head->attachmentSize;
00316 
00317             /*
00318             if ((attachmentSize = head->attachmentSize))
00319             {
00320                 attData = (char*)(buffer + headSize + imageSize);
00321                 attKey = attData;
00322                 attValue = 0;
00323                 for (i = 0; i < (attachmentSize-1); i++) {
00324                     if (attData[i] == 0) 
00325                         if (attKey) {
00326                             attValue = &(attData[i+1]);
00327                             image->setAttachmentField (attKey,attValue);
00328                             attKey = attValue = 0;
00329                         }
00330                         else
00331                             attKey = &(attData[i+1]);
00332                 }
00333                 if (attKey || attValue) {
00334                     FFATAL (("Attachment restore error\n"));
00335                 }
00336             }
00337             */
00338 
00339             size = headSize + imageSize + attachmentSize;
00340       
00341             FDEBUG (( "Restore image data: %lu (%lu/%lu/%lu)\n",
00342                       size, headSize, imageSize, attachmentSize ));
00343 
00344         }
00345         else
00346         {
00347             imageSize = 0;
00348             FWARNING(("Can not restore image data, invalid mimeType: %s\n",
00349                       mimeType.empty() == false ? mimeType.c_str() : "Unknown"));
00350         }
00351 
00352       
00353     }
00354 
00355     return size;
00356 }

UInt64 ImageFileType::store ( const ImagePtr image,
const char *  mimeType,
UChar8 buffer,
Int32  memSize = -1 
) [static, inherited]

Tries to store the raster data to the given mem block. Will include a ImageFileType::Head description and the data encoded as 'mimeType'

Definition at line 364 of file OSGImageFileType.cpp.

References osg::ImageFileHandler::getFileType(), osg::ImageFileType::store(), and osg::ImageFileHandler::the().

Referenced by osg::ClusterViewBuffer::send(), osg::ImageFileType::store(), and osg::ImageFileHandler::store().

00366 {
00367   ImageFileType   *type = ImageFileHandler::the().getFileType(mimeType);
00368   
00369   return type ? type->store(image, buffer, memSize) : 0;
00370 }

UInt64 ImageFileType::store ( const ImagePtr image,
UChar8 buffer,
Int32  memSize = -1 
) [inherited]

Tries to store the raster data to the given mem block. Will include a ImageFileType::Head description for the derived concreate mimeType.

Definition at line 378 of file OSGImageFileType.cpp.

References osg::ImageFileType::_suffixList, osg::ImageFileType::Head::attachmentSize, osg::ImageFileType::Head::dataType, osg::ImageFileType::Head::depth, FDEBUG, FFATAL, osg::ImageFileType::Head::frameCount, osg::ImageFileType::Head::frameDelay, osg::ImageFileType::Head::height, osg::ImageFileType::Head::hostToNet(), osg::ImageFileType::Head::mipmapCount, osg::ImageFileType::Head::pixelFormat, osg::ImageFileType::Head::sideCount, osg::ImageFileType::storeData(), osg::ImageFileType::Head::suffix, and osg::ImageFileType::Head::width.

00380 {
00381     Head            *head;
00382     unsigned long   dataSize = 0, headSize = sizeof(Head);
00383     unsigned long   attachmentSize;
00384     UChar8          *dest;
00385     const UChar8    *src = image->getData();
00386     std::map<std::string, std::string>::const_iterator aI;
00387     std::string     value;
00388 
00389     attachmentSize = 0;
00390 
00391     // get attachment size
00392     /*
00393     ImageGenericAttPtr att=ImageGenericAttPtr::dcast(
00394         const_cast<Image*>(image.getCPtr())->findAttachment(
00395             ImageGenericAtt::getClassType().getGroupId()));
00396     if(att != NullFC)
00397     {
00398         for(i = 0; i < (att->getType().getNumFieldDescs()-1); ++i)
00399         {
00400             FieldDescription *fieldDesc=att->getType().getFieldDescription(i);
00401             Field *field=att->getField(i);
00402             if (fieldDesc && field) 
00403             {
00404                 field->getValueByStr(value);
00405                 attachmentSize += strlen( fieldDesc->getName().str() ) + 1;
00406                 attachmentSize += value.length() + 1;
00407               
00408                 std::cout << fieldDesc->getName().str() << std::endl; 
00409                 std::cout << value << std::endl; 
00410             }
00411             else 
00412             {
00413                 FFATAL (("Invalid Attachment in ImageFileType::store()\n"));
00414             }
00415         }
00416     }
00417     */
00418 
00419     if (buffer) 
00420     {
00421         head = (Head *)buffer;
00422 
00423         head->pixelFormat    = image->getPixelFormat();
00424         head->width          = image->getWidth();
00425         head->height         = image->getHeight();
00426         head->depth          = image->getDepth();
00427         head->mipmapCount    = image->getMipMapCount();
00428         head->frameCount     = image->getFrameCount();
00429         head->frameDelay     = short(image->getFrameDelay() * 1000.0);
00430         head->sideCount      = image->getSideCount();
00431         head->dataType       = image->getDataType();
00432         head->attachmentSize = static_cast<unsigned short>(attachmentSize);
00433         head->hostToNet();
00434       
00435         strcpy(head->suffix, _suffixList.front().str());
00436       
00437         dest = (UChar8 *) (buffer + headSize);
00438 
00439         if (src) 
00440             dataSize = static_cast<unsigned long>(
00441                 storeData(image, dest, memSize - headSize));
00442 
00443         dest = (UChar8 *) (buffer + headSize + dataSize);
00444 
00445         /*
00446         if(att != NullFC)
00447         {
00448             for(i = 0; i < (att->getType().getNumFieldDescs()-1); ++i)
00449             {
00450                 FieldDescription *fieldDesc=att->getType().getFieldDescription(i);
00451                 Field *field=att->getField(i);
00452                 if (field && fieldDesc) 
00453                 {
00454                     field->getValueByStr(value);
00455 
00456                     l = strlen( fieldDesc->getName().str() );
00457                     for (i = 0; i < l; i++)
00458                       *dest++ = fieldDesc->getName().str()[i];
00459                     *dest++ = 0;
00460                     l = value.length();
00461                     for (i = 0; i < l; i++)
00462                       *dest++ = value[i];
00463                     *dest++ = 0;
00464                 }
00465                 else
00466                 {
00467                     FFATAL (("Invalid Attachment in ImageFileType::store()\n"));
00468                 }
00469             }
00470         }
00471         */
00472 
00473         FDEBUG (( "Store image data: %lu (%lu/%lu/%lu)\n",
00474                   headSize + dataSize + attachmentSize, headSize, dataSize, 
00475                   attachmentSize ));
00476     }
00477     else {
00478         FFATAL (("Invalid buffer in ImageFileType::store()\n"));
00479     }
00480   
00481     return (headSize + dataSize + attachmentSize);
00482 
00483 }

UInt64 ImageFileType::maxBufferSize ( const ImagePtr image  )  [virtual, inherited]

Returns the max buffer size needed to store the Image (Head + mimeType specific data block)

Definition at line 490 of file OSGImageFileType.cpp.

References FINFO.

Referenced by osg::ClusterViewBuffer::send(), and osg::ImageFileHandler::store().

00491 {
00492     std::string value;
00493     unsigned long size, attachmentSize;
00494     unsigned long imageSize = image->getSize(), headSize = sizeof(Head);
00495 
00496     std::map<std::string, std::string>::const_iterator aI;
00497 
00498     attachmentSize = 0;
00499 
00500     // get attachment size
00501         /*
00502     ImageGenericAttPtr att=ImageGenericAttPtr::dcast(
00503         const_cast<Image*>(image.getCPtr())->findAttachment(
00504             ImageGenericAtt::getClassType().getGroupId()));
00505     if(att != NullFC)
00506     {
00507         for(i = 0; i < (att->getType().getNumFieldDescs()-1); ++i)
00508         {
00509             FieldDescription *fieldDesc=att->getType().getFieldDescription(i);
00510             Field *field=att->getField(i);
00511             if (field && fieldDesc) 
00512             {
00513                 field->getValueByStr(value);
00514                 attachmentSize += strlen( fieldDesc->getName().str() ) + 1;
00515                 attachmentSize += value.length() + 1;
00516             }
00517             else 
00518             {
00519                 FFATAL (("Invalid Attachment in ImageFileType::maxBufferSize()\n"));
00520             }
00521         }
00522     }
00523         */
00524 
00525     size = headSize + imageSize + attachmentSize;
00526   
00527     FINFO (( "ImageFileType::maxBufferSize(): %lu (%lu/%lu/%lu)\n", 
00528              size, headSize, imageSize, attachmentSize ));
00529   
00530     return size;
00531 }

void ImageFileType::dump ( void   )  [inherited]

The dump method just writes some object debugging info to the LOG stream

Definition at line 537 of file OSGImageFileType.cpp.

References osg::ImageFileType::_suffixList, osg::ImageFileType::getMimeType(), osg::LOG_DEBUG, and SLOG.

00538 {
00539     std::list<IDString>::iterator    sI;
00540 
00541     SLOG << getMimeType();
00542 
00543     if(_suffixList.empty())
00544     {
00545         SLOG << ": Suffix: ";
00546         for(sI = _suffixList.begin(); sI != _suffixList.end(); sI++)
00547         {
00548             Log().stream(OSG::LOG_DEBUG) << sI->str() << " ";
00549         }
00550     }
00551 
00552     std::cerr << std::endl;
00553 }


Member Data Documentation

Definition at line 124 of file OSGDATImageFileType.h.

Referenced by the().

std::map< std::string, DATImageFileType::KeyType > DATImageFileType::_keyStrMap [static, private]

Definition at line 154 of file OSGDATImageFileType.h.

Referenced by initTypeMap(), and read().

std::map< std::string, DATImageFileType::FormatDesc > DATImageFileType::_formatStrMap [static, private]

Definition at line 155 of file OSGDATImageFileType.h.

Referenced by initTypeMap(), read(), and write().

std::string osg::ImageFileType::_options [protected, inherited]


The documentation for this class was generated from the following files:

Generated on Mon Mar 17 12:05:38 2008 for OpenSG by  doxygen 1.5.5