Blame IlmImfExamples/generalInterfaceExamples.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	Code examples that show how class InputFile and class OutputFile
Packit Service 6754ca
//	can be used to read and write OpenEXR image files with an arbitrary
Packit Service 6754ca
//	set of channels.
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include <ImfOutputFile.h>
Packit Service 6754ca
#include <ImfInputFile.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfStringAttribute.h>
Packit Service 6754ca
#include <ImfMatrixAttribute.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
Packit Service 6754ca
#include "drawImage.h"
Packit Service 6754ca
Packit Service 6754ca
#include <iostream>
Packit Service 6754ca
Packit Service 6754ca
#include "namespaceAlias.h"
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeGZ1 (const char fileName[],
Packit Service 6754ca
	  const half *gPixels,
Packit Service 6754ca
	  const float *zPixels,
Packit Service 6754ca
	  int width,
Packit Service 6754ca
	  int height)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Write an image with only a G (green) and a Z (depth) channel,
Packit Service 6754ca
    // using class OutputFile.
Packit Service 6754ca
    //
Packit Service 6754ca
    //	- create a file header
Packit Service 6754ca
    //	- add G and Z channels to the header
Packit Service 6754ca
    //	- open the file, and store the header in the file
Packit Service 6754ca
    //	- describe the memory layout of the G anx Z pixels
Packit Service 6754ca
    //	- store the pixels in the file
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    Header header (width, height);
Packit Service 6754ca
    header.channels().insert ("G", Channel (IMF::HALF));
Packit Service 6754ca
    header.channels().insert ("Z", Channel (IMF::FLOAT));
Packit Service 6754ca
Packit Service 6754ca
    OutputFile file (fileName, header);
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("G",					// name
Packit Service 6754ca
		        Slice (IMF::HALF,			// type
Packit Service 6754ca
			       (char *) gPixels,		// base
Packit Service 6754ca
			       sizeof (*gPixels) * 1,		// xStride
Packit Service 6754ca
			       sizeof (*gPixels) * width));	// yStride
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("Z",					// name
Packit Service 6754ca
			Slice (IMF::FLOAT,			// type
Packit Service 6754ca
			       (char *) zPixels,		// base
Packit Service 6754ca
			       sizeof (*zPixels) * 1,		// xStride
Packit Service 6754ca
			       sizeof (*zPixels) * width));	// yStride
Packit Service 6754ca
Packit Service 6754ca
    file.setFrameBuffer (frameBuffer);
Packit Service 6754ca
    file.writePixels (height);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeGZ2 (const char fileName[],
Packit Service 6754ca
	  const half *gPixels,
Packit Service 6754ca
	  const float *zPixels,
Packit Service 6754ca
	  int width,
Packit Service 6754ca
	  int height,
Packit Service 6754ca
	  const Box2i &dataWindow)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Write an image with only a G (green) and a Z (depth) channel,
Packit Service 6754ca
    // using class OutputFile.  Don't store the whole image in the
Packit Service 6754ca
    // file, but crop it according to the given data window.
Packit Service 6754ca
    //
Packit Service 6754ca
    //	- create a file header
Packit Service 6754ca
    //	- set the header's data window
Packit Service 6754ca
    //	- add G and Z channels to the header
Packit Service 6754ca
    //	- open the file, and store the header in the file
Packit Service 6754ca
    //	- describe the memory layout of the G anx Z pixels
Packit Service 6754ca
    //	- store the pixels in the file
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    Header header (width, height);
Packit Service 6754ca
    header.dataWindow() = dataWindow;
Packit Service 6754ca
    header.channels().insert ("G", Channel (IMF::HALF));
Packit Service 6754ca
    header.channels().insert ("Z", Channel (IMF::FLOAT));
