📄 imfmisc.cpp
字号:
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 + -