Disabled external gits
This commit is contained in:
		
							
								
								
									
										16
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
config.h.in
 | 
			
		||||
config.h
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
configure
 | 
			
		||||
libtool
 | 
			
		||||
stamp-h
 | 
			
		||||
aclocal.m4
 | 
			
		||||
OpenEXR.pc
 | 
			
		||||
autom4te.cache
 | 
			
		||||
ltmain.sh
 | 
			
		||||
stamp-h.in
 | 
			
		||||
depcomp
 | 
			
		||||
.deps
 | 
			
		||||
							
								
								
									
										23
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# yue.nicholas@gmail.com
 | 
			
		||||
 | 
			
		||||
ADD_EXECUTABLE ( IlmImfExamples
 | 
			
		||||
  drawImage.cpp
 | 
			
		||||
  generalInterfaceExamples.cpp
 | 
			
		||||
  generalInterfaceTiledExamples.cpp
 | 
			
		||||
  lowLevelIoExamples.cpp
 | 
			
		||||
  main.cpp
 | 
			
		||||
  previewImageExamples.cpp
 | 
			
		||||
  rgbaInterfaceExamples.cpp
 | 
			
		||||
  rgbaInterfaceTiledExamples.cpp
 | 
			
		||||
 )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TARGET_LINK_LIBRARIES ( IlmImfExamples 
 | 
			
		||||
        IlmImf
 | 
			
		||||
        Half 
 | 
			
		||||
        Iex${ILMBASE_LIBSUFFIX}
 | 
			
		||||
        Imath${ILMBASE_LIBSUFFIX}
 | 
			
		||||
        IlmThread${ILMBASE_LIBSUFFIX}
 | 
			
		||||
        ${PTHREAD_LIB} ${ZLIB_LIBRARIES}
 | 
			
		||||
        )
 | 
			
		||||
  
 | 
			
		||||
							
								
								
									
										32
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
## Process this file with automake to produce Makefile.in
 | 
			
		||||
 | 
			
		||||
if BUILD_IMFEXAMPLES
 | 
			
		||||
noinst_PROGRAMS = imfexamples
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(top_builddir) \
 | 
			
		||||
           -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \
 | 
			
		||||
	   @ILMBASE_CXXFLAGS@
 | 
			
		||||
 | 
			
		||||
LDADD = -L$(top_builddir)/IlmImf \
 | 
			
		||||
	@ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \
 | 
			
		||||
	-lIlmImf -lz
 | 
			
		||||
 | 
			
		||||
imfexamples_SOURCES = main.cpp drawImage.cpp rgbaInterfaceExamples.cpp \
 | 
			
		||||
		      rgbaInterfaceTiledExamples.cpp \
 | 
			
		||||
		      generalInterfaceExamples.cpp \
 | 
			
		||||
		      lowLevelIoExamples.cpp previewImageExamples.cpp \
 | 
			
		||||
		      generalInterfaceTiledExamples.cpp \
 | 
			
		||||
		      generalInterfaceTiledExamples.h drawImage.h \
 | 
			
		||||
		      rgbaInterfaceExamples.h generalInterfaceExamples.h \
 | 
			
		||||
		      rgbaInterfaceTiledExamples.h \
 | 
			
		||||
		      lowLevelIoExamples.h previewImageExamples.h \
 | 
			
		||||
		      namespaceAlias.h
 | 
			
		||||
 | 
			
		||||
examplesdir = $(datadir)/doc/OpenEXR-@OPENEXR_VERSION@/examples
 | 
			
		||||
examples_DATA = $(imfexamples_SOURCES)
 | 
			
		||||
 | 
			
		||||
imfexamplesdir = $(examplesdir)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = CMakeLists.txt
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										475
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/drawImage.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										475
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/drawImage.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,475 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Functions that algorithmically generate images, so that
 | 
			
		||||
//	the code examples for image file reading and writing have
 | 
			
		||||
//	data they can work with.
 | 
			
		||||
//	Note that it is not necessary to study the code below in
 | 
			
		||||