Packit Service 6754ca
Packit Service 6754ca
    OutputFile file (fileName, header);
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("G",					// name
Packit Service 6754ca
			Slice (IMF::HALF,			// type
Packit Service 6754ca
			       (char *) gPixels,		// base
Packit Service 6754ca
			       sizeof (*gPixels) * 1,		// xStride
Packit Service 6754ca
			       sizeof (*gPixels) * width));	// yStride
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("Z",					// name
Packit Service 6754ca
			Slice (IMF::FLOAT,			// type
Packit Service 6754ca
			       (char *) zPixels,		// base
Packit Service 6754ca
			       sizeof (*zPixels) * 1,		// xStride
Packit Service 6754ca
			       sizeof (*zPixels) * width));	// yStride
Packit Service 6754ca
Packit Service 6754ca
    file.setFrameBuffer (frameBuffer);
Packit Service 6754ca
    file.writePixels (dataWindow.max.y - dataWindow.min.y + 1);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readGZ1 (const char fileName[],
Packit Service 6754ca
	 Array2D<half> &rPixels,
Packit Service 6754ca
	 Array2D<half> &gPixels,
Packit Service 6754ca
	 Array2D<float> &zPixels,
Packit Service 6754ca
	 int &width, int &height)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Read an image using class InputFile.  Try to read two
Packit Service 6754ca
    // channels, R and G, of type HALF, and one channel, Z,
Packit Service 6754ca
    // of type FLOAT.  Store the R, G, and Z pixels in three
Packit Service 6754ca
    // separate memory buffers.
Packit Service 6754ca
    // If a channel is missing in the file, the buffer for that
Packit Service 6754ca
    // channel will be filled with an appropriate default value.
Packit Service 6754ca
    //
Packit Service 6754ca
    //	- open the file
Packit Service 6754ca
    //	- allocate memory for the pixels
Packit Service 6754ca
    //	- describe the layout of the R, G, and Z pixel buffers
Packit Service 6754ca
    //	- read the pixels from the file
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    InputFile file (fileName);
Packit Service 6754ca
Packit Service 6754ca
    Box2i dw = file.header().dataWindow();
Packit Service 6754ca
    width  = dw.max.x - dw.min.x + 1;
Packit Service 6754ca
    height = dw.max.y - dw.min.y + 1;
Packit Service 6754ca
Packit Service 6754ca
    rPixels.resizeErase (height, width);
Packit Service 6754ca
    gPixels.resizeErase (height, width);
Packit Service 6754ca
    zPixels.resizeErase (height, width);
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("R",					// name
Packit Service 6754ca
			Slice (IMF::HALF,			// type
Packit Service 6754ca
			       (char *) (&rPixels[0][0] -	// base
Packit Service 6754ca
					 dw.min.x -
Packit Service 6754ca
					 dw.min.y * width),
Packit Service 6754ca
			       sizeof (rPixels[0][0]) * 1,	// xStride
Packit Service 6754ca
			       sizeof (rPixels[0][0]) * width,	// yStride
Packit Service 6754ca
			       1, 1,				// x/y sampling
Packit Service 6754ca
			       0.0));				// fillValue
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("G",					// name
Packit Service 6754ca
			Slice (IMF::HALF,			// type
Packit Service 6754ca
			       (char *) (&gPixels[0][0] -	// base
Packit Service 6754ca
					 dw.min.x -
Packit Service 6754ca
					 dw.min.y * width),
Packit Service 6754ca
			       sizeof (gPixels[0][0]) * 1,	// xStride
Packit Service 6754ca
			       sizeof (gPixels[0][0]) * width,	// yStride
Packit Service 6754ca
			       1, 1,				// x/y sampling
Packit Service 6754ca
			       0.0));				// fillValue
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("Z",					// name
Packit Service 6754ca
			Slice (IMF::FLOAT,			// type
Packit Service 6754ca
			       (char *) (&zPixels[0][0] -	// base
Packit Service 6754ca
					 dw.min.x -
Packit Service 6754ca
					 dw.min.y * width),
Packit Service 6754ca
			       sizeof (zPixels[0][0]) * 1,	 // xStride
Packit Service 6754ca
			       sizeof (zPixels[0][0]) * width,	// yStride
Packit Service 6754ca
			       1, 1,				// x/y sampling
Packit Service 6754ca
			       FLT_MAX));			// fillValue
