Blame IlmImfTest/testStandardAttributes.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 <ImfRgbaFile.h>
Packit Service 6754ca
#include <ImfStandardAttributes.h>
Packit Service 6754ca
#include <ImfFramesPerSecond.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include "ImathRandom.h"
Packit Service 6754ca
#include <fstream>
Packit Service 6754ca
#include <iomanip>
Packit Service 6754ca
#include <stdio.h>
Packit Service 6754ca
#include <assert.h>
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
convertRGBtoXYZ ()
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "conversion from RGB to XYZ" << endl;
Packit Service 6754ca
Packit Service 6754ca
    Chromaticities c;
Packit Service 6754ca
    float Y = 100;
Packit Service 6754ca
    M44f M1 = RGBtoXYZ (c, Y);
Packit Service 6754ca
Packit Service 6754ca
    V3f R1 = V3f (1, 0, 0) * M1;
Packit Service 6754ca
    V3f G1 = V3f (0, 1, 0) * M1;
Packit Service 6754ca
    V3f B1 = V3f (0, 0, 1) * M1;
Packit Service 6754ca
    V3f W1 = V3f (1, 1, 1) * M1;
Packit Service 6754ca
Packit Service 6754ca
    cout << "red   XYZ = " << R1 << endl;
Packit Service 6754ca
    cout << "green XYZ = " << G1 << endl;
Packit Service 6754ca
    cout << "blue  XYZ = " << B1 << endl;
Packit Service 6754ca
    cout << "white XYZ = " << W1 << endl;
Packit Service 6754ca
Packit Service 6754ca
    V2f r1 (R1.x / (R1.x + R1.y + R1.z), R1.y / (R1.x + R1.y + R1.z));
Packit Service 6754ca
    V2f g1 (G1.x / (G1.x + G1.y + G1.z), G1.y / (G1.x + G1.y + G1.z));
Packit Service 6754ca
    V2f b1 (B1.x / (B1.x + B1.y + B1.z), B1.y / (B1.x + B1.y + B1.z));
Packit Service 6754ca
    V2f w1 (W1.x / (W1.x + W1.y + W1.z), W1.y / (W1.x + W1.y + W1.z));
Packit Service 6754ca
Packit Service 6754ca
    cout << "red   xy = " << r1 << endl;
Packit Service 6754ca
    cout << "green xy = " << g1 << endl;
Packit Service 6754ca
    cout << "blue  xy = " << b1 << endl;
Packit Service 6754ca
    cout << "white xy = " << w1 << endl;
Packit Service 6754ca
Packit Service 6754ca
    assert (equalWithRelError (W1.y, Y, 1e-5F));
Packit Service 6754ca
    assert (r1.equalWithAbsError (c.red, 1e-5F));
Packit Service 6754ca
    assert (g1.equalWithAbsError (c.green, 1e-5F));
Packit Service 6754ca
    assert (b1.equalWithAbsError (c.blue, 1e-5F));
Packit Service 6754ca
    assert (w1.equalWithAbsError (c.white, 1e-5F));
Packit Service 6754ca
Packit Service 6754ca
    cout << "conversion from XYZ to RGB" << endl;
Packit Service 6754ca
Packit Service 6754ca
    M44f M2 = XYZtoRGB (c, Y);
Packit Service 6754ca
Packit Service 6754ca
    V3f R2 = R1 * M2;
Packit Service 6754ca
    V3f G2 = G1 * M2;
Packit Service 6754ca
    V3f B2 = B1 * M2;
Packit Service 6754ca
    V3f W2 = W1 * M2;
Packit Service 6754ca
Packit Service 6754ca
    cout << "red   RGB = " << R2 << endl;
Packit Service 6754ca
    cout << "green RGB = " << G2 << endl;
Packit Service 6754ca
    cout << "blue  RGB = " << B2 << endl;
Packit Service 6754ca
    cout << "white RGB = " << W2 << endl;
Packit Service 6754ca
Packit Service 6754ca
    assert (R2.equalWithAbsError (V3f (1, 0, 0), 1e-3F));
Packit Service 6754ca
    assert (G2.equalWithAbsError (V3f (0, 1, 0), 1e-3F));
Packit Service 6754ca
    assert (B2.equalWithAbsError (V3f (0, 0, 1), 1e-3F));
