⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imfmisc.cpp

📁 image converter source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                        writePtr[i] = readPtr[i];                    readPtr += sizeof (unsigned int);                    writePtr += xStride;                }                break;              case HALF:                while (writePtr <= endPtr)                {                    half h = *(half *) readPtr;                    *(unsigned int *) writePtr = halfToUint (h);                    readPtr += sizeof (half);                    writePtr += xStride;                }                break;              case FLOAT:                while (writePtr <= endPtr)                {                    float f;                    for (size_t i = 0; i < sizeof (float); ++i)                        ((char *)&f)[i] = readPtr[i];                    *(unsigned int *)writePtr = floatToUint (f);                    readPtr += sizeof (float);                    writePtr += xStride;                }                break;            }            break;          case HALF:            switch (typeInFile)            {              case UINT:                while (writePtr <= endPtr)                {                    unsigned int ui;                    for (size_t i = 0; i < sizeof (unsigned int); ++i)                        ((char *)&ui)[i] = readPtr[i];                    *(half *) writePtr = uintToHalf (ui);                    readPtr += sizeof (unsigned int);                    writePtr += xStride;                }                break;              case HALF:                while (writePtr <= endPtr)                {                    *(half *) writePtr = *(half *)readPtr;                    readPtr += sizeof (half);                    writePtr += xStride;                }                break;              case FLOAT:                while (writePtr <= endPtr)                {                    float f;                    for (size_t i = 0; i < sizeof (float); ++i)                        ((char *)&f)[i] = readPtr[i];                    *(half *) writePtr = floatToHalf (f);                    readPtr += sizeof (float);                    writePtr += xStride;                }                break;            }            break;          case FLOAT:            switch (typeInFile)            {              case UINT:                while (writePtr <= endPtr)                {                    unsigned int ui;                    for (size_t i = 0; i < sizeof (unsigned int); ++i)                        ((char *)&ui)[i] = readPtr[i];                    *(float *) writePtr = float (ui);                    readPtr += sizeof (unsigned int);                    writePtr += xStride;                }                break;              case HALF:                while (writePtr <= endPtr)                {                    half h = *(half *) readPtr;                    *(float *) writePtr = float (h);                    readPtr += sizeof (half);                    writePtr += xStride;                }                break;              case FLOAT:                while (writePtr <= endPtr)                {                    for (size_t i = 0; i < sizeof (float); ++i)                        writePtr[i] = readPtr[i];                    readPtr += sizeof (float);                    writePtr += xStride;                }                break;            }            break;          default:            throw Iex::ArgExc ("Unknown pixel data type.");        }    }}voidskipChannel (const char *& readPtr,             PixelType typeInFile,	     size_t xSize){    switch (typeInFile)    {      case UINT:                Xdr::skip <CharPtrIO> (readPtr, Xdr::size <unsigned int> () * xSize);        break;      case HALF:        Xdr::skip <CharPtrIO> (readPtr, Xdr::size <half> () * xSize);        break;      case FLOAT:        Xdr::skip <CharPtrIO> (readPtr, Xdr::size <float> () * xSize);        break;      default:        throw Iex::ArgExc ("Unknown pixel data type.");    }}voidconvertInPlace (char *& writePtr,                const char *& readPtr,		PixelType type,                size_t numPixels){    switch (type)    {      case UINT:            for (int j = 0; j < numPixels; ++j)        {            Xdr::write <CharPtrIO> (writePtr, *(const unsigned int *) readPtr);            readPtr += sizeof(unsigned int);        }        break;          case HALF:            for (int j = 0; j < numPixels; ++j)        {                           Xdr::write <CharPtrIO> (writePtr, *(const half *) readPtr);            readPtr += sizeof(half);        }        break;          case FLOAT:            for (int j = 0; j < numPixels; ++j)        {            Xdr::write <CharPtrIO> (writePtr, *(const float *) readPtr);            readPtr += sizeof(float);        }        break;          default:            throw Iex::ArgExc ("Unknown pixel data type.");    }}voidcopyFromFrameBuffer (char *& writePtr,		     const char *& readPtr,                     const char * endPtr,		     size_t xStride,                     Compressor::Format format,		     PixelType type){    //    // Copy a horizontal row of pixels from a frame    // buffer to an output file's line or tile buffer.    //    if (format == Compressor::XDR)    {        //        // The the line or tile buffer is in XDR format.        //        switch (type)        {          case UINT:            while (readPtr <= endPtr)            {                Xdr::write <CharPtrIO> (writePtr,                                        *(const unsigned int *) readPtr);                readPtr += xStride;            }            break;          case HALF:            while (readPtr <= endPtr)            {                Xdr::write <CharPtrIO> (writePtr, *(const half *) readPtr);                readPtr += xStride;            }            break;          case FLOAT:            while (readPtr <= endPtr)            {                Xdr::write <CharPtrIO> (writePtr, *(const float *) readPtr);                readPtr += xStride;            }            break;          default:            throw Iex::ArgExc ("Unknown pixel data type.");        }    }    else    {        //        // The the line or tile buffer is in NATIVE format.        //        switch (type)        {          case UINT:            while (readPtr <= endPtr)            {                for (size_t i = 0; i < sizeof (unsigned int); ++i)                    *writePtr++ = readPtr[i];                readPtr += xStride;            }            break;          case HALF:            while (readPtr <= endPtr)            {                *(half *) writePtr = *(const half *) readPtr;                writePtr += sizeof (half);                readPtr += xStride;            }            break;          case FLOAT:            while (readPtr <= endPtr)            {                for (size_t i = 0; i < sizeof (float); ++i)                    *writePtr++ = readPtr[i];                readPtr += xStride;            }            break;                      default:            throw Iex::ArgExc ("Unknown pixel data type.");        }    }}voidfillChannelWithZeroes (char *& writePtr,		       Compressor::Format format,		       PixelType type,		       size_t xSize){    if (format == Compressor::XDR)    {        //        // Fill with data in XDR format.        //        switch (type)        {          case UINT:            for (int j = 0; j < xSize; ++j)                Xdr::write <CharPtrIO> (writePtr, (unsigned int) 0);            break;          case HALF:            for (int j = 0; j < xSize; ++j)                Xdr::write <CharPtrIO> (writePtr, (half) 0);            break;          case FLOAT:            for (int j = 0; j < xSize; ++j)                Xdr::write <CharPtrIO> (writePtr, (float) 0);            break;                      default:            throw Iex::ArgExc ("Unknown pixel data type.");        }    }    else    {        //        // Fill with data in NATIVE format.        //        switch (type)        {          case UINT:            for (int j = 0; j < xSize; ++j)            {                static const unsigned int ui = 0;                for (size_t i = 0; i < sizeof (ui); ++i)                    *writePtr++ = ((char *) &ui)[i];            }            break;          case HALF:            for (int j = 0; j < xSize; ++j)            {                *(half *) writePtr = half (0);                writePtr += sizeof (half);            }            break;          case FLOAT:            for (int j = 0; j < xSize; ++j)            {                static const float f = 0;                for (size_t i = 0; i < sizeof (f); ++i)                    *writePtr++ = ((char *) &f)[i];            }            break;                      default:            throw Iex::ArgExc ("Unknown pixel data type.");        }    }}} // namespace Imf

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -