// This may look like C code, but it is really -*- C++ -*-
//
// Copyright Bob Friesenhahn, 1999, 2000, 2003
//
// Test reading/writing BLOBs using Magick++
//
#include <Magick++.h>
#include <string>
#include <iostream>
#include <fstream>
#if defined(MISSING_STD_IOS_BINARY)
# define IOS_IN_BINARY ios::in
#else
# define IOS_IN_BINARY ios::in | ios::binary
#endif
using namespace std;
using namespace Magick;
// A derived Blob class to exercise updateNoCopy()
class myBlob : public Blob
{
public:
// Construct from open binary stream
myBlob( ifstream &stream_ )
: Blob()
{
unsigned char* blobData = new unsigned char[100000];
char* c= reinterpret_cast<char *>(blobData);
size_t blobLen=0;
while( (blobLen< 100000) && stream_.get(*c) )
{
c++;
blobLen++;
}
if ((!stream_.eof()) || (blobLen == 0))
{
cout << "Failed to stream into blob!" << endl;
exit(1);
}
// Insert data into blob
updateNoCopy( reinterpret_cast<unsigned char*>(blobData), blobLen,
Blob::NewAllocator );
}
};
int main( int /*argc*/, char ** argv)
{
// Initialize ImageMagick install location for Windows
InitializeMagick(*argv);
int failures=0;
try
{
string srcdir("");
if(getenv("SRCDIR") != 0)
srcdir = getenv("SRCDIR");
string testimage;
//
// Test reading BLOBs
//
{
string signature("");
{
Image image(srcdir + "test_image.miff");
signature = image.signature();
}
// Read raw data from file into BLOB
testimage = srcdir + "test_image.miff";
ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY );
if( !in )
{
cout << "Failed to open file " << testimage << " for input!" << endl;
exit(1);
}
unsigned char* blobData = new unsigned char[100000];
char* c=reinterpret_cast<char *>(blobData);
size_t blobLen=0;
while( (blobLen< 100000) && in.get(*c) )
{
c++;
blobLen++;
}
if ((!in.eof()) || (blobLen == 0))
{
cout << "Failed to read file " << testimage << " for input!" << endl;
exit(1);
}
in.close();
// Construct Magick++ Blob
Blob blob(static_cast<const unsigned char*>(blobData), blobLen);
delete [] blobData;
// If construction of image fails, an exception should be thrown
{
// Construct with blob data only
Image image( blob );
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
}
}
{
// Construct with image geometry and blob data
Image image( blob, Geometry(148,99));
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
}
}
{
// Construct default image, and then read in blob data
Image image;
image.read( blob );
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
}
}
{
// Construct default image, and then read in blob data with
// image geometry
Image image;
image.read( blob, Geometry(148,99) );
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
}
}
}
// Test writing BLOBs
{
Blob blob;
string signature("");
{
Image image(srcdir + "test_image.miff");
image.magick("MIFF");
image.write( &blob );
signature = image.signature();
}
{
Image image(blob);
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
image.display();
}
}
}
// Test writing BLOBs via STL writeImages
{
Blob blob;
list<Image> first;
readImages( &first, srcdir + "test_image_anim.miff" );
writeImages( first.begin(), first.end(), &blob, true );
}
// Test constructing a BLOB from a derived class
{
string signature("");
{
Image image(srcdir + "test_image.miff");
signature = image.signature();
}
// Read raw data from file into BLOB
testimage = srcdir + "test_image.miff";
ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY );
if( !in )
{
cout << "Failed to open file for input!" << endl;
exit(1);
}
myBlob blob( in );
in.close();
Image image( blob );
if ( image.signature() != signature )
{
++failures;
cout << "Line: " << __LINE__
<< " Image signature "
<< image.signature()
<< " != "
<< signature << endl;
}
}
}
catch( Exception &error_ )
{
cout << "Caught exception: " << error_.what() << endl;
return 1;
}
catch( exception &error_ )
{
cout << "Caught exception: " << error_.what() << endl;
return 1;
}
if ( failures )
{
cout << failures << " failures" << endl;
return 1;
}
return 0;
}