///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas
// Digital Ltd. LLC
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Industrial Light & Magic nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#include <ImfAcesFile.h>
#include <ImfArray.h>
#include <ImfRgbaFile.h>
#include <IlmThread.h>
#include <stdio.h>
#include <assert.h>
#ifndef ILM_IMF_TEST_IMAGEDIR
#define ILM_IMF_TEST_IMAGEDIR
#endif
using namespace OPENEXR_IMF_NAMESPACE;
using namespace std;
using namespace IMATH_NAMESPACE;
namespace {
void
readImage (const char inFileName[])
{
Array2D<Rgba> p;
Header h;
RgbaChannels ch;
Box2i dw;
int width;
int height;
{
cout << "Reading file " << inFileName << endl;
AcesInputFile in (inFileName);
h = in.header();
ch = in.channels();
dw = h.dataWindow();
width = dw.max.x - dw.min.x + 1;
height = dw.max.y - dw.min.y + 1;
p.resizeErase (height, width);
in.setFrameBuffer (&p[0][0] - dw.min.x - dw.min.y * width, 1, width);
in.readPixels (dw.min.y, dw.max.y);
}
}
void
readBadBoundsImage (const char fileName[])
{
cout << "file " << fileName << " " << flush;
OPENEXR_IMF_NAMESPACE::RgbaInputFile in (fileName);
cout << "version " << in.version() << " " << flush;
const Box2i &dw = in.dataWindow();
}
} // namespace
void
testMalformedImages (const std::string&)
{
try
{
// id:000012,sig:11,src:000328+001154,op:splice,rep:16
readImage (ILM_IMF_TEST_IMAGEDIR "comp_short_decode_piz.exr");
cerr << "Malformed Images : InputFile : incorrect input file passed\n";
assert (false);
}
catch (const IEX_NAMESPACE::BaseExc &e)
{
// expected behaviour
}
try
{
// id:000077,sig:11,src:002575,op:havoc,rep:4
readImage (ILM_IMF_TEST_IMAGEDIR "comp_invalid_unknown.exr");
cerr << "Malformed Images : InputFile : incorrect input file passed\n";
assert (false);
}
catch (const IEX_NAMESPACE::IoExc &e)
{
// expected behaviour
}
try
{
// id:000103,sig:11,src:002037+004745,op:splice,rep:2
readImage (ILM_IMF_TEST_IMAGEDIR "comp_early_eof_piz.exr");
cerr << "Malformed Images : InputFile : incorrect input file passed\n";
assert (false);
}
catch (const IEX_NAMESPACE::InputExc &e)
{
// expected behaviour
}
// The files below expose a bug in the test code (readImage which uses the
// logic taken from exr2aces) that calculates an invalid pointer for the
// framebuffer. The dataWindow and displayWindow values used in these files
// seem valid based on a cursory reading of the OpenEXR specification. As
// such, the best we can do is ensure that parsing the basic header
// information doesn't cause any unexpected exceptions.
// id:000087,sig:11,src:000562+000300,op:splice,rep:2
readBadBoundsImage (ILM_IMF_TEST_IMAGEDIR "comp_bad_pos_bounds_piz.exr");
// id:000104,sig:11,src:001329+000334,op:splice,rep:2
readBadBoundsImage (ILM_IMF_TEST_IMAGEDIR "comp_bad_pos_bounds_pxr24.exr");
// id:000131,sig:11,src:000514+002831,op:splice,rep:16
readBadBoundsImage (ILM_IMF_TEST_IMAGEDIR "comp_bad_neg_bounds_pxr24.exr");
// id:000132,sig:11,src:000895,op:havoc,rep:32
readBadBoundsImage (ILM_IMF_TEST_IMAGEDIR "comp_bad_bounds_piz.exr");
}