Blame IlmImfTest/testTiledLineOrder.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 <ImathRandom.h>
Packit Service 6754ca
#include <ImfTiledInputFile.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include <ImfThreading.h>
Packit Service 6754ca
#include <IlmThread.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 fileName[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  LineOrder lorder,
Packit Service 6754ca
		  LevelRoundingMode rmode,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  bool triggerBuffering,
Packit Service 6754ca
		  bool triggerSeeks)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "LineOrder " << lorder << ", buffer " << triggerBuffering <<
Packit Service 6754ca
            ", seek " << triggerSeeks << ", levelMode 0, " <<
Packit Service 6754ca
	    "roundingMode " << rmode << ", "
Packit Service 6754ca
	    "compression " << comp << 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 (0, 0),		// data window
Packit Service 6754ca
		        V2i (width - 1, 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[0][0],
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 (fileName);
Packit Service 6754ca
        TiledOutputFile out (fileName, hdr);
Packit Service 6754ca
        out.setFrameBuffer (fb);
Packit Service 6754ca
Packit Service 6754ca
        int i;
Packit Service 6754ca
        
Packit Service 6754ca
        Rand32 rand1 = Rand32();
Packit Service 6754ca
        std::vector<int> tileYs = std::vector<int>(out.numYTiles());
Packit Service 6754ca
        std::vector<int> tileXs = std::vector<int>(out.numXTiles());
Packit Service 6754ca
        for (i = 0; i < out.numYTiles(); i++)
Packit Service 6754ca
        {
Packit Service 6754ca
            if (lorder == DECREASING_Y)
Packit Service 6754ca
                tileYs[out.numYTiles()-1-i] = i;    
Packit Service 6754ca
            else
Packit Service 6754ca
                tileYs[i] = i;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        for (i = 0; i < out.numXTiles(); i++)
Packit Service 6754ca
        {
Packit Service 6754ca
            tileXs[i] = i;
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        if (triggerBuffering)
Packit Service 6754ca
        {
Packit Service 6754ca
            // shuffle the tile orders
Packit Service 6754ca
            for (i = 0; i < out.numYTiles(); i++)
Packit Service 6754ca
                std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles()-1) + 0.5)]);
Packit Service 6754ca
Packit Service 6754ca
            for (i = 0; i < out.numXTiles(); i++)
Packit Service 6754ca
                std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles()-1) + 0.5)]);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        for (int tileY = 0; tileY < out.numYTiles(); tileY++)
Packit Service 6754ca
            for (int tileX = 0; tileX < out.numXTiles(); tileX++)
Packit Service 6754ca
                out.writeTile (tileXs[tileX], tileYs[tileY]);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in (fileName);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in.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 dwx = dw.min.x;
Packit Service 6754ca
        int dwy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
        Array2D<half> ph2 (h, w);
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 *) &ph2[-dwy][-dwx],
Packit Service 6754ca
                          sizeof (ph2[0][0]),
Packit Service 6754ca
                          sizeof (ph2[0][0]) * w));
Packit Service 6754ca
Packit Service 6754ca
        in.setFrameBuffer (fb);
Packit Service 6754ca
        
Packit Service 6754ca
        int startTileY, endTileY;
Packit Service 6754ca
        int dy;
Packit Service 6754ca
Packit Service 6754ca
        if ((lorder == DECREASING_Y && !triggerSeeks) ||
Packit Service 6754ca
            (lorder == INCREASING_Y && triggerSeeks) ||
Packit Service 6754ca
            (lorder == RANDOM_Y && triggerSeeks))
Packit Service 6754ca
        {
Packit Service 6754ca
            startTileY = in.numYTiles() - 1;
Packit Service 6754ca
            endTileY = -1;
Packit Service 6754ca
Packit Service 6754ca
            dy = -1;
Packit Service 6754ca
        }        
Packit Service 6754ca
        else
