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