Blame IlmImf/ImfTiledRgbaFile.cpp

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit 0d464f
// Digital Ltd. LLC
Packit 0d464f
// 
Packit 0d464f
// All rights reserved.
Packit 0d464f
// 
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission. 
Packit 0d464f
// 
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
//
Packit 0d464f
//	class TiledRgbaOutputFile
Packit 0d464f
//	class TiledRgbaInputFile
Packit 0d464f
//
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
Packit 0d464f
#include <ImfTiledRgbaFile.h>
Packit 0d464f
#include <ImfRgbaFile.h>
Packit 0d464f
#include <ImfTiledOutputFile.h>
Packit 0d464f
#include <ImfTiledInputFile.h>
Packit 0d464f
#include <ImfChannelList.h>
Packit 0d464f
#include <ImfTileDescriptionAttribute.h>
Packit 0d464f
#include <ImfStandardAttributes.h>
Packit 0d464f
#include <ImfRgbaYca.h>
Packit 0d464f
#include <ImfArray.h>
Packit 0d464f
#include "IlmThreadMutex.h"
Packit 0d464f
#include "Iex.h"
Packit 0d464f
Packit 0d464f
#include "ImfNamespace.h"
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
Packit 0d464f
Packit 0d464f
using namespace std;
Packit 0d464f
using namespace IMATH_NAMESPACE;
Packit 0d464f
using namespace RgbaYca;
Packit 0d464f
using namespace ILMTHREAD_NAMESPACE;
Packit 0d464f
Packit 0d464f
namespace {
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
insertChannels (Header &header,
Packit 0d464f
		RgbaChannels rgbaChannels,
Packit 0d464f
		const char fileName[])
Packit 0d464f
{
Packit 0d464f
    ChannelList ch;
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & (WRITE_Y | WRITE_C))
Packit 0d464f
    {
Packit 0d464f
	if (rgbaChannels & WRITE_Y)
Packit 0d464f
	{
Packit 0d464f
	    ch.insert ("Y", Channel (HALF, 1, 1));
Packit 0d464f
	}
Packit 0d464f
Packit 0d464f
	if (rgbaChannels & WRITE_C)
Packit 0d464f
	{
Packit 0d464f
	    THROW (IEX_NAMESPACE::ArgExc, "Cannot open file \"" << fileName << "\" "
Packit 0d464f
				"for writing.  Tiled image files do not "
Packit 0d464f
				"support subsampled chroma channels.");
Packit 0d464f
	}
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	if (rgbaChannels & WRITE_R)
Packit 0d464f
	    ch.insert ("R", Channel (HALF, 1, 1));
Packit 0d464f
Packit 0d464f
	if (rgbaChannels & WRITE_G)
Packit 0d464f
	    ch.insert ("G", Channel (HALF, 1, 1));
Packit 0d464f
Packit 0d464f
	if (rgbaChannels & WRITE_B)
Packit 0d464f
	    ch.insert ("B", Channel (HALF, 1, 1));
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & WRITE_A)
Packit 0d464f
	ch.insert ("A", Channel (HALF, 1, 1));
Packit 0d464f
Packit 0d464f
    header.channels() = ch;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
RgbaChannels
Packit 0d464f
rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "")
Packit 0d464f
{
Packit 0d464f
    int i = 0;
Packit 0d464f
Packit 0d464f
    if (ch.findChannel (channelNamePrefix + "R"))
Packit 0d464f
	i |= WRITE_R;
Packit 0d464f
Packit 0d464f
    if (ch.findChannel (channelNamePrefix + "G"))
Packit 0d464f
	i |= WRITE_G;
Packit 0d464f
    
Packit 0d464f
    if (ch.findChannel (channelNamePrefix + "B"))
Packit 0d464f
	i |= WRITE_B;
Packit 0d464f
Packit 0d464f
    if (ch.findChannel (channelNamePrefix + "A"))
Packit 0d464f
	i |= WRITE_A;
Packit 0d464f
Packit 0d464f
    if (ch.findChannel (channelNamePrefix + "Y"))
Packit 0d464f
	i |= WRITE_Y;
Packit 0d464f
Packit 0d464f
    return RgbaChannels (i);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
string
Packit 0d464f
prefixFromLayerName (const string &layerName, const Header &header)
Packit 0d464f
{
Packit 0d464f
    if (layerName.empty())
Packit 0d464f
	return "";
Packit 0d464f
Packit 0d464f
    if (hasMultiView (header) && multiView(header)[0] == layerName)
Packit 0d464f
	return "";
Packit 0d464f
Packit 0d464f
    return layerName + ".";
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
V3f
Packit 0d464f
ywFromHeader (const Header &header)
Packit 0d464f
{
Packit 0d464f
    Chromaticities cr;
Packit 0d464f
Packit 0d464f
    if (hasChromaticities (header))
Packit 0d464f
	cr = chromaticities (header);
Packit 0d464f
Packit 0d464f
    return computeYw (cr);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
} // namespace
Packit 0d464f
Packit 0d464f
Packit 0d464f
class TiledRgbaOutputFile::ToYa: public Mutex
Packit 0d464f
{
Packit 0d464f
  public:
Packit 0d464f
Packit 0d464f
     ToYa (TiledOutputFile &outputFile, RgbaChannels rgbaChannels);
Packit 0d464f
Packit 0d464f
     void	setFrameBuffer (const Rgba *base,
Packit 0d464f
				size_t xStride,
Packit 0d464f
				size_t yStride);
Packit 0d464f
Packit 0d464f
     void	writeTile (int dx, int dy, int lx, int ly);
Packit 0d464f
Packit 0d464f
  private:
Packit 0d464f
Packit 0d464f
     TiledOutputFile &	_outputFile;
Packit 0d464f
     bool		_writeA;
Packit 0d464f
     unsigned int	_tileXSize;
Packit 0d464f
     unsigned int	_tileYSize;
Packit 0d464f
     V3f		_yw;
Packit 0d464f
     Array2D <Rgba>	_buf;
Packit 0d464f
     const Rgba *	_fbBase;
Packit 0d464f
     size_t		_fbXStride;
Packit 0d464f
     size_t		_fbYStride;
Packit 0d464f
};
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::ToYa::ToYa (TiledOutputFile &outputFile,
Packit 0d464f
				 RgbaChannels rgbaChannels)
Packit 0d464f
:
Packit 0d464f
    _outputFile (outputFile)
Packit 0d464f
{
Packit 0d464f
    _writeA = (rgbaChannels & WRITE_A)? true: false;
Packit 0d464f
    
Packit 0d464f
    const TileDescription &td = outputFile.header().tileDescription();
Packit 0d464f
Packit 0d464f
    _tileXSize = td.xSize;
Packit 0d464f
    _tileYSize = td.ySize;
Packit 0d464f
    _yw = ywFromHeader (_outputFile.header());
Packit 0d464f
    _buf.resizeErase (_tileYSize, _tileXSize);
Packit 0d464f
    _fbBase = 0;
Packit 0d464f
    _fbXStride = 0;
Packit 0d464f
    _fbYStride = 0;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaOutputFile::ToYa::setFrameBuffer (const Rgba *base,
Packit 0d464f
					   size_t xStride,
Packit 0d464f
					   size_t yStride)
Packit 0d464f
{
Packit 0d464f
    _fbBase = base;
Packit 0d464f
    _fbXStride = xStride;
Packit 0d464f
    _fbYStride = yStride;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaOutputFile::ToYa::writeTile (int dx, int dy, int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_fbBase == 0)
Packit 0d464f
    {
Packit 0d464f
	THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the "
Packit 0d464f
			    "pixel data source for image file "
Packit 0d464f
			    "\"" << _outputFile.fileName() << "\".");
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Copy the tile's RGBA pixels into _buf and convert
Packit 0d464f
    // them to luminance/alpha format
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    Box2i dw = _outputFile.dataWindowForTile (dx, dy, lx, ly);
Packit 0d464f
    int width = dw.max.x - dw.min.x + 1;
Packit 0d464f
Packit 0d464f
    for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1)
Packit 0d464f
    {
Packit 0d464f
	for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1)
Packit 0d464f
	    _buf[y1][x1] = _fbBase[x * _fbXStride + y * _fbYStride];
Packit 0d464f
Packit 0d464f
	RGBAtoYCA (_yw, width, _writeA, _buf[y1], _buf[y1]);
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Store the contents of _buf in the output file
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    FrameBuffer fb;
Packit 0d464f
Packit 0d464f
    fb.insert ("Y", Slice (HALF,				   // type
Packit 0d464f
			   (char *) &_buf[-dw.min.y][-dw.min.x].g, // base
Packit 0d464f
			   sizeof (Rgba),			   // xStride
Packit 0d464f
			   sizeof (Rgba) * _tileXSize));	   // yStride
Packit 0d464f
Packit 0d464f
    fb.insert ("A", Slice (HALF,				   // type
Packit 0d464f
			   (char *) &_buf[-dw.min.y][-dw.min.x].a, // base
Packit 0d464f
			   sizeof (Rgba),			   // xStride
Packit 0d464f
			   sizeof (Rgba) * _tileXSize));	   // yStride
Packit 0d464f
Packit 0d464f
    _outputFile.setFrameBuffer (fb);
Packit 0d464f
    _outputFile.writeTile (dx, dy, lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::TiledRgbaOutputFile
Packit 0d464f
    (const char name[],
Packit 0d464f
     const Header &header,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     int tileXSize,
Packit 0d464f
     int tileYSize,
Packit 0d464f
     LevelMode mode,
Packit 0d464f
     LevelRoundingMode rmode,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _outputFile (0),
Packit 0d464f
    _toYa (0)
Packit 0d464f
{
Packit 0d464f
    Header hd (header);
Packit 0d464f
    insertChannels (hd, rgbaChannels, name);
Packit 0d464f
    hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode));
Packit 0d464f
    _outputFile = new TiledOutputFile (name, hd, numThreads);
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & WRITE_Y)
Packit 0d464f
	_toYa = new ToYa (*_outputFile, rgbaChannels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::TiledRgbaOutputFile
Packit 0d464f
    (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit 0d464f
     const Header &header,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     int tileXSize,
Packit 0d464f
     int tileYSize,
Packit 0d464f
     LevelMode mode,
Packit 0d464f
     LevelRoundingMode rmode,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _outputFile (0),
Packit 0d464f
    _toYa (0)
Packit 0d464f
{
Packit 0d464f
    Header hd (header);
Packit 0d464f
    insertChannels (hd, rgbaChannels, os.fileName());
Packit 0d464f
    hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode));
Packit 0d464f
    _outputFile = new TiledOutputFile (os, hd, numThreads);
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & WRITE_Y)
Packit 0d464f
	_toYa = new ToYa (*_outputFile, rgbaChannels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::TiledRgbaOutputFile
Packit 0d464f
    (const char name[],
Packit 0d464f
     int tileXSize,
Packit 0d464f
     int tileYSize,
Packit 0d464f
     LevelMode mode,
Packit 0d464f
     LevelRoundingMode rmode,
Packit 0d464f
     const IMATH_NAMESPACE::Box2i &displayWindow,
Packit 0d464f
     const IMATH_NAMESPACE::Box2i &dataWindow,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     float pixelAspectRatio,
Packit 0d464f
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit 0d464f
     float screenWindowWidth,
Packit 0d464f
     LineOrder lineOrder,
Packit 0d464f
     Compression compression,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _outputFile (0),
Packit 0d464f
    _toYa (0)
Packit 0d464f
{
Packit 0d464f
    Header hd (displayWindow,
Packit 0d464f
	       dataWindow.isEmpty()? displayWindow: dataWindow,
Packit 0d464f
	       pixelAspectRatio,
Packit 0d464f
	       screenWindowCenter,
Packit 0d464f
	       screenWindowWidth,
Packit 0d464f
	       lineOrder,
Packit 0d464f
	       compression);
Packit 0d464f
Packit 0d464f
    insertChannels (hd, rgbaChannels, name);
Packit 0d464f
    hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode));
Packit 0d464f
    _outputFile = new TiledOutputFile (name, hd, numThreads);
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & WRITE_Y)
Packit 0d464f
	_toYa = new ToYa (*_outputFile, rgbaChannels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::TiledRgbaOutputFile
Packit 0d464f
    (const char name[],
Packit 0d464f
     int width,
Packit 0d464f
     int height,
Packit 0d464f
     int tileXSize,
Packit 0d464f
     int tileYSize,
Packit 0d464f
     LevelMode mode,
Packit 0d464f
     LevelRoundingMode rmode,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     float pixelAspectRatio,
Packit 0d464f
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit 0d464f
     float screenWindowWidth,
Packit 0d464f
     LineOrder lineOrder,
Packit 0d464f
     Compression compression,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _outputFile (0),
Packit 0d464f
    _toYa (0)
Packit 0d464f
{
Packit 0d464f
    Header hd (width,
Packit 0d464f
	       height,
Packit 0d464f
	       pixelAspectRatio,
Packit 0d464f
	       screenWindowCenter,
Packit 0d464f
	       screenWindowWidth,
Packit 0d464f
	       lineOrder,
Packit 0d464f
	       compression);
Packit 0d464f
Packit 0d464f
    insertChannels (hd, rgbaChannels, name);
Packit 0d464f
    hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode));
Packit 0d464f
    _outputFile = new TiledOutputFile (name, hd, numThreads);
Packit 0d464f
Packit 0d464f
    if (rgbaChannels & WRITE_Y)
Packit 0d464f
	_toYa = new ToYa (*_outputFile, rgbaChannels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaOutputFile::~TiledRgbaOutputFile ()
Packit 0d464f
{
Packit 0d464f
    delete _outputFile;
Packit 0d464f
    delete _toYa;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaOutputFile::setFrameBuffer (const Rgba *base,
Packit 0d464f
				     size_t xStride,
Packit 0d464f
				     size_t yStride)
Packit 0d464f
{
Packit 0d464f
    if (_toYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_toYa);
Packit 0d464f
	_toYa->setFrameBuffer (base, xStride, yStride);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	size_t xs = xStride * sizeof (Rgba);
Packit 0d464f
	size_t ys = yStride * sizeof (Rgba);
Packit 0d464f
Packit 0d464f
	FrameBuffer fb;
Packit 0d464f
Packit 0d464f
	fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys));
Packit 0d464f
	fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys));
Packit 0d464f
	fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys));
Packit 0d464f
	fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys));
