#include <maya/MPxImageFile.h>
#include <maya/MImageFileInfo.h>
#include <maya/MImage.h>
#include <maya/MFnPlugin.h>
#include <maya/MStringArray.h>
#include <maya/MIOStream.h>
#include <maya/MGlobal.h>
#include "tiff.h"
#include "tiffio.h"
MString kImagePluginName(
"TIFF Float Reader");
#define _TIFF_SUCCESS 1
{
public:
tiffFloatReader();
~tiffFloatReader() override;
static void* creator();
protected:
unsigned int fWidth;
unsigned int fHeight;
unsigned int fChannels;
TIFF *fInputFile;
};
tiffFloatReader::tiffFloatReader()
: fInputFile( NULL),
fChannels( 0),
fWidth(0),
fHeight(0)
{
}
tiffFloatReader::~tiffFloatReader()
{
close();
}
void * tiffFloatReader::creator()
{
return new tiffFloatReader();
}
{
try
{
fInputFile = (TIFF *) TIFFOpen( pathname.
asChar(),
"r" );
}
catch( ... )
{
}
if( !fInputFile)
{
return MS::kFailure;
}
unsigned short num_samps;
unsigned short bitsPerChannel;
unsigned short sampleType = 0;
short config;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_IMAGEWIDTH, &fWidth ) ||
fWidth < 1)
goto no_support;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_IMAGELENGTH, &fHeight ) ||
fHeight < 1)
goto no_support;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_SAMPLESPERPIXEL, &num_samps))
goto no_support;
if ((num_samps != 3) && (num_samps!= 4))
goto no_support;
fChannels = num_samps;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_BITSPERSAMPLE, &bitsPerChannel))
goto no_support;
if (bitsPerChannel != 32)
goto no_support;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_SAMPLEFORMAT, &sampleType) ||
sampleType != SAMPLEFORMAT_IEEEFP)
{
goto no_support;
}
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_PLANARCONFIG, &config) ||
(config != PLANARCONFIG_CONTIG))
{
goto no_support;
}
#if 0
unsigned short compression;
if (_TIFF_SUCCESS != TIFFGetField(fInputFile, TIFFTAG_COMPRESSION, &compression) ||
(compression != COMPRESSION_NONE))
{
goto no_support;
}
#endif
if( info)
{
}
return MS::kSuccess;
no_support:
close();
return MS::kFailure;
}
{
if (fInputFile)
TIFFClose( fInputFile );
fInputFile = NULL;
return MS::kSuccess;
}
MStatus tiffFloatReader::load(
MImage& image,
unsigned int imageNumber)
{
if (!fInputFile)
return rval;
if (outputBuffer == NULL)
return rval;
unsigned int row = 0;
bool flipVertically = true;
if (flipVertically)
{
outputBuffer += (fHeight-1) * (fWidth * fChannels);
for (row = 0; row < fHeight; row++)
{
TIFFReadScanline (fInputFile, outputBuffer, row);
outputBuffer -= (fWidth * fChannels);
}
}
else
{
for (row = 0; row < fHeight; row++)
{
TIFFReadScanline (fInputFile, outputBuffer, row);
outputBuffer += (fWidth * fChannels);
}
}
rval = MS::kSuccess;
return rval;
}
{
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"2020",
"Any" );
kImagePluginName,
tiffFloatReader::creator,
extensions,
MFnPlugin::kImageFilePriorityLow));
return MS::kSuccess;
}
{
return MS::kSuccess;
}