//	order to understand how the file I/O code examples work.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <float.h>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
pw (float x, int y)
 | 
			
		||||
{
 | 
			
		||||
    float p = 1;
 | 
			
		||||
 | 
			
		||||
    while (y)
 | 
			
		||||
    {
 | 
			
		||||
	if (y & 1)
 | 
			
		||||
	    p *= x;
 | 
			
		||||
 | 
			
		||||
	x *= x;
 | 
			
		||||
	y >>= 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
sp (Array2D<Rgba> &px, int w, int h,
 | 
			
		||||
    float xc, float yc, float rc,
 | 
			
		||||
    float rd, float gn, float bl, float lm)
 | 
			
		||||
{
 | 
			
		||||
    int x1 = int (max ((float) floor (xc - rc),  0.0f));
 | 
			
		||||
    int x2 = int (min ((float) ceil  (xc + rc), w - 1.0f));
 | 
			
		||||
    int y1 = int (max ((float) floor (yc - rc),  0.0f));
 | 
			
		||||
    int y2 = int (min ((float) ceil  (yc + rc), h - 1.0f));
 | 
			
		||||
 | 
			
		||||
    for (int y = y1; y <= y2; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	for (int x = x1; x <= x2; ++x)
 | 
			
		||||
	{
 | 
			
		||||
	    float xl = (x - xc) / rc;
 | 
			
		||||
	    float yl = (y - yc) / rc;
 | 
			
		||||
	    float r  = sqrt (xl * xl + yl * yl);
 | 
			
		||||
 | 
			
		||||
	    if (r >= 1)
 | 
			
		||||
		continue;
 | 
			
		||||
 | 
			
		||||
	    float a = 1;
 | 
			
		||||
 | 
			
		||||
	    if (r * rc > rc - 1)
 | 
			
		||||
		a = rc - r * rc;
 | 
			
		||||
 | 
			
		||||
	    float zl = sqrt (1 - r * r);
 | 
			
		||||
	    float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710;
 | 
			
		||||
 | 
			
		||||
	    if (dl < 0)
 | 
			
		||||
		dl *= -0.1;
 | 
			
		||||
 | 
			
		||||
	    float hl = pw (dl, 50) * 4;
 | 
			
		||||
	    float dr = (dl + hl) * rd;
 | 
			
		||||
	    float dg = (dl + hl) * gn;
 | 
			
		||||
	    float db = (dl + hl) * bl;
 | 
			
		||||
 | 
			
		||||
	    Rgba &p = px[y][x];
 | 
			
		||||
	    p.r = p.r * (1 - a) + dr * lm * a;
 | 
			
		||||
	    p.g = p.g * (1 - a) + dg * lm * a;
 | 
			
		||||
	    p.b = p.b * (1 - a) + db * lm * a;
 | 
			
		||||
	    p.a = 1 - (1 - p.a) * (1 - a);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
zsp (Array2D<half> &gpx, Array2D<float> &zpx, int w, int h,
 | 
			
		||||
     float xc, float yc, float zc, float rc, float gn)
 | 
			
		||||
{
 | 
			
		||||
    int x1 = int (max ((float) floor (xc - rc),  0.0f));
 | 
			
		||||
    int x2 = int (min ((float) ceil  (xc + rc), w - 1.0f));
 | 
			
		||||
    int y1 = int (max ((float) floor (yc - rc),  0.0f));
 | 
			
		||||
    int y2 = int (min ((float) ceil  (yc + rc), h - 1.0f));
 | 
			
		||||
 | 
			
		||||
    for (int x = x1; x <= x2; ++x)
 | 
			
		||||
    {
 | 
			
		||||
	for (int y = y1; y <= y2; ++y)
 | 
			
		||||
	{
 | 
			
		||||
	    float xl = (x - xc) / rc;
 | 
			
		||||
	    float yl = (y - yc) / rc;
 | 
			
		||||
	    float r  = sqrt (xl * xl + yl * yl);
 | 
			
		||||
 | 
			
		||||
	    if (r >= 1)
 | 
			
		||||
		continue;
 | 
			
		||||
 | 
			
		||||
	    float a = 1;
 | 
			
		||||
 | 
			
		||||
	    if (r * rc > rc - 1)
 | 
			
		||||
		a = rc - r * rc;
 | 
			
		||||
 | 
			
		||||
	    float zl = sqrt (1 - r * r);
 | 
			
		||||
	    float zp = zc - rc * zl;
 | 
			
		||||
 | 
			
		||||
	    if (zp >= zpx[y][x])
 | 
			
		||||
		continue;
 | 
			
		||||
 | 
			
		||||
	    float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710;
 | 
			
		||||
 | 
			
		||||
	    if (dl < 0)
 | 
			
		||||
		dl *= -0.1;
 | 
			
		||||
 | 
			
		||||
	    float hl = pw (dl, 50) * 4;
 | 
			
		||||
	    float dg = (dl + hl) * gn;
 | 
			
		||||
 | 
			
		||||
	    gpx[y][x] = dg;
 | 
			
		||||
	    zpx[y][x] = zp;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline float
 | 
			
		||||
z (float k)
 | 
			
		||||
{
 | 
			
		||||
    k = 2 * (k - int (k));
 | 
			
		||||
    return (k < 1)? k: 2 - k;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
clear (Rgba &color)
 | 
			
		||||
{
 | 
			
		||||
    color.r = 0;
 | 
			
		||||
    color.g = 0;
 | 
			
		||||
    color.b = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
clear (GZ &gz)
 | 
			
		||||
{
 | 
			
		||||
    gz.g = 0;
 | 
			
		||||
    gz.z = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
add (float k, Rgba &color)
 | 
			
		||||
{
 | 
			
		||||
    color.a = k;
 | 
			
		||||
    k *= 4;
 | 
			
		||||
    color.r += 0.1f + 4 * z (k);
 | 
			
		||||
    color.g += 0.1f + 4 * z (k + .33333f);
 | 
			
		||||
    color.b += 0.1f + 4 * z (k + .66667f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
add (float k, GZ &gz)
 | 
			
		||||
{
 | 
			
		||||
    k *= 5;
 | 
			
		||||
    gz.g += 4 * z (k);
 | 
			
		||||
    gz.z = k;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
scale (float f, Rgba &color)
 | 
			
		||||
{
 | 
			
		||||
    color.r *= f;
 | 
			
		||||
    color.g *= f;
 | 
			
		||||
    color.b *= f;
 | 
			
		||||
    color.a *= f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
scale (float f, GZ &gz)
 | 
			
		||||
{
 | 
			
		||||
    gz.g *= f;
 | 
			
		||||
    gz.z *= f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <class P>
 | 
			
		||||
void
 | 
			
		||||
mndl (Array2D <P> &px,
 | 
			
		||||
      int w, int h,
 | 
			
		||||
      int xMin, int xMax,
 | 
			
		||||
      int yMin, int yMax,
 | 
			
		||||
      int xSamples, int ySamples,
 | 
			
		||||
      double rMin,
 | 
			
		||||
      double rMax,
 | 
			
		||||
      double iMin,
 | 
			
		||||
      double aspect,
 | 
			
		||||
      double rSeed,
 | 
			
		||||
      double iSeed)
 | 
			
		||||
{
 | 
			
		||||
    if (xSamples > 6)
 | 
			
		||||
	xSamples = 6;
 | 
			
		||||
 | 
			
		||||
    if (ySamples > 6)
 | 
			
		||||
	ySamples = 6;
 | 
			
		||||
 | 
			
		||||
    double iMax = iMin + aspect * (rMax - rMin) * h / w;
 | 
			
		||||
    double sx = double (rMax - rMin) / w;
 | 
			
		||||
    double sy = double (iMax - iMin) / h;
 | 
			
		||||
    double tx = 1.f / xSamples;
 | 
			
		||||
    double ty = 1.f / ySamples;
 | 
			
		||||
    float  t  = tx * ty;
 | 
			
		||||
 | 
			
		||||
    for (int y = yMin; y < yMax; ++y)
 | 
			
		||||
    {
 | 
			
		||||
        for (int x = xMin; x < xMax; ++x)
 | 
			
		||||
        {
 | 
			
		||||
            P &p = px[y - yMin][x - xMin];
 | 
			
		||||
 | 
			
		||||
	    clear (p);
 | 
			
		||||
 | 
			
		||||
	    for (int i = 0; i < xSamples; ++i)
 | 
			
		||||
            {
 | 
			
		||||
		for (int j = 0; j < ySamples; ++j)
 | 
			
		||||
                {
 | 
			
		||||
                    const double a = rMin + sx * (x + i * tx);
 | 
			
		||||
		    const double b = iMin + sy * (y + j * ty);
 | 
			
		||||
		    const double sMax = 100;
 | 
			
		||||
		    const int kMax = 256;
 | 
			
		||||
                    double r = rSeed;
 | 
			
		||||
		    double i = iSeed;
 | 
			
		||||
		    double s = 0;
 | 
			
		||||
                    int k = 0;
 | 
			
		||||
 | 
			
		||||
                    while (k < kMax && s < sMax)
 | 
			
		||||
                    {
 | 
			
		||||
                        s = r * r - i * i;
 | 
			
		||||
                        i = 2 * r * i + b;
 | 
			
		||||
                        r = s + a;
 | 
			
		||||
                        k++;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
		    add (k / float (kMax), p);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
	    scale (t, p);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage1 (Array2D<Rgba> &px, int w, int h)
 | 
			
		||||
{
 | 
			
		||||
    for (int y = 0; y < h; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	for (int x = 0; x < w; ++x)
 | 
			
		||||
	{
 | 
			
		||||
	    Rgba &p = px[y][x];
 | 
			
		||||
	    p.r = 0;
 | 
			
		||||
	    p.g = 0;
 | 
			
		||||
	    p.b = 0;
 | 
			
		||||
	    p.a = 0;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int n = 5600;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < n; ++i)
 | 
			
		||||
    {
 | 
			
		||||
	float t = (i * 2.0 * M_PI) / n;
 | 
			
		||||
	float xp = sin (t * 2.0) + 0.2 * sin (t * 15.0);
 | 
			
		||||
	float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0);
 | 
			
		||||
	float r = float (i + 1) / float (n);
 | 
			
		||||
	float xq = xp + 0.3 * r * sin (t * 80.0);
 | 
			
		||||
	float yq = yp + 0.3 * r * cos (t * 80.0);
 | 
			
		||||
	float xr = xp + 0.3 * r * sin (t * 80.0 + M_PI / 2);
 | 
			
		||||
	float yr = yp + 0.3 * r * cos (t * 80.0 + M_PI / 2);
 | 
			
		||||
 | 
			
		||||
	if (i % 10 == 0)
 | 
			
		||||
	    sp (px, w, h,
 | 
			
		||||
		xp * w / 3 + w / 2, yp * h / 3 + h / 2,
 | 
			
		||||
		w * 0.05 * r,
 | 
			
		||||
		2.0, 0.8, 0.1,
 | 
			
		||||
		0.5 * r * r);
 | 
			
		||||
 | 
			
		||||
	sp (px, w, h,
 | 
			
		||||
	    xq * w / 3 + w / 2, yq * h / 3 + h / 2,
 | 
			
		||||
	    w * 0.01 * r,
 | 
			
		||||
	    0.7, 0.2, 2.0,
 | 
			
		||||
	    0.5 * r * r);
 | 
			
		||||
 | 
			
		||||
	sp (px, w, h,
 | 
			
		||||
	    xr * w / 3 + w / 2, yr * h / 3 + h / 2,
 | 
			
		||||
	    w * 0.01 * r,
 | 
			
		||||
	    0.2, 1.5, 0.1,
 | 
			
		||||
	    0.5 * r * r);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage2 (Array2D<half> &gpx, Array2D<float> &zpx, int w, int h)
 | 
			
		||||
{
 | 
			
		||||
    for (int y = 0; y < h; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	for (int x = 0; x < w; ++x)
 | 
			
		||||
	{
 | 
			
		||||
	    gpx[y][x] = 0;
 | 
			
		||||
	    zpx[y][x] = FLT_MAX;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int n = 2000;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < n; ++i)
 | 
			
		||||
    {
 | 
			
		||||
	float t = (i * 2.0 * M_PI) / n;
 | 
			
		||||
	float xp = sin (t * 4.0) + 0.2 * sin (t * 15.0);
 | 
			
		||||
	float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0);
 | 
			
		||||
	float zp = sin (t * 5.0);
 | 
			
		||||
	float rd = 0.7 + 0.3 * sin (t * 15.0);
 | 
			
		||||
	float gn = 0.5 - 0.5 * zp + 0.2;
 | 
			
		||||
 | 
			
		||||
	zsp (gpx, zpx, w, h,
 | 
			
		||||
	     xp * w / 3 + w / 2,
 | 
			
		||||
	     yp * h / 3 + h / 2,
 | 
			
		||||
	     zp * w + 3 * w,
 | 
			
		||||
	     w * rd * 0.05,
 | 
			
		||||
	     2.5 * gn * gn);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage3 (Array2D<Rgba> &px,
 | 
			
		||||
            int w, int h,
 | 
			
		||||
            int xMin, int xMax,
 | 
			
		||||
            int yMin, int yMax,
 | 
			
		||||
            int xLevel, int yLevel)
 | 
			
		||||
{
 | 
			
		||||
    mndl (px,
 | 
			
		||||
	  w, h,
 | 
			
		||||
	  xMin, xMax,
 | 
			
		||||
	  yMin, yMax,
 | 
			
		||||
	  (1 << xLevel), (1 << yLevel),
 | 
			
		||||
	  0.328, 0.369,
 | 
			
		||||
	  0.5,
 | 
			
		||||
	  double (1 << yLevel) / double (1 << xLevel),
 | 
			
		||||
	  -0.713, 0.9738);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage4 (Array2D<Rgba> &px,
 | 
			
		||||
            int w, int h,
 | 
			
		||||
            int xMin, int xMax,
 | 
			
		||||
            int yMin, int yMax,
 | 
			
		||||
            int xLevel, int yLevel)
 | 
			
		||||
{
 | 
			
		||||
    mndl (px,
 | 
			
		||||
	  w, h,
 | 
			
		||||
	  xMin, xMax,
 | 
			
		||||
	  yMin, yMax,
 | 
			
		||||
	  (1 << xLevel), (1 << yLevel),
 | 
			
		||||
	  0.3247, 0.33348,
 | 
			
		||||
	  0.4346,
 | 
			
		||||
	  double (1 << yLevel) / double (1 << xLevel),
 | 
			
		||||
	  0.4, -0.765);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage5 (Array2D<Rgba> &px,
 | 
			
		||||
            int w, int h,
 | 
			
		||||
            int xMin, int xMax,
 | 
			
		||||
            int yMin, int yMax,
 | 
			
		||||
            int xLevel, int yLevel)
 | 
			
		||||
{
 | 
			
		||||
    mndl (px,
 | 
			
		||||
	  w, h,
 | 
			
		||||
	  xMin, xMax,
 | 
			
		||||
	  yMin, yMax,
 | 
			
		||||
	  (1 << xLevel), (1 << yLevel),
 | 
			
		||||
	  0.2839, 0.2852,
 | 
			
		||||
	  0.00961,
 | 
			
		||||
	  double (1 << yLevel) / double (1 << xLevel),
 | 
			
		||||
	  0.25, 0.31);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage6 (Array2D<GZ> &px, int w, int h)
 | 
			
		||||
{
 | 
			
		||||
    mndl (px,
 | 
			
		||||
	  w, h,
 | 
			
		||||
	  0, w,
 | 
			
		||||
	  0, h,
 | 
			
		||||
	  3, 3,
 | 
			
		||||
	  -2.5, 1.0,
 | 
			
		||||
	  -1.3333,
 | 
			
		||||
	  1,
 | 
			
		||||
	  0, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawImage7 (Array<Rgba> &px, int w, int h, int y)
 | 
			
		||||
{
 | 
			
		||||
    for (int x = 0; x < w; ++x)
 | 
			
		||||
    {
 | 
			
		||||
	float xc = x - w / 2;
 | 
			
		||||
	float yc = y - h / 2;
 | 
			
		||||
	float a = atan2 (xc, yc);
 | 
			
		||||
	float r = sqrt (xc * xc + yc * yc);
 | 
			
		||||
 | 
			
		||||
	Rgba &p = px[x];
 | 
			
		||||
	p.r = sin (3.0f * a + 0.3f * sin (0.10f * r)) * 0.5f + 0.5f;
 | 
			
		||||
	p.g = sin (3.0f * a + 0.3f * sin (0.11f * r)) * 0.5f + 0.5f;
 | 
			
		||||
	p.b = sin (3.0f * a + 0.3f * sin (0.12f * r)) * 0.5f + 0.5f;
 | 
			
		||||
	p.a = 1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/drawImage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/drawImage.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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 <OpenEXRConfig.h>
 | 
			
		||||
#include <ImfRgbaFile.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct GZ
 | 
			
		||||
{
 | 
			
		||||
    half  g;
 | 
			
		||||
    float z;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void drawImage1 (IMF::Array2D<IMF::Rgba> &pixels,
 | 
			
		||||
		 int width,
 | 
			
		||||
		 int height);
 | 
			
		||||
 | 
			
		||||
void drawImage2 (IMF::Array2D<half>  &gPixels,
 | 
			
		||||
		 IMF::Array2D<float> &zPixels,
 | 
			
		||||
		 int width,
 | 
			
		||||
		 int height);
 | 
			
		||||
 | 
			
		||||
void drawImage3 (IMF::Array2D<IMF::Rgba> &pixels,
 | 
			
		||||
                 int width,
 | 
			
		||||
                 int height,
 | 
			
		||||
                 int xMin, int xMax,
 | 
			
		||||
                 int yMin, int yMax,
 | 
			
		||||
                 int xLevel = 0, int yLevel = 0);
 | 
			
		||||
 | 
			
		||||
void drawImage4 (IMF::Array2D<IMF::Rgba> &pixels,
 | 
			
		||||
                 int width,
 | 
			
		||||
                 int height,
 | 
			
		||||
                 int xMin, int xMax,
 | 
			
		||||
                 int yMin, int yMax,
 | 
			
		||||
                 int xLevel = 0, int yLevel = 0);
 | 
			
		||||
 | 
			
		||||
void drawImage5 (IMF::Array2D<IMF::Rgba> &pixels,
 | 
			
		||||
                 int width,
 | 
			
		||||
                 int height,
 | 
			
		||||
                 int xMin, int xMax,
 | 
			
		||||
                 int yMin, int yMax,
 | 
			
		||||
                 int xLevel = 0, int yLevel = 0);
 | 
			
		||||
 | 
			
		||||
void drawImage6 (IMF::Array2D<GZ> &pixels,
 | 
			
		||||
		 int width,
 | 
			
		||||
		 int height);
 | 
			
		||||
 | 
			
		||||
void drawImage7 (IMF::Array<IMF::Rgba> &pixels,
 | 
			
		||||
		 int width,
 | 
			
		||||
		 int height,
 | 
			
		||||
		 int y);
 | 
			
		||||
@@ -0,0 +1,296 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how class InputFile and class OutputFile
 | 
			
		||||
//	can be used to read and write OpenEXR image files with an arbitrary
 | 
			
		||||
//	set of channels.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <ImfOutputFile.h>
 | 
			
		||||
#include <ImfInputFile.h>
 | 
			
		||||
#include <ImfChannelList.h>
 | 
			
		||||
#include <ImfStringAttribute.h>
 | 
			
		||||
#include <ImfMatrixAttribute.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeGZ1 (const char fileName[],
 | 
			
		||||
	  const half *gPixels,
 | 
			
		||||
	  const float *zPixels,
 | 
			
		||||
	  int width,
 | 
			
		||||
	  int height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an image with only a G (green) and a Z (depth) channel,
 | 
			
		||||
    // using class OutputFile.
 | 
			
		||||
    //
 | 
			
		||||
    //	- create a file header
 | 
			
		||||
    //	- add G and Z channels to the header
 | 
			
		||||
    //	- open the file, and store the header in the file
 | 
			
		||||
    //	- describe the memory layout of the G anx Z pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
    header.channels().insert ("G", Channel (IMF::HALF));
 | 
			
		||||
    header.channels().insert ("Z", Channel (IMF::FLOAT));
 | 
			
		||||
 | 
			
		||||
    OutputFile file (fileName, header);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					// name
 | 
			
		||||
		        Slice (IMF::HALF,			// type
 | 
			
		||||
			       (char *) gPixels,		// base
 | 
			
		||||
			       sizeof (*gPixels) * 1,		// xStride
 | 
			
		||||
			       sizeof (*gPixels) * width));	// yStride
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					// name
 | 
			
		||||
			Slice (IMF::FLOAT,			// type
 | 
			
		||||
			       (char *) zPixels,		// base
 | 
			
		||||
			       sizeof (*zPixels) * 1,		// xStride
 | 
			
		||||
			       sizeof (*zPixels) * width));	// yStride
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (frameBuffer);
 | 
			
		||||
    file.writePixels (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeGZ2 (const char fileName[],
 | 
			
		||||
	  const half *gPixels,
 | 
			
		||||
	  const float *zPixels,
 | 
			
		||||
	  int width,
 | 
			
		||||
	  int height,
 | 
			
		||||
	  const Box2i &dataWindow)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an image with only a G (green) and a Z (depth) channel,
 | 
			
		||||
    // using class OutputFile.  Don't store the whole image in the
 | 
			
		||||
    // file, but crop it according to the given data window.
 | 
			
		||||
    //
 | 
			
		||||
    //	- create a file header
 | 
			
		||||
    //	- set the header's data window
 | 
			
		||||
    //	- add G and Z channels to the header
 | 
			
		||||
    //	- open the file, and store the header in the file
 | 
			
		||||
    //	- describe the memory layout of the G anx Z pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
    header.dataWindow() = dataWindow;
 | 
			
		||||
    header.channels().insert ("G", Channel (IMF::HALF));
 | 
			
		||||
    header.channels().insert ("Z", Channel (IMF::FLOAT));
 | 
			
		||||
 | 
			
		||||
    OutputFile file (fileName, header);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					// name
 | 
			
		||||
			Slice (IMF::HALF,			// type
 | 
			
		||||
			       (char *) gPixels,		// base
 | 
			
		||||
			       sizeof (*gPixels) * 1,		// xStride
 | 
			
		||||
			       sizeof (*gPixels) * width));	// yStride
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					// name
 | 
			
		||||
			Slice (IMF::FLOAT,			// type
 | 
			
		||||
			       (char *) zPixels,		// base
 | 
			
		||||
			       sizeof (*zPixels) * 1,		// xStride
 | 
			
		||||
			       sizeof (*zPixels) * width));	// yStride
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (frameBuffer);
 | 
			
		||||
    file.writePixels (dataWindow.max.y - dataWindow.min.y + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readGZ1 (const char fileName[],
 | 
			
		||||
	 Array2D<half> &rPixels,
 | 
			
		||||
	 Array2D<half> &gPixels,
 | 
			
		||||
	 Array2D<float> &zPixels,
 | 
			
		||||
	 int &width, int &height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an image using class InputFile.  Try to read two
 | 
			
		||||
    // channels, R and G, of type HALF, and one channel, Z,
 | 
			
		||||
    // of type FLOAT.  Store the R, G, and Z pixels in three
 | 
			
		||||
    // separate memory buffers.
 | 
			
		||||
    // If a channel is missing in the file, the buffer for that
 | 
			
		||||
    // channel will be filled with an appropriate default value.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- allocate memory for the pixels
 | 
			
		||||
    //	- describe the layout of the R, G, and Z pixel buffers
 | 
			
		||||
    //	- read the pixels from the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    InputFile file (fileName);
 | 
			
		||||
 | 
			
		||||
    Box2i dw = file.header().dataWindow();
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
 | 
			
		||||
    rPixels.resizeErase (height, width);
 | 
			
		||||
    gPixels.resizeErase (height, width);
 | 
			
		||||
    zPixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("R",					// name
 | 
			
		||||
			Slice (IMF::HALF,			// type
 | 
			
		||||
			       (char *) (&rPixels[0][0] -	// base
 | 
			
		||||
					 dw.min.x -
 | 
			
		||||
					 dw.min.y * width),
 | 
			
		||||
			       sizeof (rPixels[0][0]) * 1,	// xStride
 | 
			
		||||
			       sizeof (rPixels[0][0]) * width,	// yStride
 | 
			
		||||
			       1, 1,				// x/y sampling
 | 
			
		||||
			       0.0));				// fillValue
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					// name
 | 
			
		||||
			Slice (IMF::HALF,			// type
 | 
			
		||||
			       (char *) (&gPixels[0][0] -	// base
 | 
			
		||||
					 dw.min.x -
 | 
			
		||||
					 dw.min.y * width),
 | 
			
		||||
			       sizeof (gPixels[0][0]) * 1,	// xStride
 | 
			
		||||
			       sizeof (gPixels[0][0]) * width,	// yStride
 | 
			
		||||
			       1, 1,				// x/y sampling
 | 
			
		||||
			       0.0));				// fillValue
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					// name
 | 
			
		||||
			Slice (IMF::FLOAT,			// type
 | 
			
		||||
			       (char *) (&zPixels[0][0] -	// base
 | 
			
		||||
					 dw.min.x -
 | 
			
		||||
					 dw.min.y * width),
 | 
			
		||||
			       sizeof (zPixels[0][0]) * 1,	 // xStride
 | 
			
		||||
			       sizeof (zPixels[0][0]) * width,	// yStride
 | 
			
		||||
			       1, 1,				// x/y sampling
 | 
			
		||||
			       FLT_MAX));			// fillValue
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (frameBuffer);
 | 
			
		||||
    file.readPixels (dw.min.y, dw.max.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readGZ2 (const char fileName[],
 | 
			
		||||
	 Array2D<GZ> &pixels,
 | 
			
		||||
	 int &width, int &height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an image using class InputFile.  Try to read one channel,
 | 
			
		||||
    // G, of type HALF, and one channel, Z, of type FLOAT.  In memory,
 | 
			
		||||
    // the G and Z channels will be interleaved in a single buffer.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- allocate memory for the pixels
 | 
			
		||||
    //	- describe the layout of the GZ pixel buffer
 | 
			
		||||
    //	- read the pixels from the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    InputFile file (fileName);
 | 
			
		||||
 | 
			
		||||
    Box2i dw = file.header().dataWindow();
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    int dx = dw.min.x;
 | 
			
		||||
    int dy = dw.min.y;
 | 
			
		||||
 | 
			
		||||
    pixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					 // name
 | 
			
		||||
                        Slice (IMF::HALF,			 // type
 | 
			
		||||
			       (char *) &pixels[-dy][-dx].g,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					 // name
 | 
			
		||||
                        Slice (IMF::FLOAT,			 // type
 | 
			
		||||
			       (char *) &pixels[-dy][-dx].z,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (frameBuffer);
 | 
			
		||||
    file.readPixels (dw.min.y, dw.max.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
generalInterfaceExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nGZ (green, depth) images\n" << endl;
 | 
			
		||||
    cout << "drawing image" << endl;
 | 
			
		||||
 | 
			
		||||
    int w = 800;
 | 
			
		||||
    int h = 600;
 | 
			
		||||
 | 
			
		||||
    Array2D<half>  gp (h, w);
 | 
			
		||||
    Array2D<float> zp (h, w);
 | 
			
		||||
    drawImage2 (gp, zp, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "writing entire image" << endl;
 | 
			
		||||
 | 
			
		||||
    writeGZ1 ("gz1.exr", &gp[0][0], &zp[0][0], w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "writing cropped image" << endl;
 | 
			
		||||
 | 
			
		||||
    writeGZ2 ("gz2.exr", &gp[0][0], &zp[0][0], w, h,
 | 
			
		||||
	      Box2i (V2i (w/6, h/6), V2i (w/2, h/2)));
 | 
			
		||||
 | 
			
		||||
    cout << "reading file into separate per-channel buffers" << endl;
 | 
			
		||||
 | 
			
		||||
    Array2D<half> rp (1, 1);
 | 
			
		||||
    readGZ1 ("gz2.exr", rp, gp, zp, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "reading file into interleaved multi-channel buffer" << endl;
 | 
			
		||||
 | 
			
		||||
    Array2D<GZ> gzp (1, 1);
 | 
			
		||||
    readGZ2 ("gz2.exr", gzp, w, h);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
void generalInterfaceExamples ();
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,148 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2002, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how class TiledInputFile and
 | 
			
		||||
//	class TiledOutputFile can be used to read and write
 | 
			
		||||
//	OpenEXR image files with an arbitrary set of channels.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
#include <ImfTiledOutputFile.h>
 | 
			
		||||
#include <ImfTiledInputFile.h>
 | 
			
		||||
#include <ImfChannelList.h>
 | 
			
		||||
#include <ImfStringAttribute.h>
 | 
			
		||||
#include <ImfMatrixAttribute.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiled1 (const char fileName[],
 | 
			
		||||
             Array2D<GZ> &pixels,
 | 
			
		||||
             int width, int height,
 | 
			
		||||
             int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
    header.channels().insert ("G", Channel (IMF::HALF));
 | 
			
		||||
    header.channels().insert ("Z", Channel (IMF::FLOAT));
 | 
			
		||||
 | 
			
		||||
    header.setTileDescription
 | 
			
		||||
	(TileDescription (tileWidth, tileHeight, ONE_LEVEL));
 | 
			
		||||
    
 | 
			
		||||
    TiledOutputFile out (fileName, header);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					 // name
 | 
			
		||||
                        Slice (IMF::HALF,			 // type
 | 
			
		||||
			       (char *) &pixels[0][0].g,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					 // name
 | 
			
		||||
                        Slice (IMF::FLOAT,			 // type
 | 
			
		||||
			       (char *) &pixels[0][0].z,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    out.setFrameBuffer (frameBuffer);
 | 
			
		||||
    out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readTiled1 (const char fileName[],
 | 
			
		||||
            Array2D<GZ> &pixels,
 | 
			
		||||
            int &width, int &height)
 | 
			
		||||
{
 | 
			
		||||
    TiledInputFile in (fileName);
 | 
			
		||||
 | 
			
		||||
    Box2i dw = in.header().dataWindow();
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    int dx = dw.min.x;
 | 
			
		||||
    int dy = dw.min.y;
 | 
			
		||||
 | 
			
		||||
    pixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer frameBuffer;
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("G",					 // name
 | 
			
		||||
                        Slice (IMF::HALF,			 // type
 | 
			
		||||
			       (char *) &pixels[-dy][-dx].g,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    frameBuffer.insert ("Z",					 // name
 | 
			
		||||
                        Slice (IMF::FLOAT,			 // type
 | 
			
		||||
			       (char *) &pixels[-dy][-dx].z,	 // base
 | 
			
		||||
				sizeof (pixels[0][0]) * 1,	 // xStride
 | 
			
		||||
				sizeof (pixels[0][0]) * width)); // yStride
 | 
			
		||||
 | 
			
		||||
    in.setFrameBuffer (frameBuffer);
 | 
			
		||||
    in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
generalInterfaceTiledExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nGZ (green, depth) tiled files\n" << endl;
 | 
			
		||||
    cout << "drawing image" << endl;
 | 
			
		||||
 | 
			
		||||
    int w = 800;
 | 
			
		||||
    int h = 600;
 | 
			
		||||
 | 
			
		||||
    Array2D<GZ>  pixels (h, w);
 | 
			
		||||
    drawImage6 (pixels, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "writing file" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiled1 ("tiledgz1.exr", pixels, w, h, 64, 64);
 | 
			
		||||
 | 
			
		||||
    cout << "reading file" << endl;
 | 
			
		||||
 | 
			
		||||
    readTiled1 ("tiledgz1.exr", pixels, w, h);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void generalInterfaceTiledExamples ();
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,292 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how implement custom low-level
 | 
			
		||||
//	file input and output for OpenEXR files:
 | 
			
		||||
//
 | 
			
		||||
//	Classes C_IStream and C_OStream are derived from IlmImf's
 | 
			
		||||
//	abstract IStream and OStreamd classes.  They allow OpenEXR
 | 
			
		||||
//	file input and output via C stdio files (FILE *).
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <ImfRgbaFile.h>
 | 
			
		||||
#include <ImfIO.h>
 | 
			
		||||
#include "Iex.h"
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class C_IStream: public IStream
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    C_IStream (FILE *file, const char fileName[]):
 | 
			
		||||
	IStream (fileName), _file (file) {}
 | 
			
		||||
 | 
			
		||||
    virtual bool	read (char c[/*n*/], int n);
 | 
			
		||||
    virtual Int64	tellg ();
 | 
			
		||||
    virtual void	seekg (Int64 pos);
 | 
			
		||||
    virtual void	clear ();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
 | 
			
		||||
    FILE *		_file;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class C_OStream: public OStream
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    C_OStream (FILE *file, const char fileName[]):
 | 
			
		||||
	OStream (fileName), _file (file) {}
 | 
			
		||||
 | 
			
		||||
    virtual void	write (const char c[/*n*/], int n);
 | 
			
		||||
    virtual Int64	tellp ();
 | 
			
		||||
    virtual void	seekp (Int64 pos);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
 | 
			
		||||
    FILE *		_file;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
C_IStream::read (char c[/*n*/], int n)
 | 
			
		||||
{
 | 
			
		||||
    if (n != fread (c, 1, n, _file))
 | 
			
		||||
    {
 | 
			
		||||
	//
 | 
			
		||||
	// fread() failed, but the return value does not distinguish
 | 
			
		||||
	// between I/O errors and end of file, so we call ferror() to
 | 
			
		||||
	// determine what happened.
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
	if (ferror (_file))
 | 
			
		||||
	    IEX_NAMESPACE::throwErrnoExc();
 | 
			
		||||
	else
 | 
			
		||||
	    throw IEX_NAMESPACE::InputExc ("Unexpected end of file.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return feof (_file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Int64
 | 
			
		||||
C_IStream::tellg ()
 | 
			
		||||
{
 | 
			
		||||
    return ftell (_file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
C_IStream::seekg (Int64 pos)
 | 
			
		||||
{
 | 
			
		||||
    clearerr (_file);
 | 
			
		||||
    fseek (_file, pos, SEEK_SET);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
C_IStream::clear ()
 | 
			
		||||
{
 | 
			
		||||
    clearerr (_file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
C_OStream::write (const char c[/*n*/], int n)
 | 
			
		||||
{
 | 
			
		||||
    clearerr (_file);
 | 
			
		||||
 | 
			
		||||
    if (n != fwrite (c, 1, n, _file))
 | 
			
		||||
	IEX_NAMESPACE::throwErrnoExc();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Int64
 | 
			
		||||
C_OStream::tellp ()
 | 
			
		||||
{
 | 
			
		||||
    return ftell (_file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
C_OStream::seekp (Int64 pos)
 | 
			
		||||
{
 | 
			
		||||
    clearerr (_file);
 | 
			
		||||
    fseek (_file, pos, SEEK_SET);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgbaFILE (FILE *cfile,
 | 
			
		||||
	       const char fileName[],
 | 
			
		||||
	       const Rgba *pixels,
 | 
			
		||||
	       int width,
 | 
			
		||||
	       int height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Store an RGBA image in a C stdio file that has already been opened:
 | 
			
		||||
    //
 | 
			
		||||
    //	- create a C_OStream object for writing to the file
 | 
			
		||||
    //	- create an RgbaOutputFile object, and attach it to the C_OStream
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    C_OStream ostr (cfile, fileName);
 | 
			
		||||
    RgbaOutputFile file (ostr, Header (width, height), WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (pixels, 1, width);
 | 
			
		||||
    file.writePixels (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readRgbaFILE (FILE *cfile,
 | 
			
		||||
	      const char fileName[],
 | 
			
		||||
	      Array2D<Rgba> &pixels,
 | 
			
		||||
	      int &width,
 | 
			
		||||
	      int &height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an RGBA image from a C stdio file that has already been opened:
 | 
			
		||||
    //
 | 
			
		||||
    //	- create a C_IStream object for reading from the file
 | 
			
		||||
    //	- create an RgbaInputFile object, and attach it to the C_IStream
 | 
			
		||||
    //	- allocate memory for the pixels
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- read the pixels from the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    C_IStream istr (cfile, fileName);
 | 
			
		||||
    RgbaInputFile file (istr);
 | 
			
		||||
    Box2i dw = file.dataWindow();
 | 
			
		||||
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    pixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width);
 | 
			
		||||
    file.readPixels (dw.min.y, dw.max.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
lowLevelIoExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nCustom low-level file I/O\n" << endl;
 | 
			
		||||
    cout << "drawing image" << endl;
 | 
			
		||||
 | 
			
		||||
    int w = 800;
 | 
			
		||||
    int h = 600;
 | 
			
		||||
    const char *fileName = "rgba4.exr";
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> p (h, w);
 | 
			
		||||
    drawImage1 (p, w, h);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // The following code is somewhat complicated because
 | 
			
		||||
    // fopen() returns 0 on error, but writeRgbaFILE() and
 | 
			
		||||
    // readRgbaFILE() throw exceptions.  Also, if a FILE *
 | 
			
		||||
    // goes out of scope, the corresponding file is not
 | 
			
		||||
    // automatically closed.  In order to avoid leaking
 | 
			
		||||
    // file descriptors, we have to make sure fclose() is
 | 
			
		||||
    // called in all cases.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    cout << "writing image" << endl;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	FILE *file = fopen (fileName, "wb");
 | 
			
		||||
 | 
			
		||||
	if (file == 0)
 | 
			
		||||
	{
 | 
			
		||||
	    THROW_ERRNO ("Cannot open file " << fileName << " (%T).");
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
	    try
 | 
			
		||||
	    {
 | 
			
		||||
		writeRgbaFILE (file, fileName, &p[0][0], w, h);
 | 
			
		||||
	    }
 | 
			
		||||
	    catch (...)
 | 
			
		||||
	    {
 | 
			
		||||
		fclose (file);
 | 
			
		||||
		throw;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    fclose (file);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "reading image" << endl;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	FILE *file = fopen (fileName, "rb");
 | 
			
		||||
 | 
			
		||||
	if (file == 0)
 | 
			
		||||
	{
 | 
			
		||||
	    THROW_ERRNO ("Cannot open file " << fileName << " (%T).");
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
	    try
 | 
			
		||||
	    {
 | 
			
		||||
		readRgbaFILE (file, fileName, p, w, h);
 | 
			
		||||
	    }
 | 
			
		||||
	    catch (...)
 | 
			
		||||
	    {
 | 
			
		||||
		fclose (file);
 | 
			
		||||
		throw;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    fclose (file);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
void lowLevelIoExamples ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										70
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								cs440-acg/ext/openexr/OpenEXR/IlmImfExamples/main.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2002, 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 "rgbaInterfaceExamples.h"
 | 
			
		||||
#include "rgbaInterfaceTiledExamples.h"
 | 
			
		||||
#include "generalInterfaceExamples.h"
 | 
			
		||||
#include "generalInterfaceTiledExamples.h"
 | 
			
		||||
#include "lowLevelIoExamples.h"
 | 
			
		||||
#include "previewImageExamples.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
	rgbaInterfaceExamples();
 | 
			
		||||
	generalInterfaceExamples();
 | 
			
		||||
 | 
			
		||||
        rgbaInterfaceTiledExamples();
 | 
			
		||||
        generalInterfaceTiledExamples();
 | 
			
		||||
 | 
			
		||||
	lowLevelIoExamples();
 | 
			
		||||
 | 
			
		||||
	previewImageExamples();
 | 
			
		||||
    }
 | 
			
		||||
    catch (const std::exception &exc)
 | 
			
		||||
    {
 | 
			
		||||
	std::cerr << exc.what() << std::endl;
 | 
			
		||||
	return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
#ifndef NAMESPACEALIAS_H_
 | 
			
		||||
#define NAMESPACEALIAS_H_
 | 
			
		||||
 | 
			
		||||
#include <ImfNamespace.h>
 | 
			
		||||
 | 
			
		||||
namespace IMF = OPENEXR_IMF_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
#endif /* NAMESPACEALIAS_H_ */
 | 
			
		||||
@@ -0,0 +1,219 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how to add preview images
 | 
			
		||||
//	(also known as thumbnais) to OpenEXR image files.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <ImfRgbaFile.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
#include <ImfPreviewImage.h>
 | 
			
		||||
#include "ImathFun.h"
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unsigned char
 | 
			
		||||
gamma (float x)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Convert a floating-point pixel value to an 8-bit gamma-2.2
 | 
			
		||||
    // preview pixel.  (This routine is a simplified version of
 | 
			
		||||
    // how the exrdisplay program transforms floating-point pixel
 | 
			
		||||
    // values in order to display them on the screen.)
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    x = pow (5.5555f * max (0.f, x), 0.4545f) * 84.66f;
 | 
			
		||||
    return (unsigned char) clamp (x, 0.f, 255.f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
makePreviewImage (const Array2D <Rgba> &pixels,
 | 
			
		||||
		  int width,
 | 
			
		||||
		  int height,
 | 
			
		||||
		  Array2D <PreviewRgba> &previewPixels,
 | 
			
		||||
		  int &previewWidth,
 | 
			
		||||
		  int &previewHeight)
 | 
			
		||||
{
 | 
			
		||||
    const int N = 8;
 | 
			
		||||
 | 
			
		||||
    previewWidth  = width / N;
 | 
			
		||||
    previewHeight = height / N;
 | 
			
		||||
    previewPixels.resizeErase (previewHeight, previewWidth);
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < previewHeight; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	for (int x = 0; x < previewWidth; ++x)
 | 
			
		||||
	{
 | 
			
		||||
	    const Rgba  &inPixel = pixels[y * N][x * N];
 | 
			
		||||
	    PreviewRgba &outPixel = previewPixels[y][x];
 | 
			
		||||
 | 
			
		||||
	    outPixel.r = gamma (inPixel.r);
 | 
			
		||||
	    outPixel.g = gamma (inPixel.g);
 | 
			
		||||
	    outPixel.b = gamma (inPixel.b);
 | 
			
		||||
	    outPixel.a = int (clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgbaWithPreview1 (const char fileName[],
 | 
			
		||||
		       const Array2D <Rgba> &pixels,
 | 
			
		||||
		       int width,
 | 
			
		||||
		       int height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an image file with a preview image, version 1:
 | 
			
		||||
    //
 | 
			
		||||
    // - generate the preview image by subsampling the main image
 | 
			
		||||
    // - generate a file header
 | 
			
		||||
    // - add the preview image to the file header
 | 
			
		||||
    // - open the file (this stores the header with the
 | 
			
		||||
    //   preview image in the file)
 | 
			
		||||
    // - describe the memory layout of the main image's pixels
 | 
			
		||||
    // - store the main image's pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Array2D <PreviewRgba> previewPixels;
 | 
			
		||||
    int previewWidth;
 | 
			
		||||
    int previewHeight;
 | 
			
		||||
 | 
			
		||||
    makePreviewImage (pixels, width, height,
 | 
			
		||||
		      previewPixels, previewWidth, previewHeight);
 | 
			
		||||
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
 | 
			
		||||
    header.setPreviewImage
 | 
			
		||||
	(PreviewImage (previewWidth, previewHeight, &previewPixels[0][0]));
 | 
			
		||||
 | 
			
		||||
    RgbaOutputFile file (fileName, header, WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (&pixels[0][0], 1, width);
 | 
			
		||||
    file.writePixels (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgbaWithPreview2 (const char fileName[],
 | 
			
		||||
		       int width,
 | 
			
		||||
		       int height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an image file with a preview image, version 2:
 | 
			
		||||
    //
 | 
			
		||||
    // - generate a file header
 | 
			
		||||
    // - add a dummy preview image to the file header
 | 
			
		||||
    // - open the file (this stores the header with the dummy
 | 
			
		||||
    //   preview image in the file)
 | 
			
		||||
    // - render the main image's pixels one scan line at a time,
 | 
			
		||||
    //   and store each scan line in the file before rendering
 | 
			
		||||
    //   the next scan line
 | 
			
		||||
    // - generate the preview image on the fly, while the main
 | 
			
		||||
    //   image is being rendered
 | 
			
		||||
    // - once the main image has been rendered, store the preview
 | 
			
		||||
    //   image in the file, overwriting the dummy preview
 | 
			
		||||
    //   
 | 
			
		||||
 | 
			
		||||
    Array <Rgba> pixels (width);
 | 
			
		||||
 | 
			
		||||
    const int N = 8;
 | 
			
		||||
 | 
			
		||||
    int previewWidth = width / N;
 | 
			
		||||
    int previewHeight = height / N;
 | 
			
		||||
    Array2D <PreviewRgba> previewPixels (previewHeight, previewWidth);
 | 
			
		||||
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
    header.setPreviewImage (PreviewImage (previewWidth, previewHeight));
 | 
			
		||||
 | 
			
		||||
    RgbaOutputFile file (fileName, header, WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (pixels, 1, 0);
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < height; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	drawImage7 (pixels, width, height, y);
 | 
			
		||||
	file.writePixels (1);
 | 
			
		||||
 | 
			
		||||
	if (y % N == 0)
 | 
			
		||||
	{
 | 
			
		||||
	    for (int x = 0; x < width; x += N)
 | 
			
		||||
	    {
 | 
			
		||||
		const Rgba  &inPixel = pixels[x];
 | 
			
		||||
		PreviewRgba &outPixel = previewPixels[y / N][x / N];
 | 
			
		||||
 | 
			
		||||
		outPixel.r = gamma (inPixel.r);
 | 
			
		||||
		outPixel.g = gamma (inPixel.g);
 | 
			
		||||
		outPixel.b = gamma (inPixel.b);
 | 
			
		||||
		outPixel.a = int (clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f);
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    file.updatePreviewImage (&previewPixels[0][0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
previewImageExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nfiles with preview images\n" << endl;
 | 
			
		||||
 | 
			
		||||
    cout << "drawing image then writing file" << endl;
 | 
			
		||||
 | 
			
		||||
    int w = 800;
 | 
			
		||||
    int h = 600;
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> p (h, w);
 | 
			
		||||
    drawImage1 (p, w, h);
 | 
			
		||||
    writeRgbaWithPreview1 ("rgbaWithPreview1.exr", p, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "drawing image while writing file" << endl;
 | 
			
		||||
 | 
			
		||||
    writeRgbaWithPreview2 ("rgbaWithPreview2.exr", w, h);
 | 
			
		||||
 | 
			
		||||
    cout << endl;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
void previewImageExamples ();
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,265 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how class RgbaInputFile and
 | 
			
		||||
//	class RgbaOutputFile can be used to read and write
 | 
			
		||||
//	OpenEXR image files with 16-bit floating-point red,
 | 
			
		||||
//	green, blue and alpha channels.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <ImfRgbaFile.h>
 | 
			
		||||
#include <ImfStringAttribute.h>
 | 
			
		||||
#include <ImfMatrixAttribute.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgba1 (const char fileName[],
 | 
			
		||||
	    const Rgba *pixels,
 | 
			
		||||
	    int width,
 | 
			
		||||
	    int height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an RGBA image using class RgbaOutputFile.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    RgbaOutputFile file (fileName, width, height, WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (pixels, 1, width);
 | 
			
		||||
    file.writePixels (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgba2 (const char fileName[],
 | 
			
		||||
	    const Rgba *pixels,
 | 
			
		||||
	    int width,
 | 
			
		||||
	    int height,
 | 
			
		||||
	    const Box2i &dataWindow)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an RGBA image using class RgbaOutputFile.
 | 
			
		||||
    // Don't store the whole image in the file, but
 | 
			
		||||
    // crop it according to the given data window.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1));
 | 
			
		||||
    RgbaOutputFile file (fileName, displayWindow, dataWindow, WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (pixels, 1, width);
 | 
			
		||||
    file.writePixels (dataWindow.max.y - dataWindow.min.y + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeRgba3 (const char fileName[],
 | 
			
		||||
	    const Rgba *pixels,
 | 
			
		||||
	    int width,
 | 
			
		||||
	    int height,
 | 
			
		||||
	    const char comments[],
 | 
			
		||||
	    const M44f &cameraTransform)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write an RGBA image using class RgbaOutputFile.
 | 
			
		||||
    // Store two extra attributes in the image header:
 | 
			
		||||
    // a string and a 4x4 transformation matrix.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- store the pixels in the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Header header (width, height);
 | 
			
		||||
    header.insert ("comments", StringAttribute (comments));
 | 
			
		||||
    header.insert ("cameraTransform", M44fAttribute (cameraTransform));
 | 
			
		||||
 | 
			
		||||
    RgbaOutputFile file (fileName, header, WRITE_RGBA);
 | 
			
		||||
    file.setFrameBuffer (pixels, 1, width);
 | 
			
		||||
    file.writePixels (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readRgba1 (const char fileName[],
 | 
			
		||||
	   Array2D<Rgba> &pixels,
 | 
			
		||||
	   int &width,
 | 
			
		||||
	   int &height)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an RGBA image using class RgbaInputFile:
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- allocate memory for the pixels
 | 
			
		||||
    //	- describe the memory layout of the pixels
 | 
			
		||||
    //	- read the pixels from the file
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    RgbaInputFile file (fileName);
 | 
			
		||||
    Box2i dw = file.dataWindow();
 | 
			
		||||
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    pixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width);
 | 
			
		||||
    file.readPixels (dw.min.y, dw.max.y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readRgba2 (const char fileName[])
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an RGBA image using class RgbaInputFile.
 | 
			
		||||
    // Read the pixels, 10 scan lines at a time, and
 | 
			
		||||
    // store the pixel data in a buffer that is just
 | 
			
		||||
    // large enough to hold 10 scan lines worth of data.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- allocate memory for the pixels
 | 
			
		||||
    //	- for each block of 10 scan lines,
 | 
			
		||||
    //	  describe the memory layout of the pixels,
 | 
			
		||||
    //	  read the pixels from the file,
 | 
			
		||||
    //	  process the pixels and discard them
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    RgbaInputFile file (fileName);
 | 
			
		||||
    Box2i dw = file.dataWindow();
 | 
			
		||||
 | 
			
		||||
    int width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    int height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    Array2D<Rgba> pixels (10, width);
 | 
			
		||||
 | 
			
		||||
    while (dw.min.y <= dw.max.y)
 | 
			
		||||
    {
 | 
			
		||||
	file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width,
 | 
			
		||||
			     1, width);
 | 
			
		||||
 | 
			
		||||
	file.readPixels (dw.min.y, min (dw.min.y + 9, dw.max.y));
 | 
			
		||||
	// processPixels (pixels)
 | 
			
		||||
	
 | 
			
		||||
	dw.min.y += 10;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readHeader (const char fileName[])
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Read an image's header from a file, and if the header
 | 
			
		||||
    // contains comments and camera transformation attributes,
 | 
			
		||||
    // print the values of those attributes.
 | 
			
		||||
    //
 | 
			
		||||
    //	- open the file
 | 
			
		||||
    //	- get the file header
 | 
			
		||||
    //	- look for the attributes
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    RgbaInputFile file (fileName);
 | 
			
		||||
 | 
			
		||||
    const StringAttribute *comments =
 | 
			
		||||
	file.header().findTypedAttribute <StringAttribute> ("comments");
 | 
			
		||||
 | 
			
		||||
    const M44fAttribute *cameraTransform = 
 | 
			
		||||
	file.header().findTypedAttribute <M44fAttribute> ("cameraTransform");
 | 
			
		||||
 | 
			
		||||
    if (comments)
 | 
			
		||||
	cout << "comments\n   " << comments->value() << endl;
 | 
			
		||||
 | 
			
		||||
    if (cameraTransform)
 | 
			
		||||
	cout << "cameraTransform\n" << cameraTransform->value() << flush;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
rgbaInterfaceExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nRGBA images\n" << endl;
 | 
			
		||||
    cout << "drawing image" << endl;
 | 
			
		||||
 | 
			
		||||
    int w = 800;
 | 
			
		||||
    int h = 600;
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> p (h, w);
 | 
			
		||||
    drawImage1 (p, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "writing entire image" << endl;
 | 
			
		||||
 | 
			
		||||
    writeRgba1 ("rgba1.exr", &p[0][0], w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "writing cropped image" << endl;
 | 
			
		||||
 | 
			
		||||
    writeRgba2 ("rgba2.exr", &p[0][0], w, h,
 | 
			
		||||
	        Box2i (V2i (w/6, h/6), V2i (w/2, h/2)));
 | 
			
		||||
 | 
			
		||||
    cout << "writing image with extra header attributes" << endl;
 | 
			
		||||
 | 
			
		||||
    writeRgba3 ("rgba3.exr", &p[0][0], w, h,
 | 
			
		||||
	        "may contain peanuts", M44f());
 | 
			
		||||
 | 
			
		||||
    cout << "reading rgba file" << endl;
 | 
			
		||||
 | 
			
		||||
    readRgba1 ("rgba2.exr", p, w, h);
 | 
			
		||||
 | 
			
		||||
    cout << "reading rgba file into 10-scanline buffer" << endl;
 | 
			
		||||
 | 
			
		||||
    readRgba2 ("rgba2.exr");
 | 
			
		||||
 | 
			
		||||
    cout << "reading extra file header attributes" << endl;
 | 
			
		||||
 | 
			
		||||
    readHeader ("rgba3.exr");
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
void rgbaInterfaceExamples ();
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,346 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Code examples that show how class TiledRgbaInputFile and
 | 
			
		||||
//	class TiledRgbaOutputFile can be used to read and write
 | 
			
		||||
//	OpenEXR image files with 16-bit floating-point red,
 | 
			
		||||
//	green, blue and alpha channels.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <ImfTiledRgbaFile.h>
 | 
			
		||||
#include <ImfStringAttribute.h>
 | 
			
		||||
#include <ImfMatrixAttribute.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
#include "drawImage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace IMATH_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaONE1 (const char fileName[],
 | 
			
		||||
                    const Rgba *pixels,
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with one level using an image-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             ONE_LEVEL,			// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    out.setFrameBuffer (pixels, 1, width);
 | 
			
		||||
    out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaONE2 (const char fileName[],
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with one level using a tile-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             ONE_LEVEL,			// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (tileHeight, tileWidth);
 | 
			
		||||
 | 
			
		||||
    for (int tileY = 0; tileY < out.numYTiles (); ++tileY)
 | 
			
		||||
    {
 | 
			
		||||
        for (int tileX = 0; tileX < out.numXTiles (); ++tileX)
 | 
			
		||||
        {
 | 
			
		||||
            Box2i range = out.dataWindowForTile (tileX, tileY);
 | 
			
		||||
 | 
			
		||||
            drawImage3 (pixels,
 | 
			
		||||
			width, height,
 | 
			
		||||
                        range.min.x, range.max.x + 1,
 | 
			
		||||
                        range.min.y, range.max.y + 1,
 | 
			
		||||
                        0, 0);
 | 
			
		||||
 | 
			
		||||
            out.setFrameBuffer (&pixels[-range.min.y][-range.min.x],
 | 
			
		||||
                                1,		// xStride
 | 
			
		||||
                                tileWidth);	// yStride
 | 
			
		||||
 | 
			
		||||
            out.writeTile (tileX, tileY);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaMIP1 (const char fileName[],
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with mipmap levels using an image-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             MIPMAP_LEVELS,		// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (height, width);
 | 
			
		||||
    out.setFrameBuffer (&pixels[0][0], 1, width);
 | 
			
		||||
 | 
			
		||||
    for (int level = 0; level < out.numLevels (); ++level)
 | 
			
		||||
    {
 | 
			
		||||
        drawImage4 (pixels,
 | 
			
		||||
		    out.levelWidth (level), out.levelHeight (level),
 | 
			
		||||
                    0, out.levelWidth (level),
 | 
			
		||||
		    0, out.levelHeight (level),
 | 
			
		||||
                    level, level);
 | 
			
		||||
 | 
			
		||||
	out.writeTiles (0, out.numXTiles (level) - 1,
 | 
			
		||||
			0, out.numYTiles (level) - 1,
 | 
			
		||||
			level);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaMIP2 (const char fileName[],
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with mipmap levels using a tile-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             MIPMAP_LEVELS,		// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (tileHeight, tileWidth);
 | 
			
		||||
 | 
			
		||||
    for (int level = 0; level < out.numLevels (); ++level)
 | 
			
		||||
    {
 | 
			
		||||
        for (int tileY = 0; tileY < out.numYTiles (level); ++tileY)
 | 
			
		||||
        {
 | 
			
		||||
            for (int tileX = 0; tileX < out.numXTiles (level); ++tileX)
 | 
			
		||||
            {
 | 
			
		||||
                Box2i range = out.dataWindowForTile (tileX, tileY, level);
 | 
			
		||||
 | 
			
		||||
                drawImage4 (pixels,
 | 
			
		||||
			    out.levelWidth (level), out.levelHeight (level),
 | 
			
		||||
                            range.min.x, range.max.x + 1,
 | 
			
		||||
                            range.min.y, range.max.y + 1,
 | 
			
		||||
                            level, level);
 | 
			
		||||
 | 
			
		||||
                out.setFrameBuffer (&pixels[-range.min.y][-range.min.x],
 | 
			
		||||
                                    1,		// xStride
 | 
			
		||||
                                    tileWidth);	// yStride
 | 
			
		||||
 | 
			
		||||
                out.writeTile (tileX, tileY, level);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaRIP1 (const char fileName[],
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with ripmap levels using an image-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             RIPMAP_LEVELS,		// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (height, width);
 | 
			
		||||
    out.setFrameBuffer (&pixels[0][0], 1, width);
 | 
			
		||||
 | 
			
		||||
    for (int yLevel = 0; yLevel < out.numYLevels (); ++yLevel)
 | 
			
		||||
    {
 | 
			
		||||
        for (int xLevel = 0; xLevel < out.numXLevels (); ++xLevel)
 | 
			
		||||
        {
 | 
			
		||||
            drawImage5 (pixels,
 | 
			
		||||
			out.levelWidth (xLevel), out.levelHeight (yLevel),
 | 
			
		||||
                        0, out.levelWidth (xLevel),
 | 
			
		||||
			0, out.levelHeight (yLevel),
 | 
			
		||||
			xLevel, yLevel);
 | 
			
		||||
 | 
			
		||||
	    out.writeTiles (0, out.numXTiles (xLevel) - 1,
 | 
			
		||||
			    0, out.numYTiles (yLevel) - 1,
 | 
			
		||||
			    xLevel,
 | 
			
		||||
			    yLevel);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
writeTiledRgbaRIP2 (const char fileName[],
 | 
			
		||||
                    int width, int height,
 | 
			
		||||
                    int tileWidth, int tileHeight)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Write a tiled image with ripmap levels using a tile-sized framebuffer.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    TiledRgbaOutputFile out (fileName,
 | 
			
		||||
                             width, height,		// image size
 | 
			
		||||
                             tileWidth, tileHeight,	// tile size
 | 
			
		||||
                             RIPMAP_LEVELS,		// level mode
 | 
			
		||||
			     ROUND_DOWN,		// rounding mode
 | 
			
		||||
                             WRITE_RGBA);		// channels in file
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (tileHeight, tileWidth);
 | 
			
		||||
 | 
			
		||||
    for (int yLevel = 0; yLevel < out.numYLevels(); ++yLevel)
 | 
			
		||||
    {
 | 
			
		||||
        for (int xLevel = 0; xLevel < out.numXLevels(); ++xLevel)
 | 
			
		||||
        {
 | 
			
		||||
            for (int tileY = 0; tileY < out.numYTiles (yLevel); ++tileY)
 | 
			
		||||
            {
 | 
			
		||||
                for (int tileX = 0; tileX < out.numXTiles (xLevel); ++tileX)
 | 
			
		||||
                {
 | 
			
		||||
                    Box2i range = out.dataWindowForTile (tileX, tileY,
 | 
			
		||||
							 xLevel, yLevel);
 | 
			
		||||
 | 
			
		||||
                    drawImage5 (pixels ,
 | 
			
		||||
				out.levelWidth(xLevel), out.levelHeight(yLevel),
 | 
			
		||||
                                range.min.x, range.max.x + 1,
 | 
			
		||||
                                range.min.y, range.max.y + 1,
 | 
			
		||||
                                xLevel, yLevel);
 | 
			
		||||
 | 
			
		||||
                    out.setFrameBuffer (&pixels[-range.min.y][-range.min.x],
 | 
			
		||||
                                        1,		// xStride
 | 
			
		||||
                                        tileWidth);	// yStride
 | 
			
		||||
 | 
			
		||||
                    out.writeTile (tileX, tileY, xLevel, yLevel);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readTiledRgba1 (const char fileName[],
 | 
			
		||||
                Array2D<Rgba> &pixels,
 | 
			
		||||
                int &width,
 | 
			
		||||
                int &height)
 | 
			
		||||
{
 | 
			
		||||
    TiledRgbaInputFile in (fileName);
 | 
			
		||||
    Box2i dw = in.dataWindow();
 | 
			
		||||
 | 
			
		||||
    width  = dw.max.x - dw.min.x + 1;
 | 
			
		||||
    height = dw.max.y - dw.min.y + 1;
 | 
			
		||||
    int dx = dw.min.x;
 | 
			
		||||
    int dy = dw.min.y;
 | 
			
		||||
 | 
			
		||||
    pixels.resizeErase (height, width);
 | 
			
		||||
 | 
			
		||||
    in.setFrameBuffer (&pixels[-dy][-dx], 1, width);
 | 
			
		||||
    in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
rgbaInterfaceTiledExamples ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "\nRGBA tiled images\n" << endl;
 | 
			
		||||
 | 
			
		||||
    const int tw = 100;
 | 
			
		||||
    const int th = 75;
 | 
			
		||||
    int w = 600;
 | 
			
		||||
    int h = 400;
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled image with image-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    Array2D<Rgba> pixels (h, w);
 | 
			
		||||
    drawImage3 (pixels, w, h, 0, w, 0, h, 0);
 | 
			
		||||
    writeTiledRgbaONE1 ("tiledrgba1.exr", &pixels[0][0], w, h, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled image with tile-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiledRgbaONE2 ("tiledrgba2.exr", w, h, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled mipmap image with image-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiledRgbaMIP1 ("tiledrgba3.exr", 512, 512, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled mipmap image with tile-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiledRgbaMIP2 ("tiledrgba4.exr", 512, 512, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled ripmap image with image-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiledRgbaRIP1 ("tiledrgba5.exr", 256, 256, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "writing tiled ripmap image with tile-size framebuffer" << endl;
 | 
			
		||||
 | 
			
		||||
    writeTiledRgbaRIP2 ("tiledrgba6.exr", 256, 256, tw, th);
 | 
			
		||||
 | 
			
		||||
    cout << "reading tiled rgba file" << endl;
 | 
			
		||||
 | 
			
		||||
    readTiledRgba1 ("tiledrgba1.exr", pixels, w, h);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void rgbaInterfaceTiledExamples ();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user