osg::GIFImageFileType Class Reference

GIF File Handler. Used to read/write GIF files. See Image for a detailed description.

#include <OSGGIFImageFileType.h>

Inheritance diagram for osg::GIFImageFileType:

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 ~GIFImageFileType (void)
Read/Write


virtual bool validateHeader (const Char8 *fileName, bool &implemented)
virtual bool read (ImagePtr &image, std::istream &is, const std::string &mimetype)
virtual std::string determineMimetypeFromStream (std::istream &is)
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, const Char8 *fileName)
virtual bool write (const ImagePtr &image, const Char8 *fileName)
virtual bool write (const ImagePtr &image, std::ostream &os, const std::string &mimetype)
Raw Store/Restore


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


void dump (void)

Static Public Member Functions

Get Method


static GIFImageFileTypethe (void)

Protected Member Functions

Default Constructor


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

Protected Attributes

MTD Header


std::string _options

Private Member Functions

Copy Constructor


 GIFImageFileType (const GIFImageFileType &obj)
Copy Operator


const GIFImageFileTypeoperator= (const GIFImageFileType &obj)

Static Private Attributes

static GIFImageFileType _the


Detailed Description

Definition at line 56 of file OSGGIFImageFileType.h.


Member Enumeration Documentation

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

GIFImageFileType::~GIFImageFileType ( void   )  [virtual]

Destructor

Definition at line 559 of file OSGGIFImageFileType.cpp.

00559 {}

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

Constructor used for the singleton object

Definition at line 549 of file OSGGIFImageFileType.cpp.

00551                                                            :
00552     ImageFileType(mimeType, suffixArray, suffixByteCount)
00553 {}

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


Member Function Documentation

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

Reimplemented from osg::ImageFileType.

Definition at line 521 of file OSGGIFImageFileType.cpp.

00522 {
00523     implemented = true;
00524 
00525     if(fileName == NULL)
00526         return false;
00527 
00528     FILE *file = fopen(fileName, "rb");
00529     if(file == NULL)
00530         return false;
00531 
00532     std::string magic;
00533     magic.resize(4);
00534     fread((void *) &magic[0], 4, 1, file);
00535     fclose(file);
00536 
00537     if(magic == "GIF8")
00538     {
00539         return true;
00540     }
00541 
00542     return false;
00543 }

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

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

Reimplemented from osg::ImageFileType.

Definition at line 200 of file OSGGIFImageFileType.cpp.

References FDEBUG, FWARNING, osg::Image::OSG_INVALID_PF, osg::Image::OSG_L_PF, osg::Image::OSG_LA_PF, osg::Image::OSG_RGB_PF, and osg::Image::OSG_RGBA_PF.