Packit Service 6754ca
    assert (W2.equalWithAbsError (V3f (1, 1, 1), 1e-3F));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeReadChromaticities (const char fileName[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "chromaticities attribute" << endl;
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing, ";
Packit Service 6754ca
Packit Service 6754ca
    Chromaticities c1 (V2f (1, 2), V2f (3, 4), V2f (5, 6), V2f (7, 8));
Packit Service 6754ca
    static const int W = 100;
Packit Service 6754ca
    static const int H = 100;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    assert (hasChromaticities (header) == false);
Packit Service 6754ca
Packit Service 6754ca
    addChromaticities (header, c1);
Packit Service 6754ca
    assert (hasChromaticities (header) == true);
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName, header);
Packit Service 6754ca
	Rgba pixels[W];
Packit Service 6754ca
Packit Service 6754ca
	for (int i = 0; i < W; ++i)
Packit Service 6754ca
	{
Packit Service 6754ca
	    pixels[i].r = 1;
Packit Service 6754ca
	    pixels[i].g = 1;
Packit Service 6754ca
	    pixels[i].b = 1;
Packit Service 6754ca
	    pixels[i].a = 1;
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	out.setFrameBuffer (pixels, 1, 0);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading, comparing" << endl;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaInputFile in (fileName);
Packit Service 6754ca
	const Chromaticities &c2 = chromaticities (in.header());
Packit Service 6754ca
Packit Service 6754ca
	assert (hasChromaticities (in.header()) == true);
Packit Service 6754ca
	assert (c1.red == c2.red);
Packit Service 6754ca
	assert (c1.green == c2.green);
Packit Service 6754ca
	assert (c1.blue == c2.blue);
Packit Service 6754ca
	assert (c1.white == c2.white);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
latLongMap (const char fileName1[], const char fileName2[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "latitude-longitude environment map" << endl;
Packit Service 6754ca
    const int W = 360;
Packit Service 6754ca
    const int H = 180;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    addEnvmap (header, ENVMAP_LATLONG);
Packit Service 6754ca
Packit Service 6754ca
    V2f pos;
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (0, 1, 0));
Packit Service 6754ca
    assert (equalWithAbsError (pos.x, float (M_PI/2), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (0, -1, 0));
Packit Service 6754ca
    assert (equalWithAbsError (pos.x, float (-M_PI/2), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (0, 0, 1));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (0, 0), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (1, 0, 0));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (0, M_PI/2), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (-1, 0, 0));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (0, -M_PI/2), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (0, 1, 1));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (M_PI/4, 0), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::latLong (V3f (0, -1, 1));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (-M_PI/4, 0), 1e-6f));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::pixelPosition (header.dataWindow(), V2f (M_PI/2, M_PI));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (0, 0), 1e-6f * W));
Packit Service 6754ca
Packit Service 6754ca
    pos = LatLongMap::pixelPosition(header.dataWindow(), V2f (-M_PI/2, -M_PI));
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f (header.dataWindow().max), 1e-6f * W));
Packit Service 6754ca
Packit Service 6754ca
    Array2D<Rgba> pixels (H, W);
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
	    Rgba &p = pixels[y][x];
Packit Service 6754ca
	    V3f dir = LatLongMap::direction (header.dataWindow(), V2f (x, y));
Packit Service 6754ca
Packit Service 6754ca
	    p.r = dir.x + 1;
Packit Service 6754ca
	    p.g = dir.y + 1;
Packit Service 6754ca
	    p.b = dir.z + 1;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName1, header, WRITE_RGB);
Packit Service 6754ca
	out.setFrameBuffer (&pixels[0][0], 1, W);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    Rand48 rand (0);
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < W * H * 3; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
	V3f dir = hollowSphereRand<V3f> (rand);
Packit Service 6754ca
	V2f pos = LatLongMap::pixelPosition (header.dataWindow(), dir);
Packit Service 6754ca
Packit Service 6754ca
	Rgba &p = pixels[int (pos.y + 0.5)][int (pos.x + 0.5)];
Packit Service 6754ca
Packit Service 6754ca
	p.r = (dir.x + 1) * 0.8;
Packit Service 6754ca
	p.g = (dir.y + 1) * 0.8;
Packit Service 6754ca
	p.b = (dir.z + 1) * 0.8;
Packit Service 6754ca
Packit Service 6754ca
	V3f dir1 = LatLongMap::direction (header.dataWindow(), pos);
Packit Service 6754ca
	assert (dir.equalWithAbsError (dir1.normalized(), 1e-5f));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName2, header, WRITE_RGB);
