Blame exrenvmap/readInputImage.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//      function readInputImage() --
Packit Service 6754ca
//      reads an image file and constructs an EnvMapImage object
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include <makeCubeMap.h>
Packit Service 6754ca
Packit Service 6754ca
#include <ImfRgbaFile.h>
Packit Service 6754ca
#include <ImfStandardAttributes.h>
Packit Service 6754ca
#include <EnvmapImage.h>
Packit Service 6754ca
#include "Iex.h"
Packit Service 6754ca
#include "IexMacros.h"
Packit Service 6754ca
#include <iostream>
Packit Service 6754ca
#include <string>
Packit Service 6754ca
#include <string.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#include "namespaceAlias.h"
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readSingleImage (const char inFileName[],
Packit Service 6754ca
                 float padTop,
Packit Service 6754ca
                 float padBottom,
Packit Service 6754ca
                 Envmap overrideType,
Packit Service 6754ca
                 bool verbose,
Packit Service 6754ca
                 EnvmapImage &image,
Packit Service 6754ca
                 Header &header,
Packit Service 6754ca
                 RgbaChannels &channels)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Read the input image, and if necessary,
Packit Service 6754ca
    // pad the image at the top and bottom.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    RgbaInputFile in (inFileName);
Packit Service 6754ca
Packit Service 6754ca
    if (verbose)
Packit Service 6754ca
        cout << "reading file " << inFileName << endl;
Packit Service 6754ca
Packit Service 6754ca
    header = in.header();
Packit Service 6754ca
    channels = in.channels();
Packit Service 6754ca
Packit Service 6754ca
    Envmap type = ENVMAP_LATLONG;
Packit Service 6754ca
Packit Service 6754ca
    if (hasEnvmap (in.header()))
Packit Service 6754ca
        type = envmap (in.header());
Packit Service 6754ca
Packit Service 6754ca
    if (overrideType == ENVMAP_LATLONG ||
Packit Service 6754ca
        overrideType == ENVMAP_CUBE)
