Home | History | Annotate | Download | only in IlmImf
      1 ///////////////////////////////////////////////////////////////////////////
      2 //
      3 // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
      4 // Digital Ltd. LLC
      5 //
      6 // All rights reserved.
      7 //
      8 // Redistribution and use in source and binary forms, with or without
      9 // modification, are permitted provided that the following conditions are
     10 // met:
     11 // *       Redistributions of source code must retain the above copyright
     12 // notice, this list of conditions and the following disclaimer.
     13 // *       Redistributions in binary form must reproduce the above
     14 // copyright notice, this list of conditions and the following disclaimer
     15 // in the documentation and/or other materials provided with the
     16 // distribution.
     17 // *       Neither the name of Industrial Light & Magic nor the names of
     18 // its contributors may be used to endorse or promote products derived
     19 // from this software without specific prior written permission.
     20 //
     21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32 //
     33 ///////////////////////////////////////////////////////////////////////////
     34 
     35 
     36 #ifndef INCLUDED_IMF_TILED_RGBA_FILE_H
     37 #define INCLUDED_IMF_TILED_RGBA_FILE_H
     38 
     39 //-----------------------------------------------------------------------------
     40 //
     41 //	Simplified RGBA image I/O for tiled files
     42 //
     43 //	class TiledRgbaOutputFile
     44 //	class TiledRgbaInputFile
     45 //
     46 //-----------------------------------------------------------------------------
     47 
     48 #include <ImfHeader.h>
     49 #include <ImfFrameBuffer.h>
     50 #include "ImathVec.h"
     51 #include "ImathBox.h"
     52 #include "half.h"
     53 #include <ImfTileDescription.h>
     54 #include <ImfRgba.h>
     55 #include <ImfThreading.h>
     56 #include <string>
     57 
     58 namespace Imf {
     59 
     60 class TiledOutputFile;
     61 class TiledInputFile;
     62 struct PreviewRgba;
     63 
     64 
     65 //
     66 // Tiled RGBA output file.
     67 //
     68 
     69 class TiledRgbaOutputFile
     70 {
     71   public:
     72 
     73     //---------------------------------------------------
     74     // Constructor -- rgbaChannels, tileXSize, tileYSize,
     75     // levelMode, and levelRoundingMode overwrite the
     76     // channel list and tile description attribute in the
     77     // header that is passed as an argument to the
     78     // constructor.
     79     //---------------------------------------------------
     80 
     81     TiledRgbaOutputFile (const char name[],
     82              const Header &header,
     83              RgbaChannels rgbaChannels,
     84              int tileXSize,
     85              int tileYSize,
     86              LevelMode mode,
     87              LevelRoundingMode rmode = ROUND_DOWN,
     88                          int numThreads = globalThreadCount ());
     89 
     90 
     91     //---------------------------------------------------
     92     // Constructor -- like the previous one, but the new
     93     // TiledRgbaOutputFile is attached to a file that has
     94     // already been opened by the caller.  Destroying
     95     // TiledRgbaOutputFileObjects constructed with this
     96     // constructor does not automatically close the
     97     // corresponding files.
     98     //---------------------------------------------------
     99 
    100     TiledRgbaOutputFile (OStream &os,
    101              const Header &header,
    102              RgbaChannels rgbaChannels,
    103              int tileXSize,
    104              int tileYSize,
    105              LevelMode mode,
    106              LevelRoundingMode rmode = ROUND_DOWN,
    107                          int numThreads = globalThreadCount ());
    108 
    109 
    110     //------------------------------------------------------
    111     // Constructor -- header data are explicitly specified
    112     // as function call arguments (an empty dataWindow means
    113     // "same as displayWindow")
    114     //------------------------------------------------------
    115 
    116     TiledRgbaOutputFile (const char name[],
    117              int tileXSize,
    118              int tileYSize,
    119              LevelMode mode,
    120              LevelRoundingMode rmode,
    121              const Imath::Box2i &displayWindow,
    122              const Imath::Box2i &dataWindow = Imath::Box2i(),
    123              RgbaChannels rgbaChannels = WRITE_RGBA,
    124              float pixelAspectRatio = 1,
    125              const Imath::V2f screenWindowCenter =
    126                             Imath::V2f (0, 0),
    127              float screenWindowWidth = 1,
    128              LineOrder lineOrder = INCREASING_Y,
    129              Compression compression = ZIP_COMPRESSION,
    130                          int numThreads = globalThreadCount ());
    131 
    132 
    133     //-----------------------------------------------
    134     // Constructor -- like the previous one, but both
    135     // the display window and the data window are
    136     // Box2i (V2i (0, 0), V2i (width - 1, height -1))
    137     //-----------------------------------------------
    138 
    139     TiledRgbaOutputFile (const char name[],
    140              int width,
    141              int height,
    142              int tileXSize,
    143              int tileYSize,
    144              LevelMode mode,
    145              LevelRoundingMode rmode = ROUND_DOWN,
    146              RgbaChannels rgbaChannels = WRITE_RGBA,
    147              float pixelAspectRatio = 1,
    148              const Imath::V2f screenWindowCenter =
    149                             Imath::V2f (0, 0),
    150              float screenWindowWidth = 1,
    151              LineOrder lineOrder = INCREASING_Y,
    152              Compression compression = ZIP_COMPRESSION,
    153                          int numThreads = globalThreadCount ());
    154 
    155 
    156     virtual ~TiledRgbaOutputFile ();
    157 
    158 
    159     //------------------------------------------------
    160     // Define a frame buffer as the pixel data source:
    161     // Pixel (x, y) is at address
    162     //
    163     //  base + x * xStride + y * yStride
    164     //
    165     //------------------------------------------------
    166 
    167     void		setFrameBuffer (const Rgba *base,
    168                     size_t xStride,
    169                     size_t yStride);
    170 
    171     //--------------------------
    172     // Access to the file header
    173     //--------------------------
    174 
    175     const Header &		header () const;
    176     const FrameBuffer &		frameBuffer () const;
    177     const Imath::Box2i &	displayWindow () const;
    178     const Imath::Box2i &	dataWindow () const;
    179     float			pixelAspectRatio () const;
    180     const Imath::V2f		screenWindowCenter () const;
    181     float			screenWindowWidth () const;
    182     LineOrder			lineOrder () const;
    183     Compression			compression () const;
    184     RgbaChannels		channels () const;
    185 
    186 
    187     //----------------------------------------------------
    188     // Utility functions (same as in Imf::TiledOutputFile)
    189     //----------------------------------------------------
    190 
    191     unsigned int	tileXSize () const;
    192     unsigned int	tileYSize () const;
    193     LevelMode		levelMode () const;
    194     LevelRoundingMode	levelRoundingMode () const;
    195 
    196     int			numLevels () const;
    197     int			numXLevels () const;
    198     int			numYLevels () const;
    199     bool		isValidLevel (int lx, int ly) const;
    200 
    201     int			levelWidth  (int lx) const;
    202     int			levelHeight (int ly) const;
    203 
    204     int			numXTiles (int lx = 0) const;
    205     int			numYTiles (int ly = 0) const;
    206 
    207     Imath::Box2i	dataWindowForLevel (int l = 0) const;
    208     Imath::Box2i	dataWindowForLevel (int lx, int ly) const;
    209 
    210     Imath::Box2i	dataWindowForTile (int dx, int dy,
    211                        int l = 0) const;
    212 
    213     Imath::Box2i	dataWindowForTile (int dx, int dy,
    214                        int lx, int ly) const;
    215 
    216     //------------------------------------------------------------------
    217     // Write pixel data:
    218     //
    219     // writeTile(dx, dy, lx, ly) writes the tile with tile
    220     // coordinates (dx, dy), and level number (lx, ly) to
    221     // the file.
    222     //
    223     //   dx must lie in the interval [0, numXTiles(lx)-1]
    224     //   dy must lie in the interval [0, numYTiles(ly)-1]
    225     //
    226     //   lx must lie in the interval [0, numXLevels()-1]
    227     //   ly must lie in the inverval [0, numYLevels()-1]
    228     //
    229     // writeTile(dx, dy, level) is a convenience function
    230     // used for ONE_LEVEL and MIPMAP_LEVEL files.  It calls
    231     // writeTile(dx, dy, level, level).
    232     //
    233     // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow
    234     // writing multiple tiles at once.  If multi-threading is used
    235     // multiple tiles are written concurrently.
    236     //
    237     // Pixels that are outside the pixel coordinate range for the tile's
    238     // level, are never accessed by writeTile().
    239     //
    240     // Each tile in the file must be written exactly once.
    241     //
    242     //------------------------------------------------------------------
    243 
    244     void		writeTile (int dx, int dy, int l = 0);
    245     void		writeTile (int dx, int dy, int lx, int ly);
    246 
    247     void		writeTiles (int dxMin, int dxMax, int dyMin, int dyMax,
    248                                     int lx, int ly);
    249 
    250     void		writeTiles (int dxMin, int dxMax, int dyMin, int dyMax,
    251                                     int l = 0);
    252 
    253 
    254     // -------------------------------------------------------------------------
    255     // Update the preview image (see Imf::TiledOutputFile::updatePreviewImage())
    256     // -------------------------------------------------------------------------
    257 
    258     void		updatePreviewImage (const PreviewRgba[]);
    259 
    260 
    261     //------------------------------------------------
    262     // Break a tile -- for testing and debugging only
    263     // (see Imf::TiledOutputFile::breakTile())
    264     //
    265     // Warning: Calling this function usually results
    266     // in a broken image file.  The file or parts of
    267     // it may not be readable, or the file may contain
    268     // bad data.
    269     //
    270     //------------------------------------------------
    271 
    272     void		breakTile  (int dx, int dy,
    273                     int lx, int ly,
    274                     int offset,
    275                     int length,
    276                     char c);
    277   private:
    278 
    279     //
    280     // Copy constructor and assignment are not implemented
    281     //
    282 
    283     TiledRgbaOutputFile (const TiledRgbaOutputFile &);
    284     TiledRgbaOutputFile & operator = (const TiledRgbaOutputFile &);
    285 
    286     class ToYa;
    287 
    288     TiledOutputFile *            _outputFile;
    289     ToYa *			_toYa;
    290 };
    291 
    292 
    293 
    294 //
    295 // Tiled RGBA input file
    296 //
    297 
    298 class TiledRgbaInputFile
    299 {
    300   public:
    301 
    302     //--------------------------------------------------------
    303     // Constructor -- opens the file with the specified name.
    304     // Destroying TiledRgbaInputFile objects constructed with
    305     // this constructor automatically closes the corresponding
    306     // files.
    307     //--------------------------------------------------------
    308 
    309     TiledRgbaInputFile (const char name[],
    310                         int numThreads = globalThreadCount ());
    311 
    312 
    313     //-------------------------------------------------------
    314     // Constructor -- attaches the new TiledRgbaInputFile
    315     // object to a file that has already been opened by the
    316     // caller.
    317     // Destroying TiledRgbaInputFile objects constructed with
    318     // this constructor does not automatically close the
    319     // corresponding files.
    320     //-------------------------------------------------------
    321 
    322     TiledRgbaInputFile (IStream &is, int numThreads = globalThreadCount ());
    323 
    324 
    325     //------------------------------------------------------------
    326     // Constructors -- the same as the previous two, but the names
    327     // of the red, green, blue, alpha, and luminance channels are
    328     // expected to be layerName.R, layerName.G, etc.
    329     //------------------------------------------------------------
    330 
    331     TiledRgbaInputFile (const char name[],
    332                 const std::string &layerName,
    333                 int numThreads = globalThreadCount());
    334 
    335     TiledRgbaInputFile (IStream &is,
    336                 const std::string &layerName,
    337                 int numThreads = globalThreadCount());
    338 
    339     //-----------
    340     // Destructor
    341     //-----------
    342 
    343     virtual ~TiledRgbaInputFile ();
    344 
    345 
    346     //-----------------------------------------------------
    347     // Define a frame buffer as the pixel data destination:
    348     // Pixel (x, y) is at address
    349     //
    350     //  base + x * xStride + y * yStride
    351     //
    352     //-----------------------------------------------------
    353 
    354     void			setFrameBuffer (Rgba *base,
    355                         size_t xStride,
    356                         size_t yStride);
    357 
    358     //-------------------------------------------------------------------
    359     // Switch to a different layer -- subsequent calls to readTile()
    360     // and readTiles() will read channels layerName.R, layerName.G, etc.
    361     // After each call to setLayerName(), setFrameBuffer() must be called
    362     // at least once before the next call to readTile() or readTiles().
    363     //-------------------------------------------------------------------
    364 
    365     void			setLayerName (const std::string &layerName);
    366 
    367 
    368     //--------------------------
    369     // Access to the file header
    370     //--------------------------
    371 
    372     const Header &		header () const;
    373     const FrameBuffer &		frameBuffer () const;
    374     const Imath::Box2i &	displayWindow () const;
    375     const Imath::Box2i &	dataWindow () const;
    376     float			pixelAspectRatio () const;
    377     const Imath::V2f		screenWindowCenter () const;
    378     float			screenWindowWidth () const;
    379     LineOrder			lineOrder () const;
    380     Compression			compression () const;
    381     RgbaChannels		channels () const;
    382     const char *                fileName () const;
    383     bool			isComplete () const;
    384 
    385     //----------------------------------
    386     // Access to the file format version
    387     //----------------------------------
    388 
    389     int				version () const;
    390 
    391 
    392     //---------------------------------------------------
    393     // Utility functions (same as in Imf::TiledInputFile)
    394     //---------------------------------------------------
    395 
    396     unsigned int	tileXSize () const;
    397     unsigned int	tileYSize () const;
    398     LevelMode		levelMode () const;
    399     LevelRoundingMode	levelRoundingMode () const;
    400 
    401     int			numLevels () const;
    402     int			numXLevels () const;
    403     int			numYLevels () const;
    404     bool		isValidLevel (int lx, int ly) const;
    405 
    406     int			levelWidth  (int lx) const;
    407     int			levelHeight (int ly) const;
    408 
    409     int			numXTiles (int lx = 0) const;
    410     int			numYTiles (int ly = 0) const;
    411 
    412     Imath::Box2i	dataWindowForLevel (int l = 0) const;
    413     Imath::Box2i	dataWindowForLevel (int lx, int ly) const;
    414 
    415     Imath::Box2i	dataWindowForTile (int dx, int dy,
    416                        int l = 0) const;
    417 
    418     Imath::Box2i	dataWindowForTile (int dx, int dy,
    419                        int lx, int ly) const;
    420 
    421 
    422     //----------------------------------------------------------------
    423     // Read pixel data:
    424     //
    425     // readTile(dx, dy, lx, ly) reads the tile with tile
    426     // coordinates (dx, dy), and level number (lx, ly),
    427     // and stores it in the current frame buffer.
    428     //
    429     //   dx must lie in the interval [0, numXTiles(lx)-1]
    430     //   dy must lie in the interval [0, numYTiles(ly)-1]
    431     //
    432     //   lx must lie in the interval [0, numXLevels()-1]
    433     //   ly must lie in the inverval [0, numYLevels()-1]
    434     //
    435     // readTile(dx, dy, level) is a convenience function used
    436     // for ONE_LEVEL and MIPMAP_LEVELS files.  It calls
    437     // readTile(dx, dy, level, level).
    438     //
    439     // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow
    440     // reading multiple tiles at once.  If multi-threading is used
    441     // multiple tiles are read concurrently.
    442     //
    443     // Pixels that are outside the pixel coordinate range for the
    444     // tile's level, are never accessed by readTile().
    445     //
    446     // Attempting to access a tile that is not present in the file
    447     // throws an InputExc exception.
    448     //
    449     //----------------------------------------------------------------
    450 
    451     void           	readTile (int dx, int dy, int l = 0);
    452     void           	readTile (int dx, int dy, int lx, int ly);
    453 
    454     void		readTiles (int dxMin, int dxMax,
    455                                    int dyMin, int dyMax, int lx, int ly);
    456 
    457     void		readTiles (int dxMin, int dxMax,
    458                                    int dyMin, int dyMax, int l = 0);
    459 
    460   private:
    461 
    462     //
    463     // Copy constructor and assignment are not implemented
    464     //
    465 
    466     TiledRgbaInputFile (const TiledRgbaInputFile &);
    467     TiledRgbaInputFile & operator = (const TiledRgbaInputFile &);
    468 
    469     class FromYa;
    470 
    471     TiledInputFile *	_inputFile;
    472     FromYa *		_fromYa;
    473     std::string		_channelNamePrefix;
    474 };
    475 
    476 
    477 } // namespace Imf
    478 
    479 #endif
    480