Packit Service 6754ca
        {
Packit Service 6754ca
            startTileY = 0;
Packit Service 6754ca
            endTileY = in.numYTiles();
Packit Service 6754ca
Packit Service 6754ca
            dy = 1;
Packit Service 6754ca
        }
Packit Service 6754ca
    
Packit Service 6754ca
        for (int tileY = startTileY; tileY != endTileY; tileY += dy)
Packit Service 6754ca
            for (int tileX = 0; tileX < in.numXTiles(); ++tileX)
Packit Service 6754ca
                in.readTile (tileX, tileY);
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in.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 (fileName);
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 fileName[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  LineOrder lorder,
Packit Service 6754ca
		  LevelRoundingMode rmode,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  bool triggerBuffering,
Packit Service 6754ca
		  bool triggerSeeks)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "LineOrder " << lorder << ", buffer " << triggerBuffering <<
Packit Service 6754ca
            ", seek " << triggerSeeks << ", levelMode 1, " <<
Packit Service 6754ca
	    "roundingMode " << rmode << ", "
Packit Service 6754ca
	    "compression " << comp << 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 (0, 0),		// data window
Packit Service 6754ca
                        V2i (width - 1, 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 (fileName);
Packit Service 6754ca
        TiledOutputFile out (fileName, hdr);
Packit Service 6754ca
        
Packit Service 6754ca
        int numLevels = out.numLevels();
Packit Service 6754ca
	levels.resizeErase (numLevels);
Packit Service 6754ca
Packit Service 6754ca
        int i;
Packit Service 6754ca
        
Packit Service 6754ca
        Rand32 rand1 = Rand32();
Packit Service 6754ca
        std::vector<int> shuffled_levels = std::vector<int>(numLevels);
Packit Service 6754ca
        
Packit Service 6754ca
        for (i = 0; i < numLevels; i++)
Packit Service 6754ca
            shuffled_levels[i] = i;
Packit Service 6754ca
Packit Service 6754ca
        if (triggerBuffering)
Packit Service 6754ca
            // shuffle the level order
Packit Service 6754ca
            for (i = 0; i < numLevels; i++)
Packit Service 6754ca
                std::swap(shuffled_levels[i], shuffled_levels[int(rand1.nextf(i,numLevels-1) + 0.5)]);
Packit Service 6754ca
Packit Service 6754ca
        for (int level = 0; level < numLevels; ++level)
Packit Service 6754ca
        {
Packit Service 6754ca
            const int slevel = shuffled_levels[level];
Packit Service 6754ca
            
Packit Service 6754ca
            int levelWidth  = out.levelWidth(slevel);
Packit Service 6754ca
            int levelHeight = out.levelHeight(slevel);
Packit Service 6754ca
            levels[slevel].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
            fillPixels (levels[slevel], 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[slevel][0][0],
Packit Service 6754ca
                              sizeof (levels[slevel][0][0]),
Packit Service 6754ca
                              sizeof (levels[slevel][0][0]) * levelWidth));
Packit Service 6754ca
        
Packit Service 6754ca
            out.setFrameBuffer (fb);
Packit Service 6754ca
Packit Service 6754ca
            std::vector<int> tileYs = std::vector<int>(out.numYTiles(slevel));
Packit Service 6754ca
            std::vector<int> tileXs = std::vector<int>(out.numXTiles(slevel));
Packit Service 6754ca
            for (i = 0; i < out.numYTiles(slevel); i++)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (lorder == DECREASING_Y)
Packit Service 6754ca
                    tileYs[out.numYTiles(slevel)-1-i] = i;    
Packit Service 6754ca
                else
Packit Service 6754ca
                    tileYs[i] = i;
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            for (i = 0; i < out.numXTiles(slevel); i++)
Packit Service 6754ca
                tileXs[i] = i;
Packit Service 6754ca
            
Packit Service 6754ca
            if (triggerBuffering)
Packit Service 6754ca
            {
Packit Service 6754ca
                // shuffle the tile orders
Packit Service 6754ca
                for (i = 0; i < out.numYTiles(slevel); i++)
Packit Service 6754ca
                    std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles(slevel)-1) + 0.5)]);