Packit Service 6754ca
	out.setFrameBuffer (&pixels[0][0], 1, W);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName1);
Packit Service 6754ca
    remove (fileName2);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
cubeMap (const char fileName1[], const char fileName2[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "cube environment map" << endl;
Packit Service 6754ca
    const int N = 128;
Packit Service 6754ca
    const int W = N;
Packit Service 6754ca
    const int H = N * 6;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    addEnvmap (header, ENVMAP_CUBE);
Packit Service 6754ca
Packit Service 6754ca
    int sof = CubeMap::sizeOfFace (header.dataWindow());
Packit Service 6754ca
Packit Service 6754ca
    assert (sof == N);
Packit Service 6754ca
Packit Service 6754ca
    for (int face1 = 0; face1 < 6; ++face1)
Packit Service 6754ca
    {
Packit Service 6754ca
	Box2i dw1 = CubeMap::dataWindowForFace (CubeMapFace (face1),
Packit Service 6754ca
						header.dataWindow());
Packit Service 6754ca
Packit Service 6754ca
	assert (dw1.max.x - dw1.min.x == sof - 1);
Packit Service 6754ca
	assert (dw1.max.y - dw1.min.y == sof - 1);
Packit Service 6754ca
	assert (header.dataWindow().intersects (dw1.min));
Packit Service 6754ca
	assert (header.dataWindow().intersects (dw1.max));
Packit Service 6754ca
Packit Service 6754ca
	for (int face2 = face1 + 1; face2 < 6; ++face2)
Packit Service 6754ca
	{
Packit Service 6754ca
	    Box2i dw2 = CubeMap::dataWindowForFace (CubeMapFace (face2),
Packit Service 6754ca
						    header.dataWindow());
Packit Service 6754ca
	    assert (!dw1.intersects (dw2));
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    CubeMapFace face;
Packit Service 6754ca
    V2f pos;
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (1, 0, 0),
Packit Service 6754ca
				   header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_POS_X);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (-1, 0, 0),
Packit Service 6754ca
	                           header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_NEG_X);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (0, 1, 0),
Packit Service 6754ca
	    			   header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_POS_Y);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (0, -1, 0),
Packit Service 6754ca
	    			   header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_NEG_Y);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (0, 0, 1),
Packit Service 6754ca
	    			   header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_POS_Z);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    CubeMap::faceAndPixelPosition (V3f (0, 0, -1),
Packit Service 6754ca
	    			   header.dataWindow(),
Packit Service 6754ca
				   face, pos);
Packit Service 6754ca
    
Packit Service 6754ca
    assert (face == CUBEFACE_NEG_Z);
Packit Service 6754ca
    assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W));
Packit Service 6754ca
Packit Service 6754ca
    Array2D<Rgba> pixels (H, W);
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
	    Rgba &p = pixels[y][x];
Packit Service 6754ca
	    p.r = p.g = p.b = 0;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    for (int face = 0; face < 6; ++face)
Packit Service 6754ca
    {
Packit Service 6754ca
	for (int y = 0; y < sof; ++y)
Packit Service 6754ca
	{
Packit Service 6754ca
	    for (int x = 0; x < sof; ++x)
Packit Service 6754ca
	    {
Packit Service 6754ca
		V2f px = CubeMap::pixelPosition (CubeMapFace (face),
Packit Service 6754ca
						 header.dataWindow(),
Packit Service 6754ca
						 V2f (x, y));
Packit Service 6754ca
Packit Service 6754ca
		Rgba &p = pixels[int (px.y + 0.5)][int (px.x + 0.5)];
Packit Service 6754ca
Packit Service 6754ca
		V3f dir = CubeMap::direction (CubeMapFace (face),
Packit Service 6754ca
			                      header.dataWindow(),
Packit Service 6754ca
					      V2f (x, y));
Packit Service 6754ca
		dir.normalize();
Packit Service 6754ca
Packit Service 6754ca
		p.r = dir.x + 1;
Packit Service 6754ca
		p.g = dir.y + 1;
Packit Service 6754ca
		p.b = dir.z + 1;
Packit Service 6754ca
	    }
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName1, header, WRITE_RGB);
Packit Service 6754ca
	out.setFrameBuffer (&pixels[0][0], 1, W);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
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
	    Rgba &p = pixels[y][x];
Packit Service 6754ca
	    assert (p.r != 0 || p.g != 0 || p.b != 0);
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    Rand48 rand (0);
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < W * H * 3; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
	V3f dir = hollowSphereRand<V3f> (rand);
Packit Service 6754ca
Packit Service 6754ca
	CubeMapFace face;
Packit Service 6754ca
	V2f pif;
Packit Service 6754ca
Packit Service 6754ca
	CubeMap::faceAndPixelPosition (dir, header.dataWindow(), face, pif);
Packit Service 6754ca
Packit Service 6754ca
	V2f pos = CubeMap::pixelPosition (face, header.dataWindow(), pif);
Packit Service 6754ca
Packit Service 6754ca
	Rgba &p = pixels[int (pos.y + 0.5)][int (pos.x + 0.5)];
Packit Service 6754ca
Packit Service 6754ca
	p.r = (dir.x + 1) * 0.8;
Packit Service 6754ca
	p.g = (dir.y + 1) * 0.8;
Packit Service 6754ca
	p.b = (dir.z + 1) * 0.8;
Packit Service 6754ca
Packit Service 6754ca
	V3f dir1 = CubeMap::direction (face, header.dataWindow(), pif);
Packit Service 6754ca
	assert (dir.equalWithAbsError (dir1.normalized(), 1e-6f));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName2, header, WRITE_RGB);
