Disabled external gits
This commit is contained in:
		
							
								
								
									
										17
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
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
 | 
			
		||||
CVS
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
 | 
			
		||||
ADD_EXECUTABLE ( exrdisplay
 | 
			
		||||
	main.cpp 
 | 
			
		||||
	ImageView.cpp
 | 
			
		||||
	ImageView.h
 | 
			
		||||
	loadImage.cpp
 | 
			
		||||
	loadImage.h
 | 
			
		||||
	scaleImage.cpp
 | 
			
		||||
	scaleImage.h
 | 
			
		||||
	applyCtl.cpp
 | 
			
		||||
	applyCtl.h
 | 
			
		||||
	GlWindow3d.h
 | 
			
		||||
	GlWindow3d.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INCLUDE_DIRECTORIES ( 
 | 
			
		||||
	${FLTK_INCLUDE_DIR}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
TARGET_LINK_LIBRARIES ( exrdisplay
 | 
			
		||||
	IlmImf${OPENEXR_LIBSUFFIX}
 | 
			
		||||
	Iex${ILMBASE_LIBSUFFIX}
 | 
			
		||||
	Half
 | 
			
		||||
	${FLTK_LIBRARIES}
 | 
			
		||||
	${OPENGL_LIBRARIES}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INSTALL ( TARGETS
 | 
			
		||||
	exrdisplay
 | 
			
		||||
	DESTINATION
 | 
			
		||||
	${CMAKE_INSTALL_PREFIX}/bin
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										400
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/GlWindow3d.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/GlWindow3d.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,400 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//        class GlWindow3d -- reconstructs deep image in a 3D OpenGl window
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "GlWindow3d.h"
 | 
			
		||||
#include <FL/fl_draw.H>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
using std::max;
 | 
			
		||||
using std::min;
 | 
			
		||||
using std::cout;
 | 
			
		||||
using std::endl;
 | 
			
		||||
using std::cerr;
 | 
			
		||||
 | 
			
		||||
GlWindow::GlWindow (int x,int y,
 | 
			
		||||
                    int w,int h,
 | 
			
		||||
                    const char *l,
 | 
			
		||||
                    const IMF::Rgba pixels[],
 | 
			
		||||
                    float* dataZ[],
 | 
			
		||||
                    unsigned int sampleCount[],
 | 
			
		||||
                    int dx, int dy,
 | 
			
		||||
                    float zmax, float zmin,
 | 
			
		||||
                    float farPlane)
 | 
			
		||||
:
 | 
			
		||||
    Fl_Gl_Window (x,y,w,h,l),
 | 
			
		||||
    _rawPixels (pixels),
 | 
			
		||||
    _dataZ (dataZ),
 | 
			
		||||
    _sampleCount (sampleCount),
 | 
			
		||||
    _dx (dx),
 | 
			
		||||
    _dy (dy),
 | 
			
		||||
    _zmax (zmax),
 | 
			
		||||
    _zmin (zmin),
 | 
			
		||||
    _farPlane (farPlane)
 | 
			
		||||
{
 | 
			
		||||
    Fl::add_timeout (FPS, Timer_CallBack, (void*)this);       // 24fps timer
 | 
			
		||||
 | 
			
		||||
    // check zmax and zmin
 | 
			
		||||
    if (zmax < zmin)
 | 
			
		||||
    {
 | 
			
		||||
        cerr << "z max: "<< zmax << ", z min: " << zmin << endl;
 | 
			
		||||
        cerr << "z value bound error" << endl;
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _fitTran = -(_zmax + _zmin) / 2.0;
 | 
			
		||||
    _fitScale = 1.0;
 | 
			
		||||
 | 
			
		||||
    if (_zmax != _zmin)
 | 
			
		||||
        _fitScale = 1.0 / (_zmax - _zmin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GlWindow::~GlWindow ()
 | 
			
		||||
{
 | 
			
		||||
    for (int y = 0; y < _dy; y++)
 | 
			
		||||
    {
 | 
			
		||||
        for (int x = 0; x < _dx; x++)
 | 
			
		||||
        {
 | 
			
		||||
            delete _dataZ[y * _dx + x];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete [] _sampleCount;
 | 
			
		||||
    delete [] _rawPixels;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
GlWindow::Perspective (GLdouble focal, GLdouble aspect,
 | 
			
		||||
                       GLdouble zNear, GLdouble zFar)
 | 
			
		||||
{
 | 
			
		||||
    GLdouble xmin, xmax, ymin, ymax;
 | 
			
		||||
    ymax = zNear * tan (focal * M_PI / 360.0);
 | 
			
		||||
    ymin = -ymax;
 | 
			
		||||
    xmin = ymin * aspect;
 | 
			
		||||
    xmax = ymax * aspect;
 | 
			
		||||
    glFrustum (xmin, xmax, ymin, ymax, zNear, zFar);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
GlWindow::ReshapeViewport()
 | 
			
		||||
{
 | 
			
		||||
    glViewport (0, 0, w(), h());
 | 
			
		||||
 | 
			
		||||
    glMatrixMode (GL_PROJECTION);
 | 
			
		||||
    glLoadIdentity();
 | 
			
		||||
    GLfloat ratio = w() / h();
 | 
			
		||||
    Perspective(min (max (30.0 + _zoom, 1.0), 179.0),
 | 
			
		||||
                1.0 * ratio, 1.0, _farPlane);
 | 
			
		||||
    glTranslatef(0.0, 0.0, -8.0);
 | 
			
		||||
 | 
			
		||||
    glMatrixMode (GL_MODELVIEW);
 | 
			
		||||
    glLoadIdentity();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
GlWindow::GlInit()
 | 
			
		||||
{
 | 
			
		||||
    glShadeModel (GL_FLAT);
 | 
			
		||||
 | 
			
		||||
    _zoom = 0;
 | 
			
		||||
    _translateX = 0;
 | 
			
		||||
    _translateY = 0;
 | 
			
		||||
    _scaleZ = 1.0;
 | 
			
		||||
    _elevation = 0;
 | 
			
		||||
    _azimuth = 0;
 | 
			
		||||
    _inverted = 0;
 | 
			
		||||
    _displayFactor = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawRefPlan()
 | 
			
		||||
{
 | 
			
		||||
    glBegin (GL_LINES);
 | 
			
		||||
    glColor3f (0.6, 0.6, 0.6);
 | 
			
		||||
    for (int i = 0; i <= 10; i++)
 | 
			
		||||
    {
 | 
			
		||||
        glVertex3f (1.0 - 0.2 * i, 0.0, 1.0);
 | 
			
		||||
        glVertex3f (1.0 - 0.2 * i, 0.0, -1.0);
 | 
			
		||||
        glVertex3f (1.0, 0.0, 1.0 - 0.2 * i);
 | 
			
		||||
        glVertex3f (-1.0, 0.0, 1.0 - 0.2 * i);
 | 
			
		||||
    }
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin (GL_LINES);
 | 
			
		||||
    glColor3f (0.3, 0.3, 0.3);
 | 
			
		||||
    glVertex3f (0.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (0.0, 0.0, -1.0);
 | 
			
		||||
    glVertex3f (1.0, 0.0, 0.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 0.0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawCoord()
 | 
			
		||||
{
 | 
			
		||||
    glBegin (GL_LINES);
 | 
			
		||||
    glColor3f (0.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 0.8);
 | 
			
		||||
 | 
			
		||||
    glColor3f (1.0, 0.0, 0.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (-0.8, 0.0, 1.0);
 | 
			
		||||
 | 
			
		||||
    glColor3f (0.0, 1.0, 0.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.2, 1.0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glPointSize(6);
 | 
			
		||||
    glBegin (GL_POINTS);
 | 
			
		||||
    glColor3f (1.0, 1.0, 0.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 1.0);
 | 
			
		||||
 | 
			
		||||
    glColor3f (0.0, 0.0, 1.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.0, 0.8);
 | 
			
		||||
 | 
			
		||||
    glColor3f (1.0, 0.0, 0.0);
 | 
			
		||||
    glVertex3f (-0.8, 0.0, 1.0);
 | 
			
		||||
 | 
			
		||||
    glColor3f (0.0, 1.0, 0.0);
 | 
			
		||||
    glVertex3f (-1.0, 0.2, 1.0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawOutLine(float dx, float dy, float z)
 | 
			
		||||
{
 | 
			
		||||
    glBegin (GL_LINE_LOOP);
 | 
			
		||||
    glColor3f (0.6, 0.0, 0.6);
 | 
			
		||||
    glVertex3f (0, 0, z);
 | 
			
		||||
    glVertex3f (0, dy, z);
 | 
			
		||||
    glVertex3f (dx, dy, z);
 | 
			
		||||
    glVertex3f (dx, 0, z);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
GlWindow::draw()
 | 
			
		||||
{
 | 
			
		||||
    if ( !valid() )
 | 
			
		||||
    {
 | 
			
		||||
        valid (1);
 | 
			
		||||
        GlInit();
 | 
			
		||||
    }
 | 
			
		||||
    ReshapeViewport();
 | 
			
		||||
    glClearColor (.5,.5,.5, 0.0);
 | 
			
		||||
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 | 
			
		||||
    glLoadIdentity();
 | 
			
		||||
 | 
			
		||||
    glTranslatef (_translateX, 0.0, 0.0);
 | 
			
		||||
    glTranslatef (0.0, -_translateY, 0.0);
 | 
			
		||||
 | 
			
		||||
    glRotatef (_elevation, 1.0, 0.0, 0.0);
 | 
			
		||||
    glRotatef (_azimuth, 0.0, 1.0, 0.0);
 | 
			
		||||
 | 
			
		||||
    // draw the reference plane
 | 
			
		||||
    drawRefPlan();
 | 
			
		||||
 | 
			
		||||
    // draw the coordinate
 | 
			
		||||
    drawCoord();
 | 
			
		||||
 | 
			
		||||
    // scale z value
 | 
			
		||||
    glScalef (1.0, 1.0, _scaleZ);
 | 
			
		||||
 | 
			
		||||
    // display the objects
 | 
			
		||||
    // move the objects to the center of display
 | 
			
		||||
    glScalef (1.0 / _dx, 1.0 / _dx, 1.0 / 2.0);
 | 
			
		||||
    glTranslatef (-_dx / 2.0, -_dy / 2.0, 0.0);
 | 
			
		||||
 | 
			
		||||
    glScalef (1.0, 1.0, _fitScale);
 | 
			
		||||
    glTranslatef (0.0, 0.0, -_fitTran);
 | 
			
		||||
 | 
			
		||||
    // loop dataZ to draw points
 | 
			
		||||
    glPointSize (2);
 | 
			
		||||
 | 
			
		||||
    glBegin (GL_POINTS);
 | 
			
		||||
    glColor3f (0.0, 1.0, 1.0);
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < _dy; y++)
 | 
			
		||||
    {
 | 
			
		||||
        for (int x = 0; x < _dx; x++)
 | 
			
		||||
        {
 | 
			
		||||
            if( x % (10 * _displayFactor) == 0 && y % (10 * _displayFactor) == 0)
 | 
			
		||||
            {
 | 
			
		||||
                float* z = _dataZ[y * _dx + x];
 | 
			
		||||
                unsigned int count = _sampleCount[y * _dx + x];
 | 
			
		||||
 | 
			
		||||
                for (unsigned int i = 0; i < count; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    float val = z[i];
 | 
			
		||||
                    glVertex3f (float(x), _dy - float(y) -1, -val);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    // draw the display window OutLine
 | 
			
		||||
    drawOutLine (_dx, _dy, -(_zmax + _zmin) / 2.0);
 | 
			
		||||
 | 
			
		||||
    // Check gl errors
 | 
			
		||||
    GLenum err = glGetError();
 | 
			
		||||
    if ( err != GL_NO_ERROR )
 | 
			
		||||
    {
 | 
			
		||||
        cerr << "GLGETERROR = " << (int)err << endl;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
GlWindow::handle (int event)
 | 
			
		||||
{
 | 
			
		||||
    if (Fl::event_button() == FL_LEFT_MOUSE)
 | 
			
		||||
    {
 | 
			
		||||
        switch (event)
 | 
			
		||||
        {
 | 
			
		||||
            case FL_PUSH:
 | 
			
		||||
                _mouseStartX = Fl::event_x();
 | 
			
		||||
                _mouseStartY = Fl::event_y();
 | 
			
		||||
 | 
			
		||||
                if (fabs(_elevation) > 90.0)
 | 
			
		||||
                {
 | 
			
		||||
                    _inverted = 1;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    _inverted = 0;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case FL_DRAG:
 | 
			
		||||
            case FL_RELEASE:
 | 
			
		||||
            {
 | 
			
		||||
                int x = Fl::event_x();
 | 
			
		||||
                int y = Fl::event_y();
 | 
			
		||||
 | 
			
		||||
                if (_inverted)
 | 
			
		||||
                {
 | 
			
		||||
                    _azimuth -= (double)(x - _mouseStartX) * 0.2;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    _azimuth += (double)(x - _mouseStartX) * 0.2;
 | 
			
		||||
                }
 | 
			
		||||
                _elevation += (double)(y - _mouseStartY) * 0.2;
 | 
			
		||||
 | 
			
		||||
                while (_elevation < -180.0)
 | 
			
		||||
                    _elevation += 360.0;
 | 
			
		||||
                while (_elevation > 180.0)
 | 
			
		||||
                    _elevation -= 360.0;
 | 
			
		||||
 | 
			
		||||
                _mouseStartX = x;
 | 
			
		||||
                _mouseStartY = y;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( Fl::event_button() == FL_MIDDLE_MOUSE )
 | 
			
		||||
    {
 | 
			
		||||
        switch (event)
 | 
			
		||||
        {
 | 
			
		||||
            case FL_PUSH:
 | 
			
		||||
                fl_cursor (FL_CURSOR_MOVE);
 | 
			
		||||
                break;
 | 
			
		||||
            case FL_RELEASE:
 | 
			
		||||
                fl_cursor (FL_CURSOR_DEFAULT);
 | 
			
		||||
                break;
 | 
			
		||||
            case FL_DRAG:
 | 
			
		||||
                int x = Fl::event_x();
 | 
			
		||||
                int y = Fl::event_y();
 | 
			
		||||
                _translateX += (x - _mouseX) * 0.01;
 | 
			
		||||
                _translateY += (y - _mouseY) * 0.01;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( event == FL_DRAG && Fl::event_button() == FL_RIGHT_MOUSE )
 | 
			
		||||
    {
 | 
			
		||||
       int x = Fl::event_x();
 | 
			
		||||
       int dx = x - _mouseX;
 | 
			
		||||
       int delta = -dx;
 | 
			
		||||
       _zoom += delta * 0.2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _mouseX = Fl::event_x();
 | 
			
		||||
    _mouseY = Fl::event_y();
 | 
			
		||||
 | 
			
		||||
    if (event == FL_KEYUP)
 | 
			
		||||
    {
 | 
			
		||||
        const char* text = Fl::event_text();
 | 
			
		||||
        if (!strcmp (text, "A")) //scale up
 | 
			
		||||
        {
 | 
			
		||||
            _scaleZ *= 1.2;
 | 
			
		||||
        }
 | 
			
		||||
        if (!strcmp (text, "S")) //scale down
 | 
			
		||||
        {
 | 
			
		||||
            _scaleZ /= 1.2;
 | 
			
		||||
        }
 | 
			
		||||
        if (!strcmp (text, "F")) //fit
 | 
			
		||||
        {
 | 
			
		||||
            GlInit();
 | 
			
		||||
        }
 | 
			
		||||
        if (!strcmp (text, "D")) //decrease pixel samples
 | 
			
		||||
        {
 | 
			
		||||
            _displayFactor *= 2;
 | 
			
		||||
            if (_displayFactor > (_dx/10) || _displayFactor > (_dy/10) )
 | 
			
		||||
                _displayFactor /= 2;
 | 
			
		||||
        }
 | 
			
		||||
        if (!strcmp (text, "C")) //increase pixel samples
 | 
			
		||||
        {
 | 
			
		||||
            _displayFactor /= 2;
 | 
			
		||||
            if (_displayFactor < 1)
 | 
			
		||||
                _displayFactor = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Fl_Gl_Window::handle (event);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										119
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/GlWindow3d.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/GlWindow3d.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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 INCLUDED_GLWINDOW3D_H
 | 
			
		||||
#define INCLUDED_GLWINDOW3D_H
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//        class GlWindow3d -- reconstructs deep image in a 3D OpenGl window
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <FL/Fl.H>
 | 
			
		||||
#include <FL/Fl_Window.H>
 | 
			
		||||
#include <FL/Fl_Gl_Window.H>
 | 
			
		||||
#include <FL/gl.h>
 | 
			
		||||
 | 
			
		||||
#include <ImfRgba.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
#include <ImfNamespace.h>
 | 
			
		||||
 | 
			
		||||
#define FPS (1.0/24.0)  // frames per second
 | 
			
		||||
 | 
			
		||||
class GlWindow : public Fl_Gl_Window
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    GlWindow (int x,int y,
 | 
			
		||||
              int w,int h,
 | 
			
		||||
              const char *l,
 | 
			
		||||
              const IMF::Rgba pixels[],
 | 
			
		||||
              float* dataZ[],
 | 
			
		||||
              unsigned int sampleCount[],
 | 
			
		||||
              int dx, int dy, // data window
 | 
			
		||||
              float zmax, float zmin,
 | 
			
		||||
              float farPlane  // zfar plane in Deep 3D window
 | 
			
		||||
              );
 | 
			
		||||
    ~GlWindow ();
 | 
			
		||||
 | 
			
		||||
    void Perspective (GLdouble focal, GLdouble aspect,
 | 
			
		||||
                      GLdouble zNear, GLdouble zFar);
 | 
			
		||||
    void ReshapeViewport();
 | 
			
		||||
    void GlInit();
 | 
			
		||||
    void draw();
 | 
			
		||||
    int handle (int event);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    const IMF::Rgba *                    _rawPixels;
 | 
			
		||||
    float**                              _dataZ;
 | 
			
		||||
    unsigned int *                       _sampleCount;
 | 
			
		||||
    int                                  _dx;
 | 
			
		||||
    int                                  _dy;
 | 
			
		||||
    float                                _zmax;
 | 
			
		||||
    float                                _zmin;
 | 
			
		||||
    float                                _farPlane;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    double      _zoom;
 | 
			
		||||
    double      _translateX;
 | 
			
		||||
    double      _translateY;
 | 
			
		||||
    double      _scaleZ;
 | 
			
		||||
    double      _fitTran;
 | 
			
		||||
    double      _fitScale;
 | 
			
		||||
    double      _elevation;     // for rotation
 | 
			
		||||
    double      _azimuth;       // for rotation
 | 
			
		||||
    int         _mouseX;
 | 
			
		||||
    int         _mouseY;
 | 
			
		||||
    int         _mouseStartX;
 | 
			
		||||
    int         _mouseStartY;
 | 
			
		||||
    int         _inverted;      // for rotation
 | 
			
		||||
    int         _displayFactor; // for display pixel samples
 | 
			
		||||
 | 
			
		||||
    // TIMER CALLBACK
 | 
			
		||||
    // Handles rotation of the object
 | 
			
		||||
    //
 | 
			
		||||
    static void Timer_CallBack (void *data)
 | 
			
		||||
    {
 | 
			
		||||
        GlWindow *glwin = (GlWindow*)data;
 | 
			
		||||
        glwin->redraw();
 | 
			
		||||
        Fl::repeat_timeout(FPS, Timer_CallBack, data);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										718
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/ImageView.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										718
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/ImageView.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,718 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	class ImageView
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "ImageView.h"
 | 
			
		||||
 | 
			
		||||
#include <ImathMath.h>
 | 
			
		||||
#include <ImathFun.h>
 | 
			
		||||
#include <ImathLimits.h>
 | 
			
		||||
#include <halfFunction.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#if defined PLATFORM_WINDOWS || defined _WIN32
 | 
			
		||||
    #include <windows.h>
 | 
			
		||||
    #include <FL/Fl.H>
 | 
			
		||||
    #include <GL/gl.h>
 | 
			
		||||
#elif defined __APPLE__
 | 
			
		||||
    #include <FL/Fl.H>
 | 
			
		||||
    #include <OpenGL/gl.h>
 | 
			
		||||
#else
 | 
			
		||||
    #include <FL/Fl.H>
 | 
			
		||||
    #include <GL/gl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using std::min;
 | 
			
		||||
using std::max;
 | 
			
		||||
using std::cout;
 | 
			
		||||
using std::endl;
 | 
			
		||||
using std::cerr;
 | 
			
		||||
using namespace IMATH;
 | 
			
		||||
 | 
			
		||||
ImageView::ImageView (int x, int y,
 | 
			
		||||
                      int w, int h,
 | 
			
		||||
                      const char label[],
 | 
			
		||||
                      const IMF::Rgba pixels[],
 | 
			
		||||
                      float* dataZ[],
 | 
			
		||||
                      unsigned int sampleCount[],
 | 
			
		||||
                      int zsize,
 | 
			
		||||
                      int dw, int dh,
 | 
			
		||||
                      int dx, int dy,
 | 
			
		||||
                      Fl_Box *rgbaBox,
 | 
			
		||||
                      float farPlane,
 | 
			
		||||
                      float gamma,
 | 
			
		||||
                      float exposure,
 | 
			
		||||
                      float defog,
 | 
			
		||||
                      float kneeLow,
 | 
			
		||||
                      float kneeHigh)
 | 
			
		||||
:
 | 
			
		||||
    Fl_Gl_Window (x, y, w, h, label),
 | 
			
		||||
    _gamma (gamma),
 | 
			
		||||
    _exposure (exposure),
 | 
			
		||||
    _defog (defog),
 | 
			
		||||
    _kneeLow (kneeLow),
 | 
			
		||||
    _kneeHigh (kneeHigh),
 | 
			
		||||
    _rawPixels (pixels),
 | 
			
		||||
    _dataZ (dataZ),
 | 
			
		||||
    _sampleCount (sampleCount),
 | 
			
		||||
    _fogR (0),
 | 
			
		||||
    _fogG (0),
 | 
			
		||||
    _fogB (0),
 | 
			
		||||
    _farPlane (farPlane),
 | 
			
		||||
    _dw (dw),
 | 
			
		||||
    _dh (dh),
 | 
			
		||||
    _dx (dx),
 | 
			
		||||
    _dy (dy),
 | 
			
		||||
    _zsize (zsize),
 | 
			
		||||
    _rgbaBox (rgbaBox),
 | 
			
		||||
    _screenPixels (dw * dh * 3)
 | 
			
		||||
{
 | 
			
		||||
    computeFogColor();
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // initialize z value chart
 | 
			
		||||
    //
 | 
			
		||||
    _chartwin = new Fl_Window (600, 300);
 | 
			
		||||
    _chartwin->label("Deep Pixel Display");
 | 
			
		||||
 | 
			
		||||
    _chart = new Fl_Chart (20, 20,
 | 
			
		||||
                           _chartwin->w()-40,
 | 
			
		||||
                           _chartwin->h()-40,
 | 
			
		||||
                           "Sample #");
 | 
			
		||||
    _chartMax = new Fl_Chart (20, 20,
 | 
			
		||||
                           _chartwin->w()-40,
 | 
			
		||||
                           _chartwin->h()-40,
 | 
			
		||||
                           "");
 | 
			
		||||
    _chartMin = new Fl_Chart (20, 20,
 | 
			
		||||
                           _chartwin->w()-40,
 | 
			
		||||
                           _chartwin->h()-40,
 | 
			
		||||
                           "");
 | 
			
		||||
 | 
			
		||||
    findZbound();
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // initialize Deep 3d window
 | 
			
		||||
    //
 | 
			
		||||
    _gl3d = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::setExposure (float exposure)
 | 
			
		||||
{
 | 
			
		||||
    _exposure = exposure;
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
    redraw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::setDefog (float defog)
 | 
			
		||||
{
 | 
			
		||||
    _defog = defog;
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
    redraw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::setKneeLow (float kneeLow)
 | 
			
		||||
{
 | 
			
		||||
    _kneeLow = kneeLow;
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
    redraw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::findZbound()
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // find zmax and zmin values of deep data to set bound
 | 
			
		||||
    //
 | 
			
		||||
    float zmax  = limits<float>::min();
 | 
			
		||||
    float zmin = limits<float>::max();
 | 
			
		||||
    _maxCount = 0;
 | 
			
		||||
 | 
			
		||||
    for (int k = 0; k < _zsize; k++)
 | 
			
		||||
    {
 | 
			
		||||
        float* z = _dataZ[k];
 | 
			
		||||
        unsigned int count = _sampleCount[k];
 | 
			
		||||
 | 
			
		||||
        if (_maxCount < count)
 | 
			
		||||
            _maxCount = count;
 | 
			
		||||
 | 
			
		||||
        for (unsigned int i = 0; i < count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            double val = double(z[i]);
 | 
			
		||||
            if (val > zmax && val < _farPlane)
 | 
			
		||||
                zmax = val;
 | 
			
		||||
            if (val < zmin)
 | 
			
		||||
                zmin = val;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( zmax > zmin)
 | 
			
		||||
    {
 | 
			
		||||
        cout << "z max: "<< zmax << ", z min: " << zmin << endl;
 | 
			
		||||
        _chart->bounds (zmin, zmax);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _zmax = zmax;
 | 
			
		||||
    _zmin = zmin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::setPixels(const IMF::Rgba pixels[/* w*h */],
 | 
			
		||||
                     float* dataZ[/* w*h */],
 | 
			
		||||
                     unsigned int sampleCount[/* w*h */],
 | 
			
		||||
                     int zsize,
 | 
			
		||||
                     int dw, int dh, int dx, int dy)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // update data of imageview
 | 
			
		||||
    //
 | 
			
		||||
    _rawPixels = pixels;
 | 
			
		||||
    _dw = dw;
 | 
			
		||||
    _dh = dh;
 | 
			
		||||
    _dx = dx;
 | 
			
		||||
    _dy = dy;
 | 
			
		||||
    _dataZ = dataZ;
 | 
			
		||||
    _sampleCount = sampleCount;
 | 
			
		||||
    _zsize = zsize;
 | 
			
		||||
 | 
			
		||||
    _screenPixels.resizeErase(dw*dh*3);
 | 
			
		||||
 | 
			
		||||
    findZbound();
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // update Deep 3d window
 | 
			
		||||
    //
 | 
			
		||||
    GlWindow* temp;
 | 
			
		||||
    temp = _gl3d;
 | 
			
		||||
    _gl3d = NULL;
 | 
			
		||||
 | 
			
		||||
    if (_gl3d != NULL){
 | 
			
		||||
        delete temp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
    redraw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::clearDataDisplay()
 | 
			
		||||
{
 | 
			
		||||
    _chart->clear();
 | 
			
		||||
 | 
			
		||||
    if (_gl3d != NULL)
 | 
			
		||||
        _gl3d->hide();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::setKneeHigh (float kneeHigh)
 | 
			
		||||
{
 | 
			
		||||
    _kneeHigh = kneeHigh;
 | 
			
		||||
    updateScreenPixels();
 | 
			
		||||
    redraw();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::draw()
 | 
			
		||||
{
 | 
			
		||||
    if (!valid())
 | 
			
		||||
    {
 | 
			
		||||
        glLoadIdentity();
 | 
			
		||||
        glViewport (0, 0, w(), h());
 | 
			
		||||
        glOrtho(0, w(), h(), 0, -1, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    glClearColor (0.3, 0.3, 0.3, 1.0);
 | 
			
		||||
    glClear (GL_COLOR_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
    if (_dx + _dw <= 0 || _dx >= w())
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < _dh; ++y)
 | 
			
		||||
    {
 | 
			
		||||
        if (y + _dy < 0 || y + _dy >= h())
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        glRasterPos2i (max (0, _dx), y + _dy + 1);
 | 
			
		||||
 | 
			
		||||
        glDrawPixels (_dw + min (0, _dx),			     // width
 | 
			
		||||
                      1,					     // height
 | 
			
		||||
                      GL_RGB,					     // format
 | 
			
		||||
                      GL_UNSIGNED_BYTE,				     // type
 | 
			
		||||
                      _screenPixels +				     // pixels
 | 
			
		||||
                      static_cast <ptrdiff_t> ((y * _dw - min (0, _dx)) * 3));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::computeFogColor ()
 | 
			
		||||
{
 | 
			
		||||
    _fogR = 0;
 | 
			
		||||
    _fogG = 0;
 | 
			
		||||
    _fogB = 0;
 | 
			
		||||
 | 
			
		||||
    for (int j = 0; j < _dw * _dh; ++j)
 | 
			
		||||
    {
 | 
			
		||||
        const IMF::Rgba &rp = _rawPixels[j];
 | 
			
		||||
 | 
			
		||||
        if (rp.r.isFinite())
 | 
			
		||||
            _fogR += rp.r;
 | 
			
		||||
 | 
			
		||||
        if (rp.g.isFinite())
 | 
			
		||||
            _fogG += rp.g;
 | 
			
		||||
 | 
			
		||||
        if (rp.b.isFinite())
 | 
			
		||||
            _fogB += rp.b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _fogR /= _dw * _dh;
 | 
			
		||||
    _fogG /= _dw * _dh;
 | 
			
		||||
    _fogB /= _dw * _dh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::drawChart (int x, int y, bool initChart)
 | 
			
		||||
{
 | 
			
		||||
    if (x >= 0 && x < w() && y >= 0 && y < h())
 | 
			
		||||
    {
 | 
			
		||||
        int px = x - _dx;
 | 
			
		||||
        int py = y - _dy;
 | 
			
		||||
 | 
			
		||||
        if (px >= 0 && px < _dw && py >= 0 && py < _dh)
 | 
			
		||||
        {
 | 
			
		||||
            float* z = _dataZ[py * _dw + px];
 | 
			
		||||
            unsigned int count = _sampleCount[py * _dw + px];
 | 
			
		||||
 | 
			
		||||
            cout << "\nsample Count: " << count << endl;
 | 
			
		||||
            cout << "x: " << px << ", y: " << py << endl;
 | 
			
		||||
 | 
			
		||||
            for (unsigned int i = 0; i < count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                printf ("pixel Z value  %d: %.3f\n", i, float(z[i]));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const IMF::Rgba &p = _rawPixels[py * _dw + px];
 | 
			
		||||
 | 
			
		||||
            cout << "R = " << p.r << ", G = " << p.g << ","
 | 
			
		||||
            " B = " << p.b <<endl;
 | 
			
		||||
 | 
			
		||||
            //
 | 
			
		||||
            // draw the chart
 | 
			
		||||
            //
 | 
			
		||||
            drawChartRef();
 | 
			
		||||
 | 
			
		||||
            for (unsigned int i = 0; i < count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                double val = double(z[i]);
 | 
			
		||||
                if (val < _farPlane)
 | 
			
		||||
                {
 | 
			
		||||
                    static char val_str[20];
 | 
			
		||||
                    sprintf (val_str, "%.3lf", val);
 | 
			
		||||
                    _chart->add (val, val_str, FL_BLUE);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            redraw();
 | 
			
		||||
 | 
			
		||||
            if (initChart)
 | 
			
		||||
            {
 | 
			
		||||
                _chartwin->resizable (_chartwin);
 | 
			
		||||
                _chartwin->set_non_modal(); // make chart on top
 | 
			
		||||
 | 
			
		||||
                if (!_chartwin->shown())
 | 
			
		||||
                    _chartwin->show();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::drawChartRef ()
 | 
			
		||||
{
 | 
			
		||||
    _chart->clear();
 | 
			
		||||
    _chart->bounds(_zmin, _zmax);
 | 
			
		||||
 | 
			
		||||
    _chart->type (FL_LINE_CHART);
 | 
			
		||||
    _chart->label("Sample #");
 | 
			
		||||
 | 
			
		||||
    _chartMax->clear();
 | 
			
		||||
    _chartMax->type (FL_SPIKE_CHART);
 | 
			
		||||
    static char val_str[20];
 | 
			
		||||
    sprintf (val_str, "Zmax : %.3lf", _zmax);
 | 
			
		||||
    _chartMax->label(val_str);
 | 
			
		||||
    _chartMax->align(FL_ALIGN_TOP_LEFT);
 | 
			
		||||
    _chartMax->box(FL_NO_BOX);
 | 
			
		||||
 | 
			
		||||
    _chartMin->clear();
 | 
			
		||||
    _chartMin->type (FL_SPIKE_CHART);
 | 
			
		||||
    static char val_str1[20];
 | 
			
		||||
    sprintf (val_str1, "Zmin : %.3lf", _zmin);
 | 
			
		||||
    _chartMin->label(val_str1);
 | 
			
		||||
    _chartMin->align(FL_ALIGN_BOTTOM_LEFT);
 | 
			
		||||
    _chartMin->box(FL_NO_BOX);
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ImageView::handle (int event)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    if (event == FL_PUSH)
 | 
			
		||||
    {
 | 
			
		||||
        // We want to get the other associated events for this widget so
 | 
			
		||||
        // return a non-zero value here.
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (event == FL_MOVE)
 | 
			
		||||
    {
 | 
			
		||||
        //
 | 
			
		||||
        // Print the red, green and blue values of
 | 
			
		||||
        // the pixel at the current cursor location.
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
        int x = Fl::event_x();
 | 
			
		||||
        int y = Fl::event_y();
 | 
			
		||||
 | 
			
		||||
        if (x >= 0 && x < w() && y >= 0 && y < h())
 | 
			
		||||
        {
 | 
			
		||||
            int px = x - _dx;
 | 
			
		||||
            int py = y - _dy;
 | 
			
		||||
 | 
			
		||||
            if (px >= 0 && px < _dw && py >= 0 && py < _dh)
 | 
			
		||||
            {
 | 
			
		||||
                const IMF::Rgba &p = _rawPixels[py * _dw + px];
 | 
			
		||||
 | 
			
		||||
                sprintf (_rgbaBoxLabel,
 | 
			
		||||
                         "r = %.3g   g = %.3g   b = %.3g",
 | 
			
		||||
                         float (p.r), float (p.g), float (p.b));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                sprintf (_rgbaBoxLabel, " ");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _rgbaBox->label (_rgbaBoxLabel);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (_chartwin->shown() && _zsize > 0)
 | 
			
		||||
            {
 | 
			
		||||
                int x = Fl::event_x();
 | 
			
		||||
                int y = Fl::event_y();
 | 
			
		||||
                drawChart (x, y, false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (event == FL_RELEASE && Fl::event_button() == FL_LEFT_MOUSE)
 | 
			
		||||
    {
 | 
			
		||||
        //
 | 
			
		||||
        // Open a sample chart and print the z values of
 | 
			
		||||
        // the pixel at the current cursor location
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
        if(_zsize > 0)
 | 
			
		||||
        {
 | 
			
		||||
            int x = Fl::event_x();
 | 
			
		||||
            int y = Fl::event_y();
 | 
			
		||||
 | 
			
		||||
            drawChart (x, y, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (event == FL_RELEASE && Fl::event_button() == FL_RIGHT_MOUSE)
 | 
			
		||||
    {
 | 
			
		||||
        if(_zsize > 0)
 | 
			
		||||
        {
 | 
			
		||||
            if (_gl3d == NULL)
 | 
			
		||||
            {
 | 
			
		||||
                //
 | 
			
		||||
                // initialize Deep 3d display
 | 
			
		||||
                //
 | 
			
		||||
 | 
			
		||||
                _gl3d = new GlWindow(10, 10, 500, 500,
 | 
			
		||||
                                     "3D View", _rawPixels,
 | 
			
		||||
                                     _dataZ, _sampleCount,
 | 
			
		||||
                                     _dw, _dh, _zmax, _zmin,
 | 
			
		||||
                                     _farPlane);
 | 
			
		||||
 | 
			
		||||
                _gl3d->show();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                _gl3d->show();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Fl_Gl_Window::handle (event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Conversion from raw pixel data to data for the OpenGL frame buffer:
 | 
			
		||||
//
 | 
			
		||||
//  1) Compensate for fogging by subtracting defog
 | 
			
		||||
//     from the raw pixel values.
 | 
			
		||||
//
 | 
			
		||||
//  2) Multiply the defogged pixel values by
 | 
			
		||||
//     2^(exposure + 2.47393).
 | 
			
		||||
//
 | 
			
		||||
//  3) Values that are now 1.0 are called "middle gray".
 | 
			
		||||
//     If defog and exposure are both set to 0.0, then
 | 
			
		||||
//     middle gray corresponds to a raw pixel value of 0.18.
 | 
			
		||||
//     In step 6, middle gray values will be mapped to an
 | 
			
		||||
//     intensity 3.5 f-stops below the display's maximum
 | 
			
		||||
//     intensity.
 | 
			
		||||
//
 | 
			
		||||
//  4) Apply a knee function.  The knee function has two
 | 
			
		||||
//     parameters, kneeLow and kneeHigh.  Pixel values
 | 
			
		||||
//     below 2^kneeLow are not changed by the knee
 | 
			
		||||
//     function.  Pixel values above kneeLow are lowered
 | 
			
		||||
//     according to a logarithmic curve, such that the
 | 
			
		||||
//     value 2^kneeHigh is mapped to 2^3.5.  (In step 6,
 | 
			
		||||
//     this value will be mapped to the the display's
 | 
			
		||||
//     maximum intensity.)
 | 
			
		||||
//
 | 
			
		||||
//  5) Gamma-correct the pixel values, according to the
 | 
			
		||||
//     screen's gamma.  (We assume that the gamma curve
 | 
			
		||||
//     is a simple power function.)
 | 
			
		||||
//
 | 
			
		||||
//  6) Scale the values such that middle gray pixels are
 | 
			
		||||
//     mapped to a frame buffer value that is 3.5 f-stops
 | 
			
		||||
//     below the display's maximum intensity. (84.65 if
 | 
			
		||||
//     the screen's gamma is 2.2)
 | 
			
		||||
//
 | 
			
		||||
//  7) Clamp the values to [0, 255].
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
knee (double x, double f)
 | 
			
		||||
{
 | 
			
		||||
    return float (IMATH::Math<double>::log (x * f + 1) / f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
findKneeF (float x, float y)
 | 
			
		||||
{
 | 
			
		||||
    float f0 = 0;
 | 
			
		||||
    float f1 = 1;
 | 
			
		||||
 | 
			
		||||
    while (knee (x, f1) > y)
 | 
			
		||||
    {
 | 
			
		||||
        f0 = f1;
 | 
			
		||||
        f1 = f1 * 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 30; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        float f2 = (f0 + f1) / 2;
 | 
			
		||||
        float y2 = knee (x, f2);
 | 
			
		||||
 | 
			
		||||
        if (y2 < y)
 | 
			
		||||
            f1 = f2;
 | 
			
		||||
        else
 | 
			
		||||
            f0 = f2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (f0 + f1) / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct Gamma
 | 
			
		||||
{
 | 
			
		||||
    float g, m, d, kl, f, s;
 | 
			
		||||
 | 
			
		||||
    Gamma (float gamma,
 | 
			
		||||
           float exposure,
 | 
			
		||||
           float defog,
 | 
			
		||||
           float kneeLow,
 | 
			
		||||
           float kneeHigh);
 | 
			
		||||
 | 
			
		||||
    float operator () (half h);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Gamma::Gamma
 | 
			
		||||
(float gamma,
 | 
			
		||||
 float exposure,
 | 
			
		||||
 float defog,
 | 
			
		||||
 float kneeLow,
 | 
			
		||||
 float kneeHigh)
 | 
			
		||||
:
 | 
			
		||||
    g (gamma),
 | 
			
		||||
    m (IMATH::Math<float>::pow (2, exposure + 2.47393)),
 | 
			
		||||
    d (defog),
 | 
			
		||||
    kl (IMATH::Math<float>::pow (2, kneeLow)),
 | 
			
		||||
    f (findKneeF (IMATH::Math<float>::pow (2, kneeHigh) - kl,
 | 
			
		||||
                  IMATH::Math<float>::pow (2, 3.5) - kl)),
 | 
			
		||||
                  s (255.0 * IMATH::Math<float>::pow (2, -3.5 * g))
 | 
			
		||||
                  {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
Gamma::operator () (half h)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Defog
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    float x = max (0.f, (h - d));
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Exposure
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    x *= m;
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Knee
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    if (x > kl)
 | 
			
		||||
        x = kl + knee (x - kl, f);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Gamma
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    x = IMATH::Math<float>::pow (x, g);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Scale and clamp
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    return clamp (x * s, 0.f, 255.f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Dithering: Reducing the raw 16-bit pixel data to 8 bits for the
 | 
			
		||||
//  OpenGL frame buffer can sometimes lead to contouring in smooth
 | 
			
		||||
//  color ramps.  Dithering with a simple Bayer pattern eliminates
 | 
			
		||||
//  visible contouring.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
unsigned char
 | 
			
		||||
dither (float v, int x, int y)
 | 
			
		||||
{
 | 
			
		||||
    static const float d[4][4] =
 | 
			
		||||
    {
 | 
			
		||||
     {0.f / 16,  8.f / 16,  2.f / 16, 10.f / 16},
 | 
			
		||||
     {12.f / 16,  4.f / 16, 14.f / 16,  6.f / 16},
 | 
			
		||||
     {3.f / 16, 11.f / 16,  1.f / 16,  9.f / 16},
 | 
			
		||||
     {15.f / 16,  7.f / 16, 13.f / 16,  5.f / 16}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return (unsigned char) (v + d[y & 3][x & 3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
ImageView::findKnee (float x, float y)
 | 
			
		||||
{
 | 
			
		||||
    return findKneeF (x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ImageView::updateScreenPixels ()
 | 
			
		||||
{
 | 
			
		||||
    halfFunction<float>
 | 
			
		||||
    rGamma (Gamma (_gamma,
 | 
			
		||||
                   _exposure,
 | 
			
		||||
                   _defog * _fogR,
 | 
			
		||||
                   _kneeLow,
 | 
			
		||||
                   _kneeHigh),
 | 
			
		||||
                   -HALF_MAX, HALF_MAX,
 | 
			
		||||
                   0.f, 255.f, 0.f, 0.f);
 | 
			
		||||
 | 
			
		||||
    halfFunction<float>
 | 
			
		||||
    gGamma (Gamma (_gamma,
 | 
			
		||||
                   _exposure,
 | 
			
		||||
                   _defog * _fogG,
 | 
			
		||||
                   _kneeLow,
 | 
			
		||||
                   _kneeHigh),
 | 
			
		||||
                   -HALF_MAX, HALF_MAX,
 | 
			
		||||
                   0.f, 255.f, 0.f, 0.f);
 | 
			
		||||
 | 
			
		||||
    halfFunction<float>
 | 
			
		||||
    bGamma (Gamma (_gamma,
 | 
			
		||||
                   _exposure,
 | 
			
		||||
                   _defog * _fogB,
 | 
			
		||||
                   _kneeLow,
 | 
			
		||||
                   _kneeHigh),
 | 
			
		||||
                   -HALF_MAX, HALF_MAX,
 | 
			
		||||
                   0.f, 255.f, 0.f, 0.f);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < _dh; ++y)
 | 
			
		||||
    {
 | 
			
		||||
        int i = y * _dw;
 | 
			
		||||
 | 
			
		||||
        for (int x = 0; x < _dw; ++x)
 | 
			
		||||
        {
 | 
			
		||||
            int j = i + x;
 | 
			
		||||
            const IMF::Rgba &rp = _rawPixels[j];
 | 
			
		||||
            unsigned char *sp = _screenPixels + j * 3;
 | 
			
		||||
            sp[0] = dither (rGamma (rp.r), x, y);
 | 
			
		||||
            sp[1] = dither (gGamma (rp.g), x, y);
 | 
			
		||||
            sp[2] = dither (bGamma (rp.b), x, y);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										133
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/ImageView.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/ImageView.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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 INCLUDED_IMAGE_VIEW_H
 | 
			
		||||
#define INCLUDED_IMAGE_VIEW_H
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//        class ImageView -- draws an Imf::Rgba image in an OpenGl window
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
#include "GlWindow3d.h"
 | 
			
		||||
 | 
			
		||||
#include <FL/Fl_Chart.H>
 | 
			
		||||
#include <FL/Fl_Gl_Window.H>
 | 
			
		||||
#include <FL/Fl_Box.H>
 | 
			
		||||
#include <ImfRgba.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ImageView: public Fl_Gl_Window
 | 
			
		||||
{
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        ImageView (int x, int y,
 | 
			
		||||
                   int w, int h,            // display window width and height
 | 
			
		||||
                   const char label[],
 | 
			
		||||
                   const IMF::Rgba pixels[/* w*h */],
 | 
			
		||||
                   float* dataZ[/* w*h */],
 | 
			
		||||
                   unsigned int sampleCount[/* w*h */],
 | 
			
		||||
                   int zsize,
 | 
			
		||||
                   int dw, int dh,          // data window width and height
 | 
			
		||||
                   int dx, int dy,          // data window offset
 | 
			
		||||
                   Fl_Box *rgbaBox,
 | 
			
		||||
                   float farPlane,          // zfar plane in Deep 3D window
 | 
			
		||||
                   float gamma,
 | 
			
		||||
                   float exposure,
 | 
			
		||||
                   float defog,
 | 
			
		||||
                   float kneeLow,
 | 
			
		||||
                   float kneeHigh);
 | 
			
		||||
 | 
			
		||||
        virtual void        setExposure (float exposure);
 | 
			
		||||
        virtual void        setDefog (float defog);
 | 
			
		||||
        virtual void        setKneeLow (float low);
 | 
			
		||||
        virtual void        setKneeHigh (float high);
 | 
			
		||||
        virtual void        setPixels(const IMF::Rgba pixels[],
 | 
			
		||||
                                      float* dataZ[/* w*h */],
 | 
			
		||||
                                      unsigned int sampleCount[/* w*h */],
 | 
			
		||||
                                      int zsize,
 | 
			
		||||
                                      int dw, int dh, int dx, int dy);
 | 
			
		||||
 | 
			
		||||
        virtual void        draw();
 | 
			
		||||
        virtual int         handle (int event);
 | 
			
		||||
        void                clearDataDisplay();
 | 
			
		||||
 | 
			
		||||
    protected:
 | 
			
		||||
 | 
			
		||||
        virtual void        updateScreenPixels ();
 | 
			
		||||
        void                computeFogColor ();
 | 
			
		||||
        void                findZbound ();
 | 
			
		||||
        float               findKnee (float x, float y);
 | 
			
		||||
        void                drawChart (int x, int y, bool initChart);
 | 
			
		||||
        void                drawChartRef ();
 | 
			
		||||
 | 
			
		||||
        float                                _gamma;
 | 
			
		||||
        float                                _exposure;
 | 
			
		||||
        float                                _defog;
 | 
			
		||||
        float                                _kneeLow;
 | 
			
		||||
        float                                _kneeHigh;
 | 
			
		||||
        const IMF::Rgba *                    _rawPixels;
 | 
			
		||||
        float**                              _dataZ;
 | 
			
		||||
        unsigned int *                       _sampleCount;
 | 
			
		||||
        float                                _fogR;
 | 
			
		||||
        float                                _fogG;
 | 
			
		||||
        float                                _fogB;
 | 
			
		||||
        float                                _zmax;
 | 
			
		||||
        float                                _zmin;
 | 
			
		||||
        float                                _farPlane;
 | 
			
		||||
        int                                  _dw;
 | 
			
		||||
        int                                  _dh;
 | 
			
		||||
        int                                  _dx;
 | 
			
		||||
        int                                  _dy;
 | 
			
		||||
        int                                  _zsize;
 | 
			
		||||
        unsigned int                         _maxCount;
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        GlWindow*                            _gl3d;
 | 
			
		||||
        Fl_Window *                          _chartwin;
 | 
			
		||||
        Fl_Chart *                           _chart;
 | 
			
		||||
        Fl_Chart *                           _chartMax;
 | 
			
		||||
        Fl_Chart *                           _chartMin;
 | 
			
		||||
        Fl_Box *                             _rgbaBox;
 | 
			
		||||
        char                                 _rgbaBoxLabel[200];
 | 
			
		||||
        IMF::Array<unsigned char>            _screenPixels;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										52
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
## Process this file with automake to produce Makefile.in
 | 
			
		||||
 | 
			
		||||
if HAVE_FLTK
 | 
			
		||||
 | 
			
		||||
bin_PROGRAMS = exrdisplay
 | 
			
		||||
 | 
			
		||||
INCLUDES = @OPENEXR_CXXFLAGS@ \
 | 
			
		||||
        @GL_CXXFLAGS@ @CG_CXXFLAGS@ @FLTK_CXXFLAGS@ -I$(top_builddir) \
 | 
			
		||||
	@OPENEXR_CTL_CXXFLAGS@
 | 
			
		||||
 | 
			
		||||
LDADD = @OPENEXR_LDFLAGS@ @OPENEXR_LIBS@ \
 | 
			
		||||
        @OPENEXR_CTL_LDFLAGS@ @OPENEXR_CTL_LIBS@ \
 | 
			
		||||
        @CG_LDFLAGS@ @FLTK_LDFLAGS@
 | 
			
		||||
        
 | 
			
		||||
all-local:
 | 
			
		||||
	@FLTK_CONFIG@ --post exrdisplay
 | 
			
		||||
 | 
			
		||||
install-exec-hook:
 | 
			
		||||
	@FLTK_CONFIG@ --post $(DESTDIR)$(bindir)/exrdisplay
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
install-exec-hook:
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
exrdisplay_SOURCES = \
 | 
			
		||||
	main.cpp \
 | 
			
		||||
	ImageView.cpp \
 | 
			
		||||
	ImageView.h \
 | 
			
		||||
	loadImage.cpp \
 | 
			
		||||
	loadImage.h \
 | 
			
		||||
	scaleImage.cpp \
 | 
			
		||||
	scaleImage.h \
 | 
			
		||||
	applyCtl.cpp \
 | 
			
		||||
	applyCtl.h \
 | 
			
		||||
	GlWindow3d.h \
 | 
			
		||||
	GlWindow3d.cpp
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS =  \
 | 
			
		||||
        ImageView.h \
 | 
			
		||||
        loadImage.h \
 | 
			
		||||
        scaleImage.h \
 | 
			
		||||
        applyCtl.h \
 | 
			
		||||
        GlWindow3d.h \
 | 
			
		||||
        namespaceAlias.h
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = $(exrdisplay_SOURCES)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										436
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/applyCtl.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										436
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/applyCtl.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,436 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2006, 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Apply CTL transforms
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "applyCtl.h"
 | 
			
		||||
 | 
			
		||||
#if HAVE_CTL_INTERPRETER
 | 
			
		||||
 | 
			
		||||
    #include <ImfCtlApplyTransforms.h>
 | 
			
		||||
    #include <CtlSimdInterpreter.h>
 | 
			
		||||
    #include <ImfStandardAttributes.h>
 | 
			
		||||
    #include <ImfHeader.h>
 | 
			
		||||
    #include <ImfFrameBuffer.h>
 | 
			
		||||
    #include <stdlib.h>
 | 
			
		||||
    #include <cassert>
 | 
			
		||||
    #include <cstdio>
 | 
			
		||||
    #include <iostream>
 | 
			
		||||
    #include<stdio.h>
 | 
			
		||||
 | 
			
		||||
    using namespace std;
 | 
			
		||||
    using namespace Ctl;
 | 
			
		||||
    using namespace IMATH;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    #include <ImfStandardAttributes.h>
 | 
			
		||||
    #include <ImfHeader.h>
 | 
			
		||||
    #include <stdlib.h>
 | 
			
		||||
    #include <cassert>
 | 
			
		||||
    #include <cstdio>
 | 
			
		||||
    #include <iostream>
 | 
			
		||||
    #include <stdio.h>
 | 
			
		||||
 | 
			
		||||
    using namespace std;
 | 
			
		||||
    using namespace IMATH;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
 | 
			
		||||
#define WARNING(message) (cerr << "Warning: " << message << endl)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
displayVideoGamma ()
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Get the display's video gamma from an environment variable.
 | 
			
		||||
    // If this fails, use a default value (1/2.2).
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    const char gammaEnv[] = "EXR_DISPLAY_VIDEO_GAMMA";
 | 
			
		||||
    float g = 2.2f;
 | 
			
		||||
 | 
			
		||||
    if (const char *gamma = getenv (gammaEnv))
 | 
			
		||||
    {
 | 
			
		||||
	float tmp;
 | 
			
		||||
	int n = sscanf (gamma, " %f", &tmp);
 | 
			
		||||
 | 
			
		||||
	if (n != 1)
 | 
			
		||||
	    WARNING ("Cannot parse environment variable " << gammaEnv << "; "
 | 
			
		||||
		     "using default value (" << g << ").");
 | 
			
		||||
	else if (tmp < 1.f)
 | 
			
		||||
	    WARNING ("Display video gamma, specified in environment "
 | 
			
		||||
		     "variable " << gammaEnv << " is out of range; "
 | 
			
		||||
		     "using default value (" << g << ").");
 | 
			
		||||
	else
 | 
			
		||||
	    g = tmp;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
	    WARNING ("Environment variable " << gammaEnv << " is not set; "
 | 
			
		||||
		     "using default value (" << g << ").");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1.f / g;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
Chromaticities
 | 
			
		||||
displayChromaticities ()
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Get the chromaticities of the display's primaries and
 | 
			
		||||
    // white point from an environment variable.  If this fails,
 | 
			
		||||
    // assume chromaticities according to Rec. ITU-R BT.709.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    static const char chromaticitiesEnv[] = "CTL_DISPLAY_CHROMATICITIES";
 | 
			
		||||
    Chromaticities c;  // default-initialized according to Rec. 709
 | 
			
		||||
 | 
			
		||||
    if (const char *chromaticities = getenv (chromaticitiesEnv))
 | 
			
		||||
    {
 | 
			
		||||
	Chromaticities tmp;
 | 
			
		||||
 | 
			
		||||
	int n = sscanf (chromaticities,
 | 
			
		||||
			" red %f %f green %f %f blue %f %f white %f %f",
 | 
			
		||||
			&tmp.red.x, &tmp.red.y,
 | 
			
		||||
			&tmp.green.x, &tmp.green.y,
 | 
			
		||||
			&tmp.blue.x, &tmp.blue.y,
 | 
			
		||||
			&tmp.white.x, &tmp.white.y);
 | 
			
		||||
 | 
			
		||||
	if (n == 8)
 | 
			
		||||
	    c = tmp;
 | 
			
		||||
	else
 | 
			
		||||
	    WARNING ("Cannot parse environment variable " <<
 | 
			
		||||
		     chromaticitiesEnv << "; using default value "
 | 
			
		||||
		     "(chromaticities according to Rec. ITU-R BT.709).");
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
	WARNING ("Environment variable " << chromaticitiesEnv << " is "
 | 
			
		||||
		 "not set; using default value (chromaticities according "
 | 
			
		||||
		 "to Rec. ITU-R BT.709).");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
#if HAVE_CTL_INTERPRETER
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
initializeEnvHeader (Header &envHeader)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Initialize the "environment header" for the CTL
 | 
			
		||||
    // transforms by adding displayChromaticities,
 | 
			
		||||
    // displayWhiteLuminance and displaySurroundLuminance
 | 
			
		||||
    // attributes.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Chromaticities c = displayChromaticities();
 | 
			
		||||
    envHeader.insert ("displayChromaticities", ChromaticitiesAttribute (c));
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Get the display's white luminance from an environment variable.
 | 
			
		||||
    // If this fails, assume 120 candelas per square meter.
 | 
			
		||||
    // (Screen aim luminance according to SMPTE RP 166.)
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    static const char whiteLuminanceEnv[] = "CTL_DISPLAY_WHITE_LUMINANCE";
 | 
			
		||||
    static const float whiteLuminanceDefault = 120.0;
 | 
			
		||||
    float wl = whiteLuminanceDefault;
 | 
			
		||||
 | 
			
		||||
    if (const char *whiteLuminance = getenv (whiteLuminanceEnv))
 | 
			
		||||
    {
 | 
			
		||||
	int n = sscanf (whiteLuminance, " %f", &wl);
 | 
			
		||||
 | 
			
		||||
	if (n != 1)
 | 
			
		||||
	    WARNING ("Cannot parse environment variable " <<
 | 
			
		||||
		     whiteLuminanceEnv << "; using default value "
 | 
			
		||||
		     "(" << wl << " candelas per square meter).");
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
	    WARNING ("Environment variable " << whiteLuminanceEnv << "  is "
 | 
			
		||||
		     "is not set; using default value (" << wl << " candelas "
 | 
			
		||||
		     "per square meter).");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    envHeader.insert ("displayWhiteLuminance", FloatAttribute (wl));
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Get the display's surround luminance from an environment variable.
 | 
			
		||||
    // If this fails, assume 10% of the display's white luminance.
 | 
			
		||||
    // (Recommended setup according to SMPTE RP 166.)
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    static const char surroundLuminanceEnv[] = "CTL_DISPLAY_SURROUND_LUMINANCE";
 | 
			
		||||
    float sl = wl * 0.1f;
 | 
			
		||||
 | 
			
		||||
    if (const char *surroundLuminance = getenv (surroundLuminanceEnv))
 | 
			
		||||
    {
 | 
			
		||||
	int n = sscanf (surroundLuminance, " %f", &sl);
 | 
			
		||||
 | 
			
		||||
	if (n != 1)
 | 
			
		||||
	    WARNING ("Cannot parse environment variable " <<
 | 
			
		||||
		     surroundLuminanceEnv << "; using default value "
 | 
			
		||||
		     "(" << sl << " candelas per square meter).");
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
	    WARNING ("Environment variable " << surroundLuminanceEnv << "  is "
 | 
			
		||||
		     "is not set; using default value (" << sl << " candelas "
 | 
			
		||||
		     "per square meter).");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    envHeader.insert ("displaySurroundLuminance", FloatAttribute (sl));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
string
 | 
			
		||||
displayTransformName ()
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Get the name of the display transform from an environment
 | 
			
		||||
    // variable.  If this fails, use a default name.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    static const char displayTransformEnv[] = "CTL_DISPLAY_TRANSFORM";
 | 
			
		||||
    static const char displayTransformDefault[] = "transform_display_video";
 | 
			
		||||
    const char *displayTransform = getenv (displayTransformEnv);
 | 
			
		||||
 | 
			
		||||
    if (!displayTransform)
 | 
			
		||||
    {
 | 
			
		||||
	displayTransform = displayTransformDefault;
 | 
			
		||||
 | 
			
		||||
	WARNING ("Environment variable " << displayTransformEnv << " "
 | 
			
		||||
		 "is not set; using default value "
 | 
			
		||||
		 "(\"" << displayTransform << "\").");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return displayTransform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
initializeInFrameBuffer
 | 
			
		||||
    (int w,
 | 
			
		||||
     int h,
 | 
			
		||||
     const Array<Rgba> &pixels,
 | 
			
		||||
     FrameBuffer &fb)
 | 
			
		||||
{
 | 
			
		||||
    fb.insert ("R", Slice (HALF,			// type
 | 
			
		||||
			   (char *)(&pixels[0].r),	// base
 | 
			
		||||
			   sizeof (pixels[0]),		// xStride
 | 
			
		||||
			   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
 | 
			
		||||
    fb.insert ("G", Slice (HALF,			// type
 | 
			
		||||
			   (char *)(&pixels[0].g),	// base
 | 
			
		||||
			   sizeof (pixels[0]),		// xStride
 | 
			
		||||
			   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
 | 
			
		||||
    fb.insert ("B", Slice (HALF,			// type
 | 
			
		||||
			   (char *)(&pixels[0].b),	// base
 | 
			
		||||
			   sizeof (pixels[0]),		// xStride
 | 
			
		||||
			   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
initializeOutFrameBuffer
 | 
			
		||||
    (int w,
 | 
			
		||||
     int h,
 | 
			
		||||
     const Array<Rgba> &pixels,
 | 
			
		||||
     FrameBuffer &fb)
 | 
			
		||||
{
 | 
			
		||||
    fb.insert ("R_display", Slice (HALF,			// type
 | 
			
		||||
				   (char *)(&pixels[0].r),	// base
 | 
			
		||||
				   sizeof (pixels[0]),		// xStride
 | 
			
		||||
				   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
 | 
			
		||||
    fb.insert ("G_display", Slice (HALF,			// type
 | 
			
		||||
				   (char *)(&pixels[0].g),	// base
 | 
			
		||||
				   sizeof (pixels[0]),		// xStride
 | 
			
		||||
				   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
 | 
			
		||||
    fb.insert ("B_display", Slice (HALF,			// type
 | 
			
		||||
				   (char *)(&pixels[0].b),	// base
 | 
			
		||||
				   sizeof (pixels[0]),		// xStride
 | 
			
		||||
				   sizeof (pixels[0]) * w));	// yStride
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
applyCtl (vector<string> transformNames,
 | 
			
		||||
	  Header inHeader,
 | 
			
		||||
	  const Array<Rgba> &inPixels,
 | 
			
		||||
	  int w,
 | 
			
		||||
	  int h,
 | 
			
		||||
	  Array<Rgba> &outPixels)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // If we do not have an explicit set of transform names
 | 
			
		||||
    // then find suitable look modification, rendering and
 | 
			
		||||
    // display transforms.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    if (transformNames.empty())
 | 
			
		||||
    {
 | 
			
		||||
	if (hasLookModTransform (inHeader))
 | 
			
		||||
	    transformNames.push_back (lookModTransform (inHeader));
 | 
			
		||||
 | 
			
		||||
	if (hasRenderingTransform (inHeader))
 | 
			
		||||
	    transformNames.push_back (renderingTransform (inHeader));
 | 
			
		||||
	else
 | 
			
		||||
	    transformNames.push_back ("transform_RRT");
 | 
			
		||||
 | 
			
		||||
	transformNames.push_back (displayTransformName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Initialize an input and an environment header:
 | 
			
		||||
    // Make sure that the headers contain information about the primaries
 | 
			
		||||
    // and the white point of the image files an the display, and about
 | 
			
		||||
    // the display's white luminance and surround luminance.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    if (!hasChromaticities (inHeader))
 | 
			
		||||
	addChromaticities (inHeader, Chromaticities());
 | 
			
		||||
 | 
			
		||||
    if (!hasAdoptedNeutral (inHeader))
 | 
			
		||||
	addAdoptedNeutral (inHeader, chromaticities(inHeader).white);
 | 
			
		||||
 | 
			
		||||
    Header envHeader;
 | 
			
		||||
    initializeEnvHeader (envHeader);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Set up input and output FrameBuffer objects for the transforms.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    FrameBuffer inFb;
 | 
			
		||||
    initializeInFrameBuffer (w, h, inPixels, inFb);
 | 
			
		||||
 | 
			
		||||
    FrameBuffer outFb;
 | 
			
		||||
    initializeOutFrameBuffer (w, h, outPixels, outFb);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Run the CTL transforms
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Box2i transformWindow (V2i (0, 0), V2i (w - 1, h - 1));
 | 
			
		||||
 | 
			
		||||
    SimdInterpreter interpreter;
 | 
			
		||||
 | 
			
		||||
    #ifdef CTL_MODULE_BASE_PATH
 | 
			
		||||
 | 
			
		||||
	//
 | 
			
		||||
	// The configuration scripts has defined a default
 | 
			
		||||
	// location for CTL modules.  Include this location
 | 
			
		||||
	// in the CTL module search path.
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
	vector<string> paths = interpreter.modulePaths();
 | 
			
		||||
	paths.push_back (CTL_MODULE_BASE_PATH);
 | 
			
		||||
	interpreter.setModulePaths (paths);
 | 
			
		||||
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    Header outHeader;
 | 
			
		||||
 | 
			
		||||
    ImfCtl::applyTransforms (interpreter,
 | 
			
		||||
			     transformNames,
 | 
			
		||||
			     transformWindow,
 | 
			
		||||
			     envHeader,
 | 
			
		||||
			     inHeader,
 | 
			
		||||
			     inFb,
 | 
			
		||||
			     outHeader,
 | 
			
		||||
			     outFb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
adjustChromaticities (const Header &header,
 | 
			
		||||
		      const Array<Rgba> &inPixels,
 | 
			
		||||
		      int w, int h,
 | 
			
		||||
		      Array<Rgba> &outPixels)
 | 
			
		||||
{
 | 
			
		||||
    Chromaticities fileChroma;  // default-initialized according to Rec. 709
 | 
			
		||||
 | 
			
		||||
    if (hasChromaticities (header))
 | 
			
		||||
	fileChroma = chromaticities (header);
 | 
			
		||||
 | 
			
		||||
    Chromaticities displayChroma = displayChromaticities();
 | 
			
		||||
 | 
			
		||||
    if (fileChroma.red   == displayChroma.red &&
 | 
			
		||||
	fileChroma.green == displayChroma.green &&
 | 
			
		||||
	fileChroma.blue  == displayChroma.blue &&
 | 
			
		||||
	fileChroma.white == displayChroma.white)
 | 
			
		||||
    {
 | 
			
		||||
	return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    M44f M = RGBtoXYZ (fileChroma, 1) * XYZtoRGB (displayChroma, 1);
 | 
			
		||||
 | 
			
		||||
    size_t numPixels = w * h;
 | 
			
		||||
 | 
			
		||||
    for (size_t i = 0; i < numPixels; ++i)
 | 
			
		||||
    {
 | 
			
		||||
	const Rgba &in = inPixels[i];
 | 
			
		||||
	Rgba &out = outPixels[i];
 | 
			
		||||
 | 
			
		||||
	V3f rgb = V3f (in.r, in.g, in.b) * M;
 | 
			
		||||
 | 
			
		||||
	out.r = rgb[0];
 | 
			
		||||
	out.g = rgb[1];
 | 
			
		||||
	out.b = rgb[2];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										123
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/applyCtl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/applyCtl.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,123 @@
 | 
			
		||||
#ifndef INCLUDED_APPLY_CTL_H
 | 
			
		||||
#define INCLUDED_APPLY_CTL_H
 | 
			
		||||
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2005, Industrial Light & Magic, a division of Lucasfilm
 | 
			
		||||
// Entertainment Company Ltd.  Portions contributed and copyright held by
 | 
			
		||||
// others as indicated.  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
 | 
			
		||||
//       any other contributors to this software 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.
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Apply CTL transforms
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
 | 
			
		||||
#include <ImfRgba.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
#include <ImfHeader.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Apply a series of CTL transforms to the raw pixel data from an image file
 | 
			
		||||
// in order to generate pixel data that can be displayed on the screen.
 | 
			
		||||
//
 | 
			
		||||
//	transformNames	A list of the names of the CTL transforms that will
 | 
			
		||||
//			be applied to raw pixels.  If this list is empty,
 | 
			
		||||
//			applyCtl() looks for a rendering transform and a
 | 
			
		||||
//			display transform:
 | 
			
		||||
//
 | 
			
		||||
//			If inHeader contains a string attribute called
 | 
			
		||||
//			"renderingTransform" then the value of this attribute
 | 
			
		||||
//			is the name of the rendering transform.
 | 
			
		||||
//			If inHeader contains no such attribute, then the
 | 
			
		||||
//			name of the rendering transform is "transform_RRT".
 | 
			
		||||
//
 | 
			
		||||
//			If the environment variable CTL_DISPLAY_TRANSFORM
 | 
			
		||||
//			is set, the value of the environment variable is
 | 
			
		||||
//			the name of the display transform.
 | 
			
		||||
//			If the environment variable is not set, then the name
 | 
			
		||||
//			of the display transform is "transform_display_video".
 | 
			
		||||
//
 | 
			
		||||
//	inHeader	The header of the image file.
 | 
			
		||||
//
 | 
			
		||||
//	inPixels	Raw pixels from the image file.
 | 
			
		||||
//
 | 
			
		||||
//	w, h		Width and height of the inPixels and outPixels
 | 
			
		||||
//			arrays.  (The caller must set the size of the
 | 
			
		||||
//			arrays to w*h, before calling applyCtl().)
 | 
			
		||||
//
 | 
			
		||||
//	outPixels	Output -- pixels for display on the screen.
 | 
			
		||||
//			The data in outPixels represent relative
 | 
			
		||||
//			luminance values; an R, G or B value of 1.0
 | 
			
		||||
//			represents the maximum red, green or blue
 | 
			
		||||
//			luminance that the display can achieve.
 | 
			
		||||
//			
 | 
			
		||||
 | 
			
		||||
void	applyCtl (std::vector<std::string> transformNames,
 | 
			
		||||
		  IMF::Header inHeader,
 | 
			
		||||
		  const IMF::Array<IMF::Rgba> &inPixels,
 | 
			
		||||
		  int w,
 | 
			
		||||
		  int h,
 | 
			
		||||
		  IMF::Array<IMF::Rgba> &outPixels);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// If the chromaticities of the RGB pixel loaded from a file
 | 
			
		||||
// are not the same as the chromaticities of the display,
 | 
			
		||||
// then transform the pixels from the RGB coordinate system
 | 
			
		||||
// of the file to the RGB coordinate system of the display.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void	adjustChromaticities (const IMF::Header &header,
 | 
			
		||||
			      const IMF::Array<IMF::Rgba> &inPixels,
 | 
			
		||||
			      int w,
 | 
			
		||||
			      int h,
 | 
			
		||||
			      IMF::Array<IMF::Rgba> &outPixels);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Get the gamma factor that must be used in order to convert luminance
 | 
			
		||||
// values output by applyCtl() into display frame buffer values.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
float	displayVideoGamma ();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										1000
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/loadImage.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1000
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/loadImage.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										99
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/loadImage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/loadImage.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
#ifndef INCLUDED_LOAD_IMAGE_H
 | 
			
		||||
#define INCLUDED_LOAD_IMAGE_H
 | 
			
		||||
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2012, Industrial Light & Magic, a division of Lucasfilm
 | 
			
		||||
// Entertainment Company Ltd.  Portions contributed and copyright held by
 | 
			
		||||
// others as indicated.  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
 | 
			
		||||
//       any other contributors to this software 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.
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Load an OpenEXR image into a pixel array.
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
 | 
			
		||||
#include <ImfRgba.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
#include <ImfHeader.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Load an OpenEXR image file:
 | 
			
		||||
//
 | 
			
		||||
//	fileName	The name of the file to be loaded.
 | 
			
		||||
//
 | 
			
		||||
//	channel		If channel is 0, load the R, G and B channels,
 | 
			
		||||
//			otherwise channel must point to the name of the
 | 
			
		||||
//			image channel to be loaded; the channel is copied
 | 
			
		||||
//			into the R, G and B components of the frame buffer.
 | 
			
		||||
//
 | 
			
		||||
//	layer		Used only if channel is 0: if layer is 0, load
 | 
			
		||||
//			the R, G and B channels, otherwise load layer.R,
 | 
			
		||||
//			layer.G and layer.B.
 | 
			
		||||
//
 | 
			
		||||
//	preview		If preview is true load the file's preview image,
 | 
			
		||||
//			otherwise load the main image.
 | 
			
		||||
//
 | 
			
		||||
//	lx, ly		If lx != 0 or ly != 0 then assume that the input
 | 
			
		||||
//			file is tiled and load level (0, 0).
 | 
			
		||||
//
 | 
			
		||||
//	header		Output -- the header of the input file, but with
 | 
			
		||||
//			the dataWindow, displayWindow and pixelAspectRatio
 | 
			
		||||
//			attributes adjusted to match what parts of the file
 | 
			
		||||
//			were actually loaded.
 | 
			
		||||
//
 | 
			
		||||
//	pixels		Output -- the pixels loaded from the file.
 | 
			
		||||
//			loadImage() resizes the pixels array to fit
 | 
			
		||||
//			the dataWindow attribute of the header.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void loadImage (const char fileName[],
 | 
			
		||||
                const char channel[],
 | 
			
		||||
                const char layer[],
 | 
			
		||||
                bool preview,
 | 
			
		||||
                int lx,
 | 
			
		||||
                int ly,
 | 
			
		||||
                int partnum,
 | 
			
		||||
                int &zsize,
 | 
			
		||||
                IMF::Header &header,
 | 
			
		||||
                IMF::Array<IMF::Rgba> &pixels,
 | 
			
		||||
                IMF::Array<float*> &zbuffer,
 | 
			
		||||
                IMF::Array<unsigned int> &sampleCount,
 | 
			
		||||
                bool deepComp);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										1063
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1063
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/main.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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"
 | 
			
		||||
#include "ImathNamespace.h"
 | 
			
		||||
#include "IexNamespace.h"
 | 
			
		||||
 | 
			
		||||
namespace IMF   = OPENEXR_IMF_NAMESPACE;
 | 
			
		||||
namespace IMATH = IMATH_NAMESPACE;
 | 
			
		||||
namespace IEX   = IEX_NAMESPACE;
 | 
			
		||||
 | 
			
		||||
#endif /* NAMESPACEALIAS_H_ */
 | 
			
		||||
							
								
								
									
										276
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/scaleImage.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								cs440-acg/ext/openexr/OpenEXR_Viewers/exrdisplay/scaleImage.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,276 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Image scaling and filtering functions.
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "scaleImage.h"
 | 
			
		||||
 | 
			
		||||
#include <ImathLimits.h>
 | 
			
		||||
#include <ImathFun.h>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace IMF;
 | 
			
		||||
using namespace IMATH;
 | 
			
		||||
using std::min;
 | 
			
		||||
using std::max;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
scaleInt (float f, int i)
 | 
			
		||||
{
 | 
			
		||||
    return int (f * i + 0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
scaleX (float f, 
 | 
			
		||||
	int &w, int &h,
 | 
			
		||||
	int &dw, int &dh,
 | 
			
		||||
	int &dx, int &dy,
 | 
			
		||||
	Array<Rgba> &pixels)
 | 
			
		||||
{
 | 
			
		||||
    int dw1 = scaleInt (f, dw);
 | 
			
		||||
 | 
			
		||||
    if (dw1 <= dw)
 | 
			
		||||
    {
 | 
			
		||||
	//
 | 
			
		||||
	// Do nothing if the width of the data window
 | 
			
		||||
	// woudn't increase by at least one pixel.
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
	return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    w = scaleInt (f, w);
 | 
			
		||||
    dx = scaleInt (f, dx);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Copy the pixels to a temporary array
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Array<Rgba> tmp (dw * dh);
 | 
			
		||||
    
 | 
			
		||||
    for (int i = 0; i < dw * dh; ++i)
 | 
			
		||||
	tmp[i] = pixels[i];
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Resize the original pixel array,
 | 
			
		||||
    // and copy the pixels back into the
 | 
			
		||||
    // resized array.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    pixels.resizeErase (dw1 * dh);
 | 
			
		||||
 | 
			
		||||
    f = float (dw - 1) / float (dw1 - 1);
 | 
			
		||||
 | 
			
		||||
    for (int x = 0; x < dw1; ++x)
 | 
			
		||||
    {
 | 
			
		||||
	float x1 = x * f;
 | 
			
		||||
	int xs = int (x1);
 | 
			
		||||
	int xt = min (xs + 1, dw - 1);
 | 
			
		||||
	float t = x1 - xs;
 | 
			
		||||
	float s = 1 - t;
 | 
			
		||||
 | 
			
		||||
	for (int y = 0; y < dh; ++y)
 | 
			
		||||
	{
 | 
			
		||||
	    const Rgba &ps = tmp [y * dw + xs];
 | 
			
		||||
	    const Rgba &pt = tmp [y * dw + xt];
 | 
			
		||||
	    Rgba &p = pixels[y * dw1 + x];
 | 
			
		||||
 | 
			
		||||
	    p.r = ps.r * s + pt.r * t;
 | 
			
		||||
	    p.g = ps.g * s + pt.g * t;
 | 
			
		||||
	    p.b = ps.b * s + pt.b * t;
 | 
			
		||||
	    p.a = ps.a * s + pt.a * t;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dw = dw1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
scaleY (float f, 
 | 
			
		||||
	int &w, int &h, 
 | 
			
		||||
	int &dw, int &dh,
 | 
			
		||||
	int &dx, int &dy,
 | 
			
		||||
	Array<Rgba> &pixels)
 | 
			
		||||
{
 | 
			
		||||
    int dh1 = scaleInt (f, dh);
 | 
			
		||||
 | 
			
		||||
    if (dh1 <= dh)
 | 
			
		||||
    {
 | 
			
		||||
	//
 | 
			
		||||
	// Do nothing if the height of the data window
 | 
			
		||||
	// woudn't increase by at least one pixel.
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
	return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    h = scaleInt (f, h);
 | 
			
		||||
    dy = scaleInt (f, dy);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Copy the pixels to a temporary array
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    Array<Rgba> tmp (dw * dh);
 | 
			
		||||
    
 | 
			
		||||
    for (int i = 0; i < dw * dh; ++i)
 | 
			
		||||
	tmp[i] = pixels[i];
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Resize the original pixel array,
 | 
			
		||||
    // and copy the pixels back into the
 | 
			
		||||
    // resized array.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    pixels.resizeErase (dw * dh1);
 | 
			
		||||
 | 
			
		||||
    f = float (dh - 1) / float (dh1 - 1);
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < dh1; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	float y1 = y * f;
 | 
			
		||||
	int ys = int (y1);
 | 
			
		||||
	int yt = min (ys + 1, dh - 1);
 | 
			
		||||
	float t = y1 - ys;
 | 
			
		||||
	float s = 1 - t;
 | 
			
		||||
 | 
			
		||||
	for (int x = 0; x < dw; ++x)
 | 
			
		||||
	{
 | 
			
		||||
	    const Rgba &ps = tmp [ys * dw + x];
 | 
			
		||||
	    const Rgba &pt = tmp [yt * dw + x];
 | 
			
		||||
	    Rgba &p = pixels[y * dw + x];
 | 
			
		||||
 | 
			
		||||
	    p.r = ps.r * s + pt.r * t;
 | 
			
		||||
	    p.g = ps.g * s + pt.g * t;
 | 
			
		||||
	    p.b = ps.b * s + pt.b * t;
 | 
			
		||||
	    p.a = ps.a * s + pt.a * t;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dh = dh1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
normalizePixels (int dw, int dh, Array<Rgba> &pixels)
 | 
			
		||||
{
 | 
			
		||||
    float pMax = -IMATH::limits<float>::max ();
 | 
			
		||||
    float pMin =  IMATH::limits<float>::max ();
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < dw * dh; ++i)
 | 
			
		||||
    {
 | 
			
		||||
	const Rgba &p = pixels[i];
 | 
			
		||||
 | 
			
		||||
	if (p.r.isFinite())
 | 
			
		||||
	{
 | 
			
		||||
	    pMax = max (float (p.r), pMax);
 | 
			
		||||
	    pMin = min (float (p.r), pMin);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p.g.isFinite())
 | 
			
		||||
	{
 | 
			
		||||
	    pMax = max (float (p.g), pMax);
 | 
			
		||||
	    pMin = min (float (p.g), pMin);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p.b.isFinite())
 | 
			
		||||
	{
 | 
			
		||||
	    pMax = max (float (p.b), pMax);
 | 
			
		||||
	    pMin = min (float (p.b), pMin);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (pMax <= pMin)
 | 
			
		||||
	pMax = pMin + 1;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < dw * dh; ++i)
 | 
			
		||||
    {
 | 
			
		||||
	Rgba &p = pixels[i];
 | 
			
		||||
 | 
			
		||||
	if (p.r.isFinite())
 | 
			
		||||
	    p.r = (p.r - pMin) / (pMax - pMin);
 | 
			
		||||
 | 
			
		||||
	if (p.g.isFinite())
 | 
			
		||||
	    p.g = (p.g - pMin) / (pMax - pMin);
 | 
			
		||||
 | 
			
		||||
	if (p.b.isFinite())
 | 
			
		||||
	    p.b = (p.b - pMin) / (pMax - pMin);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
swapPixels (int dw, int dh, Array<Rgba> &pixels)
 | 
			
		||||
{
 | 
			
		||||
    Array<Rgba> tmp (max (dw, dh));
 | 
			
		||||
 | 
			
		||||
    int dw2 = dw / 2;
 | 
			
		||||
    int dh2 = dh / 2;
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Swap top and bottom half
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    for (int x = 0; x < dw; ++x)
 | 
			
		||||
    {
 | 
			
		||||
	for (int y = 0; y < dh; ++y)
 | 
			
		||||
	    tmp[(y + dh2) % dh] = pixels[dw * y + x];
 | 
			
		||||
 | 
			
		||||
	for (int y = 0; y < dh; ++y)
 | 
			
		||||
	    pixels[dw * y + x] = tmp[y];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Swap left and right half
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    for (int y = 0; y < dh; ++y)
 | 
			
		||||
    {
 | 
			
		||||
	for (int x = 0; x < dw; ++x)
 | 
			
		||||
	    tmp[(x + dw2) % dw] = pixels[dw * y + x];
 | 
			
		||||
 | 
			
		||||
	for (int x = 0; x < dw; ++x)
 | 
			
		||||
	    pixels[dw * y + x] = tmp[x];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,99 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef INCLUDED_SCALE_IMAGE_H
 | 
			
		||||
#define INCLUDED_SCALE_IMAGE_H
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Image scaling and filtering functions.
 | 
			
		||||
//
 | 
			
		||||
//----------------------------------------------------------------------------
 | 
			
		||||
#include "namespaceAlias.h"
 | 
			
		||||
 | 
			
		||||
#include <ImfRgba.h>
 | 
			
		||||
#include <ImfArray.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Scale an image horizontally or vertically, by a factor of
 | 
			
		||||
// approximately f (f is adjusted slightly so that the corners
 | 
			
		||||
// of the display window and the data window fall on integer
 | 
			
		||||
// pixel locations).
 | 
			
		||||
//
 | 
			
		||||
// f		scale factor; must be >= 1.0
 | 
			
		||||
//
 | 
			
		||||
// w, h		width and height of the display window
 | 
			
		||||
//
 | 
			
		||||
// dw, dh	width and height of the data window
 | 
			
		||||
//
 | 
			
		||||
// dx, dy	offset of the data window's upper left
 | 
			
		||||
// 		corner from the display window's upper
 | 
			
		||||
// 		left corner
 | 
			
		||||
//
 | 
			
		||||
// pixels	the image's pixel array
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void	scaleX (float f,
 | 
			
		||||
		int &w, int &h,
 | 
			
		||||
		int &dw, int &dh,
 | 
			
		||||
		int &dx, int &dy,
 | 
			
		||||
		IMF::Array<IMF::Rgba> &pixels);
 | 
			
		||||
 | 
			
		||||
void	scaleY (float f, 
 | 
			
		||||
		int &w, int &h, 
 | 
			
		||||
		int &dw, int &dh,
 | 
			
		||||
		int &dx, int &dy,
 | 
			
		||||
		IMF::Array<IMF::Rgba> &pixels);
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Normalize the pixel values in an image so that the smallest
 | 
			
		||||
// value becomes 0.0 and the largest value becomes 1.0.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void	normalizePixels (int dw, int dh, IMF::Array<IMF::Rgba> &pixels);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Swap the left and right half of and image; then swap the
 | 
			
		||||
// top and bottom half, so that the four corners of the image
 | 
			
		||||
// end up in the center.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
void	swapPixels (int dw, int dh, IMF::Array<IMF::Rgba> &pixels);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user