Packit Service 6754ca
    {
Packit Service 6754ca
        type = overrideType;
Packit Service 6754ca
        addEnvmap (header, overrideType);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    const Box2i &dw = in.dataWindow();
Packit Service 6754ca
    int w = dw.max.x - dw.min.x + 1;
Packit Service 6754ca
    int h = dw.max.y - dw.min.y + 1;
Packit Service 6754ca
Packit Service 6754ca
    int pt = 0;
Packit Service 6754ca
    int pb = 0;
Packit Service 6754ca
Packit Service 6754ca
    if (type == ENVMAP_LATLONG)
Packit Service 6754ca
    {
Packit Service 6754ca
        pt = int (padTop * h + 0.5f);
Packit Service 6754ca
        pb = int (padBottom * h + 0.5f);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    Box2i paddedDw (V2i (dw.min.x, dw.min.y - pt),
Packit Service 6754ca
                    V2i (dw.max.x, dw.max.y + pb));
Packit Service 6754ca
    
Packit Service 6754ca
    image.resize (type, paddedDw);
Packit Service 6754ca
    Array2D<Rgba> &pixels = image.pixels();
Packit Service 6754ca
Packit Service 6754ca
    in.setFrameBuffer (&pixels[-paddedDw.min.y][-paddedDw.min.x], 1, w);
Packit Service 6754ca
    in.readPixels (dw.min.y, dw.max.y);
Packit Service 6754ca
Packit Service 6754ca
    for (int y = 0; y < pt; ++y)
Packit Service 6754ca
        for (int x = 0; x < w; ++x)
Packit Service 6754ca
            pixels[y][x] = pixels[pt][x];
Packit Service 6754ca
Packit Service 6754ca
    for (int y = h + pt; y < h + pt + pb; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
        for (int x = 0; x < w; ++x)
Packit Service 6754ca
            pixels[y][x] = pixels[h + pt - 1][x];
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readSixImages (const char inFileName[],
Packit Service 6754ca
               bool verbose,
Packit Service 6754ca
               EnvmapImage &image,
Packit Service 6754ca
               Header &header,
Packit Service 6754ca
               RgbaChannels &channels)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Generate six file names by replacing the first '%' character in
Packit Service 6754ca
    // inFileName with +X, -X, ... -Z.  Interpreting the corresponding
Packit Service 6754ca
    // image files as the six sides of a cube, assembe a single cube-
Packit Service 6754ca
    // face map image.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    static const char *faceNames[] =
Packit Service 6754ca
        {"+X", "-X", "+Y", "-Y", "+Z", "-Z"};
Packit Service 6754ca
Packit Service 6754ca
    size_t pos = strchr (inFileName, '%') - inFileName;
Packit Service 6754ca
    string name = string(inFileName).replace (pos, 1, faceNames[0]);
Packit Service 6754ca
Packit Service 6754ca
    Box2i dw;
Packit Service 6754ca
    int w, h;
Packit Service 6754ca
Packit Service 6754ca
    {
Packit Service 6754ca
        RgbaInputFile in (name.c_str());
Packit Service 6754ca
Packit Service 6754ca
        if (verbose)
Packit Service 6754ca
            cout << "reading cube face size from file " << name << endl;
Packit Service 6754ca
Packit Service 6754ca
        dw = in.dataWindow();
Packit Service 6754ca
        w = dw.max.x - dw.min.x + 1;
Packit Service 6754ca
        h = dw.max.y - dw.min.y + 1;
Packit Service 6754ca
Packit Service 6754ca
        if (w != h)
Packit Service 6754ca
        {
Packit Service 6754ca
            THROW (IEX::InputExc,
Packit Service 6754ca
                   "Cube face image " << name << " is not square.");
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        header = in.header();
Packit Service 6754ca
        channels = in.channels();
Packit Service 6754ca
        addEnvmap (header, ENVMAP_CUBE);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    const Box2i imageDw (V2i (0, 0), V2i (w - 1, 6 * h - 1));
Packit Service 6754ca
Packit Service 6754ca
    image.resize (ENVMAP_CUBE, imageDw);
Packit Service 6754ca
    Rgba *pixels = &(image.pixels()[0][0]);
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < 6; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        string name = string(inFileName).replace (pos, 1, faceNames[i]);
Packit Service 6754ca
Packit Service 6754ca
        RgbaInputFile in (name.c_str());
Packit Service 6754ca
Packit Service 6754ca
        if (verbose)
Packit Service 6754ca
            cout << "reading file " << name << endl;
Packit Service 6754ca
Packit Service 6754ca
        if (in.dataWindow() != dw)
Packit Service 6754ca
        {
Packit Service 6754ca
            THROW (IEX::InputExc,
Packit Service 6754ca
                   "The data window of cube face " << name << " differs "
Packit Service 6754ca
                   "from the data window of other cube faces.");
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        in.setFrameBuffer (pixels - dw.min.x - dw.min.y * w, 1, w);
Packit Service 6754ca
        in.readPixels (dw.min.y, dw.max.y);
Packit Service 6754ca
Packit Service 6754ca
        pixels += w * h;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readInputImage (const char inFileName[],
Packit Service 6754ca
                float padTop,
Packit Service 6754ca
                float padBottom,
Packit Service 6754ca
                Envmap overrideType,
Packit Service 6754ca
                bool verbose,
Packit Service 6754ca
                EnvmapImage &image,
Packit Service 6754ca
                Header &header,
Packit Service 6754ca
                RgbaChannels &channels)
Packit Service 6754ca
{
Packit Service 6754ca
    if (strchr (inFileName, '%'))
Packit Service 6754ca
    {
Packit Service 6754ca
        readSixImages (inFileName,
Packit Service 6754ca
                       verbose,
Packit Service 6754ca
                       image,
Packit Service 6754ca
                       header,
Packit Service 6754ca
                       channels);
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        readSingleImage (inFileName,
Packit Service 6754ca
                         padTop,
Packit Service 6754ca
                         padBottom,
Packit Service 6754ca
                         overrideType,
Packit Service 6754ca
                         verbose,
Packit Service 6754ca
                         image,
Packit Service 6754ca
                         header,
Packit Service 6754ca
                         channels);
Packit Service 6754ca
    }
Packit Service 6754ca
}