Blame IlmImfTest/testScanLineApi.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 <ImfTiledInputFile.h>
Packit Service 6754ca
#include <ImfInputFile.h>
Packit Service 6754ca
#include <ImfTiledRgbaFile.h>
Packit Service 6754ca
#include <ImfRgbaFile.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfThreading.h>
Packit Service 6754ca
#include "IlmThread.h"
Packit Service 6754ca
#include "ImathRandom.h"
Packit Service 6754ca
#include <string>
Packit Service 6754ca
#include <stdio.h>
Packit Service 6754ca
#include <assert.h>
Packit Service 6754ca
#include <vector>
Packit Service 6754ca
#include <math.h>
Packit Service 6754ca
#include <ImfTileDescriptionAttribute.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace IMF = OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
fillPixels (Array2D<unsigned int> &pi,
Packit Service 6754ca
            Array2D<half> &ph,
Packit Service 6754ca
            Array2D<float> &pf,
Packit Service 6754ca
            int width,
Packit Service 6754ca
            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
        {
Packit Service 6754ca
            pi[y][x] = x % 100 + 100 * (y % 100);
Packit Service 6754ca
            ph[y][x] = sin (double (x)) + sin (y * 0.5);
Packit Service 6754ca
            pf[y][x] = sin (double (y)) + sin (x * 0.5);
Packit Service 6754ca
        }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeRead (const Array2D<unsigned int> &pi1,
Packit Service 6754ca
           const Array2D<half> &ph1,
Packit Service 6754ca
           const Array2D<float> &pf1,
Packit Service 6754ca
           const char fileName[],
Packit Service 6754ca
           LineOrder lorder,
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
           LevelMode mode,
Packit Service 6754ca
	   LevelRoundingMode rmode)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Write the pixel data in pi1, ph1 and ph2 to a tiled
Packit Service 6754ca
    // image file using the specified parameters.
Packit Service 6754ca
    // Read the pixel data back from the file using the scanline
Packit Service 6754ca
    // interface one scanline at a time, and verify that the data did
Packit Service 6754ca
    // not change.
Packit Service 6754ca
    // For MIPMAP and RIPMAP_LEVELS, the lower levels of the images
Packit Service 6754ca
    // are filled in cropped versions of the level(0,0) image,
Packit Service 6754ca
    // i.e. no filtering is done.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    cout << "levelMode " << mode <<
Packit Service 6754ca
	    ", roundingMode " << rmode <<
Packit Service 6754ca
            ", line order " << lorder <<
Packit Service 6754ca
            ",\ntileSize " << xSize << "x" << ySize <<
Packit Service 6754ca
            ", xOffset " << xOffset <<
Packit Service 6754ca
            ", 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
    hdr.lineOrder() = lorder;
Packit Service 6754ca
    hdr.compression() = comp;
Packit Service 6754ca
Packit Service 6754ca
    hdr.channels().insert ("I", Channel (IMF::UINT));
Packit Service 6754ca
    hdr.channels().insert ("H", Channel (IMF::HALF));
Packit Service 6754ca
    hdr.channels().insert ("F", Channel (IMF::FLOAT));
Packit Service 6754ca
    
Packit Service 6754ca
    hdr.setTileDescription(TileDescription(xSize, ySize, mode, rmode));
Packit Service 6754ca
    {
Packit Service 6754ca
        FrameBuffer fb; 
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("I",                                       // name
Packit Service 6754ca
                   Slice (IMF::UINT,                          // type
Packit Service 6754ca
                          (char *) &pi1[-yOffset][-xOffset],  // base
Packit Service 6754ca
                          sizeof (pi1[0][0]),                 // xStride
Packit Service 6754ca
                          sizeof (pi1[0][0]) * width)         // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
                  
Packit Service 6754ca
        fb.insert ("H",                                       // name
Packit Service 6754ca
                   Slice (IMF::HALF,                          // type
Packit Service 6754ca
                          (char *) &ph1[-yOffset][-xOffset],  // base
Packit Service 6754ca
                          sizeof (ph1[0][0]),                 // xStride
Packit Service 6754ca
                          sizeof (ph1[0][0]) * width)         // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
                  
Packit Service 6754ca
        fb.insert ("F",                                       // name
Packit Service 6754ca
                   Slice (IMF::FLOAT,                              // type
Packit Service 6754ca
                          (char *) &pf1[-yOffset][-xOffset],  // base
Packit Service 6754ca
                          sizeof (pf1[0][0]),                 // xStride
Packit Service 6754ca
                          sizeof (pf1[0][0]) * width)         // yStride
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
        out.setFrameBuffer (fb);
Packit Service 6754ca
        
Packit Service 6754ca
        int startTileY = -1;
Packit Service 6754ca
	int endTileY = -1;
Packit Service 6754ca
        int dy;
Packit Service 6754ca
Packit Service 6754ca
        switch (mode)
Packit Service 6754ca
        {
Packit Service 6754ca
          case ONE_LEVEL:
Packit Service 6754ca
          {
Packit Service 6754ca
            if (lorder == DECREASING_Y)
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = out.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 = out.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 < out.numXTiles(); ++tileX)         
Packit Service 6754ca
                    out.writeTile (tileX, tileY);
Packit Service 6754ca
          }
Packit Service 6754ca
          break;
Packit Service 6754ca
Packit Service 6754ca
          case MIPMAP_LEVELS:
Packit Service 6754ca
          {
Packit Service 6754ca
            if (lorder == DECREASING_Y)
Packit Service 6754ca
            {
Packit Service 6754ca
                endTileY = -1;
Packit Service 6754ca
                dy = -1;
Packit Service 6754ca
            }        
Packit Service 6754ca
            else
Packit Service 6754ca
            {
Packit Service 6754ca
                startTileY = 0;
Packit Service 6754ca
                dy = 1;
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            for (int level = 0; level < out.numLevels(); ++level)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (lorder == DECREASING_Y)
Packit Service 6754ca
                    startTileY = out.numYTiles(level) - 1;
Packit Service 6754ca
                else
Packit Service 6754ca
                    endTileY = out.numYTiles(level);
Packit Service 6754ca
Packit Service 6754ca
                for (int tileY = startTileY; tileY != endTileY; tileY += dy)
Packit Service 6754ca
                    for (int tileX = 0; tileX < out.numXTiles(level); ++tileX)
Packit Service 6754ca
                        out.writeTile (tileX, tileY, level);
Packit Service 6754ca
            }
Packit Service 6754ca
          }
Packit Service 6754ca
          break;
Packit Service 6754ca
          
Packit Service 6754ca
          case RIPMAP_LEVELS:
Packit Service 6754ca
          {
Packit Service 6754ca
            for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel)
Packit Service 6754ca
            {               
Packit Service 6754ca
                if (lorder == DECREASING_Y)
Packit Service 6754ca
                {
Packit Service 6754ca
                    startTileY = out.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 = out.numYTiles(ylevel);
Packit Service 6754ca
Packit Service 6754ca
                    dy = 1;
Packit Service 6754ca
                }
Packit Service 6754ca
Packit Service 6754ca
                for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel)
Packit Service 6754ca
                {
Packit Service 6754ca
                    for (int tileY = startTileY; tileY != endTileY;
Packit Service 6754ca
                         tileY += dy)
Packit Service 6754ca
                        for (int tileX = 0; tileX < out.numXTiles (xlevel);
Packit Service 6754ca
                             ++tileX)
Packit Service 6754ca
                            out.writeTile (tileX, tileY, xlevel, ylevel);
Packit Service 6754ca
                }
Packit Service 6754ca
            }
Packit Service 6754ca
          }
Packit Service 6754ca
          break;
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " reading INCREASING_Y" << flush;
Packit Service 6754ca
Packit Service 6754ca
        InputFile 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<unsigned int> pi2 (h, w);
Packit Service 6754ca
        Array2D<half>         ph2 (h, w);
Packit Service 6754ca
        Array2D<float>        pf2 (h, w);
Packit Service 6754ca
Packit Service 6754ca
        FrameBuffer fb;
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("I",                             // name
Packit Service 6754ca
                   Slice (IMF::UINT,                // type
Packit Service 6754ca
                          (char *) &pi2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (pi2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (pi2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("H",                             // name
Packit Service 6754ca
                   Slice (IMF::HALF,                // type
Packit Service 6754ca
                          (char *) &ph2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (ph2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (ph2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("F",                             // name
Packit Service 6754ca
                   Slice (IMF::FLOAT,               // type
Packit Service 6754ca
                          (char *) &pf2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (pf2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (pf2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        in.setFrameBuffer (fb);
Packit Service 6754ca
        for (int y = dw.min.y; y <= dw.max.y; ++y)
Packit Service 6754ca
            in.readPixels (y);
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
Packit Service 6754ca
        ChannelList::ConstIterator hi = hdr.channels().begin();
Packit Service 6754ca
        ChannelList::ConstIterator ii = in.header().channels().begin();
Packit Service 6754ca
Packit Service 6754ca
        while (hi != hdr.channels().end())
Packit Service 6754ca
        {
Packit Service 6754ca
            assert (!strcmp (hi.name(), ii.name()));
Packit Service 6754ca
            assert (hi.channel().type == ii.channel().type);
Packit Service 6754ca
            assert (hi.channel().xSampling == ii.channel().xSampling);
Packit Service 6754ca
            assert (hi.channel().ySampling == ii.channel().ySampling);
Packit Service 6754ca
Packit Service 6754ca
            ++hi;
Packit Service 6754ca
            ++ii;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        assert (ii == in.header().channels().end());
Packit Service 6754ca
Packit Service 6754ca
        for (int y = 0; y < h; ++y)
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int x = 0; x < w; ++x)
Packit Service 6754ca
            {
Packit Service 6754ca
                assert (pi1[y][x] == pi2[y][x]);
Packit Service 6754ca
                assert (ph1[y][x] == ph2[y][x]);
Packit Service 6754ca
                assert (pf1[y][x] == pf2[y][x]);
Packit Service 6754ca
            }
Packit Service 6754ca
        }    
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << endl << "         reading DECREASING_Y" << flush;
Packit Service 6754ca
Packit Service 6754ca
        InputFile 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<unsigned int> pi2 (h, w);
Packit Service 6754ca
        Array2D<half>         ph2 (h, w);
Packit Service 6754ca
        Array2D<float>        pf2 (h, w);
Packit Service 6754ca
Packit Service 6754ca
        FrameBuffer fb;
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("I",                             // name
Packit Service 6754ca
                   Slice (IMF::UINT,                // type
Packit Service 6754ca
                          (char *) &pi2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (pi2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (pi2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("H",                             // name
Packit Service 6754ca
                   Slice (IMF::HALF,                // type
Packit Service 6754ca
                          (char *) &ph2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (ph2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (ph2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        fb.insert ("F",                             // name
Packit Service 6754ca
                   Slice (IMF::FLOAT,               // type
Packit Service 6754ca
                          (char *) &pf2[-dwy][-dwx],// base
Packit Service 6754ca
                          sizeof (pf2[0][0]),       // xStride
Packit Service 6754ca
                          sizeof (pf2[0][0]) * w)   // yStride
Packit Service 6754ca
                  );
Packit Service 6754ca
Packit Service 6754ca
        in.setFrameBuffer (fb);
Packit Service 6754ca
        for (int y = dw.max.y; y >= dw.min.y; --y)
Packit Service 6754ca
            in.readPixels (y);
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
Packit Service 6754ca
        ChannelList::ConstIterator hi = hdr.channels().begin();
Packit Service 6754ca
        ChannelList::ConstIterator ii = in.header().channels().begin();
Packit Service 6754ca
Packit Service 6754ca
        while (hi != hdr.channels().end())
Packit Service 6754ca
        {
Packit Service 6754ca
            assert (!strcmp (hi.name(), ii.name()));
Packit Service 6754ca
            assert (hi.channel().type == ii.channel().type);
Packit Service 6754ca
            assert (hi.channel().xSampling == ii.channel().xSampling);
Packit Service 6754ca
            assert (hi.channel().ySampling == ii.channel().ySampling);
Packit Service 6754ca
Packit Service 6754ca
            ++hi;
Packit Service 6754ca
            ++ii;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        assert (ii == in.header().channels().end());
Packit Service 6754ca
Packit Service 6754ca
        for (int y = 0; y < h; ++y)
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int x = 0; x < w; ++x)
Packit Service 6754ca
            {
Packit Service 6754ca
                assert (pi1[y][x] == pi2[y][x]);
Packit Service 6754ca
                assert (ph1[y][x] == ph2[y][x]);
Packit Service 6754ca
                assert (pf1[y][x] == pf2[y][x]);
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << endl << "         reading INCREASING_Y "
Packit Service 6754ca
		        "(new frame buffer on every line)" << flush;
Packit Service 6754ca
Packit Service 6754ca
        InputFile 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<unsigned int> pi2 (h, w);
Packit Service 6754ca
        Array2D<half>         ph2 (h, w);
Packit Service 6754ca
        Array2D<float>        pf2 (h, w);
Packit Service 6754ca
Packit Service 6754ca
        for (int y = dw.min.y; y <= dw.max.y; ++y)
Packit Service 6754ca
	{
Packit Service 6754ca
	    FrameBuffer fb;
Packit Service 6754ca
Packit Service 6754ca
	    fb.insert ("I",					// name
Packit Service 6754ca
		       Slice (IMF::UINT,			// type
Packit Service 6754ca
			      (char *) &pi2[y - dwy][-dwx],	// base
Packit Service 6754ca
			      sizeof (pi2[0][0]),		// xStride
Packit Service 6754ca
			      0)				// yStride
Packit Service 6754ca
		      );
Packit Service 6754ca
Packit Service 6754ca
	    fb.insert ("H",					// name
Packit Service 6754ca
		       Slice (IMF::HALF,			// type
Packit Service 6754ca
			      (char *) &ph2[y - dwy][-dwx],	// base
Packit Service 6754ca
			      sizeof (ph2[0][0]),		// xStride
Packit Service 6754ca
			      0)				// yStride
Packit Service 6754ca
		      );
Packit Service 6754ca
Packit Service 6754ca
	    fb.insert ("F",                     	        // name
Packit Service 6754ca
		       Slice (IMF::FLOAT,			// type
Packit Service 6754ca
			      (char *) &pf2[y - dwy][-dwx],	// base
Packit Service 6754ca
			      sizeof (pf2[0][0]),		// xStride
Packit Service 6754ca
			      0)				// yStride
Packit Service 6754ca
		      );
Packit Service 6754ca
Packit Service 6754ca
	    in.setFrameBuffer (fb);
Packit Service 6754ca
            in.readPixels (y);
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
Packit Service 6754ca
        ChannelList::ConstIterator hi = hdr.channels().begin();
Packit Service 6754ca
        ChannelList::ConstIterator ii = in.header().channels().begin();
Packit Service 6754ca
Packit Service 6754ca
        while (hi != hdr.channels().end())
Packit Service 6754ca
        {
Packit Service 6754ca
            assert (!strcmp (hi.name(), ii.name()));
Packit Service 6754ca
            assert (hi.channel().type == ii.channel().type);
Packit Service 6754ca
            assert (hi.channel().xSampling == ii.channel().xSampling);
Packit Service 6754ca
            assert (hi.channel().ySampling == ii.channel().ySampling);
Packit Service 6754ca
Packit Service 6754ca
            ++hi;
Packit Service 6754ca
            ++ii;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        assert (ii == in.header().channels().end());
Packit Service 6754ca
Packit Service 6754ca
        for (int y = 0; y < h; ++y)
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int x = 0; x < w; ++x)
Packit Service 6754ca
            {
Packit Service 6754ca
                assert (pi1[y][x] == pi2[y][x]);
Packit Service 6754ca
                assert (ph1[y][x] == ph2[y][x]);
Packit Service 6754ca
                assert (pf1[y][x] == pf2[y][x]);
Packit Service 6754ca
            }
Packit Service 6754ca
        }    
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
writeRead (const std::string &tempDir,
Packit Service 6754ca
           const Array2D<unsigned int> &pi,
Packit Service 6754ca
           const Array2D<half> &ph,
Packit Service 6754ca
           const Array2D<float> &pf,
Packit Service 6754ca
           int W,
Packit Service 6754ca
           int H,
Packit Service 6754ca
           LineOrder lorder,
Packit Service 6754ca
           Compression comp,
Packit Service 6754ca
	   LevelRoundingMode rmode,
Packit Service 6754ca
           int dx, int dy,
Packit Service 6754ca
           int xSize, int ySize)
Packit Service 6754ca
{
Packit Service 6754ca
    std::string filename = tempDir + "imf_test_scanline_api.exr";
Packit Service 6754ca
Packit Service 6754ca
    writeRead (pi, ph, pf, filename.c_str(), lorder, W, H,
Packit Service 6754ca
               xSize, ySize, dx, dy, comp, ONE_LEVEL, rmode);
Packit Service 6754ca
    writeRead (pi, ph, pf, filename.c_str(), lorder, W, H,
Packit Service 6754ca
               xSize, ySize, dx, dy, comp, MIPMAP_LEVELS, rmode);
Packit Service 6754ca
    writeRead (pi, ph, pf, filename.c_str(), lorder, W, H,
Packit Service 6754ca
               xSize, ySize, dx, dy, comp, RIPMAP_LEVELS, rmode);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
testScanLineApi (const std::string &tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "Testing the scanline API for tiled files" << endl;
Packit Service 6754ca
Packit Service 6754ca
        const int W = 48;
Packit Service 6754ca
        const int H = 81;
Packit Service 6754ca
        const int DX = -17;
Packit Service 6754ca
        const int DY = -29;
Packit Service 6754ca
        
Packit Service 6754ca
        Array2D<unsigned int> pi (H, W);
Packit Service 6754ca
        Array2D<half> ph (H, W);
Packit Service 6754ca
        Array2D<float> pf (H, W);
Packit Service 6754ca
        fillPixels (pi, ph, pf, W, H);
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
	    for (int lorder = 0; lorder < NUM_LINEORDERS; ++lorder)
Packit Service 6754ca
	    {
Packit Service 6754ca
		for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode)
Packit Service 6754ca
		{
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf,  W, H, 
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       0, 0, 1, 1);
Packit Service 6754ca
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H, 
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       DX, DY, 1, 1);
Packit Service 6754ca
		    
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       0, 0, 24, 26);
Packit Service 6754ca
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       DX, DY, 24, 26);
Packit Service 6754ca
		    
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       0, 0, 48, 81);
Packit Service 6754ca
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       DX, DY, 48, 81);
Packit Service 6754ca
			       
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       0, 0, 128, 96);
Packit Service 6754ca
Packit Service 6754ca
		    writeRead (tempDir, pi, ph, pf, W, H,
Packit Service 6754ca
			       LineOrder (lorder),
Packit Service 6754ca
			       ZIP_COMPRESSION,
Packit Service 6754ca
			       LevelRoundingMode (rmode),
Packit Service 6754ca
			       DX, DY, 128, 96);
Packit Service 6754ca
		}
Packit Service 6754ca
	    }
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
}