Packit Service 6754ca
	out.setFrameBuffer (&pixels[0][0], 1, W);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName1);
Packit Service 6754ca
    remove (fileName2);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeReadKeyCode (const char fileName[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "key code attribute" << endl;
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing, ";
Packit Service 6754ca
Packit Service 6754ca
    KeyCode k1 (12,	// filmMfcCode
Packit Service 6754ca
	        34,	// filmType
Packit Service 6754ca
		123456,	// prefix
Packit Service 6754ca
		1234,	// count
Packit Service 6754ca
		45,	// perfOffset
Packit Service 6754ca
		3,	// perfsPerFrame
Packit Service 6754ca
		80);	// perfsPerCount
Packit Service 6754ca
Packit Service 6754ca
    assert (k1.filmMfcCode() == 12);
Packit Service 6754ca
    assert (k1.filmType() == 34);
Packit Service 6754ca
    assert (k1.prefix() == 123456);
Packit Service 6754ca
    assert (k1.count() == 1234);
Packit Service 6754ca
    assert (k1.perfOffset() == 45);
Packit Service 6754ca
    assert (k1.perfsPerFrame() == 3);
Packit Service 6754ca
    assert (k1.perfsPerCount() == 80);
Packit Service 6754ca
Packit Service 6754ca
    static const int W = 100;
Packit Service 6754ca
    static const int H = 100;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    assert (hasKeyCode (header) == false);
Packit Service 6754ca
Packit Service 6754ca
    addKeyCode (header, k1);
Packit Service 6754ca
    assert (hasKeyCode (header) == true);
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName, header);
Packit Service 6754ca
	Rgba pixels[W];
Packit Service 6754ca
Packit Service 6754ca
	for (int i = 0; i < W; ++i)
Packit Service 6754ca
	{
Packit Service 6754ca
	    pixels[i].r = 1;
Packit Service 6754ca
	    pixels[i].g = 1;
Packit Service 6754ca
	    pixels[i].b = 1;
Packit Service 6754ca
	    pixels[i].a = 1;
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	out.setFrameBuffer (pixels, 1, 0);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading, comparing" << endl;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaInputFile in (fileName);
Packit Service 6754ca
	const KeyCode &k2 = keyCode (in.header());
Packit Service 6754ca
Packit Service 6754ca
	assert (hasKeyCode (in.header()) == true);
Packit Service 6754ca
	assert (k1.filmMfcCode() == k2.filmMfcCode());
Packit Service 6754ca
	assert (k1.filmType() == k2.filmType());
Packit Service 6754ca
	assert (k1.prefix() == k2.prefix());
Packit Service 6754ca
	assert (k1.count() == k2.count());
Packit Service 6754ca
	assert (k1.perfOffset() == k2.perfOffset());
Packit Service 6754ca
	assert (k1.perfsPerFrame() == k2.perfsPerFrame());
Packit Service 6754ca
	assert (k1.perfsPerCount() == k2.perfsPerCount());
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
timeCodeMethods ()
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "time code methods" << endl;
Packit Service 6754ca
Packit Service 6754ca
    TimeCode t;
Packit Service 6754ca
Packit Service 6754ca
    assert (t.timeAndFlags() == 0);
Packit Service 6754ca
    assert (t.userData() == 0);
Packit Service 6754ca
Packit Service 6754ca
    // Frames
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setFrame (29);
Packit Service 6754ca
    assert (t.frame() == 29);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x00000029);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setFrame (0);
Packit Service 6754ca
    assert (t.frame() == 0);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xffffffc0);
