/src/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp
C++ | 192 lines | 99 code | 55 blank | 38 comment | 3 complexity | 5dc2255bdd2a59f020d7df3f1f98f3d8 MD5 | raw file
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 37//----------------------------------------------------------------------------- 38// 39// class Compressor 40// 41//----------------------------------------------------------------------------- 42 43#include <ImfCompressor.h> 44#include <ImfRleCompressor.h> 45#include <ImfZipCompressor.h> 46#include <ImfPizCompressor.h> 47#include <ImfPxr24Compressor.h> 48#include <ImfB44Compressor.h> 49#include <ImfCheckedArithmetic.h> 50 51namespace Imf { 52 53using Imath::Box2i; 54 55 56Compressor::Compressor (const Header &hdr): _header (hdr) {} 57 58 59Compressor::~Compressor () {} 60 61 62Compressor::Format 63Compressor::format () const 64{ 65 return XDR; 66} 67 68 69int 70Compressor::compressTile (const char *inPtr, 71 int inSize, 72 Box2i range, 73 const char *&outPtr) 74{ 75 return compress (inPtr, inSize, range.min.y, outPtr); 76} 77 78 79int 80Compressor::uncompressTile (const char *inPtr, 81 int inSize, 82 Box2i range, 83 const char *&outPtr) 84{ 85 return uncompress (inPtr, inSize, range.min.y, outPtr); 86} 87 88 89bool 90isValidCompression (Compression c) 91{ 92 switch (c) 93 { 94 case NO_COMPRESSION: 95 case RLE_COMPRESSION: 96 case ZIPS_COMPRESSION: 97 case ZIP_COMPRESSION: 98 case PIZ_COMPRESSION: 99 case PXR24_COMPRESSION: 100 case B44_COMPRESSION: 101 case B44A_COMPRESSION: 102 103 return true; 104 105 default: 106 107 return false; 108 } 109} 110 111 112Compressor * 113newCompressor (Compression c, size_t maxScanLineSize, const Header &hdr) 114{ 115 switch (c) 116 { 117 case RLE_COMPRESSION: 118 119 return new RleCompressor (hdr, maxScanLineSize); 120 121 case ZIPS_COMPRESSION: 122 123 return new ZipCompressor (hdr, maxScanLineSize, 1); 124 125 case ZIP_COMPRESSION: 126 127 return new ZipCompressor (hdr, maxScanLineSize, 16); 128 129 case PIZ_COMPRESSION: 130 131 return new PizCompressor (hdr, maxScanLineSize, 32); 132 133 case PXR24_COMPRESSION: 134 135 return new Pxr24Compressor (hdr, maxScanLineSize, 16); 136 137 case B44_COMPRESSION: 138 139 return new B44Compressor (hdr, maxScanLineSize, 32, false); 140 141 case B44A_COMPRESSION: 142 143 return new B44Compressor (hdr, maxScanLineSize, 32, true); 144 145 default: 146 147 return 0; 148 } 149} 150 151 152Compressor * 153newTileCompressor (Compression c, 154 size_t tileLineSize, 155 size_t numTileLines, 156 const Header &hdr) 157{ 158 switch (c) 159 { 160 case RLE_COMPRESSION: 161 162 return new RleCompressor (hdr, uiMult (tileLineSize, numTileLines)); 163 164 case ZIPS_COMPRESSION: 165 case ZIP_COMPRESSION: 166 167 return new ZipCompressor (hdr, tileLineSize, numTileLines); 168 169 case PIZ_COMPRESSION: 170 171 return new PizCompressor (hdr, tileLineSize, numTileLines); 172 173 case PXR24_COMPRESSION: 174 175 return new Pxr24Compressor (hdr, tileLineSize, numTileLines); 176 177 case B44_COMPRESSION: 178 179 return new B44Compressor (hdr, tileLineSize, numTileLines, false); 180 181 case B44A_COMPRESSION: 182 183 return new B44Compressor (hdr, tileLineSize, numTileLines, true); 184 185 default: 186 187 return 0; 188 } 189} 190 191 192} // namespace Imf