Packit Service 6754ca
Packit Service 6754ca
    file.setFrameBuffer (frameBuffer);
Packit Service 6754ca
    file.readPixels (dw.min.y, dw.max.y);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readGZ2 (const char fileName[],
Packit Service 6754ca
	 Array2D<GZ> &pixels,
Packit Service 6754ca
	 int &width, int &height)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Read an image using class InputFile.  Try to read one channel,
Packit Service 6754ca
    // G, of type HALF, and one channel, Z, of type FLOAT.  In memory,
Packit Service 6754ca
    // the G and Z channels will be interleaved in a single buffer.
Packit Service 6754ca
    //
Packit Service 6754ca
    //	- open the file
Packit Service 6754ca
    //	- allocate memory for the pixels
Packit Service 6754ca
    //	- describe the layout of the GZ pixel buffer
Packit Service 6754ca
    //	- read the pixels from the file
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    InputFile file (fileName);
Packit Service 6754ca
Packit Service 6754ca
    Box2i dw = file.header().dataWindow();
Packit Service 6754ca
    width  = dw.max.x - dw.min.x + 1;
Packit Service 6754ca
    height = dw.max.y - dw.min.y + 1;
Packit Service 6754ca
    int dx = dw.min.x;
Packit Service 6754ca
    int dy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
    pixels.resizeErase (height, width);
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("G",					 // name
Packit Service 6754ca
                        Slice (IMF::HALF,			 // type
Packit Service 6754ca
			       (char *) &pixels[-dy][-dx].g,	 // base
Packit Service 6754ca
				sizeof (pixels[0][0]) * 1,	 // xStride
Packit Service 6754ca
				sizeof (pixels[0][0]) * width)); // yStride
Packit Service 6754ca
Packit Service 6754ca
    frameBuffer.insert ("Z",					 // name
Packit Service 6754ca
                        Slice (IMF::FLOAT,			 // type
Packit Service 6754ca
			       (char *) &pixels[-dy][-dx].z,	 // base
Packit Service 6754ca
				sizeof (pixels[0][0]) * 1,	 // xStride
Packit Service 6754ca
				sizeof (pixels[0][0]) * width)); // yStride
Packit Service 6754ca
Packit Service 6754ca
    file.setFrameBuffer (frameBuffer);
Packit Service 6754ca
    file.readPixels (dw.min.y, dw.max.y);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
generalInterfaceExamples ()
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "\nGZ (green, depth) images\n" << endl;
Packit Service 6754ca
    cout << "drawing image" << endl;
Packit Service 6754ca
Packit Service 6754ca
    int w = 800;
Packit Service 6754ca
    int h = 600;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<half>  gp (h, w);
Packit Service 6754ca
    Array2D<float> zp (h, w);
Packit Service 6754ca
    drawImage2 (gp, zp, w, h);
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing entire image" << endl;
Packit Service 6754ca
Packit Service 6754ca
    writeGZ1 ("gz1.exr", &gp[0][0], &zp[0][0], w, h);
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing cropped image" << endl;
Packit Service 6754ca
Packit Service 6754ca
    writeGZ2 ("gz2.exr", &gp[0][0], &zp[0][0], w, h,
Packit Service 6754ca
	      Box2i (V2i (w/6, h/6), V2i (w/2, h/2)));
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading file into separate per-channel buffers" << endl;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<half> rp (1, 1);
Packit Service 6754ca
    readGZ1 ("gz2.exr", rp, gp, zp, w, h);
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading file into interleaved multi-channel buffer" << endl;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<GZ> gzp (1, 1);
Packit Service 6754ca
    readGZ2 ("gz2.exr", gzp, w, h);
Packit Service 6754ca
}