00202 {
00203     bool                retCode = false;
00204 
00205 #ifdef OSG_WITH_GIF
00206     Image::PixelFormat  pixelFormat = osg::Image::OSG_INVALID_PF;
00207     GIFStream           *gifStream = GIFRead(is);
00208     GIFData             *gifData = 0;
00209     bool                isColor;
00210     int                 i, j, destI, lineSize, lineEnd;
00211     unsigned            red, green, blue;
00212     int                 transparentIndex;
00213     int                 width = 0, height = 0, channel = 0, xOff = 0, yOff = 0;
00214     unsigned char       *srcData = 0, *destData = 0;
00215     int                 colorIndex;
00216     unsigned            frameCount = 0, currentFrame = 0;
00217     unsigned char       *colorMap = 0;
00218 
00219     //    int imageSize = 0;
00220     int                 colorMapSize;
00221     Time                frameDelay;
00222 
00223     if(gifStream)
00224     {
00225         frameCount = 0;
00226         for(gifData = gifStream->data; gifData; gifData = gifData->next)
00227         {
00228             if(gifData->type == gif_image)
00229                 frameCount++;
00230         }
00231     }
00232 
00233     FDEBUG(("GIF Frames: %d\n", frameCount));
00234 
00235     if(gifStream)
00236     {
00237         for(gifData = gifStream->data; gifData; gifData = gifData->next)
00238         {
00239             switch(gifData->type)
00240             {
00241             case gif_image:
00242                 if(frameCount)
00243                 {
00244                     FDEBUG(("Try to copy GIF Anim Frame %d/%d\n",
00245                            (currentFrame + 1), frameCount));
00246                 }
00247 
00248                 // get the att.
00249                 transparentIndex = gifData->info.transparent;
00250                 frameDelay = float(gifData->info.delayTime) / 100.0f;
00251                 width  = gifData->width;
00252                 height = gifData->height;
00253                 xOff   = gifData->x;
00254                 yOff   = gifData->y;
00255 
00256                 // check if the movie is color or greyscale
00257                 isColor = false;
00258                 if(gifData->data.image.cmapSize > 0)
00259                 {
00260                     colorMapSize = gifData->data.image.cmapSize;
00261                     colorMap = (unsigned char *) gifData->data.image.cmapData;
00262 
00263                     // cout << "INFO: Use gifData colorMap" << endl;
00264                 }
00265                 else if(gifStream->cmapSize > 0)
00266                 {
00267                     colorMapSize = gifStream->cmapSize;
00268                     colorMap = (unsigned char *) gifStream->cmapData;
00269 
00270                     // cout << "INFO: Use gifStream colorMap" << endl;
00271                 }
00272                 else
00273                 {
00274                     FWARNING(("Bad color map in GIFImageFileType::read()\n"));
00275                     colorMapSize = 0;
00276                 }
00277 
00278                 for(i = 0; i < colorMapSize; i++)
00279                 {
00280                     if(i != transparentIndex)
00281                     {
00282                         red = colorMap[i * 3 + 0];
00283                         green = colorMap[i * 3 + 1];
00284                         blue = colorMap[i * 3 + 2];
00285                         if(red != green || red != blue)
00286                         {
00287                             isColor = true;
00288                             break;
00289                         }
00290                     }
00291                 }
00292 
00293                 // calculate the movie channel
00294                 channel = (isColor ? 3 : 1) + (transparentIndex >= 0 ? 1 : 0);
00295 
00296                 if(currentFrame)
00297                 {
00298                     // is not the first frame
00299                     if((channel == image->getBpp()) &&
00300                        (width == image->getWidth()) &&
00301                        (height == image->getHeight()))
00302                     {
00303                         destData = image->getData(0, currentFrame);
00304                     }
00305                     else
00306                     {                        
00307                         destData = image->getData(0, currentFrame);
00308 
00309                         // This is probably wrong, but it's a start
00310                         switch(gifData->info.disposal)
00311                         {
00312                             case gif_no_disposal:
00313                                 break;
00314                                 
00315                             case gif_keep_disposal:
00316                                 memcpy(destData, 
00317                                        image->getData(0, currentFrame - 1), 
00318                                        image->getWidth () * 
00319                                        image->getHeight() * 
00320                                        channel);
00321                                 break;
00322                                 
00323                             case gif_color_restore:
00324                                 {
00325                                 unsigned char r,g,b,a;
00326                                 UInt32 bgindex = gifStream->background;
00327                                 unsigned char *d = destData;
00328                                 
00329                                 r = colorMap[bgindex * 3 + 0];
00330                                 g = colorMap[bgindex * 3 + 1];
00331                                 b = colorMap[bgindex * 3 + 2];
00332                                 a = (bgindex == transparentIndex) ? 0 : 255;
00333                                 
00334                                 for(UInt32 pixel = image->getWidth () * 
00335                                                    image->getHeight(); 
00336                                     pixel > 0; --pixel, d += channel)
00337                                 {
00338                                     d[0] = r;
00339                                     d[1] = g;
00340                                     d[2] = b;
00341                                     if(channel == 4)
00342                                         d[3] = a;
00343                                 }
00344                                 }
00345                                 break;
00346                                 
00347                             case gif_image_restore:                                
00348                                 memcpy(destData, 
00349                                        image->getData(0, (currentFrame >= 2) ?
00350                                                          (currentFrame - 2):0),
00351                                        image->getWidth () * 
00352                                        image->getHeight() * 
00353                                        channel);
00354                                 break;
00355                             default:
00356                                 FWARNING(("Unknown GIF disposal mode %d\n", 
00357                                         gifData->info.disposal));
00358                                 break;
00359                         }
00360 //currentFrame++;
00361 //                        continue;
00362                     }
00363                 }
00364                 else
00365                 {
00366                     switch(channel)
00367                     {
00368                     case 1:
00369                         pixelFormat = Image::OSG_L_PF;
00370                         break;
00371                     case 2:
00372                         pixelFormat = Image::OSG_LA_PF;
00373                         break;
00374                     case 3:
00375                         pixelFormat = Image::OSG_RGB_PF;
00376                         break;
00377                     case 4:
00378                         pixelFormat = Image::OSG_RGBA_PF;
00379                         break;
00380                     };
00381                     image->set(pixelFormat, width, height, 1, 1, frameCount,
00382                                frameDelay);
00383                     destData = image->getData();
00384                 }
00385 
00386                 // copy the image data)
00387                 lineSize = image->getWidth() * channel;
00388                 lineEnd  = width * channel + xOff * channel;
00389                 srcData = gifData->data.image.data;
00390                 destData = destData + ((image->getHeight() - yOff - 1) * lineSize);
00391 
00392                 switch(channel)
00393                 {
00394                 case 1: // Greyscale without Alpha
00395                     destI = 0;
00396                     for(i = width * height; i--;)
00397                     {
00398                         destData[destI++] = colorMap[*srcData++ *3];
00399                         if(destI >= lineSize)
00400                         {
00401                             destI = 0;
00402                             destData -= lineSize;
00403                         }
00404                     }
00405                     break;
00406 
00407                 case 2: // Greyscale with Alpha
00408                     destI = 0;
00409                     for(i = width * height; i--;)
00410                     {
00411                         colorIndex = *srcData++;
00412                         if(colorIndex == transparentIndex)
00413                         {
00414                             destData[destI++] = 0;
00415                             destData[destI++] = 0;
00416                         }
00417                         else
00418                         {
00419                             destData[destI++] = colorMap[colorIndex * 3];
00420                             destData[destI++] = 255;
00421                         }
00422 
00423                         if(destI >= lineSize)
00424                         {
00425                             destI = 0;
00426                             destData -= lineSize;
00427                         }
00428                     }
00429                     break;
00430 
00431                 case 3: // RGB without Alpha
00432                     destI = 0;
00433                     for(i = width * height; i--;)
00434                     {
00435                         colorIndex = *srcData++;
00436                         for(j = 0; j < 3; j++)
00437                         {
00438                             destData[destI++] = colorMap[colorIndex * 3 + j];
00439                         }
00440 
00441                         if(destI >= lineSize)
00442                         {
00443                             destI = 0;
00444                             destData -= lineSize;
00445                         }
00446                     }
00447                     break;
00448 
00449                 case 4: // RGB with Alpha
00450                     destI = xOff * 4;                    
00451                     
00452                     for(i = width * height; i--;)
00453                     {
00454                         colorIndex = *srcData++;
00455                         if(colorIndex == transparentIndex)
00456                         {
00457 /*
00458                             for(j = 0; j < 3; j++)
00459                                 destData[destI++] = 0;                              // RGB
00460                             destData[destI++] = 0;                                  // ALPHA
00461  */
00462                             destI += 4;
00463                         }
00464                         else
00465                         {
00466                             for(j = 0; j < 3; j++)
00467                             {
00468                                 destData[destI++] = 
00469                                     colorMap[colorIndex * 3 + j];   // RGB
00470                             }
00471 
00472                             destData[destI++] = 255;                                // ALPHA
00473                         }
00474 
00475                         if(destI >= lineEnd)
00476                         {
00477                             destI = xOff * 4;
00478                             destData -= lineSize;
00479                         }
00480                     }
00481                     break;
00482                 }
00483 
00484                 retCode = true;
00485 
00486                 currentFrame++;
00487 
00488                 break;
00489             case gif_comment:
00490                 break;
00491             case gif_text:
00492                 break;
00493             }
00494         }
00495 
00496         GIFFree(gifStream);
00497     }
00498     else
00499         retCode = false;
00500 #endif
00501     return retCode;
00502 }

