Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp view on Meta::CPAN
int partNumber; // part number
bool multiPartBackwardSupport; // if we are reading a multipart file
// using OpenEXR 1.7 API
int numThreads; // number of threads
MultiPartInputFile* multiPartFile; // the MultiPartInputFile used to
// support backward compatibility
vector<TileBuffer*> tileBuffers; // each holds a single tile
bool memoryMapped; // if the stream is memory mapped
char* sampleCountSliceBase; // pointer to the start of
// the sample count array
ptrdiff_t sampleCountXStride; // x stride of the sample count array
ptrdiff_t sampleCountYStride; // y stride of the sample count array
int sampleCountXTileCoords; // the value of xTileCoords from the
// sample count slice
int sampleCountYTileCoords; // the value of yTileCoords from the
// sample count slice
Array<char> sampleCountTableBuffer; // the buffer for sample count table
Compressor* sampleCountTableComp; // the decompressor for sample count table
Int64 maxSampleCountTableSize; // the max size in bytes for a pixel
// sample count table
int combinedSampleSize; // total size of all channels combined to check sampletable size
InputStreamMutex * _streamData;
bool _deleteStream; // should we delete the stream
Data (int numThreads);
~Data ();
inline TileBuffer * getTileBuffer (int number);
// hash function from tile indices
// into our vector of tile buffers
int& getSampleCount(int x, int y);
// get the number of samples
// in each pixel
};
DeepTiledInputFile::Data::Data (int numThreads):
numXTiles (0),
numYTiles (0),
partNumber (-1),
multiPartBackwardSupport(false),
numThreads(numThreads),
memoryMapped(false),
_streamData(NULL),
_deleteStream(false)
{
//
// We need at least one tileBuffer, but if threading is used,
// to keep n threads busy we need 2*n tileBuffers
//
tileBuffers.resize (max (1, 2 * numThreads));
}
DeepTiledInputFile::Data::~Data ()
{
delete [] numXTiles;
delete [] numYTiles;
for (size_t i = 0; i < tileBuffers.size(); i++)
delete tileBuffers[i];
if (multiPartBackwardSupport)
delete multiPartFile;
for (size_t i = 0; i < slices.size(); i++)
delete slices[i];
}
TileBuffer*
DeepTiledInputFile::Data::getTileBuffer (int number)
{
return tileBuffers[number % tileBuffers.size()];
}
int&
DeepTiledInputFile::Data::getSampleCount(int x, int y)
{
return sampleCount(sampleCountSliceBase,
sampleCountXStride,
sampleCountYStride,
x, y);
}
namespace {
void
readTileData (InputStreamMutex *streamData,
DeepTiledInputFile::Data *ifd,
int dx, int dy,
int lx, int ly,
char *&buffer,
Int64 &dataSize,
Int64 &unpackedDataSize)
{
//
// Read a single tile block from the file and into the array pointed
// to by buffer. If the file is memory-mapped, then we change where
// buffer points instead of writing into the array (hence buffer needs
// to be a reference to a char *).
//
//
// Look up the location for this tile in the Index and
// seek to that position if necessary
( run in 1.149 second using v1.01-cache-2.11-cpan-99c4e6809bf )