Blame IlmImfTest/testTiledCopyPixels.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004-2012, 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
#include <ImfTiledOutputFile.h>
Packit Service 6754ca
#include <ImfInputFile.h>
Packit Service 6754ca
#include <ImfTiledInputFile.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include <half.h>
Packit Service 6754ca
Packit Service 6754ca
#include <vector>
Packit Service 6754ca
#include <stdio.h>
Packit Service 6754ca
#include <assert.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
using namespace OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
fillPixels (Array2D<half> &ph, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = 0; y < height; ++y)
Packit Service 6754ca
	for (int x = 0; x < width; ++x)
Packit Service 6754ca
	    ph[y][x] = sin (double (x)) + sin (y * 0.5);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeCopyReadONE (const char fileName1[],
Packit Service 6754ca
		  const char fileName2[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  int xOffset,
Packit Service 6754ca
		  int yOffset,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  LevelRoundingMode rmode)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "levelMode 0, " << "compression " << comp <<
Packit Service 6754ca
	    ", roundingMode " << rmode <<
Packit Service 6754ca
            ", xOffset " << xOffset << ", yOffset " << yOffset << endl;
Packit Service 6754ca
    
Packit Service 6754ca
    Header hdr ((Box2i (V2i (0, 0),			// display window
Packit Service 6754ca
		        V2i (width - 1, height -1))),
Packit Service 6754ca
		(Box2i (V2i (xOffset, yOffset),		// data window
Packit Service 6754ca
		        V2i (xOffset + width - 1, yOffset + height - 1))));
Packit Service 6754ca
Packit Service 6754ca
    hdr.compression() = comp;
Packit Service 6754ca
    hdr.lineOrder() = INCREASING_Y;
Packit Service 6754ca
    hdr.channels().insert ("H", Channel (HALF, 1, 1));
Packit Service 6754ca
    
Packit Service 6754ca
    hdr.setTileDescription(TileDescription(xSize, ySize, ONE_LEVEL, rmode));
Packit Service 6754ca
Packit Service 6754ca
    Array2D<half> ph1 (height, width);
Packit Service 6754ca
    fillPixels (ph1, width, height);
Packit Service 6754ca
    
Packit Service 6754ca
    {
Packit Service 6754ca
        FrameBuffer fb; 
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("H",
Packit Service 6754ca
                   Slice (HALF,
Packit Service 6754ca
                          (char *) &ph1[-yOffset][-xOffset],
Packit Service 6754ca
                          sizeof (ph1[0][0]),
Packit Service 6754ca
                          sizeof (ph1[0][0]) * width));
Packit Service 6754ca
Packit Service 6754ca
        cout << " writing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName1, hdr);
Packit Service 6754ca
        out.setFrameBuffer (fb);
Packit Service 6754ca
        out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " copying" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName2);
Packit Service 6754ca
        InputFile in (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName2, in.header());
Packit Service 6754ca
        out.copyPixels (in);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in1 (fileName1);
Packit Service 6754ca
        TiledInputFile in2 (fileName2);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in2.header().dataWindow();
Packit Service 6754ca
        int w = dw.max.x - dw.min.x + 1;
Packit Service 6754ca
        int h = 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
        Array2D<half> ph1 (h, w);
Packit Service 6754ca
        Array2D<half> ph2 (h, w);
Packit Service 6754ca
Packit Service 6754ca
        FrameBuffer fb1;
Packit Service 6754ca
        FrameBuffer fb2;
Packit Service 6754ca
Packit Service 6754ca
        fb1.insert ("H",
Packit Service 6754ca
                    Slice (HALF,
Packit Service 6754ca
                           (char *) &ph1[-dy][-dx],
Packit Service 6754ca
                           sizeof (ph1[0][0]),
Packit Service 6754ca
                           sizeof (ph1[0][0]) * w));
Packit Service 6754ca
Packit Service 6754ca
        fb2.insert ("H",
Packit Service 6754ca
                    Slice (HALF,
Packit Service 6754ca
                           (char *) &ph2[-dy][-dx],
Packit Service 6754ca
                           sizeof (ph2[0][0]),
Packit Service 6754ca
                           sizeof (ph2[0][0]) * w));
Packit Service 6754ca
Packit Service 6754ca
        in1.setFrameBuffer (fb1);
Packit Service 6754ca
        in1.readTiles (0, in1.numXTiles() - 1, 0, in1.numYTiles() - 1);
Packit Service 6754ca
        in2.setFrameBuffer (fb2);
Packit Service 6754ca
        in2.readTiles (0, in2.numXTiles() - 1, 0, in2.numYTiles() - 1);
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in2.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in2.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in2.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in2.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in2.header().channels() == hdr.channels());
Packit Service 6754ca
Packit Service 6754ca
        for (int y = 0; y < h; ++y)