Packit Service 6754ca
Packit Service 6754ca
                for (i = 0; i < out.numXTiles(slevel); i++)
Packit Service 6754ca
                    std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles(slevel)-1) + 0.5)]);
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            for (int tileY = 0; tileY < out.numYTiles(slevel); ++tileY)
Packit Service 6754ca
                for (int tileX = 0; tileX < out.numXTiles(slevel); ++tileX)
Packit Service 6754ca
                    out.writeTile (tileXs[tileX], tileYs[tileY], slevel);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in (fileName);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in.header().dataWindow();
Packit Service 6754ca
        int dwx = dw.min.x;
Packit Service 6754ca
        int dwy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
        int numLevels = in.numLevels();
Packit Service 6754ca
        Array < Array2D<half> > levels2 (numLevels);
Packit Service 6754ca
Packit Service 6754ca
        int startTileY, endTileY;
Packit Service 6754ca
        int dy;
Packit Service 6754ca
        
Packit Service 6754ca
        for (int level = 0; level < in.numLevels(); ++level)
Packit Service 6754ca
        {
Packit Service 6754ca
            int levelWidth = in.levelWidth(level);
Packit Service 6754ca
            int levelHeight = in.levelHeight(level);
Packit Service 6754ca
            levels2[level].resizeErase(levelHeight, levelWidth);
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 *) &levels2[level][-dwy][-dwx],
Packit Service 6754ca
                              sizeof (levels2[level][0][0]),
Packit Service 6754ca
                              sizeof (levels2[level][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
            in.setFrameBuffer (fb);
Packit Service 6754ca
            
Packit Service 6754ca
            if ((lorder == DECREASING_Y && !triggerSeeks) ||
Packit Service 6754ca
                (lorder == INCREASING_Y && triggerSeeks) ||
Packit Service 6754ca
                (lorder == RANDOM_Y && triggerSeeks))
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = in.numYTiles(level) - 1;
Packit Service 6754ca
                endTileY = -1;
Packit Service 6754ca
Packit Service 6754ca
                dy = -1;
Packit Service 6754ca
            }        
Packit Service 6754ca
            else
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = 0;
Packit Service 6754ca
                endTileY = in.numYTiles(level);
Packit Service 6754ca
Packit Service 6754ca
                dy = 1;
Packit Service 6754ca
            }
Packit Service 6754ca
            
Packit Service 6754ca
            for (int tileY = startTileY; tileY != endTileY; tileY += dy)
Packit Service 6754ca
                for (int tileX = 0; tileX < in.numXTiles (level); ++tileX)
Packit Service 6754ca
                    in.readTile (tileX, tileY, level);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in.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 < in.levelHeight(l); ++y)
Packit Service 6754ca
                for (int x = 0; x < in.levelWidth(l); ++x)                    
Packit Service 6754ca
                    assert ((levels2[l])[y][x] == (levels[l])[y][x]);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName);
Packit Service 6754ca
    cout << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeCopyReadRIP (const char fileName[],
Packit Service 6754ca
		  int width,
Packit Service 6754ca
		  int height,
Packit Service 6754ca
		  LineOrder lorder,
Packit Service 6754ca
		  LevelRoundingMode rmode,
Packit Service 6754ca
		  int xSize, 
Packit Service 6754ca
		  int ySize,
Packit Service 6754ca
		  Compression comp,
Packit Service 6754ca
		  bool triggerBuffering,
Packit Service 6754ca
		  bool triggerSeeks)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "LineOrder " << lorder << ", buffer " << triggerBuffering <<
Packit Service 6754ca
            ", seek " << triggerSeeks << ", levelMode 2, " <<
Packit Service 6754ca
	    "roundingMode " << rmode << ", "
Packit Service 6754ca
	    "compression " << comp << 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 (0, 0),		// data window
