1 /////////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (c) 2002, 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 37 #ifndef INCLUDED_IMF_COMPRESSOR_H 38 #define INCLUDED_IMF_COMPRESSOR_H 39 40 //----------------------------------------------------------------------------- 41 // 42 // class Compressor 43 // 44 //----------------------------------------------------------------------------- 45 46 #include <ImfCompression.h> 47 #include "ImathBox.h" 48 #include <stdlib.h> 49 50 namespace Imf { 51 52 class Header; 53 54 55 class Compressor 56 { 57 public: 58 59 //--------------------------------------------- 60 // Constructor -- hdr is the header of the file 61 // that will be compressed or uncompressed 62 //--------------------------------------------- 63 64 Compressor (const Header &hdr); 65 66 67 //----------- 68 // Destructor 69 //----------- 70 71 virtual ~Compressor (); 72 73 74 //---------------------------------------------- 75 // Maximum number of scan lines processed by 76 // a single call to compress() and uncompress(). 77 //---------------------------------------------- 78 79 virtual int numScanLines () const = 0; 80 81 82 //-------------------------------------------- 83 // Format of the pixel data read and written 84 // by the compress() and uncompress() methods. 85 // The default implementation of format() 86 // returns XDR. 87 //-------------------------------------------- 88 89 enum Format 90 { 91 NATIVE, // the machine's native format 92 XDR // Xdr format 93 }; 94 95 virtual Format format () const; 96 97 98 //---------------------------- 99 // Access to the file's header 100 //---------------------------- 101 header()102 const Header & header () const {return _header;} 103 104 105 //------------------------------------------------------------------------- 106 // Compress an array of bytes that represents the contents of up to 107 // numScanLines() scan lines: 108 // 109 // inPtr Input buffer (uncompressed data). 110 // 111 // inSize Number of bytes in the input buffer 112 // 113 // minY Minimum y coordinate of the scan lines to 114 // be compressed 115 // 116 // outPtr Pointer to output buffer 117 // 118 // return value Size of compressed data in output buffer 119 // 120 // Arrangement of uncompressed pixel data in the input buffer: 121 // 122 // Before calling 123 // 124 // compress (buf, size, minY, ...); 125 // 126 // the InputFile::writePixels() method gathers pixel data from the 127 // frame buffer, fb, and places them in buffer buf, like this: 128 // 129 // char *endOfBuf = buf; 130 // 131 // for (int y = minY; 132 // y <= min (minY + numScanLines() - 1, header().dataWindow().max.y); 133 // ++y) 134 // { 135 // for (ChannelList::ConstIterator c = header().channels().begin(); 136 // c != header().channels().end(); 137 // ++c) 138 // { 139 // if (modp (y, c.channel().ySampling) != 0) 140 // continue; 141 // 142 // for (int x = header().dataWindow().min.x; 143 // x <= header().dataWindow().max.x; 144 // ++x) 145 // { 146 // if (modp (x, c.channel().xSampling) != 0) 147 // continue; 148 // 149 // Xdr::write<CharPtrIO> (endOfBuf, fb.pixel (c, x, y)); 150 // } 151 // } 152 // } 153 // 154 // int size = endOfBuf - buf; 155 // 156 //------------------------------------------------------------------------- 157 158 virtual int compress (const char *inPtr, 159 int inSize, 160 int minY, 161 const char *&outPtr) = 0; 162 163 virtual int compressTile (const char *inPtr, 164 int inSize, 165 Imath::Box2i range, 166 const char *&outPtr); 167 168 //------------------------------------------------------------------------- 169 // Uncompress an array of bytes that has been compressed by compress(): 170 // 171 // inPtr Input buffer (compressed data). 172 // 173 // inSize Number of bytes in the input buffer 174 // 175 // minY Minimum y coordinate of the scan lines to 176 // be uncompressed 177 // 178 // outPtr Pointer to output buffer 179 // 180 // return value Size of uncompressed data in output buffer 181 // 182 //------------------------------------------------------------------------- 183 184 virtual int uncompress (const char *inPtr, 185 int inSize, 186 int minY, 187 const char *&outPtr) = 0; 188 189 virtual int uncompressTile (const char *inPtr, 190 int inSize, 191 Imath::Box2i range, 192 const char *&outPtr); 193 194 private: 195 196 const Header & _header; 197 }; 198 199 200 //-------------------------------------- 201 // Test if c is a valid compression type 202 //-------------------------------------- 203 204 bool isValidCompression (Compression c); 205 206 207 //----------------------------------------------------------------- 208 // Construct a Compressor for compression type c: 209 // 210 // maxScanLineSize Maximum number of bytes per uncompressed 211 // scan line. 212 // 213 // header Header of the input or output file whose 214 // pixels will be compressed or uncompressed. 215 // 216 // return value A pointer to a new Compressor object (it 217 // is the caller's responsibility to delete 218 // the object), or 0 (if c is NO_COMPRESSION). 219 // 220 //----------------------------------------------------------------- 221 222 Compressor * newCompressor (Compression c, 223 size_t maxScanLineSize, 224 const Header &hdr); 225 226 227 //----------------------------------------------------------------- 228 // Construct a Compressor for compression type c for a tiled image: 229 // 230 // tileLineSize Maximum number of bytes per uncompressed 231 // line in a tile. 232 // 233 // numTileLines Maximum number of lines in a tile. 234 // 235 // header Header of the input or output file whose 236 // pixels will be compressed or uncompressed. 237 // 238 // return value A pointer to a new Compressor object (it 239 // is the caller's responsibility to delete 240 // the object), or 0 (if c is NO_COMPRESSION). 241 // 242 //----------------------------------------------------------------- 243 244 Compressor * newTileCompressor (Compression c, 245 size_t tileLineSize, 246 size_t numTileLines, 247 const Header &hdr); 248 249 250 } // namespace Imf 251 252 #endif 253