/src/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h
C++ Header | 255 lines | 46 code | 38 blank | 171 comment | 0 complexity | 17a154409fecfc2d536af28973cc9f12 MD5 | raw file
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_MISC_H 38#define INCLUDED_IMF_MISC_H 39 40//----------------------------------------------------------------------------- 41// 42// Miscellaneous helper functions for OpenEXR image file I/O 43// 44//----------------------------------------------------------------------------- 45 46#include <ImfPixelType.h> 47#include <vector> 48#include <ImfCompressor.h> 49 50namespace Imf { 51 52class Header; 53 54// 55// Return the size of a single value of the indicated type, 56// in the machine's native format. 57// 58 59int pixelTypeSize (PixelType type); 60 61 62// 63// Return the number of samples a channel with subsampling rate 64// s has in the interval [a, b]. For example, a channel with 65// subsampling rate 2 (and samples at 0, 2, 4, 6, 8, etc.) has 66// 2 samples in the interval [1, 5] and three samples in the 67// interval [2, 6]. 68// 69 70int numSamples (int s, int a, int b); 71 72 73// 74// Build a table that lists, for each scanline in a file's 75// data window, how many bytes are required to store all 76// pixels in all channels in that scanline (assuming that 77// the pixel data are tightly packed). 78// 79 80size_t bytesPerLineTable (const Header &header, 81 std::vector<size_t> &bytesPerLine); 82 83// 84// For scanline-based files, pixels are read or written in 85// in multi-scanline blocks. Internally, class OutputFile 86// and class ScanLineInputFile store a block of scan lines 87// in a "line buffer". Function offsetInLineBufferTable() 88// builds a table that lists, for each scan line in a file's 89// data window, the location of the pixel data for the scanline 90// relative to the beginning of the line buffer. 91// 92 93void offsetInLineBufferTable (const std::vector<size_t> &bytesPerLine, 94 int linesInLineBuffer, 95 std::vector<size_t> &offsetInLineBuffer); 96 97// 98// For a scanline-based file, compute the range of scanlines 99// that occupy the same line buffer as a given scanline, y. 100// (minY is the minimum y coordinate of the file's data window.) 101// 102 103int lineBufferMinY (int y, int minY, int linesInLineBuffer); 104int lineBufferMaxY (int y, int minY, int linesInLineBuffer); 105 106 107// 108// Return a compressor's data format (Compressor::NATIVE or Compressor::XDR). 109// If compressor is 0, return Compressor::XDR. 110// 111 112Compressor::Format defaultFormat (Compressor *compressor); 113 114 115// 116// Return the number of scan lines a compressor wants to compress 117// or uncompress at once. If compressor is 0, return 1. 118// 119 120int numLinesInBuffer (Compressor *compressor); 121 122 123// 124// Copy a single channel of a horizontal row of pixels from an 125// input file's internal line buffer or tile buffer into a 126// frame buffer slice. If necessary, perform on-the-fly data 127// type conversion. 128// 129// readPtr initially points to the beginning of the 130// data in the line or tile buffer. readPtr 131// is advanced as the pixel data are copied; 132// when copyIntoFrameBuffer() returns, 133// readPtr points just past the end of the 134// copied data. 135// 136// writePtr, endPtr point to the lefmost and rightmost pixels 137// in the frame buffer slice 138// 139// xStride the xStride for the frame buffer slice 140// 141// format indicates if the line or tile buffer is 142// in NATIVE or XDR format. 143// 144// typeInFrameBuffer the pixel data type of the frame buffer slice 145// 146// typeInFile the pixel data type in the input file's channel 147// 148 149void copyIntoFrameBuffer (const char *&readPtr, 150 char *writePtr, 151 char *endPtr, 152 size_t xStride, 153 bool fill, 154 double fillValue, 155 Compressor::Format format, 156 PixelType typeInFrameBuffer, 157 PixelType typeInFile); 158 159// 160// Given a pointer into a an input file's line buffer or tile buffer, 161// skip over the data for xSize pixels of type typeInFile. 162// readPtr initially points to the beginning of the data to be skipped; 163// when skipChannel() returns, readPtr points just past the end of the 164// skipped data. 165// 166 167void skipChannel (const char *&readPtr, 168 PixelType typeInFile, 169 size_t xSize); 170 171// 172// Convert an array of pixel data from the machine's native 173// representation to XDR format. 174// 175// toPtr, fromPtr initially point to the beginning of the input 176// and output pixel data arrays; when convertInPlace() 177// returns, toPtr and fromPtr point just past the 178// end of the input and output arrays. 179// If the native representation of the data has the 180// same size as the XDR data, then the conversion 181// can take in place, without an intermediate 182// temporary buffer (toPtr and fromPtr can point 183// to the same location). 184// 185// type the pixel data type 186// 187// numPixels number of pixels in the input and output arrays 188// 189 190void convertInPlace (char *&toPtr, 191 const char *&fromPtr, 192 PixelType type, 193 size_t numPixels); 194 195// 196// Copy a single channel of a horizontal row of pixels from a 197// a frame buffer into an output file's internal line buffer or 198// tile buffer. 199// 200// writePtr initially points to the beginning of the 201// data in the line or tile buffer. writePtr 202// is advanced as the pixel data are copied; 203// when copyFromFrameBuffer() returns, 204// writePtr points just past the end of the 205// copied data. 206// 207// readPtr, endPtr point to the lefmost and rightmost pixels 208// in the frame buffer slice 209// 210// xStride the xStride for the frame buffer slice 211// 212// format indicates if the line or tile buffer is 213// in NATIVE or XDR format. 214// 215// type the pixel data type in the frame buffer 216// and in the output file's channel (function 217// copyFromFrameBuffer() doesn't do on-the-fly 218// data type conversion) 219// 220 221void copyFromFrameBuffer (char *&writePtr, 222 const char *&readPtr, 223 const char *endPtr, 224 size_t xStride, 225 Compressor::Format format, 226 PixelType type); 227 228// 229// Fill part of an output file's line buffer or tile buffer with 230// zeroes. This routine is called when an output file contains 231// a channel for which the frame buffer contains no corresponding 232// slice. 233// 234// writePtr initially points to the beginning of the 235// data in the line or tile buffer. When 236// fillChannelWithZeroes() returns, writePtr 237// points just past the end of the zeroed 238// data. 239// 240// format indicates if the line or tile buffer is 241// in NATIVE or XDR format. 242// 243// type the pixel data type in the line or frame buffer. 244// 245// xSize number of pixels to be filled with zeroes. 246// 247 248void fillChannelWithZeroes (char *&writePtr, 249 Compressor::Format format, 250 PixelType type, 251 size_t xSize); 252 253} // namespace Imf 254 255#endif