Packit Service 6754ca
Packit Service 6754ca
    // Seconds
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setSeconds (59);
Packit Service 6754ca
    assert (t.seconds() == 59);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x00005900);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setSeconds (0);
Packit Service 6754ca
    assert (t.seconds() == 0);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xffff80ff);
Packit Service 6754ca
Packit Service 6754ca
    // Minutes
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setMinutes (59);
Packit Service 6754ca
    assert (t.minutes() == 59);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x00590000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setMinutes (0);
Packit Service 6754ca
    assert (t.minutes() == 0);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xff80ffff);
Packit Service 6754ca
Packit Service 6754ca
    // Hours
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setHours (23);
Packit Service 6754ca
    assert (t.hours() == 23);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x23000000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setHours (0);
Packit Service 6754ca
    assert (t.hours() == 0);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xc0ffffff);
Packit Service 6754ca
Packit Service 6754ca
    // Drop frame flag
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setDropFrame (true);
Packit Service 6754ca
    assert (t.dropFrame() == true);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x00000040);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setDropFrame (false);
Packit Service 6754ca
    assert (t.dropFrame() == false);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xffffffbf);
Packit Service 6754ca
Packit Service 6754ca
    // Color frame flag
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setColorFrame (true);
Packit Service 6754ca
    assert (t.colorFrame() == true);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x00000080);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setColorFrame (false);
Packit Service 6754ca
    assert (t.colorFrame() == false);
Packit Service 6754ca
    assert (t.timeAndFlags() == 0xffffff7f);
Packit Service 6754ca
Packit Service 6754ca
    // Field/phase flag
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setFieldPhase (true);
Packit Service 6754ca
    assert (t.fieldPhase() == true);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0x00008000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0x80000000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x00008000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setFieldPhase (false);
Packit Service 6754ca
    assert (t.fieldPhase() == false);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0xffff7fff);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0x7fffffbf);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xffff7f3f);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::TV60_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00008000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::TV50_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00008000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::FILM24_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00008000));
Packit Service 6754ca
Packit Service 6754ca
    // bgf0
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setBgf0 (true);
Packit Service 6754ca
    assert (t.bgf0() == true);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0x00800000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0x00008000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x00800000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setBgf0 (false);
Packit Service 6754ca
    assert (t.bgf0() == false);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0xff7fffff);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0xffff7fbf);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xff7fff3f);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::TV60_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00800000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::TV50_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00800000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::FILM24_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x00800000));
Packit Service 6754ca
Packit Service 6754ca
    // bgf1
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setBgf1 (true);
Packit Service 6754ca
    assert (t.bgf1() == true);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0x40000000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0x40000000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x40000000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setBgf1 (false);
Packit Service 6754ca
    assert (t.bgf1() == false);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0xbfffffff);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0xbfffffbf);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xbfffff3f);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::TV60_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x40000000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::TV50_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x40000000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::FILM24_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x40000000));
Packit Service 6754ca
Packit Service 6754ca
    // bgf2
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x00000000);
Packit Service 6754ca
    t.setBgf2 (true);
Packit Service 6754ca
    assert (t.bgf2() == true);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0x80000000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0x00800000);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x80000000);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0xffffffff);
Packit Service 6754ca
    t.setBgf2 (false);
Packit Service 6754ca
    assert (t.bgf2() == false);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV60_PACKING)   == 0x7fffffff);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::TV50_PACKING)   == 0xff7fffbf);
Packit Service 6754ca
    assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x7fffff3f);
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::TV60_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x80000000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::TV50_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x80000000));
Packit Service 6754ca
Packit Service 6754ca
    t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::FILM24_PACKING);
Packit Service 6754ca
    assert (t.timeAndFlags() == (0x23595929 | 0x80000000));
Packit Service 6754ca
Packit Service 6754ca
    // User-defined data
Packit Service 6754ca
    
Packit Service 6754ca
    t.setUserData (0x87654321);
Packit Service 6754ca
    assert (t.userData() == 0x87654321);
Packit Service 6754ca
Packit Service 6754ca
    assert (t.binaryGroup (1) == 1);