Packit 0d464f
Packit 0d464f
	_outputFile->setFrameBuffer (fb);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const Header &
Packit 0d464f
TiledRgbaOutputFile::header () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const FrameBuffer &
Packit 0d464f
TiledRgbaOutputFile::frameBuffer () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->frameBuffer();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
TiledRgbaOutputFile::displayWindow () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().displayWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
TiledRgbaOutputFile::dataWindow () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().dataWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float	
Packit 0d464f
TiledRgbaOutputFile::pixelAspectRatio () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().pixelAspectRatio();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::V2f
Packit 0d464f
TiledRgbaOutputFile::screenWindowCenter () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().screenWindowCenter();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float	
Packit 0d464f
TiledRgbaOutputFile::screenWindowWidth () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().screenWindowWidth();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LineOrder
Packit 0d464f
TiledRgbaOutputFile::lineOrder () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().lineOrder();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Compression
Packit 0d464f
TiledRgbaOutputFile::compression () const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->header().compression();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
RgbaChannels
Packit 0d464f
TiledRgbaOutputFile::channels () const
Packit 0d464f
{
Packit 0d464f
    return rgbaChannels (_outputFile->header().channels());
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
unsigned int
Packit 0d464f
TiledRgbaOutputFile::tileXSize () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->tileXSize();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
unsigned int
Packit 0d464f
TiledRgbaOutputFile::tileYSize () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->tileYSize();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LevelMode
Packit 0d464f
TiledRgbaOutputFile::levelMode () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->levelMode();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LevelRoundingMode
Packit 0d464f
TiledRgbaOutputFile::levelRoundingMode () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->levelRoundingMode();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::numLevels () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->numLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::numXLevels () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->numXLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::numYLevels () const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->numYLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
TiledRgbaOutputFile::isValidLevel (int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
    return _outputFile->isValidLevel (lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::levelWidth (int lx) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->levelWidth (lx);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::levelHeight (int ly) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->levelHeight (ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::numXTiles (int lx) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->numXTiles (lx);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaOutputFile::numYTiles (int ly) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->numYTiles (ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaOutputFile::dataWindowForLevel (int l) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->dataWindowForLevel (l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaOutputFile::dataWindowForLevel (int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->dataWindowForLevel (lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int l) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->dataWindowForTile (dx, dy, l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
     return _outputFile->dataWindowForTile (dx, dy, lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaOutputFile::writeTile (int dx, int dy, int l)
Packit 0d464f
{
Packit 0d464f
    if (_toYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_toYa);
Packit 0d464f
	_toYa->writeTile (dx, dy, l, l);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	 _outputFile->writeTile (dx, dy, l);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaOutputFile::writeTile (int dx, int dy, int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_toYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_toYa);
Packit 0d464f
	_toYa->writeTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	 _outputFile->writeTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaOutputFile::writeTiles
Packit 0d464f
    (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_toYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_toYa);
Packit 0d464f
Packit 0d464f
        for (int dy = dyMin; dy <= dyMax; dy++)
Packit 0d464f
            for (int dx = dxMin; dx <= dxMax; dx++)
Packit 0d464f
	        _toYa->writeTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
        _outputFile->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaOutputFile::writeTiles
Packit 0d464f
    (int dxMin, int dxMax, int dyMin, int dyMax, int l)
Packit 0d464f
{
Packit 0d464f
    writeTiles (dxMin, dxMax, dyMin, dyMax, l, l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
class TiledRgbaInputFile::FromYa: public Mutex
Packit 0d464f
{
Packit 0d464f
  public:
Packit 0d464f
Packit 0d464f
     FromYa (TiledInputFile &inputFile);
Packit 0d464f
Packit 0d464f
     void	setFrameBuffer (Rgba *base,
Packit 0d464f
				size_t xStride,
Packit 0d464f
				size_t yStride,
Packit 0d464f
				const string &channelNamePrefix);
Packit 0d464f
Packit 0d464f
     void	readTile (int dx, int dy, int lx, int ly);
Packit 0d464f
Packit 0d464f
  private:
Packit 0d464f
Packit 0d464f
     TiledInputFile &	_inputFile;
Packit 0d464f
     unsigned int	_tileXSize;
Packit 0d464f
     unsigned int	_tileYSize;
Packit 0d464f
     V3f		_yw;
Packit 0d464f
     Array2D <Rgba>	_buf;
Packit 0d464f
     Rgba *		_fbBase;
Packit 0d464f
     size_t		_fbXStride;
Packit 0d464f
     size_t		_fbYStride;
Packit 0d464f
};
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::FromYa::FromYa (TiledInputFile &inputFile)
Packit 0d464f
:
Packit 0d464f
    _inputFile (inputFile)
Packit 0d464f
{
Packit 0d464f
    const TileDescription &td = inputFile.header().tileDescription();
Packit 0d464f
Packit 0d464f
    _tileXSize = td.xSize;
Packit 0d464f
    _tileYSize = td.ySize;
Packit 0d464f
    _yw = ywFromHeader (_inputFile.header());
Packit 0d464f
    _buf.resizeErase (_tileYSize, _tileXSize);
Packit 0d464f
    _fbBase = 0;
Packit 0d464f
    _fbXStride = 0;
Packit 0d464f
    _fbYStride = 0;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaInputFile::FromYa::setFrameBuffer (Rgba *base,
Packit 0d464f
					    size_t xStride,
Packit 0d464f
					    size_t yStride,
Packit 0d464f
					    const string &channelNamePrefix)
Packit 0d464f
{
Packit 0d464f
    if (_fbBase == 0)
Packit 0d464f
{
Packit 0d464f
	FrameBuffer fb;
Packit 0d464f
Packit 0d464f
	fb.insert (channelNamePrefix + "Y",
Packit 0d464f
		   Slice (HALF,				// type
Packit 0d464f
			  (char *) &_buf[0][0].g,	// base
Packit 0d464f
			  sizeof (Rgba),		// xStride
Packit 0d464f
			  sizeof (Rgba) * _tileXSize,	// yStride
Packit 0d464f
			  1, 1,				// sampling
Packit 0d464f
			  0.0,				// fillValue
Packit 0d464f
			  true, true));			// tileCoordinates
Packit 0d464f
Packit 0d464f
	fb.insert (channelNamePrefix + "A",
Packit 0d464f
		   Slice (HALF,				// type
Packit 0d464f
			  (char *) &_buf[0][0].a,	// base
Packit 0d464f
			  sizeof (Rgba),		// xStride
Packit 0d464f
			  sizeof (Rgba) * _tileXSize,	// yStride
Packit 0d464f
			  1, 1,				// sampling
Packit 0d464f
			  1.0,				// fillValue
Packit 0d464f
			  true, true));			// tileCoordinates
Packit 0d464f
Packit 0d464f
	_inputFile.setFrameBuffer (fb);
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    _fbBase = base;
Packit 0d464f
    _fbXStride = xStride;
Packit 0d464f
    _fbYStride = yStride;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaInputFile::FromYa::readTile (int dx, int dy, int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_fbBase == 0)
Packit 0d464f
    {
Packit 0d464f
	THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the "
Packit 0d464f
			    "pixel data destination for image file "
Packit 0d464f
			    "\"" << _inputFile.fileName() << "\".");
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Read the tile requested by the caller into _buf.
Packit 0d464f
    //
Packit 0d464f
    
Packit 0d464f
    _inputFile.readTile (dx, dy, lx, ly);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Convert the luminance/alpha pixels to RGBA
Packit 0d464f
    // and copy them into the caller's frame buffer.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    Box2i dw = _inputFile.dataWindowForTile (dx, dy, lx, ly);
Packit 0d464f
    int width = dw.max.x - dw.min.x + 1;
Packit 0d464f
Packit 0d464f
    for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1)
Packit 0d464f
    {
Packit 0d464f
	for (int x1 = 0; x1 < width; ++x1)
Packit 0d464f
	{
Packit 0d464f
	    _buf[y1][x1].r = 0;
Packit 0d464f
	    _buf[y1][x1].b = 0;
Packit 0d464f
	}
Packit 0d464f
Packit 0d464f
	YCAtoRGBA (_yw, width, _buf[y1], _buf[y1]);
Packit 0d464f
Packit 0d464f
	for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1)
Packit 0d464f
	{
Packit 0d464f
	    _fbBase[x * _fbXStride + y * _fbYStride] = _buf[y1][x1];
Packit 0d464f
	}
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::TiledRgbaInputFile (const char name[], int numThreads):
Packit 0d464f
    _inputFile (new TiledInputFile (name, numThreads)),
Packit 0d464f
    _fromYa (0),
Packit 0d464f
    _channelNamePrefix ("")
Packit 0d464f
{
Packit 0d464f
    if (channels() & WRITE_Y)
Packit 0d464f
	_fromYa = new FromYa (*_inputFile);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads):
Packit 0d464f
    _inputFile (new TiledInputFile (is, numThreads)),
Packit 0d464f
    _fromYa (0),
Packit 0d464f
    _channelNamePrefix ("")
Packit 0d464f
{
Packit 0d464f
    if (channels() & WRITE_Y)
Packit 0d464f
	_fromYa = new FromYa (*_inputFile);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::TiledRgbaInputFile (const char name[],
Packit 0d464f
					const string &layerName,
Packit 0d464f
					int numThreads)
Packit 0d464f
:
Packit 0d464f
    _inputFile (new TiledInputFile (name, numThreads)),
Packit 0d464f
    _fromYa (0),
Packit 0d464f
    _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header()))
Packit 0d464f
{
Packit 0d464f
    if (channels() & WRITE_Y)
Packit 0d464f
	_fromYa = new FromYa (*_inputFile);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
Packit 0d464f
					const string &layerName,
Packit 0d464f
					int numThreads)
Packit 0d464f
:
Packit 0d464f
    _inputFile (new TiledInputFile (is, numThreads)),
Packit 0d464f
    _fromYa (0),
Packit 0d464f
    _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header()))
Packit 0d464f
{
Packit 0d464f
    if (channels() & WRITE_Y)
Packit 0d464f
	_fromYa = new FromYa (*_inputFile);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
TiledRgbaInputFile::~TiledRgbaInputFile ()
Packit 0d464f
{
Packit 0d464f
    delete _inputFile;
Packit 0d464f
    delete _fromYa;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride)
Packit 0d464f
{
Packit 0d464f
    if (_fromYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_fromYa);
Packit 0d464f
	_fromYa->setFrameBuffer (base, xStride, yStride, _channelNamePrefix);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	size_t xs = xStride * sizeof (Rgba);
Packit 0d464f
	size_t ys = yStride * sizeof (Rgba);
Packit 0d464f
Packit 0d464f
	FrameBuffer fb;
Packit 0d464f
Packit 0d464f
	fb.insert (_channelNamePrefix + "R",
Packit 0d464f
		   Slice (HALF,
Packit 0d464f
			       (char *) &base[0].r,
Packit 0d464f
			       xs, ys,
Packit 0d464f
			       1, 1,	// xSampling, ySampling
Packit 0d464f
			       0.0));	// fillValue
Packit 0d464f
Packit 0d464f
	fb.insert (_channelNamePrefix + "G",
Packit 0d464f
		   Slice (HALF,
Packit 0d464f
			       (char *) &base[0].g,
Packit 0d464f
			       xs, ys,
Packit 0d464f
			       1, 1,	// xSampling, ySampling
Packit 0d464f
			       0.0));	// fillValue
Packit 0d464f
Packit 0d464f
	fb.insert (_channelNamePrefix + "B",
Packit 0d464f
		   Slice (HALF,
Packit 0d464f
			       (char *) &base[0].b,
Packit 0d464f
			       xs, ys,
Packit 0d464f
			       1, 1,	// xSampling, ySampling
Packit 0d464f
			       0.0));	// fillValue
Packit 0d464f
Packit 0d464f
	fb.insert (_channelNamePrefix + "A",
Packit 0d464f
		   Slice (HALF,
Packit 0d464f
			       (char *) &base[0].a,
Packit 0d464f
			       xs, ys,
Packit 0d464f
			       1, 1,	// xSampling, ySampling
Packit 0d464f
			       1.0));	// fillValue
Packit 0d464f
Packit 0d464f
	_inputFile->setFrameBuffer (fb);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
TiledRgbaInputFile::setLayerName (const std::string &layerName)
Packit 0d464f
{
Packit 0d464f
    delete _fromYa;
Packit 0d464f
    _fromYa = 0;
Packit 0d464f
    
Packit 0d464f
    _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header());
Packit 0d464f
Packit 0d464f
    if (channels() & WRITE_Y)
Packit 0d464f
	_fromYa = new FromYa (*_inputFile);
Packit 0d464f
Packit 0d464f
    FrameBuffer fb;
Packit 0d464f
    _inputFile->setFrameBuffer (fb);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const Header &
Packit 0d464f
TiledRgbaInputFile::header () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const char *
Packit 0d464f
TiledRgbaInputFile::fileName () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->fileName();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const FrameBuffer &	
Packit 0d464f
TiledRgbaInputFile::frameBuffer () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->frameBuffer();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
TiledRgbaInputFile::displayWindow () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().displayWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
TiledRgbaInputFile::dataWindow () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().dataWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float	
Packit 0d464f
TiledRgbaInputFile::pixelAspectRatio () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().pixelAspectRatio();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::V2f	
Packit 0d464f
TiledRgbaInputFile::screenWindowCenter () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().screenWindowCenter();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float	
Packit 0d464f
TiledRgbaInputFile::screenWindowWidth () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().screenWindowWidth();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LineOrder
Packit 0d464f
TiledRgbaInputFile::lineOrder () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().lineOrder();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Compression
Packit 0d464f
TiledRgbaInputFile::compression () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->header().compression();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
RgbaChannels	
Packit 0d464f
TiledRgbaInputFile::channels () const
Packit 0d464f
{
Packit 0d464f
    return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::version () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->version();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
TiledRgbaInputFile::isComplete () const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->isComplete();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
unsigned int
Packit 0d464f
TiledRgbaInputFile::tileXSize () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->tileXSize();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
unsigned int
Packit 0d464f
TiledRgbaInputFile::tileYSize () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->tileYSize();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LevelMode
Packit 0d464f
TiledRgbaInputFile::levelMode () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->levelMode();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LevelRoundingMode
Packit 0d464f
TiledRgbaInputFile::levelRoundingMode () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->levelRoundingMode();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::numLevels () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->numLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::numXLevels () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->numXLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::numYLevels () const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->numYLevels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
TiledRgbaInputFile::isValidLevel (int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
    return _inputFile->isValidLevel (lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::levelWidth (int lx) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->levelWidth (lx);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::levelHeight (int ly) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->levelHeight (ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::numXTiles (int lx) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->numXTiles(lx);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
TiledRgbaInputFile::numYTiles (int ly) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->numYTiles(ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaInputFile::dataWindowForLevel (int l) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->dataWindowForLevel (l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaInputFile::dataWindowForLevel (int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->dataWindowForLevel (lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int l) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->dataWindowForTile (dx, dy, l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
IMATH_NAMESPACE::Box2i
Packit 0d464f
TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const
Packit 0d464f
{
Packit 0d464f
     return _inputFile->dataWindowForTile (dx, dy, lx, ly);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaInputFile::readTile (int dx, int dy, int l)
Packit 0d464f
{
Packit 0d464f
    if (_fromYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_fromYa);
Packit 0d464f
	_fromYa->readTile (dx, dy, l, l);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	 _inputFile->readTile (dx, dy, l);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
TiledRgbaInputFile::readTile (int dx, int dy, int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_fromYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_fromYa);
Packit 0d464f
	_fromYa->readTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	 _inputFile->readTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax,
Packit 0d464f
                               int lx, int ly)
Packit 0d464f
{
Packit 0d464f
    if (_fromYa)
Packit 0d464f
    {
Packit 0d464f
	Lock lock (*_fromYa);
Packit 0d464f
Packit 0d464f
        for (int dy = dyMin; dy <= dyMax; dy++)
Packit 0d464f
            for (int dx = dxMin; dx <= dxMax; dx++)
Packit 0d464f
	        _fromYa->readTile (dx, dy, lx, ly);
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
        _inputFile->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax,
Packit 0d464f
                               int l)
Packit 0d464f
{
Packit 0d464f
    readTiles (dxMin, dxMax, dyMin, dyMax, l, l);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
TiledRgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[])
Packit 0d464f
{
Packit 0d464f
    _outputFile->updatePreviewImage (newPixels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void	
Packit 0d464f
TiledRgbaOutputFile::breakTile  (int dx, int dy, int lx, int ly,
Packit 0d464f
				 int offset, int length, char c)
Packit 0d464f
{
Packit 0d464f
    _outputFile->breakTile (dx, dy, lx, ly, offset, length, c);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT