📄 imftiledrgbafile.cpp
字号:
TiledRgbaOutputFile::numYTiles (int ly) const
{
return _outputFile->numYTiles (ly);
}
Imath::Box2i
TiledRgbaOutputFile::dataWindowForLevel (int l) const
{
return _outputFile->dataWindowForLevel (l);
}
Imath::Box2i
TiledRgbaOutputFile::dataWindowForLevel (int lx, int ly) const
{
return _outputFile->dataWindowForLevel (lx, ly);
}
Imath::Box2i
TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int l) const
{
return _outputFile->dataWindowForTile (dx, dy, l);
}
Imath::Box2i
TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const
{
return _outputFile->dataWindowForTile (dx, dy, lx, ly);
}
void
TiledRgbaOutputFile::writeTile (int dx, int dy, int l)
{
if (_toYa)
{
Lock lock (*_toYa);
_toYa->writeTile (dx, dy, l, l);
}
else
{
_outputFile->writeTile (dx, dy, l);
}
}
void
TiledRgbaOutputFile::writeTile (int dx, int dy, int lx, int ly)
{
if (_toYa)
{
Lock lock (*_toYa);
_toYa->writeTile (dx, dy, lx, ly);
}
else
{
_outputFile->writeTile (dx, dy, lx, ly);
}
}
void
TiledRgbaOutputFile::writeTiles
(int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly)
{
if (_toYa)
{
Lock lock (*_toYa);
for (int dy = dyMin; dy <= dyMax; dy++)
for (int dx = dxMin; dx <= dxMax; dx++)
_toYa->writeTile (dx, dy, lx, ly);
}
else
{
_outputFile->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
}
}
void
TiledRgbaOutputFile::writeTiles
(int dxMin, int dxMax, int dyMin, int dyMax, int l)
{
writeTiles (dxMin, dxMax, dyMin, dyMax, l, l);
}
class TiledRgbaInputFile::FromYa: public Mutex
{
public:
FromYa (TiledInputFile &inputFile);
void setFrameBuffer (Rgba *base,
size_t xStride,
size_t yStride);
void readTile (int dx, int dy, int lx, int ly);
private:
TiledInputFile & _inputFile;
unsigned int _tileXSize;
unsigned int _tileYSize;
V3f _yw;
Array2D <Rgba> _buf;
Rgba * _fbBase;
size_t _fbXStride;
size_t _fbYStride;
};
TiledRgbaInputFile::FromYa::FromYa (TiledInputFile &inputFile)
:
_inputFile (inputFile)
{
const TileDescription &td = inputFile.header().tileDescription();
_tileXSize = td.xSize;
_tileYSize = td.ySize;
_yw = ywFromHeader (_inputFile.header());
_buf.resizeErase (_tileYSize, _tileXSize);
_fbBase = 0;
_fbXStride = 0;
_fbYStride = 0;
}
void
TiledRgbaInputFile::FromYa::setFrameBuffer (Rgba *base,
size_t xStride,
size_t yStride)
{
_fbBase = base;
_fbXStride = xStride;
_fbYStride = yStride;
}
void
TiledRgbaInputFile::FromYa::readTile (int dx, int dy, int lx, int ly)
{
if (_fbBase == 0)
{
THROW (Iex::ArgExc, "No frame buffer was specified as the "
"pixel data destination for image file "
"\"" << _inputFile.fileName() << "\".");
}
//
// Read the tile requiested by the caller into _buf.
//
Box2i dw = _inputFile.dataWindowForTile (dx, dy, lx, ly);
FrameBuffer fb;
fb.insert ("Y", Slice (HALF, // type
(char *) &_buf[-dw.min.y][-dw.min.x].g, // base
sizeof (Rgba), // xStride
sizeof (Rgba) * _tileXSize)); // yStride
fb.insert ("A", Slice (HALF, // type
(char *) &_buf[-dw.min.y][-dw.min.x].a, // base
sizeof (Rgba), // xStride
sizeof (Rgba) * _tileXSize, // yStride
1, 1, // sampling
1.0)); // fillValue
_inputFile.setFrameBuffer (fb);
_inputFile.readTile (dx, dy, lx, ly);
//
// Convert the luminance/alpha pixels to RGBA
// and copy them into the caller's frame buffer.
//
int width = dw.max.x - dw.min.x + 1;
for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1)
{
for (int x1 = 0; x1 < width; ++x1)
{
_buf[y1][x1].r = 0;
_buf[y1][x1].b = 0;
}
YCAtoRGBA (_yw, width, _buf[y1], _buf[y1]);
for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1)
{
_fbBase[x * _fbXStride + y * _fbYStride] = _buf[y1][x1];
}
}
}
TiledRgbaInputFile::TiledRgbaInputFile (const char name[], int numThreads):
_inputFile (new TiledInputFile (name, numThreads)),
_fromYa (0)
{
if (channels() & WRITE_Y)
_fromYa = new FromYa (*_inputFile);
}
TiledRgbaInputFile::TiledRgbaInputFile (IStream &is, int numThreads):
_inputFile (new TiledInputFile (is, numThreads)),
_fromYa (0)
{
if (channels() & WRITE_Y)
_fromYa = new FromYa (*_inputFile);
}
TiledRgbaInputFile::~TiledRgbaInputFile ()
{
delete _inputFile;
delete _fromYa;
}
void
TiledRgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride)
{
if (_fromYa)
{
Lock lock (*_fromYa);
_fromYa->setFrameBuffer (base, xStride, yStride);
}
else
{
size_t xs = xStride * sizeof (Rgba);
size_t ys = yStride * sizeof (Rgba);
FrameBuffer fb;
fb.insert ("R", Slice (HALF,
(char *) &base[0].r,
xs, ys,
1, 1, // xSampling, ySampling
0.0)); // fillValue
fb.insert ("G", Slice (HALF,
(char *) &base[0].g,
xs, ys,
1, 1, // xSampling, ySampling
0.0)); // fillValue
fb.insert ("B", Slice (HALF,
(char *) &base[0].b,
xs, ys,
1, 1, // xSampling, ySampling
0.0)); // fillValue
fb.insert ("A", Slice (HALF,
(char *) &base[0].a,
xs, ys,
1, 1, // xSampling, ySampling
1.0)); // fillValue
_inputFile->setFrameBuffer (fb);
}
}
const Header &
TiledRgbaInputFile::header () const
{
return _inputFile->header();
}
const char *
TiledRgbaInputFile::fileName () const
{
return _inputFile->fileName();
}
const FrameBuffer &
TiledRgbaInputFile::frameBuffer () const
{
return _inputFile->frameBuffer();
}
const Imath::Box2i &
TiledRgbaInputFile::displayWindow () const
{
return _inputFile->header().displayWindow();
}
const Imath::Box2i &
TiledRgbaInputFile::dataWindow () const
{
return _inputFile->header().dataWindow();
}
float
TiledRgbaInputFile::pixelAspectRatio () const
{
return _inputFile->header().pixelAspectRatio();
}
const Imath::V2f
TiledRgbaInputFile::screenWindowCenter () const
{
return _inputFile->header().screenWindowCenter();
}
float
TiledRgbaInputFile::screenWindowWidth () const
{
return _inputFile->header().screenWindowWidth();
}
LineOrder
TiledRgbaInputFile::lineOrder () const
{
return _inputFile->header().lineOrder();
}
Compression
TiledRgbaInputFile::compression () const
{
return _inputFile->header().compression();
}
RgbaChannels
TiledRgbaInputFile::channels () const
{
return rgbaChannels (_inputFile->header().channels());
}
int
TiledRgbaInputFile::version () const
{
return _inputFile->version();
}
bool
TiledRgbaInputFile::isComplete () const
{
return _inputFile->isComplete();
}
unsigned int
TiledRgbaInputFile::tileXSize () const
{
return _inputFile->tileXSize();
}
unsigned int
TiledRgbaInputFile::tileYSize () const
{
return _inputFile->tileYSize();
}
LevelMode
TiledRgbaInputFile::levelMode () const
{
return _inputFile->levelMode();
}
LevelRoundingMode
TiledRgbaInputFile::levelRoundingMode () const
{
return _inputFile->levelRoundingMode();
}
int
TiledRgbaInputFile::numLevels () const
{
return _inputFile->numLevels();
}
int
TiledRgbaInputFile::numXLevels () const
{
return _inputFile->numXLevels();
}
int
TiledRgbaInputFile::numYLevels () const
{
return _inputFile->numYLevels();
}
bool
TiledRgbaInputFile::isValidLevel (int lx, int ly) const
{
return _inputFile->isValidLevel (lx, ly);
}
int
TiledRgbaInputFile::levelWidth (int lx) const
{
return _inputFile->levelWidth (lx);
}
int
TiledRgbaInputFile::levelHeight (int ly) const
{
return _inputFile->levelHeight (ly);
}
int
TiledRgbaInputFile::numXTiles (int lx) const
{
return _inputFile->numXTiles(lx);
}
int
TiledRgbaInputFile::numYTiles (int ly) const
{
return _inputFile->numYTiles(ly);
}
Imath::Box2i
TiledRgbaInputFile::dataWindowForLevel (int l) const
{
return _inputFile->dataWindowForLevel (l);
}
Imath::Box2i
TiledRgbaInputFile::dataWindowForLevel (int lx, int ly) const
{
return _inputFile->dataWindowForLevel (lx, ly);
}
Imath::Box2i
TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int l) const
{
return _inputFile->dataWindowForTile (dx, dy, l);
}
Imath::Box2i
TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const
{
return _inputFile->dataWindowForTile (dx, dy, lx, ly);
}
void
TiledRgbaInputFile::readTile (int dx, int dy, int l)
{
if (_fromYa)
{
Lock lock (*_fromYa);
_fromYa->readTile (dx, dy, l, l);
}
else
{
_inputFile->readTile (dx, dy, l);
}
}
void
TiledRgbaInputFile::readTile (int dx, int dy, int lx, int ly)
{
if (_fromYa)
{
Lock lock (*_fromYa);
_fromYa->readTile (dx, dy, lx, ly);
}
else
{
_inputFile->readTile (dx, dy, lx, ly);
}
}
void
TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax,
int lx, int ly)
{
if (_fromYa)
{
Lock lock (*_fromYa);
for (int dy = dyMin; dy <= dyMax; dy++)
for (int dx = dxMin; dx <= dxMax; dx++)
_fromYa->readTile (dx, dy, lx, ly);
}
else
{
_inputFile->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
}
}
void
TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax,
int l)
{
readTiles (dxMin, dxMax, dyMin, dyMax, l, l);
}
void
TiledRgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[])
{
_outputFile->updatePreviewImage (newPixels);
}
void
TiledRgbaOutputFile::breakTile (int dx, int dy, int lx, int ly,
int offset, int length, char c)
{
_outputFile->breakTile (dx, dy, lx, ly, offset, length, c);
}
} // namespace Imf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -