Home | History | Annotate | Download | only in tests
      1 // This may look like C code, but it is really -*- C++ -*-
      2 //
      3 // Copyright Bob Friesenhahn, 1999, 2000, 2003
      4 //
      5 // Test reading/writing BLOBs using Magick++
      6 //
      7 
      8 #include <Magick++.h>
      9 #include <string>
     10 #include <iostream>
     11 #include <fstream>
     12 
     13 #if defined(MISSING_STD_IOS_BINARY)
     14 #  define IOS_IN_BINARY ios::in
     15 #else
     16 #  define IOS_IN_BINARY ios::in | ios::binary
     17 #endif
     18 
     19 using namespace std;
     20 
     21 using namespace Magick;
     22 
     23 // A derived Blob class to exercise updateNoCopy()
     24 class myBlob : public Blob
     25 {
     26 public:
     27   // Construct from open binary stream
     28   myBlob( ifstream &stream_ )
     29     : Blob()
     30     {
     31       unsigned char* blobData = new unsigned char[100000];
     32       char* c= reinterpret_cast<char *>(blobData);
     33       size_t blobLen=0;
     34       while( (blobLen< 100000) && stream_.get(*c) )
     35         {
     36           c++;
     37           blobLen++;
     38         }
     39       if ((!stream_.eof()) || (blobLen == 0))
     40         {
     41           cout << "Failed to stream into blob!" << endl;
     42           exit(1);
     43         }
     44 
     45       // Insert data into blob
     46       updateNoCopy( reinterpret_cast<unsigned char*>(blobData), blobLen,
     47                     Blob::NewAllocator );
     48     }
     49 };
     50 
     51 
     52 int main( int /*argc*/, char ** argv)
     53 {
     54 
     55   // Initialize ImageMagick install location for Windows
     56   InitializeMagick(*argv);
     57 
     58   int failures=0;
     59 
     60   try
     61     {
     62       string srcdir("");
     63       if(getenv("SRCDIR") != 0)
     64         srcdir = getenv("SRCDIR");
     65 
     66       string testimage;
     67 
     68       //
     69       // Test reading BLOBs
     70       //
     71       {
     72         string signature("");
     73         {
     74           Image image(srcdir + "test_image.miff");
     75           signature = image.signature();
     76         }
     77 
     78         // Read raw data from file into BLOB
     79         testimage = srcdir + "test_image.miff";
     80         ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY );
     81         if( !in )
     82           {
     83             cout << "Failed to open file " << testimage << " for input!" << endl;
     84             exit(1);
     85           }
     86         unsigned char* blobData = new unsigned char[100000];
     87         char* c=reinterpret_cast<char *>(blobData);
     88         size_t blobLen=0;
     89         while( (blobLen< 100000) && in.get(*c) )
     90           {
     91             c++;
     92             blobLen++;
     93           }
     94         if ((!in.eof()) || (blobLen == 0))
     95           {
     96             cout << "Failed to read file " << testimage << " for input!" << endl;
     97             exit(1);
     98           }
     99         in.close();
    100 
    101         // Construct Magick++ Blob
    102         Blob blob(static_cast<const unsigned char*>(blobData), blobLen);
    103         delete [] blobData;
    104 
    105         // If construction of image fails, an exception should be thrown
    106         {
    107           // Construct with blob data only
    108           Image image( blob );
    109           if ( image.signature() != signature )
    110             {
    111               ++failures;
    112               cout << "Line: " << __LINE__
    113                    << "  Image signature "
    114                    << image.signature()
    115                    << " != "
    116                    << signature << endl;
    117             }
    118         }
    119 
    120         {
    121           // Construct with image geometry and blob data
    122           Image image(  blob, Geometry(148,99));
    123           if ( image.signature() != signature )
    124             {
    125               ++failures;
    126               cout << "Line: " << __LINE__
    127                    << "  Image signature "
    128                    << image.signature()
    129                    << " != "
    130                    << signature << endl;
    131             }
    132         }
    133 
    134         {
    135           // Construct default image, and then read in blob data
    136           Image image;
    137           image.read( blob );
    138           if ( image.signature() != signature )
    139             {
    140               ++failures;
    141               cout << "Line: " << __LINE__
    142                    << "  Image signature "
    143                    << image.signature()
    144                    << " != "
    145                    << signature << endl;
    146             }
    147         }
    148 
    149         {
    150           // Construct default image, and then read in blob data with
    151           // image geometry
    152           Image image;
    153           image.read( blob, Geometry(148,99) );
    154           if ( image.signature() != signature )
    155             {
    156               ++failures;
    157               cout << "Line: " << __LINE__
    158                    << "  Image signature "
    159                    << image.signature()
    160                    << " != "
    161                    << signature << endl;
    162             }
    163         }
    164 
    165       }
    166 
    167       // Test writing BLOBs
    168       {
    169         Blob blob;
    170         string signature("");
    171         {
    172           Image image(srcdir + "test_image.miff");
    173           image.magick("MIFF");
    174           image.write( &blob );
    175           signature = image.signature();
    176         }
    177         {
    178           Image image(blob);
    179           if ( image.signature() != signature )
    180             {
    181               ++failures;
    182               cout << "Line: " << __LINE__
    183                    << "  Image signature "
    184                    << image.signature()
    185                    << " != "
    186                    << signature << endl;
    187               image.display();
    188             }
    189         }
    190 
    191       }
    192       // Test writing BLOBs via STL writeImages
    193       {
    194         Blob blob;
    195 
    196         list<Image> first;
    197         readImages( &first, srcdir + "test_image_anim.miff" );
    198         writeImages( first.begin(), first.end(), &blob, true );
    199       }
    200 
    201       // Test constructing a BLOB from a derived class
    202       {
    203 
    204         string signature("");
    205         {
    206           Image image(srcdir + "test_image.miff");
    207           signature = image.signature();
    208         }
    209 
    210         // Read raw data from file into BLOB
    211         testimage = srcdir + "test_image.miff";
    212         ifstream in( testimage.c_str(), ios::in | IOS_IN_BINARY );
    213         if( !in )
    214           {
    215             cout << "Failed to open file for input!" << endl;
    216             exit(1);
    217           }
    218 
    219         myBlob blob( in );
    220         in.close();
    221 
    222         Image image( blob );
    223         if ( image.signature() != signature )
    224           {
    225             ++failures;
    226             cout << "Line: " << __LINE__
    227                  << "  Image signature "
    228                  << image.signature()
    229                  << " != "
    230                  << signature << endl;
    231           }
    232       }
    233     }
    234 
    235   catch( Exception &error_ )
    236     {
    237       cout << "Caught exception: " << error_.what() << endl;
    238       return 1;
    239     }
    240   catch( exception &error_ )
    241     {
    242       cout << "Caught exception: " << error_.what() << endl;
    243       return 1;
    244     }
    245 
    246   if ( failures )
    247     {
    248       cout << failures << " failures" << endl;
    249       return 1;
    250     }
    251 
    252   return 0;
    253 }
    254 
    255 
    256