Blame IlmImfTest/testTiledCompression.cpp

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