Packit Service 6754ca
            for (int x = 0; x < w; ++x)
Packit Service 6754ca
		assert (ph1[y][x] == ph2[y][x]);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName1);
Packit Service 6754ca
    remove (fileName2);
Packit Service 6754ca
    cout << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeCopyReadMIP (const char fileName1[],
Packit Service 6754ca
		  const char fileName2[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  int xOffset,
Packit Service 6754ca
		  int yOffset,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  LevelRoundingMode rmode)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "levelMode 1, " << "compression " << comp <<
Packit Service 6754ca
	    ", roundingMode " << rmode <<
Packit Service 6754ca
            ", xOffset " << xOffset << ", yOffset " << yOffset << endl;
Packit Service 6754ca
    
Packit Service 6754ca
    Header hdr ((Box2i (V2i (0, 0),			// display window
Packit Service 6754ca
                        V2i (width - 1, height -1))),
Packit Service 6754ca
                (Box2i (V2i (xOffset, yOffset),		// data window
Packit Service 6754ca
                        V2i (xOffset + width - 1, yOffset + height - 1))));
Packit Service 6754ca
Packit Service 6754ca
    hdr.compression() = comp;
Packit Service 6754ca
    hdr.lineOrder() = INCREASING_Y;
Packit Service 6754ca
    hdr.channels().insert ("H", Channel (HALF, 1, 1));
Packit Service 6754ca
    
Packit Service 6754ca
    hdr.setTileDescription(TileDescription(xSize, ySize, MIPMAP_LEVELS, rmode));
Packit Service 6754ca
    
Packit Service 6754ca
    Array < Array2D<half> > levels;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " writing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName1, hdr);
Packit Service 6754ca
        
Packit Service 6754ca
        int numLevels = out.numLevels();
Packit Service 6754ca
	levels.resizeErase (numLevels);
Packit Service 6754ca
Packit Service 6754ca
        for (int level = 0; level < out.numLevels(); ++level)
Packit Service 6754ca
        {
Packit Service 6754ca
            int levelWidth  = out.levelWidth(level);
Packit Service 6754ca
            int levelHeight = out.levelHeight(level);
Packit Service 6754ca
            levels[level].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
            fillPixels (levels[level], levelWidth, levelHeight);
Packit Service 6754ca
            
Packit Service 6754ca
            FrameBuffer fb; 
Packit Service 6754ca
Packit Service 6754ca
            fb.insert ("H",
Packit Service 6754ca
                       Slice (HALF,
Packit Service 6754ca
                              (char *) &levels[level][-yOffset][-xOffset],
Packit Service 6754ca
                              sizeof (levels[level][0][0]),
Packit Service 6754ca
                              sizeof (levels[level][0][0]) * levelWidth));
Packit Service 6754ca
        
Packit Service 6754ca
            out.setFrameBuffer (fb);
Packit Service 6754ca
            out.writeTiles (0, out.numXTiles(level) - 1,
Packit Service 6754ca
                            0, out.numYTiles(level) - 1, level);
Packit Service 6754ca
        }        
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " copying" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName2);
Packit Service 6754ca
        InputFile in (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName2, in.header());
Packit Service 6754ca
        out.copyPixels (in);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in1 (fileName1);
Packit Service 6754ca
        TiledInputFile in2 (fileName2);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in2.header().dataWindow();