Packit Service 6754ca
                        V2i (width - 1, 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 (fileName);
Packit Service 6754ca
        TiledOutputFile out (fileName, hdr);
Packit Service 6754ca
        
Packit Service 6754ca
	levels.resizeErase (out.numYLevels(), out.numXLevels());
Packit Service 6754ca
                                     
Packit Service 6754ca
        int i;
Packit Service 6754ca
        
Packit Service 6754ca
        Rand32 rand1 = Rand32();
Packit Service 6754ca
        std::vector<int> shuffled_xLevels = std::vector<int>(out.numXLevels());
Packit Service 6754ca
        std::vector<int> shuffled_yLevels = std::vector<int>(out.numYLevels());
Packit Service 6754ca
        
Packit Service 6754ca
        for (i = 0; i < out.numXLevels(); i++)
Packit Service 6754ca
            shuffled_xLevels[i] = i;
Packit Service 6754ca
        
Packit Service 6754ca
        for (i = 0; i < out.numYLevels(); i++)
Packit Service 6754ca
            shuffled_yLevels[i] = i;
Packit Service 6754ca
Packit Service 6754ca
        if (triggerBuffering)
Packit Service 6754ca
        {
Packit Service 6754ca
            // shuffle the level orders
Packit Service 6754ca
            for (i = 0; i < out.numXLevels(); i++)
Packit Service 6754ca
                std::swap(shuffled_xLevels[i], shuffled_xLevels[int(rand1.nextf(i,out.numXLevels()-1) + 0.5)]);
Packit Service 6754ca
                
Packit Service 6754ca
            for (i = 0; i < out.numYLevels(); i++)
Packit Service 6754ca
                std::swap(shuffled_yLevels[i], shuffled_yLevels[int(rand1.nextf(i,out.numYLevels()-1) + 0.5)]);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel)
Packit Service 6754ca
        {
Packit Service 6754ca
            const int sylevel = shuffled_yLevels[ylevel];
Packit Service 6754ca
            
Packit Service 6754ca
            std::vector<int> tileYs = std::vector<int>(out.numYTiles(sylevel));
Packit Service 6754ca
            for (i = 0; i < out.numYTiles(sylevel); i++)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (lorder == DECREASING_Y)
Packit Service 6754ca
                    tileYs[out.numYTiles(sylevel)-1-i] = i;    
Packit Service 6754ca
                else
Packit Service 6754ca
                    tileYs[i] = i;
Packit Service 6754ca
            }
Packit Service 6754ca
            
Packit Service 6754ca
            if (triggerBuffering)
Packit Service 6754ca
                // shuffle the tile orders
Packit Service 6754ca
                for (i = 0; i < out.numYTiles(sylevel); i++)
Packit Service 6754ca
                    std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles(sylevel)-1) + 0.5)]);
Packit Service 6754ca
            
Packit Service 6754ca
            for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel)
Packit Service 6754ca
            {
Packit Service 6754ca
                const int sxlevel = shuffled_xLevels[xlevel];
Packit Service 6754ca
                
Packit Service 6754ca
                int levelWidth = out.levelWidth(sxlevel);
Packit Service 6754ca
                int levelHeight = out.levelHeight(sylevel);
Packit Service 6754ca
                levels[sylevel][sxlevel].resizeErase(levelHeight, levelWidth);          
Packit Service 6754ca
                fillPixels (levels[sylevel][sxlevel], 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[sylevel][sxlevel][0][0],
Packit Service 6754ca
                                  sizeof (levels[sylevel][sxlevel][0][0]),
Packit Service 6754ca
                                  sizeof (levels[sylevel][sxlevel][0][0]) * levelWidth));
Packit Service 6754ca
Packit Service 6754ca
                out.setFrameBuffer (fb);
Packit Service 6754ca
    
Packit Service 6754ca
                std::vector<int> tileXs = std::vector<int>(out.numXTiles(sxlevel));
Packit Service 6754ca
                for (i = 0; i < out.numXTiles(sxlevel); i++)
