Blame IlmImfTest/testTiledCompression.cpp

Packit c2c737
///////////////////////////////////////////////////////////////////////////
Packit c2c737
//
Packit c2c737
// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas
Packit c2c737
// Digital Ltd. LLC
Packit c2c737
// 
Packit c2c737
// All rights reserved.
Packit c2c737
// 
Packit c2c737
// Redistribution and use in source and binary forms, with or without
Packit c2c737
// modification, are permitted provided that the following conditions are
Packit c2c737
// met:
Packit c2c737
// *       Redistributions of source code must retain the above copyright
Packit c2c737
// notice, this list of conditions and the following disclaimer.
Packit c2c737
// *       Redistributions in binary form must reproduce the above
Packit c2c737
// copyright notice, this list of conditions and the following disclaimer
Packit c2c737
// in the documentation and/or other materials provided with the
Packit c2c737
// distribution.
Packit c2c737
// *       Neither the name of Industrial Light & Magic nor the names of
Packit c2c737
// its contributors may be used to endorse or promote products derived
Packit c2c737
// from this software without specific prior written permission. 
Packit c2c737
// 
Packit c2c737
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit c2c737
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit c2c737
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit c2c737
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit c2c737
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit c2c737
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit c2c737
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit c2c737
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit c2c737
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit c2c737
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit c2c737
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit c2c737
//
Packit c2c737
///////////////////////////////////////////////////////////////////////////
Packit c2c737
Packit c2c737
Packit c2c737
#include "compareB44.h"
Packit c2c737
#include "compareDwa.h"
Packit c2c737
Packit c2c737
#include <ImfOutputFile.h>
Packit c2c737
#include <ImfInputFile.h>
Packit c2c737
#include <ImfTiledOutputFile.h>
Packit c2c737
#include <ImfTiledInputFile.h>
Packit c2c737
#include <ImfChannelList.h>
Packit c2c737
#include <ImfArray.h>
Packit c2c737
#include <half.h>
Packit c2c737
#include <ImathRandom.h>
Packit c2c737
#include <ImfTileDescriptionAttribute.h>
Packit c2c737
#include "compareFloat.h"
Packit c2c737
Packit c2c737
#include <stdio.h>
Packit c2c737
#include <assert.h>
Packit c2c737
#include <algorithm>
Packit c2c737
Packit c2c737
using namespace OPENEXR_IMF_NAMESPACE;
Packit c2c737
using namespace std;
Packit c2c737
using namespace IMATH_NAMESPACE;
Packit c2c737
Packit c2c737
Packit c2c737
namespace {
Packit c2c737
Packit c2c737
void
Packit c2c737
fillPixels1 (Array2D<unsigned int> &pi,
Packit c2c737
	     Array2D<half> &ph,
Packit c2c737
	     Array2D<float> &pf,
Packit c2c737
	     int width,
Packit c2c737
	     int height)
Packit c2c737
{
Packit c2c737
    cout << "only zeroes" << endl;
Packit c2c737
Packit c2c737
    for (int y = 0; y < height; ++y)
Packit c2c737
	for (int x = 0; x < width; ++x)
Packit c2c737
	{
Packit c2c737
	    pi[y][x] = 0;
Packit c2c737
	    ph[y][x] = 0;
Packit c2c737
	    pf[y][x] = 0;
Packit c2c737
	}
Packit c2c737
}
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
fillPixels2 (Array2D<unsigned int> &pi,
Packit c2c737
	     Array2D<half> &ph,
Packit c2c737
	     Array2D<float> &pf,
Packit c2c737
	     int width,
Packit c2c737
	     int height)
Packit c2c737
{
Packit c2c737
    cout << "pattern 1" << endl;
Packit c2c737
Packit c2c737
    for (int y = 0; y < height; ++y)
Packit c2c737
	for (int x = 0; x < width; ++x)
Packit c2c737
	{
Packit c2c737
	    pi[y][x] = (x + y) & 1;
Packit c2c737
	    ph[y][x] = pi[y][x];
Packit c2c737
	    pf[y][x] = pi[y][x];
Packit c2c737
	}
Packit c2c737
}
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
fillPixels3 (Array2D<unsigned int> &pi,
Packit c2c737
	     Array2D<half> &ph,
Packit c2c737
	     Array2D<float> &pf,
Packit c2c737
	     int width,
Packit c2c737
	     int height)
Packit c2c737
{
Packit c2c737
    cout << "pattern 2" << endl;
Packit c2c737
Packit c2c737
    for (int y = 0; y < height; ++y)
Packit c2c737
	for (int x = 0; x < width; ++x)
Packit c2c737
	{
Packit c2c737
	    pi[y][x] = x % 100 + 100 * (y % 100);
Packit c2c737
	    ph[y][x] = sin (double (x)) + sin (y * 0.5);
Packit c2c737
	    pf[y][x] = sin (double (y)) + sin (x * 0.5);
Packit c2c737
	}
Packit c2c737
}
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
fillPixels4 (Array2D<unsigned int> &pi,
Packit c2c737
	     Array2D<half> &ph,
Packit c2c737
	     Array2D<float> &pf,
Packit c2c737
	     int width,
Packit c2c737
	     int height)
Packit c2c737
{
Packit c2c737
    cout << "random bits" << endl;
Packit c2c737
Packit c2c737
    //
Packit c2c737
    // Use of a union to extract the bit pattern from a float, as is
Packit c2c737
    // done below, works only if int and float have the same size.
Packit c2c737
    //
Packit c2c737
Packit c2c737
    assert (sizeof (int) == sizeof (float));
Packit c2c737
Packit c2c737
    Rand48 rand;
Packit c2c737
Packit c2c737
    for (int y = 0; y < height; ++y)
Packit c2c737
        for (int x = 0; x < width; ++x)
Packit c2c737
        {
Packit c2c737
            pi[y][x] = rand.nexti();
Packit c2c737
Packit c2c737
            do
Packit c2c737
            {
Packit c2c737
                ph[y][x].setBits (rand.nexti());
Packit c2c737
            }
Packit c2c737
            while (ph[y][x].isNan());
Packit c2c737
Packit c2c737
            union {int i; float f;} u;
Packit c2c737
Packit c2c737
            do
Packit c2c737
            {
Packit c2c737
                u.i = rand.nexti();
Packit c2c737
                pf[y][x] = u.f;
Packit c2c737
            }
Packit c2c737
            while (pf[y][x] != pf[y][x]);
Packit c2c737
        }
Packit c2c737
}
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
writeRead (const Array2D<unsigned int> &pi1,
Packit c2c737
           const Array2D<half> &ph1,
Packit c2c737
           const Array2D<float> &pf1,
Packit c2c737
           const char fileName[],
Packit c2c737
           LineOrder lorder,
Packit c2c737
           int width,
Packit c2c737
           int height,
Packit c2c737
           int xSize,
Packit c2c737
           int ySize,
Packit c2c737
           int xOffset,
Packit c2c737
           int yOffset,
Packit c2c737
           Compression comp)
Packit c2c737
{
Packit c2c737
    //
Packit c2c737
    // Write the pixel data in pi1, ph1 and ph2 to an
Packit c2c737
    // image file using the specified compression type.
Packit c2c737
    // Read the pixel data back
Packit c2c737
    // from the file and verify that the data did not
Packit c2c737
    // change.
Packit c2c737
    //
Packit c2c737
Packit c2c737
    cout << "compression " << comp << ":" << flush;
Packit c2c737
Packit c2c737
Packit c2c737
    Header hdr ((Box2i (V2i (0, 0),                     // display window
Packit c2c737
                        V2i (width - 1, height -1))),
Packit c2c737
                (Box2i (V2i (xOffset, yOffset),         // data window
Packit c2c737
                        V2i (xOffset + width - 1, yOffset + height - 1))));
Packit c2c737
Packit c2c737
    hdr.compression() = comp;
Packit c2c737
    hdr.lineOrder() = lorder;
Packit c2c737
Packit c2c737
    hdr.channels().insert ("I", Channel (UINT));
Packit c2c737
    hdr.channels().insert ("H", Channel (HALF));
Packit c2c737
    hdr.channels().insert ("F", Channel (FLOAT));
Packit c2c737
    
Packit c2c737
    hdr.setTileDescription(TileDescription(xSize, ySize, ONE_LEVEL));
Packit c2c737
    
Packit c2c737
    {
Packit c2c737
        FrameBuffer fb; 
Packit c2c737
Packit c2c737
        fb.insert ("I",                                       // name
Packit c2c737
                   Slice (UINT,                               // type
Packit c2c737
                          (char *) &pi1[-yOffset][-xOffset],  // base
Packit c2c737
                          sizeof (pi1[0][0]),                 // xStride
Packit c2c737
                          sizeof (pi1[0][0]) * width)         // yStride
Packit c2c737
                  );
Packit c2c737
                  
Packit c2c737
        fb.insert ("H",                                       // name
Packit c2c737
                   Slice (HALF,                               // type
Packit c2c737
                          (char *) &ph1[-yOffset][-xOffset],  // base
Packit c2c737
                          sizeof (ph1[0][0]),                 // xStride
Packit c2c737
                          sizeof (ph1[0][0]) * width)         // yStride
Packit c2c737
                  );
Packit c2c737
                  
Packit c2c737
        fb.insert ("F",                                       // name
Packit c2c737
                   Slice (FLOAT,                              // type
Packit c2c737
                          (char *) &pf1[-yOffset][-xOffset],  // base
Packit c2c737
                          sizeof (pf1[0][0]),                 // xStride
Packit c2c737
                          sizeof (pf1[0][0]) * width)         // yStride
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        cout << " writing" << flush;
Packit c2c737
Packit c2c737
        remove (fileName);
Packit c2c737
        TiledOutputFile out (fileName, hdr);
Packit c2c737
        out.setFrameBuffer (fb);
Packit c2c737
        out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1);
Packit c2c737
    }
Packit c2c737
    
Packit c2c737
    {
Packit c2c737
        cout << ", reading (whole file)" << flush;
Packit c2c737
Packit c2c737
        TiledInputFile in (fileName);
Packit c2c737
Packit c2c737
        const Box2i &dw = in.header().dataWindow();
Packit c2c737
        int w = dw.max.x - dw.min.x + 1;
Packit c2c737
        int h = dw.max.y - dw.min.y + 1;
Packit c2c737
        int dwx = dw.min.x;
Packit c2c737
        int dwy = dw.min.y;
Packit c2c737
Packit c2c737
        Array2D<unsigned int> pi2 (h, w);
Packit c2c737
        Array2D<half>         ph2 (h, w);
Packit c2c737
        Array2D<float>        pf2 (h, w);
Packit c2c737
Packit c2c737
        FrameBuffer fb;
Packit c2c737
Packit c2c737
        fb.insert ("I",                             // name
Packit c2c737
                   Slice (UINT,                     // type
Packit c2c737
                          (char *) &pi2[-dwy][-dwx],// base
Packit c2c737
                          sizeof (pi2[0][0]),       // xStride
Packit c2c737
                          sizeof (pi2[0][0]) * w)   // yStride
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        fb.insert ("H",                             // name
Packit c2c737
                   Slice (HALF,                     // type
Packit c2c737
                          (char *) &ph2[-dwy][-dwx],// base
Packit c2c737
                          sizeof (ph2[0][0]),       // xStride
Packit c2c737
                          sizeof (ph2[0][0]) * w)   // yStride
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        fb.insert ("F",                             // name
Packit c2c737
                   Slice (FLOAT,                    // type
Packit c2c737
                          (char *) &pf2[-dwy][-dwx],// base
Packit c2c737
                          sizeof (pf2[0][0]),       // xStride
Packit c2c737
                          sizeof (pf2[0][0]) * w)   // yStride
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        in.setFrameBuffer (fb);
Packit c2c737
        in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1);
Packit c2c737
        
Packit c2c737
Packit c2c737
        cout << ", comparing (whole file)" << flush;
Packit c2c737
Packit c2c737
        assert (in.header().displayWindow() == hdr.displayWindow());
Packit c2c737
        assert (in.header().dataWindow() == hdr.dataWindow());
Packit c2c737
        assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit c2c737
        assert (in.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit c2c737
        assert (in.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit c2c737
        assert (in.header().lineOrder() == hdr.lineOrder());
Packit c2c737
        assert (in.header().compression() == hdr.compression());
Packit c2c737
Packit c2c737
        ChannelList::ConstIterator hi = hdr.channels().begin();
Packit c2c737
        ChannelList::ConstIterator ii = in.header().channels().begin();
Packit c2c737
Packit c2c737
        while (hi != hdr.channels().end())
Packit c2c737
        {
Packit c2c737
            assert (!strcmp (hi.name(), ii.name()));
Packit c2c737
            assert (hi.channel().type == ii.channel().type);
Packit c2c737
            assert (hi.channel().xSampling == ii.channel().xSampling);
Packit c2c737
            assert (hi.channel().ySampling == ii.channel().ySampling);
Packit c2c737
Packit c2c737
            ++hi;
Packit c2c737
            ++ii;
Packit c2c737
        }
Packit c2c737
Packit c2c737
        assert (ii == in.header().channels().end());
Packit c2c737
Packit c2c737
	if (comp == B44_COMPRESSION ||
Packit c2c737
            comp == B44A_COMPRESSION ||
Packit c2c737
            comp == DWAA_COMPRESSION ||
Packit c2c737
            comp == DWAB_COMPRESSION)
Packit c2c737
	{
Packit c2c737
	    for (int y = 0; y < h; y += ySize)
Packit c2c737
	    {
Packit c2c737
		for (int x = 0; x < w; x += xSize)
Packit c2c737
		{
Packit c2c737
		    int nx = min (w - x, xSize);
Packit c2c737
		    int ny = min (h - y, ySize);
Packit c2c737
Packit c2c737
		    Array2D<half> ph3 (ny, nx);
Packit c2c737
		    Array2D<half> ph4 (ny, nx);
Packit c2c737
Packit c2c737
		    for (int y1 = 0; y1 < ny; ++y1)
Packit c2c737
		    {
Packit c2c737
			for (int x1 = 0; x1 < nx; ++x1)
Packit c2c737
			{
Packit c2c737
			    ph3[y1][x1] = ph1[y + y1][x + x1];
Packit c2c737
			    ph4[y1][x1] = ph2[y + y1][x + x1];
Packit c2c737
			}
Packit c2c737
		    }
Packit c2c737
Packit c2c737
                    if (comp == B44_COMPRESSION ||
Packit c2c737
                        comp == B44A_COMPRESSION)
Packit c2c737
                    {
Packit c2c737
                        compareB44 (nx, ny, ph3, ph4);
Packit c2c737
                    }
Packit c2c737
                    else if (comp == DWAA_COMPRESSION ||
Packit c2c737
                             comp == DWAB_COMPRESSION)
Packit c2c737
                    {
Packit c2c737
                        //XXX compareDwa (nx, ny, ph3, ph4);
Packit c2c737
                    }
Packit c2c737
		}
Packit c2c737
	    }
Packit c2c737
	}
Packit c2c737
Packit c2c737
	for (int y = 0; y < h; ++y)
Packit c2c737
	{
Packit c2c737
	    for (int x = 0; x < w; ++x)
Packit c2c737
	    {
Packit c2c737
		assert (pi1[y][x] == pi2[y][x]);
Packit c2c737
Packit c2c737
		if (comp != B44_COMPRESSION &&
Packit c2c737
                    comp != B44A_COMPRESSION &&
Packit c2c737
                    comp != DWAA_COMPRESSION &&
Packit c2c737
                    comp != DWAB_COMPRESSION)
Packit c2c737
                {
Packit c2c737
		    assert (ph1[y][x] == ph2[y][x]);
Packit c2c737
                }
Packit c2c737
Packit c2c737
		assert (equivalent (pf1[y][x], pf2[y][x], comp));
Packit c2c737
	    }
Packit c2c737
	}
Packit c2c737
    }
Packit c2c737
    
Packit c2c737
    {
Packit c2c737
        cout << ", reading and comparing (tile-by-tile)" << flush;
Packit c2c737
Packit c2c737
        TiledInputFile in (fileName);
Packit c2c737
Packit c2c737
        Array2D<unsigned int> pi2 (ySize, xSize);
Packit c2c737
        Array2D<half>         ph2 (ySize, xSize);
Packit c2c737
        Array2D<float>        pf2 (ySize, xSize);
Packit c2c737
Packit c2c737
        FrameBuffer fb;
Packit c2c737
Packit c2c737
        fb.insert ("I",                                 // name
Packit c2c737
                   Slice (UINT,                         // type
Packit c2c737
                          (char *) &pi2[0][0],          // base
Packit c2c737
                          sizeof (pi2[0][0]),           // xStride
Packit c2c737
                          sizeof (pi2[0][0]) * xSize,   // yStride
Packit c2c737
                          1,                            // xSampling
Packit c2c737
	                  1,                            // ySampling
Packit c2c737
	                  0.0,                          // fillValue
Packit c2c737
                          true,                         // reuse tiles 
Packit c2c737
                          true)
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        fb.insert ("H",                                 // name
Packit c2c737
                   Slice (HALF,                         // type
Packit c2c737
                          (char *) &ph2[0][0],          // base
Packit c2c737
                          sizeof (ph2[0][0]),           // xStride
Packit c2c737
                          sizeof (ph2[0][0]) * xSize,   // yStride
Packit c2c737
                          1,                            // xSampling
Packit c2c737
	                  1,                            // ySampling
Packit c2c737
	                  0.0,                          // fillValue
Packit c2c737
                          true,                         // reuse tiles 
Packit c2c737
                          true)
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        fb.insert ("F",                                 // name
Packit c2c737
                   Slice (FLOAT,                        // type
Packit c2c737
                          (char *) &pf2[0][0],          // base
Packit c2c737
                          sizeof (pf2[0][0]),           // xStride
Packit c2c737
                          sizeof (pf2[0][0]) * xSize,   // yStride
Packit c2c737
                          1,                            // xSampling
Packit c2c737
	                  1,                            // ySampling
Packit c2c737
	                  0.0,                          // fillValue
Packit c2c737
                          true,                         // reuse tiles 
Packit c2c737
                          true)
Packit c2c737
                  );
Packit c2c737
Packit c2c737
        in.setFrameBuffer (fb);
Packit c2c737
        
Packit c2c737
        assert (in.header().displayWindow() == hdr.displayWindow());
Packit c2c737
        assert (in.header().dataWindow() == hdr.dataWindow());
Packit c2c737
        assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit c2c737
        assert (in.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit c2c737
        assert (in.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit c2c737
        assert (in.header().lineOrder() == hdr.lineOrder());
Packit c2c737
        assert (in.header().compression() == hdr.compression());
Packit c2c737
Packit c2c737
        ChannelList::ConstIterator hi = hdr.channels().begin();
Packit c2c737
        ChannelList::ConstIterator ii = in.header().channels().begin();
Packit c2c737
Packit c2c737
        while (hi != hdr.channels().end())
Packit c2c737
        {
Packit c2c737
            assert (!strcmp (hi.name(), ii.name()));
Packit c2c737
            assert (hi.channel().type == ii.channel().type);
Packit c2c737
            assert (hi.channel().xSampling == ii.channel().xSampling);
Packit c2c737
            assert (hi.channel().ySampling == ii.channel().ySampling);
Packit c2c737
Packit c2c737
            ++hi;
Packit c2c737
            ++ii;
Packit c2c737
        }
Packit c2c737
Packit c2c737
        assert (ii == in.header().channels().end());
Packit c2c737
        
Packit c2c737
        for (int tileY = 0; tileY < in.numYTiles(); tileY++)
Packit c2c737
        {
Packit c2c737
            for (int tileX = 0; tileX < in.numXTiles(); ++tileX)
Packit c2c737
            {
Packit c2c737
                in.readTile (tileX, tileY);
Packit c2c737
Packit c2c737
                IMATH_NAMESPACE::Box2i win = in.dataWindowForTile (tileX, tileY);
Packit c2c737
                int oX = win.min.x - xOffset;
Packit c2c737
                int oY = win.min.y - yOffset;
Packit c2c737
Packit c2c737
                for (int y = 0, y2 = win.min.y; y < ySize && y2 <= win.max.y;
Packit c2c737
                     ++y, y2++)
Packit c2c737
                {
Packit c2c737
                    for (int x = 0, x2 = win.min.x;
Packit c2c737
                         x < xSize && x2 <= win.max.x; ++x, x2++)
Packit c2c737
                    {
Packit c2c737
                        assert (pi1[oY + y][oX + x] == pi2[y][x]);
Packit c2c737
Packit c2c737
			if (comp != B44_COMPRESSION &&
Packit c2c737
                            comp != B44A_COMPRESSION &&
Packit c2c737
                            comp != DWAA_COMPRESSION &&
Packit c2c737
                            comp != DWAB_COMPRESSION)
Packit c2c737
			{
Packit c2c737
			    assert (ph1[oY + y][oX + x] == ph2[y][x]);
Packit c2c737
			}
Packit c2c737
Packit c2c737
                        assert (equivalent (pf1[oY + y][oX + x],
Packit c2c737
                                            pf2[y][x], comp));
Packit c2c737
                    }
Packit c2c737
                }
Packit c2c737
            }
Packit c2c737
        }
Packit c2c737
    }
Packit c2c737
Packit c2c737
    remove (fileName);
Packit c2c737
    cout << endl;
Packit c2c737
}
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
writeRead (const std::string &tempDir,
Packit c2c737
           const Array2D<unsigned int> &pi,
Packit c2c737
           const Array2D<half> &ph,
Packit c2c737
           const Array2D<float> &pf,
Packit c2c737
           int w,
Packit c2c737
           int h,
Packit c2c737
           int xs,
Packit c2c737
           int ys,
Packit c2c737
           int dx,
Packit c2c737
           int dy)
Packit c2c737
{
Packit c2c737
    std::string filename = tempDir + "imf_test_comp.exr";
Packit c2c737
Packit c2c737
    for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp)
Packit c2c737
    {
Packit c2c737
        writeRead (pi, ph, pf,
Packit c2c737
                   filename.c_str(),
Packit c2c737
                   LineOrder (0),
Packit c2c737
                   w, h,
Packit c2c737
                   xs, ys,
Packit c2c737
                   dx, dy,
Packit c2c737
                   Compression (comp));
Packit c2c737
    }
Packit c2c737
}
Packit c2c737
Packit c2c737
} // namespace
Packit c2c737
Packit c2c737
Packit c2c737
void
Packit c2c737
testTiledCompression (const std::string &tempDir)
Packit c2c737
{
Packit c2c737
    try
Packit c2c737
    {
Packit c2c737
        cout << "Testing pixel data types and data "
Packit c2c737
		"window offsets for tiled files" << endl;
Packit c2c737
Packit c2c737
        const int W = 171;
Packit c2c737
        const int H = 59;
Packit c2c737
        const int DX[] = {-17, 0, 23};
Packit c2c737
        const int DY[] = {-29, 0, 13};
Packit c2c737
        const int XS = 15;
Packit c2c737
        const int YS = 15;
Packit c2c737
Packit c2c737
        Array2D<unsigned int> pi (H, W);
Packit c2c737
        Array2D<half> ph (H, W);
Packit c2c737
        Array2D<float> pf (H, W);
Packit c2c737
Packit c2c737
        //
Packit c2c737
        // If the following assertion fails, new pixel types have
Packit c2c737
        // been added to the Imf library; testing code for the new
Packit c2c737
        // pixel types should be added to this file.
Packit c2c737
        //
Packit c2c737
Packit c2c737
        assert (NUM_PIXELTYPES == 3);
Packit c2c737
        
Packit c2c737
        for (int i = 0; i < 3; ++i)
Packit c2c737
        {
Packit c2c737
            cout << endl <<
Packit c2c737
		    "xOffset = " << DX[i] << ", "
Packit c2c737
		    "yOffset = " << DY[i] << endl;
Packit c2c737
Packit c2c737
            fillPixels1 (pi, ph, pf, W, H);
Packit c2c737
            writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]);
Packit c2c737
Packit c2c737
            fillPixels2 (pi, ph, pf, W, H);
Packit c2c737
            writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]);
Packit c2c737
Packit c2c737
            fillPixels3 (pi, ph, pf, W, H);
Packit c2c737
            writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]);
Packit c2c737
Packit c2c737
            fillPixels4 (pi, ph, pf, W, H);
Packit c2c737
            writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]);
Packit c2c737
        }
Packit c2c737
Packit c2c737
        cout << "ok\n" << endl;
Packit c2c737
    }
Packit c2c737
    catch (const std::exception &e)
Packit c2c737
    {
Packit c2c737
        cerr << "ERROR -- caught exception: " << e.what() << endl;
Packit c2c737
        assert (false);
Packit c2c737
    }
Packit c2c737
}