//---------------------------------------------------------------------------------------------
typedef struct my_error_mgr {
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
} *my_error_ptr;
METHODDEF void my_error_exit (j_common_ptr cinfo) {
my_error_ptr myerr = (my_error_ptr) cinfo->err;
longjmp(myerr->setjmp_buffer, 1);
}
//Number of simultaneous live strings.
//Libtiff uses a large number of strings simultaneously in a dialog, so this method
//was modified so that it iterates through a different number of buffers.
#define TIF_MAX_STRINGS 4
#define TIF_MAX_STRING_SIZE 256
//Declare this function as extern "C" so that the libtiff stuff can hook into it.
extern "C" TCHAR *GetString(int id)
{
static int bufPos=0;
static TCHAR buf[TIF_MAX_STRING_SIZE*TIF_MAX_STRINGS];
TCHAR* ret;
if( LoadString(NULL, id, buf+bufPos, TIF_MAX_STRING_SIZE) ) {
ret = buf+bufPos;
bufPos += TIF_MAX_STRING_SIZE;
if( bufPos >= TIF_MAX_STRINGS*TIF_MAX_STRING_SIZE ) bufPos = 0;
return ret;
}
return NULL;
}
//---------------------------------------------------------------------------------------------
void Eclinse::getExt(std::string & name)
{
int pos;
if( (pos = (int) name.find_last_of('.')) != name.npos ) {
int count = (int) name.length() - pos;
if( count > 5 )
count = 5;
name = name.substr( pos, count );
if( name[name.length() - 1] == '\\' )
name = name.substr( 0, name.length() - 1 );
}
}
//---------------------------------------------------------------------------------------------
ImageFile::ImageFile()
{
fp = NULL;
width = 0;
height = 0;
width1 = 0;
height1 = 0;
component = 0;
ypos = 0;
}
//---------------------------------------------------------------------------------------------
ImageFile::~ImageFile()
{
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetWidth() const
{
return width;
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetHeight() const
{
return height;
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetComponent() const
{
return component;
}
//---------------------------------------------------------------------------------------------
RAWImageFile::RAWImageFile()
{
wb = 0;
}
//---------------------------------------------------------------------------------------------
RAWImageFile::~RAWImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
fread( &w, sizeof(int), 1, fp );
fread( &h, sizeof(int), 1, fp );
fread( &c, sizeof(int), 1, fp );
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
fread( &width, sizeof(int), 1, fp );
fread( &height, sizeof(int), 1, fp );
fread( &component, sizeof(int), 1, fp );
if( component != 3 && component != 4 )
return false;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
wb = width * component;
return true;
}
//---------------------------------------------------------------------------------------------
void RAWImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::MoveToLine(int y)
{
if( fp == NULL || y < 0 || y >= height )
return false;
fseek( fp, y * wb, SEEK_SET );
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::MoveToNextLine()
{
if( fp == NULL || ypos == height1 )
return false;
fseek( fp, wb, SEEK_CUR );
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void RAWImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( fp == NULL )
return;
fseek( fp, x1 * component, SEEK_CUR );
if( component == 3 ) {
fread( BGRbuf, (x2 - x1) * component, 1, fp );
} else if( component == 4 ) {
for(int i = x1; i < x2; ++i) {
fread( BGRbuf, 3, 1, fp );
fread( Abuf, 1, 1, fp );
BGRbuf += 3;
++ Abuf;
}
}
fseek( fp, - x2 * component, SEEK_CUR );
}
//---------------------------------------------------------------------------------------------
BMPImageFile::BMPImageFile()
{
wb = 0;
}
//---------------------------------------------------------------------------------------------
BMPImageFile::~BMPImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
BITMAPFILEHEADER bfhHeader;
fread( &bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );
if( bfhHeader.bfType != 0x4d42 ) {
fclose( fp );
return false;
}
UINT uBmpInfoLen = (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
LPBITMAPINFOHEADER m_lpBMPHdr = (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];
fread( m_lpBMPHdr, uBmpInfoLen, 1, fp );
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
m_lpBMPHdr->biBitCount != 24 ||
m_lpBMPHdr->biCompression != BI_RGB ) {
delete [] m_lpBMPHdr;
fclose( fp );
return false;
}
w = m_lpBMPHdr->biWidth;
h = m_lpBMPHdr->biHeight;
c = 4;
delete [] m_lpBMPHdr;
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
BITMAPFILEHEADER bfhHeader;
fread( &bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );
if( bfhHeader.bfType != 0x4d42 ) {
fclose( fp );
return false;
}
UINT uBmpInfoLen = (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
LPBITMAPINFOHEADER m_lpBMPHdr = (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];
fread( m_lpBMPHdr, uBmpInfoLen, 1, fp );
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
m_lpBMPHdr->biBitCount != 24 ||
m_lpBMPHdr->biCompression != BI_RGB ) {
delete [] m_lpBMPHdr;
fclose( fp );
return false;
}
width = m_lpBMPHdr->biWidth;
height = m_lpBMPHdr->biHeight;
component = 3;
width1 = width - 1;
height1 = height - 1;
ypos = height1;
wb = (width * 3 + 3) & ~3;
delete [] m_lpBMPHdr;
return true;
}
//---------------------------------------------------------------------------------------------
void BMPImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::MoveToLine(int y)
{
if( fp == NULL || y < 0 || y >= height )
return false;
fseek( fp, 0, SEEK_END );
fseek( fp, - wb * (y + 1), SEEK_CUR );
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::MoveToNextLine()
{
if( fp == NULL || ypos == height1 )
return false;
fseek( fp, - wb, SEEK_CUR );
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void BMPImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( fp == NULL )
return;
fseek( fp, x1 * component, SEEK_CUR );
fread( BGRbuf, (x2 - x1) * component, 1, fp );
fseek( fp, - x2 * component, SEEK_CUR );
}
//---------------------------------------------------------------------------------------------
JPGImageFile::JPGImageFile()
{
}
//---------------------------------------------------------------------------------------------
JPGImageFile::~JPGImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" ) ) == NULL )
return false;
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
cinfo.err = jpeg_std_error( &jerr.pub );
jerr.pub.error_exit = my_error_exit;
if( setjmp(jerr.setjmp_buffer) ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
jpeg_create_decompress( &cinfo );
jpeg_stdio_src( &cinfo, fp );
jpeg_read_header( &cinfo, TRUE );
jpeg_start_decompress( &cinfo );
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
return false;
w = cinfo.output_width;
h = cinfo.output_height;
c = cinfo.num_components;
jpeg_destroy_decompress( &cinfo );
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" ) ) == NULL )
return false;
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
JSAMPARRAY buffer;
int row_stride;
FILE *tmpf = NULL;
cinfo.err = jpeg_std_error( &jerr.pub );
jerr.pub.error_exit = my_error_exit;
if( setjmp(jerr.setjmp_buffer) ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
jpeg_create_decompress( &cinfo );
jpeg_stdio_src( &cinfo, fp );
jpeg_read_header( &cinfo, TRUE );
jpeg_start_decompress( &cinfo );
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
return false;
width = cinfo.output_width;
height = cinfo.output_height;
component = cinfo.num_components;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
row_stride = width * component;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
tmpnam( tmpf_name );
if( (tmpf = fopen(tmpf_name, "wb")) == NULL ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
fwrite( &width, sizeof(int), 1, tmpf );
fwrite( &height, sizeof(int), 1, tmpf );
fwrite( &component, sizeof(int), 1, tmpf );
while( cinfo.output_scanline < cinfo.output_height ) {
jpeg_read_scanlines( &cinfo, buffer, 1 );
BYTE *ptr = buffer[0];
if( component == 3 ) {
for(int i = 0; i < width; ++i) {
fwrite( ptr + 2, 1, 1, tmpf );
fwrite( ptr + 1, 1, 1, tmpf );
fwrite( ptr + 0, 1, 1, tmpf );
ptr += component;
}
} else if( component == 4 ) {
for(int i = 0; i < width; ++i) {
fwrite( ptr + 2, 1, 1, tmpf );
fwrite( ptr + 1, 1, 1, tmpf );
fwrite( ptr + 0, 1, 1, tmpf );
fwrite( ptr + 3, 1, 1, tmpf );
ptr += component;
}
}
};
fclose( tmpf );
jpeg_finish_decompress( &cinfo );
jpeg_destroy_decompress( &cinfo );
raw.Load( tmpf_name );
return true;
}
//---------------------------------------------------------------------------------------------
void JPGImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
raw.Close();
remove( tmpf_name );
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::MoveToLine(int y)
{
return raw.MoveToLine( y );
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::MoveToNextLine()
{
return raw.MoveToNextLine();
}
//---------------------------------------------------------------------------------------------
void JPGImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
raw.FormatSubLine( BGRbuf, Abuf, x1, x2 );
}
//---------------------------------------------------------------------------------------------
TIFImageFile::TIFImageFile()
{
tif = NULL;
td = NULL;
loadbuf = NULL;
}
//---------------------------------------------------------------------------------------------
TIFImageFile::~TIFImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
return false;
td = &tif->tif_dir;
if( td->td_photometric != PHOTOMETRIC_RGB ||
(td->td_samplesperpixel != 3 && td->td_samplesperpixel != 4) ||
td->td_bitspersample != 8 )
return false;
w = td->td_imagewidth;
h = td->td_imagelength;
c = td->td_samplesperpixel;
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::Load(const char *name)
{
Close();
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
return false;
td = &tif->tif_dir;
if( td->td_photometric != PHOTOMETRIC_RGB ||
(td->td_samplesperpixel != 3 && td->td_samplesperpixel != 4) ||
td->td_bitspersample != 8 )
return false;
width = td->td_imagewidth;
height = td->td_imagelength;
component = td->td_samplesperpixel;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
loadbuf = new BYTE[ tif->tif_scanlinesize ];
return true;
}
//---------------------------------------------------------------------------------------------
void TIFImageFile::Close()
{
if( tif != NULL ) {
TIFFClose( tif );
tif = NULL;
td = NULL;
}
if( loadbuf != NULL ) {
delete [] loadbuf;
loadbuf = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::MoveToLine(int y)
{
if( tif == NULL || y < 0 || y >= height )
return false;
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::MoveToNextLine()
{
if( tif == NULL || ypos == height1 )
return false;
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void TIFImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( tif == NULL )
return;
BYTE *dst, *ptr;
if( td->td_planarconfig == PLANARCONFIG_SEPARATE ) {
for(int i = 0; i < 3; ++i) {
TIFFReadScanline( tif, loadbuf, ypos, 2 - i );
dst = BGRbuf + i,
ptr = loadbuf + x1;
for(int x = x1; x < x2; ++x) {
dst[0] = ptr[0];
dst += 3;
++ ptr;
}
}
if( component == 4 ) {
TIFFReadScanline( tif, loadbuf, ypos, 3 );
dst = Abuf;
ptr = loadbuf + x1;
for(int x = x1; x < x2; ++x) {
dst[0] = ptr[0];
++ dst;
++ ptr;
}
}
} else {
TIFFReadScanline( tif, loadbuf, ypos, 0 );
ptr = loadbuf + x1 * component;
if( component == 3 ) {
for(int i = x1; i < x2; ++i) {
BGRbuf[0] = ptr[2];
BGRbuf[1] = ptr[1];
BGRbuf[2] = ptr[0];
BGRbuf += 3;
ptr += component;
}
} else if( component == 4 ) {
for(int i = x1; i < x2; ++i) {
BGRbuf[0] = ptr[2];
BGRbuf[1] = ptr[1];
BGRbuf[2] = ptr[0];
Abuf[0] = ptr[3];
BGRbuf += 3;
++ Abuf;
ptr += component;
}
}
}
}
//---------------------------------------------------------------------------------------------
typedef struct my_error_mgr {
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
} *my_error_ptr;
METHODDEF void my_error_exit (j_common_ptr cinfo) {
my_error_ptr myerr = (my_error_ptr) cinfo->err;
longjmp(myerr->setjmp_buffer, 1);
}
//Number of simultaneous live strings.
//Libtiff uses a large number of strings simultaneously in a dialog, so this method
//was modified so that it iterates through a different number of buffers.
#define TIF_MAX_STRINGS 4
#define TIF_MAX_STRING_SIZE 256
//Declare this function as extern "C" so that the libtiff stuff can hook into it.
extern "C" TCHAR *GetString(int id)
{
static int bufPos=0;
static TCHAR buf[TIF_MAX_STRING_SIZE*TIF_MAX_STRINGS];
TCHAR* ret;
if( LoadString(NULL, id, buf+bufPos, TIF_MAX_STRING_SIZE) ) {
ret = buf+bufPos;
bufPos += TIF_MAX_STRING_SIZE;
if( bufPos >= TIF_MAX_STRINGS*TIF_MAX_STRING_SIZE ) bufPos = 0;
return ret;
}
return NULL;
}
//---------------------------------------------------------------------------------------------
void Eclinse::getExt(std::string & name)
{
int pos;
if( (pos = (int) name.find_last_of('.')) != name.npos ) {
int count = (int) name.length() - pos;
if( count > 5 )
count = 5;
name = name.substr( pos, count );
if( name[name.length() - 1] == '\\' )
name = name.substr( 0, name.length() - 1 );
}
}
//---------------------------------------------------------------------------------------------
ImageFile::ImageFile()
{
fp = NULL;
width = 0;
height = 0;
width1 = 0;
height1 = 0;
component = 0;
ypos = 0;
}
//---------------------------------------------------------------------------------------------
ImageFile::~ImageFile()
{
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetWidth() const
{
return width;
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetHeight() const
{
return height;
}
//---------------------------------------------------------------------------------------------
int ImageFile::GetComponent() const
{
return component;
}
//---------------------------------------------------------------------------------------------
RAWImageFile::RAWImageFile()
{
wb = 0;
}
//---------------------------------------------------------------------------------------------
RAWImageFile::~RAWImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
fread( &w, sizeof(int), 1, fp );
fread( &h, sizeof(int), 1, fp );
fread( &c, sizeof(int), 1, fp );
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
fread( &width, sizeof(int), 1, fp );
fread( &height, sizeof(int), 1, fp );
fread( &component, sizeof(int), 1, fp );
if( component != 3 && component != 4 )
return false;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
wb = width * component;
return true;
}
//---------------------------------------------------------------------------------------------
void RAWImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::MoveToLine(int y)
{
if( fp == NULL || y < 0 || y >= height )
return false;
fseek( fp, y * wb, SEEK_SET );
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool RAWImageFile::MoveToNextLine()
{
if( fp == NULL || ypos == height1 )
return false;
fseek( fp, wb, SEEK_CUR );
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void RAWImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( fp == NULL )
return;
fseek( fp, x1 * component, SEEK_CUR );
if( component == 3 ) {
fread( BGRbuf, (x2 - x1) * component, 1, fp );
} else if( component == 4 ) {
for(int i = x1; i < x2; ++i) {
fread( BGRbuf, 3, 1, fp );
fread( Abuf, 1, 1, fp );
BGRbuf += 3;
++ Abuf;
}
}
fseek( fp, - x2 * component, SEEK_CUR );
}
//---------------------------------------------------------------------------------------------
BMPImageFile::BMPImageFile()
{
wb = 0;
}
//---------------------------------------------------------------------------------------------
BMPImageFile::~BMPImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
BITMAPFILEHEADER bfhHeader;
fread( &bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );
if( bfhHeader.bfType != 0x4d42 ) {
fclose( fp );
return false;
}
UINT uBmpInfoLen = (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
LPBITMAPINFOHEADER m_lpBMPHdr = (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];
fread( m_lpBMPHdr, uBmpInfoLen, 1, fp );
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
m_lpBMPHdr->biBitCount != 24 ||
m_lpBMPHdr->biCompression != BI_RGB ) {
delete [] m_lpBMPHdr;
fclose( fp );
return false;
}
w = m_lpBMPHdr->biWidth;
h = m_lpBMPHdr->biHeight;
c = 4;
delete [] m_lpBMPHdr;
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" )) == NULL )
return false;
BITMAPFILEHEADER bfhHeader;
fread( &bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );
if( bfhHeader.bfType != 0x4d42 ) {
fclose( fp );
return false;
}
UINT uBmpInfoLen = (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
LPBITMAPINFOHEADER m_lpBMPHdr = (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];
fread( m_lpBMPHdr, uBmpInfoLen, 1, fp );
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
m_lpBMPHdr->biBitCount != 24 ||
m_lpBMPHdr->biCompression != BI_RGB ) {
delete [] m_lpBMPHdr;
fclose( fp );
return false;
}
width = m_lpBMPHdr->biWidth;
height = m_lpBMPHdr->biHeight;
component = 3;
width1 = width - 1;
height1 = height - 1;
ypos = height1;
wb = (width * 3 + 3) & ~3;
delete [] m_lpBMPHdr;
return true;
}
//---------------------------------------------------------------------------------------------
void BMPImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::MoveToLine(int y)
{
if( fp == NULL || y < 0 || y >= height )
return false;
fseek( fp, 0, SEEK_END );
fseek( fp, - wb * (y + 1), SEEK_CUR );
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool BMPImageFile::MoveToNextLine()
{
if( fp == NULL || ypos == height1 )
return false;
fseek( fp, - wb, SEEK_CUR );
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void BMPImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( fp == NULL )
return;
fseek( fp, x1 * component, SEEK_CUR );
fread( BGRbuf, (x2 - x1) * component, 1, fp );
fseek( fp, - x2 * component, SEEK_CUR );
}
//---------------------------------------------------------------------------------------------
JPGImageFile::JPGImageFile()
{
}
//---------------------------------------------------------------------------------------------
JPGImageFile::~JPGImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (fp = fopen( name, "rb" ) ) == NULL )
return false;
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
cinfo.err = jpeg_std_error( &jerr.pub );
jerr.pub.error_exit = my_error_exit;
if( setjmp(jerr.setjmp_buffer) ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
jpeg_create_decompress( &cinfo );
jpeg_stdio_src( &cinfo, fp );
jpeg_read_header( &cinfo, TRUE );
jpeg_start_decompress( &cinfo );
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
return false;
w = cinfo.output_width;
h = cinfo.output_height;
c = cinfo.num_components;
jpeg_destroy_decompress( &cinfo );
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::Load(const char *name)
{
Close();
if( (fp = fopen( name, "rb" ) ) == NULL )
return false;
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
JSAMPARRAY buffer;
int row_stride;
FILE *tmpf = NULL;
cinfo.err = jpeg_std_error( &jerr.pub );
jerr.pub.error_exit = my_error_exit;
if( setjmp(jerr.setjmp_buffer) ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
jpeg_create_decompress( &cinfo );
jpeg_stdio_src( &cinfo, fp );
jpeg_read_header( &cinfo, TRUE );
jpeg_start_decompress( &cinfo );
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
return false;
width = cinfo.output_width;
height = cinfo.output_height;
component = cinfo.num_components;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
row_stride = width * component;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
tmpnam( tmpf_name );
if( (tmpf = fopen(tmpf_name, "wb")) == NULL ) {
jpeg_destroy_decompress( &cinfo );
return false;
}
fwrite( &width, sizeof(int), 1, tmpf );
fwrite( &height, sizeof(int), 1, tmpf );
fwrite( &component, sizeof(int), 1, tmpf );
while( cinfo.output_scanline < cinfo.output_height ) {
jpeg_read_scanlines( &cinfo, buffer, 1 );
BYTE *ptr = buffer[0];
if( component == 3 ) {
for(int i = 0; i < width; ++i) {
fwrite( ptr + 2, 1, 1, tmpf );
fwrite( ptr + 1, 1, 1, tmpf );
fwrite( ptr + 0, 1, 1, tmpf );
ptr += component;
}
} else if( component == 4 ) {
for(int i = 0; i < width; ++i) {
fwrite( ptr + 2, 1, 1, tmpf );
fwrite( ptr + 1, 1, 1, tmpf );
fwrite( ptr + 0, 1, 1, tmpf );
fwrite( ptr + 3, 1, 1, tmpf );
ptr += component;
}
}
};
fclose( tmpf );
jpeg_finish_decompress( &cinfo );
jpeg_destroy_decompress( &cinfo );
raw.Load( tmpf_name );
return true;
}
//---------------------------------------------------------------------------------------------
void JPGImageFile::Close()
{
if( fp != NULL ) {
fclose( fp );
fp = NULL;
}
raw.Close();
remove( tmpf_name );
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::MoveToLine(int y)
{
return raw.MoveToLine( y );
}
//---------------------------------------------------------------------------------------------
bool JPGImageFile::MoveToNextLine()
{
return raw.MoveToNextLine();
}
//---------------------------------------------------------------------------------------------
void JPGImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
raw.FormatSubLine( BGRbuf, Abuf, x1, x2 );
}
//---------------------------------------------------------------------------------------------
TIFImageFile::TIFImageFile()
{
tif = NULL;
td = NULL;
loadbuf = NULL;
}
//---------------------------------------------------------------------------------------------
TIFImageFile::~TIFImageFile()
{
Close();
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::GetInfo(const char *name, int & w, int & h, int & c)
{
Close();
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
return false;
td = &tif->tif_dir;
if( td->td_photometric != PHOTOMETRIC_RGB ||
(td->td_samplesperpixel != 3 && td->td_samplesperpixel != 4) ||
td->td_bitspersample != 8 )
return false;
w = td->td_imagewidth;
h = td->td_imagelength;
c = td->td_samplesperpixel;
Close();
return true;
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::Load(const char *name)
{
Close();
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
return false;
td = &tif->tif_dir;
if( td->td_photometric != PHOTOMETRIC_RGB ||
(td->td_samplesperpixel != 3 && td->td_samplesperpixel != 4) ||
td->td_bitspersample != 8 )
return false;
width = td->td_imagewidth;
height = td->td_imagelength;
component = td->td_samplesperpixel;
width1 = width - 1;
height1 = height - 1;
ypos = 0;
loadbuf = new BYTE[ tif->tif_scanlinesize ];
return true;
}
//---------------------------------------------------------------------------------------------
void TIFImageFile::Close()
{
if( tif != NULL ) {
TIFFClose( tif );
tif = NULL;
td = NULL;
}
if( loadbuf != NULL ) {
delete [] loadbuf;
loadbuf = NULL;
}
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::MoveToLine(int y)
{
if( tif == NULL || y < 0 || y >= height )
return false;
ypos = y;
return true;
}
//---------------------------------------------------------------------------------------------
bool TIFImageFile::MoveToNextLine()
{
if( tif == NULL || ypos == height1 )
return false;
++ ypos;
return true;
}
//---------------------------------------------------------------------------------------------
void TIFImageFile::FormatSubLine(BYTE *BGRbuf, BYTE *Abuf, int x1, int x2)
{
if( tif == NULL )
return;
BYTE *dst, *ptr;
if( td->td_planarconfig == PLANARCONFIG_SEPARATE ) {
for(int i = 0; i < 3; ++i) {
TIFFReadScanline( tif, loadbuf, ypos, 2 - i );
dst = BGRbuf + i,
ptr = loadbuf + x1;
for(int x = x1; x < x2; ++x) {
dst[0] = ptr[0];
dst += 3;
++ ptr;
}
}
if( component == 4 ) {
TIFFReadScanline( tif, loadbuf, ypos, 3 );
dst = Abuf;
ptr = loadbuf + x1;
for(int x = x1; x < x2; ++x) {
dst[0] = ptr[0];
++ dst;
++ ptr;
}
}
} else {
TIFFReadScanline( tif, loadbuf, ypos, 0 );
ptr = loadbuf + x1 * component;
if( component == 3 ) {
for(int i = x1; i < x2; ++i) {
BGRbuf[0] = ptr[2];
BGRbuf[1] = ptr[1];
BGRbuf[2] = ptr[0];
BGRbuf += 3;
ptr += component;
}
} else if( component == 4 ) {
for(int i = x1; i < x2; ++i) {
BGRbuf[0] = ptr[2];
BGRbuf[1] = ptr[1];
BGRbuf[2] = ptr[0];
Abuf[0] = ptr[3];
BGRbuf += 3;
++ Abuf;
ptr += component;
}
}
}
}
//---------------------------------------------------------------------------------------------