Packit Service 6754ca
    assert (t.binaryGroup (2) == 2);
Packit Service 6754ca
    assert (t.binaryGroup (3) == 3);
Packit Service 6754ca
    assert (t.binaryGroup (4) == 4);
Packit Service 6754ca
    assert (t.binaryGroup (5) == 5);
Packit Service 6754ca
    assert (t.binaryGroup (6) == 6);
Packit Service 6754ca
    assert (t.binaryGroup (7) == 7);
Packit Service 6754ca
Packit Service 6754ca
    t.setBinaryGroup (1, 2);
Packit Service 6754ca
    t.setBinaryGroup (2, 3);
Packit Service 6754ca
    t.setBinaryGroup (3, 4);
Packit Service 6754ca
    t.setBinaryGroup (4, 5);
Packit Service 6754ca
    t.setBinaryGroup (5, 6);
Packit Service 6754ca
    t.setBinaryGroup (6, 7);
Packit Service 6754ca
    t.setBinaryGroup (7, 8);
Packit Service 6754ca
    t.setBinaryGroup (8, 9);
Packit Service 6754ca
Packit Service 6754ca
    assert (t.userData() == 0x98765432);
Packit Service 6754ca
    
Packit Service 6754ca
    // Assignment
Packit Service 6754ca
Packit Service 6754ca
    TimeCode t1 (12, 17, 57, 14,	   // hours, minutes, seconds, frame
Packit Service 6754ca
		 false, false, false,	   // dropFrame, colorFrame, fieldPhase
Packit Service 6754ca
		 false, false, false,	   // bgf0, bgf1, bgf2
Packit Service 6754ca
		 1, 2, 3, 4, 5, 6, 7, 8);  // binary groups 1 to 8
Packit Service 6754ca
    t = t1;
Packit Service 6754ca
Packit Service 6754ca
    assert (t.timeAndFlags() == 0x12175714);