std::string GIFImageFileType::determineMimetypeFromStream ( std::istream &  is  )  [virtual]

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 from osg::ImageFileType.

Definition at line 510 of file OSGGIFImageFileType.cpp.

References osg::ImageFileType::getMimeType().

00511 {
00512     char filecode[4];
00513     is.read(filecode, 4);
00514     is.seekg(-4, std::ios::cur);
00515     return strncmp(filecode, "GIF8", 4) == 0 ?
00516         std::string(getMimeType()) : std::string();
00517 }

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

Class method to get the singleton Object

Definition at line 190 of file OSGGIFImageFileType.cpp.

References _the.

00191 {
00192   return _the;
00193 }

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

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(), 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,
const Char8 fileName 
) [virtual, inherited]

Reimplemented in osg::DATImageFileType, and osg::HDRImageFileType.

Definition at line 141 of file OSGImageFileType.cpp.

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

00142 {
00143     std::ifstream is(fileName, std::ios::binary);
00144     if (is.good() == false)
00145         return false;
00146     return read(image, is, std::string());
00147 }

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

Reimplemented in osg::DATImageFileType, and osg::HDRImageFileType.

Definition at line 151 of file OSGImageFileType.cpp.

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

00152 {
00153     std::ofstream os(fileName, std::ios::binary);
00154     if (os.good() == false)
00155         return false;
00156     return write(image, os, std::string());
00157 }

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 }

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 }

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

Abstract restore method. Should be overwriten by a concrete derived class. Tries to restore the image data from the given memblock.

Reimplemented in osg::DATImageFileType, osg::EXRImageFileType, osg::HDRImageFileType, osg::JPGImageFileType, osg::MTDImageFileType, and osg::PNGImageFileType.

Definition at line 253 of file OSGImageFileType.cpp.

References FWARNING, and osg::ImageFileType::getMimeType().

00256 {
00257   FWARNING(("ImageXFileType::restoreData() not impl. for mimeType %s\n",
00258             getMimeType()));
00259 
00260   return 0;
00261 }

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

Abstract restore method. Should be overwriten by a concrete derived class. Tries to store the given image data to the given memblock

Reimplemented in osg::DATImageFileType, osg::EXRImageFileType, osg::HDRImageFileType, osg::JPGImageFileType, osg::MTDImageFileType, and osg::PNGImageFileType.

Definition at line 268 of file OSGImageFileType.cpp.

References FWARNING, and osg::ImageFileType::getMimeType().

Referenced by osg::ImageFileType::store().

00271 {
00272   FWARNING(("ImageXFileType::storeData() not impl. for mimeType %s\n",
00273             getMimeType()));
00274   
00275   return 0;
00276 }

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 118 of file OSGGIFImageFileType.h.

Referenced by the().

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:39 2008 for OpenSG by  doxygen 1.5.5