Packit Service 6754ca
                    tileXs[i] = i;
Packit Service 6754ca
Packit Service 6754ca
                if (triggerBuffering)
Packit Service 6754ca
                    // shuffle the tile orders
Packit Service 6754ca
                    for (i = 0; i < out.numXTiles(sxlevel); i++)
Packit Service 6754ca
                        std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles(sxlevel)-1) + 0.5)]);
Packit Service 6754ca
                
Packit Service 6754ca
                for (int tileY = 0; tileY < out.numYTiles(sylevel); ++tileY)
Packit Service 6754ca
                    for (int tileX = 0; tileX < out.numXTiles(sxlevel); ++tileX)
Packit Service 6754ca
                        out.writeTile(tileXs[tileX], tileYs[tileY], sxlevel, sylevel);
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading" << flush;
Packit Service 6754ca
Packit Service 6754ca
        TiledInputFile in (fileName);
Packit Service 6754ca
Packit Service 6754ca
        const Box2i &dw = in.header().dataWindow();
Packit Service 6754ca
        int dwx = dw.min.x;
Packit Service 6754ca
        int dwy = dw.min.y;
Packit Service 6754ca
Packit Service 6754ca
        int numXLevels = in.numXLevels();
Packit Service 6754ca
        int numYLevels = in.numYLevels();
Packit Service 6754ca
	Array2D < Array2D<half> > levels2 (numYLevels, numXLevels);
Packit Service 6754ca
Packit Service 6754ca
        int startTileY, endTileY;
Packit Service 6754ca
        int dy;
Packit Service 6754ca
        
Packit Service 6754ca
        for (int ylevel = 0; ylevel < in.numYLevels(); ++ylevel)
Packit Service 6754ca
        {
Packit Service 6754ca
            if ((lorder == DECREASING_Y && !triggerSeeks) ||
Packit Service 6754ca
                (lorder == INCREASING_Y && triggerSeeks) ||
Packit Service 6754ca
                (lorder == RANDOM_Y && triggerSeeks))
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = in.numYTiles(ylevel) - 1;
Packit Service 6754ca
                endTileY = -1;
Packit Service 6754ca
Packit Service 6754ca
                dy = -1;
Packit Service 6754ca
            }        
Packit Service 6754ca
            else
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = 0;
Packit Service 6754ca
                endTileY = in.numYTiles(ylevel);
Packit Service 6754ca
Packit Service 6754ca
                dy = 1;
Packit Service 6754ca
            }
Packit Service 6754ca
            
Packit Service 6754ca
            for (int xlevel = 0; xlevel < in.numXLevels(); ++xlevel)
Packit Service 6754ca
            {
Packit Service 6754ca
                int levelWidth  = in.levelWidth(xlevel);
Packit Service 6754ca
                int levelHeight = in.levelHeight(ylevel);
Packit Service 6754ca
                levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth);
Packit Service 6754ca
Packit Service 6754ca
                FrameBuffer fb;
Packit Service 6754ca
                fb.insert ("H",
Packit Service 6754ca
                           Slice (HALF,
Packit Service 6754ca
                                  (char *) &levels2[ylevel][xlevel][-dwy][-dwx],
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
                in.setFrameBuffer (fb);
Packit Service 6754ca
                
Packit Service 6754ca
                for (int tileY = startTileY; tileY != endTileY; tileY += dy)
Packit Service 6754ca
                    for (int tileX = 0; tileX < in.numXTiles (xlevel); ++tileX)
Packit Service 6754ca
                        in.readTile (tileX, tileY, xlevel, ylevel);
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        cout << " comparing" << flush;
Packit Service 6754ca
Packit Service 6754ca
        assert (in.header().displayWindow() == hdr.displayWindow());
Packit Service 6754ca
        assert (in.header().dataWindow() == hdr.dataWindow());
Packit Service 6754ca
        assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio());
Packit Service 6754ca
        assert (in.header().screenWindowCenter() == hdr.screenWindowCenter());
Packit Service 6754ca
        assert (in.header().screenWindowWidth() == hdr.screenWindowWidth());
Packit Service 6754ca
        assert (in.header().lineOrder() == hdr.lineOrder());
Packit Service 6754ca
        assert (in.header().compression() == hdr.compression());
Packit Service 6754ca
        assert (in.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 < in.levelHeight(ly); ++y)
Packit Service 6754ca
                    for (int x = 0; x < in.levelWidth(lx); ++x)
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
    remove (fileName);
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)
Packit Service 6754ca
{
Packit Service 6754ca
    std::string filename = tempDir + "imf_test_copy.exr";
Packit Service 6754ca
Packit Service 6754ca
    for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp)