Packit Service 6754ca
    assert (t.userData() == 0x87654321);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeReadTimeCode (const char fileName[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "time code attribute" << endl;
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing, ";
Packit Service 6754ca
Packit Service 6754ca
    TimeCode t1 (0x23595829, 0x12345678, TimeCode::FILM24_PACKING);
Packit Service 6754ca
Packit Service 6754ca
    assert (t1.timeAndFlags (TimeCode::FILM24_PACKING) == 0x23595829);
Packit Service 6754ca
    assert (t1.userData() == 0x12345678);
Packit Service 6754ca
Packit Service 6754ca
    static const int W = 100;
Packit Service 6754ca
    static const int H = 100;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    assert (hasTimeCode (header) == false);
Packit Service 6754ca
Packit Service 6754ca
    addTimeCode (header, t1);
Packit Service 6754ca
    assert (hasTimeCode (header) == true);
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName, header);
Packit Service 6754ca
	Rgba pixels[W];
Packit Service 6754ca
Packit Service 6754ca
	for (int i = 0; i < W; ++i)
Packit Service 6754ca
	{
Packit Service 6754ca
	    pixels[i].r = 1;
Packit Service 6754ca
	    pixels[i].g = 1;
Packit Service 6754ca
	    pixels[i].b = 1;
Packit Service 6754ca
	    pixels[i].a = 1;
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	out.setFrameBuffer (pixels, 1, 0);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading, comparing" << endl;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaInputFile in (fileName);
Packit Service 6754ca
	const TimeCode &t2 = timeCode (in.header());
Packit Service 6754ca
Packit Service 6754ca
	assert (hasTimeCode (in.header()) == true);
Packit Service 6754ca
	assert (t1.timeAndFlags() == t2.timeAndFlags());
Packit Service 6754ca
	assert (t1.userData() == t2.userData());
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
equal (const Rational &a, const Rational &b)
Packit Service 6754ca
{
Packit Service 6754ca
    return a.n == b.n && a.d == b.d;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
rationalMethods ()
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "rational methods" << endl;
Packit Service 6754ca
Packit Service 6754ca
    Rational r0 (0, 1);
Packit Service 6754ca
    assert (r0 == 0);
Packit Service 6754ca
Packit Service 6754ca
    Rational r1 (1, 1);
Packit Service 6754ca
    assert (r1 == 1);
Packit Service 6754ca
Packit Service 6754ca
    Rational r2 (1, 4);
Packit Service 6754ca
    assert (r2 == 0.25);
Packit Service 6754ca
Packit Service 6754ca
    Rational r3 (-8, 2);
Packit Service 6754ca
    assert (r3 == -4);
Packit Service 6754ca
Packit Service 6754ca
    Rational r4 (0.0);
Packit Service 6754ca
    assert (r4 == 0);
Packit Service 6754ca
Packit Service 6754ca
    Rational r5 (1e-50);
Packit Service 6754ca
    assert (r5 == 0);
Packit Service 6754ca
Packit Service 6754ca
    Rational r6 (1.0);
Packit Service 6754ca
    assert (r6 == 1.0 && r6.n == 1 && r6.d == 1);
Packit Service 6754ca
Packit Service 6754ca
    Rational r7 (-10.0);
Packit Service 6754ca
    assert (r7 == -10.0 && r7.n == -10 && r7.d == 1);
Packit Service 6754ca
Packit Service 6754ca
    Rational r8 (0.03125);
Packit Service 6754ca
    assert (r8 == 0.03125 && r8.n == 1 && r8.d == 32);
Packit Service 6754ca
Packit Service 6754ca
    Rational r9 (0.53125);
Packit Service 6754ca
    assert (r9 == 0.53125 && r9.n == 17 && r9.d == 32);
Packit Service 6754ca
Packit Service 6754ca
    Rational r10 (10.1);
Packit Service 6754ca
    assert (equalWithAbsError (double (r10), 10.1, 1e-8));
Packit Service 6754ca
Packit Service 6754ca
    Rational r11 (double ((1U << 30) - 1));
Packit Service 6754ca
    assert (r11 == double ((1U << 30) - 1));
Packit Service 6754ca
Packit Service 6754ca
    assert (equal (guessExactFps (23.976), fps_23_976()));
Packit Service 6754ca
    assert (equal (guessExactFps (24.000), fps_24()));
Packit Service 6754ca
    assert (equal (guessExactFps (25.000), fps_25()));
Packit Service 6754ca
    assert (equal (guessExactFps (29.970), fps_29_97()));
Packit Service 6754ca
    assert (equal (guessExactFps (30.000), fps_30()));
Packit Service 6754ca
    assert (equal (guessExactFps (47.952), fps_47_952()));
Packit Service 6754ca
    assert (equal (guessExactFps (48.000), fps_48()));
Packit Service 6754ca
    assert (equal (guessExactFps (50.000), fps_50()));
Packit Service 6754ca
    assert (equal (guessExactFps (59.940), fps_59_94()));
Packit Service 6754ca
    assert (equal (guessExactFps (60.000), fps_60()));
Packit Service 6754ca
    assert (equal (guessExactFps (70.500), Rational (141, 2)));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
writeReadRational (const char fileName[])
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "rational attribute" << endl;
Packit Service 6754ca
Packit Service 6754ca
    cout << "writing, ";
Packit Service 6754ca
Packit Service 6754ca
    Rational r1 (12, 17);
Packit Service 6754ca
    Rational r2 (-12, 3);
Packit Service 6754ca
Packit Service 6754ca
    static const int W = 100;
Packit Service 6754ca
    static const int H = 100;
Packit Service 6754ca
Packit Service 6754ca
    Header header (W, H);
Packit Service 6754ca
    header.insert ("r1", RationalAttribute (r1));
Packit Service 6754ca
    header.insert ("r2", RationalAttribute (r2));
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaOutputFile out (fileName, header);
Packit Service 6754ca
	Rgba pixels[W];
Packit Service 6754ca
Packit Service 6754ca
	for (int i = 0; i < W; ++i)
Packit Service 6754ca
	{
Packit Service 6754ca
	    pixels[i].r = 1;
Packit Service 6754ca
	    pixels[i].g = 1;
Packit Service 6754ca
	    pixels[i].b = 1;
Packit Service 6754ca
	    pixels[i].a = 1;
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	out.setFrameBuffer (pixels, 1, 0);
Packit Service 6754ca
	out.writePixels (H);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "reading, comparing" << endl;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
	RgbaInputFile in (fileName);
Packit Service 6754ca
Packit Service 6754ca
	const Rational &r3 =
Packit Service 6754ca
	    in.header().typedAttribute<RationalAttribute>("r1").value();
Packit Service 6754ca
Packit Service 6754ca
	const Rational &r4 =
Packit Service 6754ca
	    in.header().typedAttribute<RationalAttribute>("r2").value();
Packit Service 6754ca
Packit Service 6754ca
	assert (equal (r1, r3));
Packit Service 6754ca
	assert (equal (r2, r4));
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    remove (fileName);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
generatedFunctions ()
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Most optional standard attributes are of type string, float,
Packit Service 6754ca
    // etc.  The attribute types are already being tested elsewhere
Packit Service 6754ca
    // (testAttributes.C), and the convenience functions to access
Packit Service 6754ca
    // the standard attributes are all generated via macros.  Here
Packit Service 6754ca
    // we just verify that all the convenience functions exist
Packit Service 6754ca
    // (that is, ImfStandardAttributes.C and ImfStandardAttributes.h
Packit Service 6754ca
    // contain the right macro invocations).  If any functions are
Packit Service 6754ca
    // missing, we should get an error during compiling or linking.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    cout << "automatically generated functions" << endl;
Packit Service 6754ca
Packit Service 6754ca
    Header header;
Packit Service 6754ca
Packit Service 6754ca
    assert (hasChromaticities (header) == false);
Packit Service 6754ca
    assert (hasWhiteLuminance (header) == false);
Packit Service 6754ca
    assert (hasAdoptedNeutral (header) == false);
Packit Service 6754ca
    assert (hasRenderingTransform (header) == false);
Packit Service 6754ca
    assert (hasLookModTransform (header) == false);
Packit Service 6754ca
    assert (hasXDensity (header) == false);
Packit Service 6754ca
    assert (hasOwner (header) == false);
Packit Service 6754ca
    assert (hasComments (header) == false);
Packit Service 6754ca
    assert (hasCapDate (header) == false);
Packit Service 6754ca
    assert (hasUtcOffset (header) == false);
Packit Service 6754ca
    assert (hasLongitude (header) == false);
Packit Service 6754ca
    assert (hasLatitude (header) == false);
Packit Service 6754ca
    assert (hasAltitude (header) == false);
Packit Service 6754ca
    assert (hasFocus (header) == false);
Packit Service 6754ca
    assert (hasExpTime (header) == false);
Packit Service 6754ca
    assert (hasAperture (header) == false);
Packit Service 6754ca
    assert (hasIsoSpeed (header) == false);
Packit Service 6754ca
    assert (hasEnvmap (header) == false);
Packit Service 6754ca
    assert (hasKeyCode (header) == false);
Packit Service 6754ca
    assert (hasTimeCode (header) == false);
Packit Service 6754ca
    assert (hasWrapmodes (header) == false);
Packit Service 6754ca
    assert (hasFramesPerSecond (header) == false);
Packit Service 6754ca
    assert (hasMultiView (header) == false);
Packit Service 6754ca
    assert (hasWorldToCamera (header) == false);
Packit Service 6754ca
    assert (hasWorldToNDC (header) == false);
Packit Service 6754ca
    assert (hasDeepImageState (header) == false);
Packit Service 6754ca
    assert (hasOriginalDataWindow (header) == false);
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
testStandardAttributes (const std::string &tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
	cout << "Testing optional standard attributes" << endl;
Packit Service 6754ca
Packit Service 6754ca
	convertRGBtoXYZ();
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    std::string filename = tempDir + "imf_test_chromaticities.exr";
Packit Service 6754ca
	    writeReadChromaticities (filename.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    std::string fn1 = tempDir + "imf_test_latlong1.exr";
Packit Service 6754ca
	    std::string fn2 = tempDir + "imf_test_latlong2.exr";
Packit Service 6754ca
	    latLongMap (fn1.c_str(), fn2.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    std::string fn1 = tempDir + "imf_test_cube1.exr";
Packit Service 6754ca
	    std::string fn2 = tempDir + "imf_test_cube2.exr";
Packit Service 6754ca
	    cubeMap (fn1.c_str(), fn2.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    std::string filename = tempDir + "imf_test_keycode.exr";
Packit Service 6754ca
	    writeReadKeyCode (filename.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    timeCodeMethods();
Packit Service 6754ca
	    std::string filename = tempDir + "imf_test_timecode.exr";
Packit Service 6754ca
	    writeReadTimeCode (filename.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	{
Packit Service 6754ca
	    rationalMethods();
Packit Service 6754ca
	    std::string filename = tempDir + "imf_test_rational.exr";
Packit Service 6754ca
	    writeReadRational (filename.c_str());
Packit Service 6754ca
	}
Packit Service 6754ca
Packit Service 6754ca
	generatedFunctions();
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
}