Packit Service 6754ca
        int dx = dw.min.x;
Packit Service 6754ca
        int dy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
        int numLevels = in2.numLevels();
Packit Service 6754ca
        Array < Array2D<half> > levels1 (numLevels);
Packit Service 6754ca
        Array < Array2D<half> > levels2 (numLevels);
Packit Service 6754ca
Packit Service 6754ca
        for (int level = 0; level < numLevels; ++level)
Packit Service 6754ca
        {
Packit Service 6754ca
            int levelWidth = in2.levelWidth(level);
Packit Service 6754ca
            int levelHeight = in2.levelHeight(level);
Packit Service 6754ca
            levels1[level].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
            levels2[level].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
Packit Service 6754ca
            FrameBuffer fb1; 
Packit Service 6754ca
            FrameBuffer fb2; 
Packit Service 6754ca
Packit Service 6754ca
            fb1.insert ("H",
Packit Service 6754ca
                        Slice (HALF,
Packit Service 6754ca
                               (char *) &levels1[level][-dy][-dx],
Packit Service 6754ca
                               sizeof (levels1[level][0][0]),
Packit Service 6754ca
                               sizeof (levels1[level][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
            fb2.insert ("H",
Packit Service 6754ca
                        Slice (HALF,
Packit Service 6754ca
                               (char *) &levels2[level][-dy][-dx],
Packit Service 6754ca
                               sizeof (levels2[level][0][0]),
Packit Service 6754ca
                               sizeof (levels2[level][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
            in1.setFrameBuffer (fb1);
Packit Service 6754ca
            in2.setFrameBuffer (fb2);
Packit Service 6754ca
Packit Service 6754ca
            in1.readTiles (0, in1.numXTiles(level) - 1,
Packit Service 6754ca
                           0, in1.numYTiles(level) - 1, level);
Packit Service 6754ca
Packit Service 6754ca
            in2.readTiles (0, in2.numXTiles(level) - 1,
Packit Service 6754ca
                           0, in2.numYTiles(level) - 1, level);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in2.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in2.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in2.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in2.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in2.header().channels() == hdr.channels());
Packit Service 6754ca
Packit Service 6754ca
        for (int l = 0; l < numLevels; ++l)
Packit Service 6754ca
            for (int y = 0; y < in1.levelHeight(l); ++y)
Packit Service 6754ca
                for (int x = 0; x < in1.levelWidth(l); ++x)                    
Packit Service 6754ca
		{
Packit Service 6754ca
                    assert ((levels2[l])[y][x] == (levels1[l])[y][x]);
Packit Service 6754ca
Packit Service 6754ca
		    if (comp != B44_COMPRESSION && comp != B44A_COMPRESSION)
Packit Service 6754ca
			assert ((levels2[l])[y][x] == (levels[l])[y][x]);
Packit Service 6754ca
		}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName1);
Packit Service 6754ca
    remove (fileName2);
Packit Service 6754ca
    cout << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeCopyReadRIP (const char fileName1[],
Packit Service 6754ca
		  const char fileName2[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  int xOffset,
Packit Service 6754ca
		  int yOffset,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  LevelRoundingMode rmode)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "levelMode 2, " << "compression " << comp <<
Packit Service 6754ca
	    ", roundingMode " << rmode <<
Packit Service 6754ca
            ", xOffset " << xOffset << ", yOffset " << yOffset << endl;
Packit Service 6754ca
    
Packit Service 6754ca
    Header hdr ((Box2i (V2i (0, 0),			// display window
Packit Service 6754ca
                        V2i (width - 1, height -1))),
Packit Service 6754ca
                (Box2i (V2i (xOffset, yOffset),		// data window
Packit Service 6754ca
                        V2i (xOffset + width - 1, yOffset + height - 1))));
Packit Service 6754ca
Packit Service 6754ca
    hdr.compression() = comp;
Packit Service 6754ca
    hdr.lineOrder() = INCREASING_Y;
Packit Service 6754ca
    hdr.channels().insert ("H", Channel (HALF, 1, 1));
Packit Service 6754ca
    
Packit Service 6754ca
    hdr.setTileDescription(TileDescription(xSize, ySize, RIPMAP_LEVELS, rmode));
Packit Service 6754ca
    
Packit Service 6754ca
    Array2D < Array2D<half> > levels;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " writing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName1, hdr);
Packit Service 6754ca
        
Packit Service 6754ca
	levels.resizeErase (out.numYLevels(), out.numXLevels());
Packit Service 6754ca
Packit Service 6754ca
        for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel)
Packit Service 6754ca
        {            
Packit Service 6754ca
            for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel)
Packit Service 6754ca
            {
Packit Service 6754ca
                int levelWidth = out.levelWidth(xlevel);
Packit Service 6754ca
                int levelHeight = out.levelHeight(ylevel);
Packit Service 6754ca
                levels[ylevel][xlevel].resizeErase(levelHeight, levelWidth);          
Packit Service 6754ca
                fillPixels (levels[ylevel][xlevel], levelWidth, levelHeight);
Packit Service 6754ca
                
Packit Service 6754ca
                FrameBuffer fb;
Packit Service 6754ca
                fb.insert ("H",
Packit Service 6754ca
		   Slice (HALF,
Packit Service 6754ca
			  (char *) &levels[ylevel][xlevel][-yOffset][-xOffset],
Packit Service 6754ca
			  sizeof (levels[ylevel][xlevel][0][0]),
Packit Service 6754ca
			  sizeof (levels[ylevel][xlevel][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
                out.setFrameBuffer (fb);
Packit Service 6754ca
Packit Service 6754ca
                out.writeTiles (0, out.numXTiles(xlevel) - 1,
Packit Service 6754ca
                                0, out.numYTiles(ylevel) - 1, xlevel, ylevel);
Packit Service 6754ca
            }
Packit Service 6754ca
        }        
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " copying" << flush;
Packit Service 6754ca
Packit Service 6754ca
        remove (fileName2);
Packit Service 6754ca
        InputFile in (fileName1);
Packit Service 6754ca
        TiledOutputFile out (fileName2, in.header());
Packit Service 6754ca
        out.copyPixels (in);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in1 (fileName1);
Packit Service 6754ca
        TiledInputFile in2 (fileName2);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in2.header().dataWindow();
Packit Service 6754ca
        int dx = dw.min.x;
Packit Service 6754ca
        int dy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
        int numXLevels = in2.numXLevels();
Packit Service 6754ca
        int numYLevels = in2.numYLevels();
Packit Service 6754ca
        Array2D < Array2D<half> > levels1 (numYLevels, numXLevels);
Packit Service 6754ca
        Array2D < Array2D<half> > levels2 (numYLevels, numXLevels);
Packit Service 6754ca
Packit Service 6754ca
        for (int ylevel = 0; ylevel < numYLevels; ++ylevel)
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int xlevel = 0; xlevel < numXLevels; ++xlevel)
Packit Service 6754ca
            {
Packit Service 6754ca
                int levelWidth  = in2.levelWidth(xlevel);
Packit Service 6754ca
                int levelHeight = in2.levelHeight(ylevel);
Packit Service 6754ca
                levels1[ylevel][xlevel].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
                levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
Packit Service 6754ca
                FrameBuffer fb1;
Packit Service 6754ca
                FrameBuffer fb2;
Packit Service 6754ca
Packit Service 6754ca
                fb1.insert ("H",
Packit Service 6754ca
		   Slice (HALF,
Packit Service 6754ca
			  (char *) &levels1[ylevel][xlevel][-dy][-dx],
Packit Service 6754ca
			  sizeof (levels1[ylevel][xlevel][0][0]),
Packit Service 6754ca
			  sizeof (levels1[ylevel][xlevel][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
                fb2.insert ("H",
Packit Service 6754ca
		   Slice (HALF,
Packit Service 6754ca
			  (char *) &levels2[ylevel][xlevel][-dy][-dx],
Packit Service 6754ca
			  sizeof (levels2[ylevel][xlevel][0][0]),
Packit Service 6754ca
			  sizeof (levels2[ylevel][xlevel][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
                in1.setFrameBuffer (fb1);
Packit Service 6754ca
                in2.setFrameBuffer (fb2);
Packit Service 6754ca
Packit Service 6754ca
                in1.readTiles (0, in1.numXTiles(xlevel) - 1,
Packit Service 6754ca
                               0, in1.numYTiles(ylevel) - 1,
Packit Service 6754ca
                               xlevel, ylevel);
Packit Service 6754ca
Packit Service 6754ca
                in2.readTiles (0, in2.numXTiles(xlevel) - 1,
Packit Service 6754ca
                               0, in2.numYTiles(ylevel) - 1,
Packit Service 6754ca
                               xlevel, ylevel);
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in2.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in2.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in2.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in2.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in2.header().channels() == hdr.channels());
Packit Service 6754ca
Packit Service 6754ca
        for (int ly = 0; ly < numYLevels; ++ly)
Packit Service 6754ca
            for (int lx = 0; lx < numXLevels; ++lx)
Packit Service 6754ca
                for (int y = 0; y < in1.levelHeight(ly); ++y)
Packit Service 6754ca
                    for (int x = 0; x < in1.levelWidth(lx); ++x)
Packit Service 6754ca
		    {
Packit Service 6754ca
                        assert ((levels2[ly][lx])[y][x] ==
Packit Service 6754ca
                                (levels1[ly][lx])[y][x]);
Packit Service 6754ca
Packit Service 6754ca
			if (comp != B44_COMPRESSION && comp != B44A_COMPRESSION)
Packit Service 6754ca
			    assert ((levels2[ly][lx])[y][x] ==
Packit Service 6754ca
				    (levels[ly][lx])[y][x]);
Packit Service 6754ca
Packit Service 6754ca
		    }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName1);
Packit Service 6754ca
    remove (fileName2);
Packit Service 6754ca
    cout << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeCopyRead (const std::string &tempDir, int w, int h, int xs, int ys, int dx, int dy)
Packit Service 6754ca
{
Packit Service 6754ca
    std::string filename1 = tempDir + "imf_test_copy1.exr";
Packit Service 6754ca
    std::string filename2 = tempDir + "imf_test_copy2.exr";
Packit Service 6754ca
Packit Service 6754ca
    for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode)
Packit Service 6754ca
	{
Packit Service 6754ca
	    writeCopyReadONE (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy,
Packit Service 6754ca
			      Compression (comp), LevelRoundingMode (rmode));
Packit Service 6754ca
Packit Service 6754ca
	    writeCopyReadMIP (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy,
Packit Service 6754ca
			      Compression (comp), LevelRoundingMode (rmode));
Packit Service 6754ca
			      
Packit Service 6754ca
	    writeCopyReadRIP (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy,
Packit Service 6754ca
			      Compression (comp), LevelRoundingMode (rmode));
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
testTiledCopyPixels (const std::string &tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "Testing fast pixel copying for tiled files" << endl;
Packit Service 6754ca
Packit Service 6754ca
        const int W = 171;
Packit Service 6754ca
        const int H = 259;
Packit Service 6754ca
        const int DX = 17;
Packit Service 6754ca
        const int DY = 29;
Packit Service 6754ca
        const int YS = 55;
Packit Service 6754ca
Packit Service 6754ca
        writeCopyRead (tempDir, W, H, DX, YS, 0,  0);
Packit Service 6754ca
        writeCopyRead (tempDir, W, H, DX, YS, 0,  DY);
Packit Service 6754ca
        writeCopyRead (tempDir, W, H, DX, YS, DX, 0);
Packit Service 6754ca
        writeCopyRead (tempDir, W, H, DX, YS, DX, DY);
Packit Service 6754ca
Packit Service 6754ca
        cout << "ok\n" << endl;
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (const std::exception &e)
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "ERROR -- caught exception: " << e.what() << endl;
Packit Service 6754ca
        assert (false);
Packit Service 6754ca
    }
Packit Service 6754ca
}