Packit Service 6754ca
    {
Packit Service 6754ca
	if (comp == B44_COMPRESSION ||
Packit Service 6754ca
            comp == B44A_COMPRESSION)
Packit Service 6754ca
        {
Packit Service 6754ca
	    continue;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        for (int lorder = 0; lorder < RANDOM_Y; ++lorder)
Packit Service 6754ca
        {
Packit Service 6754ca
	    for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode)
Packit Service 6754ca
	    {
Packit Service 6754ca
		for (int tb = 0; tb <= 1; ++tb)
Packit Service 6754ca
		{
Packit Service 6754ca
		    for (int ts = 0; ts <= 1; ++ts)
Packit Service 6754ca
		    {
Packit Service 6754ca
			writeCopyReadONE (filename.c_str(), w, h,
Packit Service 6754ca
					  (LineOrder)lorder,
Packit Service 6754ca
					  (LevelRoundingMode) rmode,
Packit Service 6754ca
					  xs, ys,
Packit Service 6754ca
					  Compression (comp),
Packit Service 6754ca
					  (bool)tb, (bool)ts);
Packit Service 6754ca
Packit Service 6754ca
			writeCopyReadMIP (filename.c_str(), w, h,
Packit Service 6754ca
					  (LineOrder)lorder,
Packit Service 6754ca
					  (LevelRoundingMode) rmode,
Packit Service 6754ca
					  xs, ys,
Packit Service 6754ca
					  Compression (comp),
Packit Service 6754ca
					  (bool)tb, (bool)ts);
Packit Service 6754ca
Packit Service 6754ca
			writeCopyReadRIP (filename.c_str(), w, h,
Packit Service 6754ca
					  (LineOrder)lorder,
Packit Service 6754ca
					  (LevelRoundingMode) rmode,
Packit Service 6754ca
					  xs, ys,
Packit Service 6754ca
					  Compression (comp),
Packit Service 6754ca
					  (bool)tb, (bool)ts);
Packit Service 6754ca
		    }
Packit Service 6754ca
		}
Packit Service 6754ca
	    }
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
testTiledLineOrder (const std::string &tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "Testing line orders for tiled files and "
Packit Service 6754ca
		"buffered/unbuffered tile writes" << endl;
Packit Service 6754ca
Packit Service 6754ca
        const int W = 171;
Packit Service 6754ca
        const int H = 259;
Packit Service 6754ca
        const int XS = 55;
Packit Service 6754ca
        const int YS = 55;
Packit Service 6754ca
Packit Service 6754ca
	int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0;
Packit Service 6754ca
Packit Service 6754ca
	for (int n = 0; n <= maxThreads; ++n)
Packit Service 6754ca
	{
Packit Service 6754ca
	    if (ILMTHREAD_NAMESPACE::supportsThreads())
Packit Service 6754ca
	    {
Packit Service 6754ca
		setGlobalThreadCount (n);
Packit Service 6754ca
		cout << "\nnumber of threads: " << globalThreadCount() << endl;
Packit Service 6754ca
	    }
Packit Service 6754ca
Packit Service 6754ca
	    writeCopyRead (tempDir, W, H, XS, YS);
Packit Service 6754ca
	}
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
}