Blame IlmImfTest/testOptimized.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, 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 <ImfOutputFile.h>
Packit Service 6754ca
#include <ImfInputFile.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include <ImfVersion.h>
Packit Service 6754ca
#include "half.h"
Packit Service 6754ca
Packit Service 6754ca
#include <ImfBoxAttribute.h>
Packit Service 6754ca
#include <ImfChannelListAttribute.h>
Packit Service 6754ca
#include <ImfCompressionAttribute.h>
Packit Service 6754ca
#include <ImfChromaticitiesAttribute.h>
Packit Service 6754ca
#include <ImfFloatAttribute.h>
Packit Service 6754ca
#include <ImfEnvmapAttribute.h>
Packit Service 6754ca
#include <ImfDoubleAttribute.h>
Packit Service 6754ca
#include <ImfIntAttribute.h>
Packit Service 6754ca
#include <ImfLineOrderAttribute.h>
Packit Service 6754ca
#include <ImfMatrixAttribute.h>
Packit Service 6754ca
#include <ImfOpaqueAttribute.h>
Packit Service 6754ca
#include <ImfStringAttribute.h>
Packit Service 6754ca
#include <ImfStringVectorAttribute.h>
Packit Service 6754ca
#include <ImfVecAttribute.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#include <stdio.h>
Packit Service 6754ca
#include <assert.h>
Packit Service 6754ca
#include <string.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
namespace IMF = OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
Packit Service 6754ca
namespace IMATH = IMATH_NAMESPACE;
Packit Service 6754ca
using namespace IMATH;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace
Packit Service 6754ca
{
Packit Service 6754ca
Packit Service 6754ca
static const int IMAGE_2K_HEIGHT = 1152;
Packit Service 6754ca
static const int IMAGE_2K_WIDTH = 2048;
Packit Service 6754ca
Packit Service 6754ca
static const char* CHANNEL_NAMES[] = {"R", "G", "B", "A"};
Packit Service 6754ca
static const char* CHANNEL_NAMES_LEFT[] = {"left.R", "left.G", "left.B", "left.A"};
Packit Service 6754ca
Packit Service 6754ca
static const half ALPHA_DEFAULT_VALUE(1.0f);
Packit Service 6754ca
Packit Service 6754ca
#define RGB_FILENAME "imf_optimized_aces_rgb.exr"
Packit Service 6754ca
#define RGBA_FILENAME "imf_optimized_aces_rgba.exr"
Packit Service 6754ca
#define RGB_STEREO_FILENAME "imf_optimized_aces_rgb_stereo.exr"
Packit Service 6754ca
#define RGBA_STEREO_FILENAME "imf_optimized_aces_rgba_stereo.exr"
Packit Service 6754ca
Packit Service 6754ca
typedef enum EImageType
Packit Service 6754ca
{
Packit Service 6754ca
    IMAGE_TYPE_RGB         = 1,
Packit Service 6754ca
    IMAGE_TYPE_RGBA        = 2,
Packit Service 6754ca
    IMAGE_TYPE_OTHER        =3
Packit Service 6754ca
} EImageType;
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
getNbChannels(EImageType pImageType)
Packit Service 6754ca
{
Packit Service 6754ca
    int retVal = 0;
Packit Service 6754ca
Packit Service 6754ca
    switch(pImageType)
Packit Service 6754ca
    {
Packit Service 6754ca
        case IMAGE_TYPE_RGB:
Packit Service 6754ca
            retVal = 3;
Packit Service 6754ca
            break;
Packit Service 6754ca
        case IMAGE_TYPE_RGBA:
Packit Service 6754ca
            retVal = 4;
Packit Service 6754ca
            break;
Packit Service 6754ca
        case IMAGE_TYPE_OTHER:
Packit Service 6754ca
            retVal = 2;
Packit Service 6754ca
            break;
Packit Service 6754ca
        default:
Packit Service 6754ca
            retVal = 0;
Packit Service 6754ca
            break;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    return retVal;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
//
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
generatePixel (int i, int j, half* rgbaValue, bool pIsLeft)
Packit Service 6754ca
{
Packit Service 6754ca
    float redValue = 0.0f;
Packit Service 6754ca
    float greenValue = 0.0f;
Packit Service 6754ca
    float blueValue = 0.0f;
Packit Service 6754ca
    float alphaValue = 0.0f;
Packit Service 6754ca
Packit Service 6754ca
    // These formulas are arbitrary but generate results that vary
Packit Service 6754ca
    // depending on pixel position.  They are used to validate that
Packit Service 6754ca
    // pixels are read/written correctly, because if we had only one
Packit Service 6754ca
    // value for the whole image, the tests would still pass if we read
Packit Service 6754ca
    // only one pixel and copied it all across the buffer.
Packit Service 6754ca
    if(pIsLeft)
Packit Service 6754ca
    {
Packit Service 6754ca
        redValue = ((i + j) % 10 + 0.004f * j) / 10.0f;
Packit Service 6754ca
        greenValue = ((j + j) % 10 + 0.006f * i) / 10.0f;
Packit Service 6754ca
        blueValue = ((j * j + i) % 10 + 0.003f * j) / 10.0f;
Packit Service 6754ca
        alphaValue = ALPHA_DEFAULT_VALUE;
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        redValue = ((i * j) % 10 + 0.005f * j) / 10.0f;
Packit Service 6754ca
        greenValue = ((i + i) % 10 + 0.007f * i) / 10.0f;
Packit Service 6754ca
        blueValue = ((i * i + j) % 10 + 0.006f * j) / 10.0f;
Packit Service 6754ca
        alphaValue = ALPHA_DEFAULT_VALUE;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    rgbaValue[0] = redValue;
Packit Service 6754ca
    rgbaValue[1] = greenValue;
Packit Service 6754ca
    rgbaValue[2] = blueValue;
Packit Service 6754ca
    rgbaValue[3] = alphaValue;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Given a buffer, fill the pixels with arbitrary but deterministic values.
Packit Service 6754ca
// Used to fill the pixels in a buffer before writing them to a file.
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
fillPixels (const int& pImageHeight,
Packit Service 6754ca
            const int& pImageWidth,
Packit Service 6754ca
            Array2D<half>& pPixels,
Packit Service 6754ca
            int pNbChannels,
Packit Service 6754ca
            bool pIsLeft)
Packit Service 6754ca
{
Packit Service 6754ca
    for(int i = 0; i < pImageHeight; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        for(int j = 0; j < pImageWidth; ++j)
Packit Service 6754ca
        {
Packit Service 6754ca
            half rgbaValue[4];
Packit Service 6754ca
Packit Service 6754ca
            generatePixel(i, j, &rgbaValue[0], pIsLeft);
Packit Service 6754ca
            memcpy( (void*)&pPixels[i][j * pNbChannels],
Packit Service 6754ca
                    &rgbaValue[0],
Packit Service 6754ca
                    pNbChannels * sizeof(half));
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Validate that the pixels value are the same as what we used to fill them.
Packit Service 6754ca
// Used after reading the pixels from the file to validate that it was read
Packit Service 6754ca
// properly.
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
validatePixels (const int& pImageHeight,
Packit Service 6754ca
                const int& pImageWidth,
Packit Service 6754ca
                Array2D<half>& pPixels,
Packit Service 6754ca
                int pNbChannels,
Packit Service 6754ca
                bool pIsLeft)
Packit Service 6754ca
{
Packit Service 6754ca
    for(int i = 0; i < pImageHeight; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        for(int j = 0; j < pImageWidth; ++j)
Packit Service 6754ca
        {
Packit Service 6754ca
            int retVal = -1;
Packit Service 6754ca
            half rgbaValue[4];
Packit Service 6754ca
            generatePixel(i, j, &rgbaValue[0], pIsLeft);
Packit Service 6754ca
Packit Service 6754ca
            retVal = memcmp ((void*)&pPixels[i][j * pNbChannels],
Packit Service 6754ca
                             (void*)&rgbaValue[0],
Packit Service 6754ca
                             pNbChannels * sizeof(half));
Packit Service 6754ca
Packit Service 6754ca
            if(retVal != 0)
Packit Service 6754ca
            {
Packit Service 6754ca
                cout << "ERROR at pixel [" << i << ";" << j << "]" << endl;
Packit Service 6754ca
                cout << "\tExpected [" << rgbaValue[0] << ", "
Packit Service 6754ca
                        << rgbaValue[1] << ", "
Packit Service 6754ca
                        << rgbaValue[2] << "] " << endl;
Packit Service 6754ca
Packit Service 6754ca
                cout << "\tReceived ["      << pPixels[i][j * pNbChannels] << ", "
Packit Service 6754ca
                        << pPixels[i][j * pNbChannels + 1] << ", "
Packit Service 6754ca
                        << pPixels[i][j * pNbChannels + 2] << "]" << endl;
Packit Service 6754ca
                assert(retVal == 0);
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
//  Write pixels to a file (mono version)
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
writePixels (const char pFilename[],
Packit Service 6754ca
             const int& pImageHeight,
Packit Service 6754ca
             const int& pImageWidth,
Packit Service 6754ca
             Array2D<half>& pPixels,
Packit Service 6754ca
             int pNbChannels,
Packit Service 6754ca
             Compression pCompression)
Packit Service 6754ca
{
Packit Service 6754ca
    Header header (pImageWidth,
Packit Service 6754ca
                   pImageHeight,
Packit Service 6754ca
                   1.0f,
Packit Service 6754ca
                   V2f(0.0f,0.0f),
Packit Service 6754ca
                   1.0f,
Packit Service 6754ca
                   INCREASING_Y,
Packit Service 6754ca
                   pCompression);
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        header.channels().insert (CHANNEL_NAMES[i], Channel(HALF));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    OutputFile lFile(pFilename, header);
Packit Service 6754ca
    FrameBuffer lOutputFrameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        lOutputFrameBuffer.insert (CHANNEL_NAMES[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixels[0][i],
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels * pImageWidth));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    lFile.setFrameBuffer (lOutputFrameBuffer);
Packit Service 6754ca
    lFile.writePixels (pImageHeight);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
//  Write pixels to a file (stereo version)
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
writePixels (const char pFilename[],
Packit Service 6754ca
             const int& pImageHeight,
Packit Service 6754ca
             const int& pImageWidth,
Packit Service 6754ca
             Array2D<half>& pPixels,
Packit Service 6754ca
             Array2D<half>& pPixelsLeft,
Packit Service 6754ca
             int pNbChannels,
Packit Service 6754ca
             Compression pCompression)
Packit Service 6754ca
{
Packit Service 6754ca
    Header header (pImageWidth,
Packit Service 6754ca
                   pImageHeight,
Packit Service 6754ca
                   1.0f,
Packit Service 6754ca
                   V2f(0.0f,0.0f),
Packit Service 6754ca
                   1.0f,
Packit Service 6754ca
                   INCREASING_Y,
Packit Service 6754ca
                   pCompression);
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        header.channels().insert (CHANNEL_NAMES[i], Channel(HALF));
Packit Service 6754ca
        header.channels().insert (CHANNEL_NAMES_LEFT[i], Channel(HALF));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    StringVector multiView;
Packit Service 6754ca
    multiView.push_back ("right");
Packit Service 6754ca
    multiView.push_back ("left");
Packit Service 6754ca
    header.insert("multiView", IMF::TypedAttribute<IMF::StringVector>(multiView));
Packit Service 6754ca
Packit Service 6754ca
    OutputFile lFile(pFilename, header);
Packit Service 6754ca
    FrameBuffer lOutputFrameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        lOutputFrameBuffer.insert (CHANNEL_NAMES[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixels[0][i],
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels * pImageWidth));
Packit Service 6754ca
Packit Service 6754ca
        lOutputFrameBuffer.insert (CHANNEL_NAMES_LEFT[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixelsLeft[0][i],
Packit Service 6754ca
                        sizeof (pPixelsLeft[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixelsLeft[0][0]) * pNbChannels * pImageWidth));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    lFile.setFrameBuffer (lOutputFrameBuffer);
Packit Service 6754ca
    lFile.writePixels (pImageHeight);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
//  Read pixels from a file (mono version).
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
readPixels (const char pFilename[], int pNbChannels, Array2D<half>& pPixels)
Packit Service 6754ca
{
Packit Service 6754ca
    InputFile lFile(pFilename);
Packit Service 6754ca
    IMATH::Box2i lDataWindow = lFile.header().dataWindow();
Packit Service 6754ca
Packit Service 6754ca
    int lWidth = lDataWindow.max.x - lDataWindow.min.x + 1;
Packit Service 6754ca
    int lHeight = lDataWindow.max.y - lDataWindow.min.y + 1;
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer lInputFrameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        lInputFrameBuffer.insert (CHANNEL_NAMES[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixels[0][i],
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels * lWidth,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        ALPHA_DEFAULT_VALUE));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    lFile.setFrameBuffer (lInputFrameBuffer);
Packit Service 6754ca
    
Packit Service 6754ca
    bool is_optimized = lFile.isOptimizationEnabled();
Packit Service 6754ca
    if(is_optimized)
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << " optimization enabled\n";
Packit Service 6754ca
        
Packit Service 6754ca
        if(pNbChannels==2)
Packit Service 6754ca
        {
Packit Service 6754ca
            cerr << " error: isOptimizationEnabled returned TRUE, but "
Packit Service 6754ca
            "optimization not known to work for two channel images\n";
Packit Service 6754ca
            assert(pNbChannels!=2);
Packit Service 6754ca
        }
Packit Service 6754ca
            
Packit Service 6754ca
    }else{
Packit Service 6754ca
        cout << " optimization disabled\n";
Packit Service 6754ca
#ifdef IMF_HAVE_SSE2
Packit Service 6754ca
        if(pNbChannels!=2)
Packit Service 6754ca
        {
Packit Service 6754ca
            cerr << " error: isOptimizationEnabled returned FALSE, but "
Packit Service 6754ca
            "should work for " << pNbChannels << "channel images\n";
Packit Service 6754ca
            assert(pNbChannels==2);
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
#endif
Packit Service 6754ca
    }
Packit Service 6754ca
    
Packit Service 6754ca
    lFile.readPixels (lDataWindow.min.y, lDataWindow.max.y);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
//  Read pixels from a file (stereo version).
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
readPixels (const char pFilename[],
Packit Service 6754ca
            int pNbChannels,
Packit Service 6754ca
            Array2D<half>& pPixels,
Packit Service 6754ca
            Array2D<half>& pPixelsLeft)
Packit Service 6754ca
{
Packit Service 6754ca
    InputFile lFile(pFilename);
Packit Service 6754ca
    IMATH::Box2i lDataWindow = lFile.header().dataWindow();
Packit Service 6754ca
Packit Service 6754ca
    int lWidth = lDataWindow.max.x - lDataWindow.min.x + 1;
Packit Service 6754ca
    int lHeight = lDataWindow.max.y - lDataWindow.min.y + 1;
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer lInputFrameBuffer;
Packit Service 6754ca
Packit Service 6754ca
    for(int i = 0; i < pNbChannels; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        lInputFrameBuffer.insert (CHANNEL_NAMES[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixels[0][i],
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixels[0][0]) * pNbChannels * lWidth,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        ALPHA_DEFAULT_VALUE));
Packit Service 6754ca
Packit Service 6754ca
        lInputFrameBuffer.insert (CHANNEL_NAMES_LEFT[i],
Packit Service 6754ca
                Slice (HALF,
Packit Service 6754ca
                        (char *) &pPixelsLeft[0][i],
Packit Service 6754ca
                        sizeof (pPixelsLeft[0][0]) * pNbChannels,
Packit Service 6754ca
                        sizeof (pPixelsLeft[0][0]) * pNbChannels * lWidth,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        1,
Packit Service 6754ca
                        ALPHA_DEFAULT_VALUE));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    lFile.setFrameBuffer (lInputFrameBuffer);
Packit Service 6754ca
    lFile.readPixels (lDataWindow.min.y, lDataWindow.max.y);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Allocate an array of pixels, fill them with values and then write
Packit Service 6754ca
// them to a file.
Packit Service 6754ca
void
Packit Service 6754ca
writeFile (const char pFilename[],
Packit Service 6754ca
           int pHeight,
Packit Service 6754ca
           int pWidth,
Packit Service 6754ca
           EImageType pImageType,
Packit Service 6754ca
           bool pIsStereo,
Packit Service 6754ca
           Compression pCompression)
Packit Service 6754ca
{
Packit Service 6754ca
    const int lNbChannels = getNbChannels (pImageType);
Packit Service 6754ca
    Array2D<half> lPixels;
Packit Service 6754ca
Packit Service 6754ca
    lPixels.resizeErase (pHeight, pWidth * lNbChannels);
Packit Service 6754ca
    fillPixels (pHeight, pWidth, lPixels, lNbChannels, false);
Packit Service 6754ca
Packit Service 6754ca
    if(pIsStereo)
Packit Service 6754ca
    {
Packit Service 6754ca
        Array2D<half> lPixelsLeft;
Packit Service 6754ca
Packit Service 6754ca
        lPixelsLeft.resizeErase (pHeight, pWidth * lNbChannels);
Packit Service 6754ca
        fillPixels (pHeight,
Packit Service 6754ca
                    pWidth,
Packit Service 6754ca
                    lPixelsLeft,
Packit Service 6754ca
                    lNbChannels,
Packit Service 6754ca
                    true);
Packit Service 6754ca
Packit Service 6754ca
        writePixels (pFilename,
Packit Service 6754ca
                     pHeight,
Packit Service 6754ca
                     pWidth,
Packit Service 6754ca
                     lPixels,
Packit Service 6754ca
                     lPixelsLeft,
Packit Service 6754ca
                     lNbChannels,
Packit Service 6754ca
                     pCompression);
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        writePixels (pFilename,
Packit Service 6754ca
                    pHeight,
Packit Service 6754ca
                    pWidth,
Packit Service 6754ca
                    lPixels,
Packit Service 6754ca
                    lNbChannels,
Packit Service 6754ca
                    pCompression);
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Read pixels from a file and then validate that the values are the
Packit Service 6754ca
// same as what was used to fill them before writing.
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
readValidateFile (const char pFilename[],
Packit Service 6754ca
                  int pHeight,
Packit Service 6754ca
                  int pWidth,
Packit Service 6754ca
                  EImageType
Packit Service 6754ca
                  pImageType,
Packit Service 6754ca
                  bool pIsStereo)
Packit Service 6754ca
{
Packit Service 6754ca
    const int lNbChannels = getNbChannels(pImageType);
Packit Service 6754ca
Packit Service 6754ca
    Array2D<half> lPixels;
Packit Service 6754ca
    lPixels.resizeErase(pHeight, pWidth * lNbChannels);
Packit Service 6754ca
    //readPixels(pFilename, lNbChannels, lPixels);
Packit Service 6754ca
    //writePixels("pkTest.exr", pHeight, pWidth, lPixels, lNbChannels, NO_COMPRESSION);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    if(pIsStereo)
Packit Service 6754ca
    {
Packit Service 6754ca
        Array2D<half> lPixelsLeft;
Packit Service 6754ca
        lPixelsLeft.resizeErase (pHeight, pWidth * lNbChannels);
Packit Service 6754ca
        readPixels (pFilename, lNbChannels, lPixels, lPixelsLeft);
Packit Service 6754ca
        validatePixels (pHeight, pWidth, lPixels, lNbChannels, false);
Packit Service 6754ca
        validatePixels (pHeight, pWidth, lPixelsLeft, lNbChannels, true);
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        readPixels (pFilename, lNbChannels, lPixels);
Packit Service 6754ca
        validatePixels (pHeight, pWidth, lPixels, lNbChannels, false);
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// confirm the optimization flag returns false for non-RGB files
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testNonOptimized (const std::string & tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    const int pHeight = IMAGE_2K_HEIGHT - 1;
Packit Service 6754ca
    const int pWidth  =  IMAGE_2K_WIDTH - 1;
Packit Service 6754ca
    std::string fn = tempDir +  RGB_FILENAME;
Packit Service 6754ca
    const char* filename  = fn.c_str();
Packit Service 6754ca
Packit Service 6754ca
    remove(filename);
Packit Service 6754ca
    writeFile (filename,  pHeight, pWidth, IMAGE_TYPE_OTHER,  false, NO_COMPRESSION);
Packit Service 6754ca
    readValidateFile(filename,pHeight,pWidth,IMAGE_TYPE_OTHER,false);
Packit Service 6754ca
    remove(filename);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Test all combinations of file/framebuffer
Packit Service 6754ca
//  RGB  file to RGB  framebuffer
Packit Service 6754ca
//  RGB  file to RGBA framebuffer
Packit Service 6754ca
//  RGBA file to RGB  framebuffer
Packit Service 6754ca
//  RGBA file to RGBA framebuffer
Packit Service 6754ca
// Given a switch that determines whether the pixels will be SSE-aligned,
Packit Service 6754ca
// whether the file is mono or stereo, and the compression algorithm used
Packit Service 6754ca
// to write the file.
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testAllCombinations (bool isAligned,
Packit Service 6754ca
                     bool isStereo,
Packit Service 6754ca
                     Compression pCompression,
Packit Service 6754ca
                     const std::string & tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    std::string pRgb  = isStereo ?  RGB_STEREO_FILENAME :
Packit Service 6754ca
                                    RGB_FILENAME;
Packit Service 6754ca
    pRgb = tempDir + pRgb;
Packit Service 6754ca
    std::string pRgba = isStereo ?  RGBA_STEREO_FILENAME :
Packit Service 6754ca
                                    RGBA_FILENAME;
Packit Service 6754ca
    pRgba = tempDir + pRgba;
Packit Service 6754ca
Packit Service 6754ca
    const char * pRgbFilename  = pRgb.c_str();
Packit Service 6754ca
    const char * pRgbaFilename = pRgba.c_str();
Packit Service 6754ca
Packit Service 6754ca
    const int pHeight = isAligned ? IMAGE_2K_HEIGHT : IMAGE_2K_HEIGHT - 1;
Packit Service 6754ca
    const int pWidth  = isAligned ? IMAGE_2K_WIDTH  : IMAGE_2K_WIDTH  - 1;
Packit Service 6754ca
Packit Service 6754ca
    remove(pRgbFilename);
Packit Service 6754ca
    remove(pRgbaFilename);
Packit Service 6754ca
Packit Service 6754ca
    writeFile (pRgbFilename,  pHeight, pWidth, IMAGE_TYPE_RGB,  isStereo, pCompression);
Packit Service 6754ca
    writeFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo, pCompression);
Packit Service 6754ca
Packit Service 6754ca
    cout << "\t\tRGB file to RGB framebuffer" << endl;
Packit Service 6754ca
    readValidateFile (pRgbFilename,  pHeight, pWidth, IMAGE_TYPE_RGB,  isStereo);
Packit Service 6754ca
    
Packit Service 6754ca
    
Packit Service 6754ca
    cout << "\t\tRGB file to RGB framebuffer" << endl;
Packit Service 6754ca
    readValidateFile (pRgbFilename,  pHeight, pWidth, IMAGE_TYPE_RGB,  isStereo);
Packit Service 6754ca
Packit Service 6754ca
    cout << "\t\tRGB file to RGBA framebuffer" << endl;
Packit Service 6754ca
    readValidateFile (pRgbFilename,  pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo);
Packit Service 6754ca
Packit Service 6754ca
    cout << "\t\tRGBA file to RGB framebuffer" << endl;
Packit Service 6754ca
    readValidateFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGB,  isStereo);
Packit Service 6754ca
Packit Service 6754ca
    cout << "\t\tRGBA file to RGBA framebuffer" << endl;
Packit Service 6754ca
    readValidateFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo);
Packit Service 6754ca
Packit Service 6754ca
    remove(pRgbFilename);
Packit Service 6754ca
    remove(pRgbaFilename);
Packit Service 6754ca
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // anonymous namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
testOptimized (const std::string & tempDir)
Packit Service 6754ca
{    
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        // Test all combinations
Packit Service 6754ca
        // Aligned file with no compression
Packit Service 6754ca
        // Unaligned file with no compression
Packit Service 6754ca
        // Aligned file with zip compression 
Packit Service 6754ca
        // Unaligned file with zip compression
Packit Service 6754ca
        //
Packit Service 6754ca
        // Other algorithms are not necessary because we are not testing
Packit Service 6754ca
        // compression but whetherthe optimized readPixels() code works
Packit Service 6754ca
        // with a compressed file.
Packit Service 6754ca
        // MONO
Packit Service 6754ca
        cout << "\nTesting optimized code path for rgb(a) images-- "
Packit Service 6754ca
                "2048x1152 (alignment respected) UNCOMPRESSED" << endl;
Packit Service 6754ca
Packit Service 6754ca
                         
Packit Service 6754ca
        cout << "\tNON-OPTIMIZABLE file" << endl;
Packit Service 6754ca
        testNonOptimized(tempDir);
Packit Service 6754ca
                
Packit Service 6754ca
        cout << "\tALIGNED -- MONO -- NO COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (true, false, NO_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tUNALIGNED -- MONO -- NO COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (false, false, NO_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tALIGNED -- MONO -- ZIP COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (true, false, ZIP_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tUNALIGNED -- MONO -- ZIP COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (false, false, ZIP_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
        //// STEREO
Packit Service 6754ca
        cout << "\tALIGNED -- STEREO -- NO COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (true, true, NO_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tUNALIGNED -- STEREO -- NO COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (false, true, NO_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tALIGNED -- STEREO -- ZIP COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (true, true, ZIP_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "\tUNALIGNED -- STEREO -- ZIP COMPRESSION" << endl;
Packit Service 6754ca
        testAllCombinations (false, true, ZIP_COMPRESSION, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        cout << "RGB(A) files validation complete \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
Packit Service 6754ca
}