13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// This may look like C code, but it is really -*- C++ -*-
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Copyright Bob Friesenhahn, 1999, 2000, 2003
439930a02337b58a07e01e4b3fc82fe966af25cfddirk// Copyright Dirk Lemstra 2014
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
639930a02337b58a07e01e4b3fc82fe966af25cfddirk// Test STL readImages and writeImages functions and test
739930a02337b58a07e01e4b3fc82fe966af25cfddirk// image format when reading/writing.
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy//
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <Magick++.h>
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <string>
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <iostream>
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <list>
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <vector>
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristyusing namespace std;
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristyusing namespace Magick;
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2039930a02337b58a07e01e4b3fc82fe966af25cfddirkint main(int,char ** argv)
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2239930a02337b58a07e01e4b3fc82fe966af25cfddirk  int
2339930a02337b58a07e01e4b3fc82fe966af25cfddirk    failures=0;
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2539930a02337b58a07e01e4b3fc82fe966af25cfddirk  string
2639930a02337b58a07e01e4b3fc82fe966af25cfddirk    srcdir("");
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2939930a02337b58a07e01e4b3fc82fe966af25cfddirk  // Initialize ImageMagick install location for Windows
3039930a02337b58a07e01e4b3fc82fe966af25cfddirk  InitializeMagick(*argv);
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3239930a02337b58a07e01e4b3fc82fe966af25cfddirk  try
3339930a02337b58a07e01e4b3fc82fe966af25cfddirk  {
3439930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (getenv("SRCDIR") != 0)
3539930a02337b58a07e01e4b3fc82fe966af25cfddirk      srcdir=getenv("SRCDIR");
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    // Test readImages and writeImages
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    //
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list<Image> first;
4139930a02337b58a07e01e4b3fc82fe966af25cfddirk    readImages(&first,srcdir + "test_image_anim.miff");
4239930a02337b58a07e01e4b3fc82fe966af25cfddirk
4339930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (first.size() != 6)
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4539930a02337b58a07e01e4b3fc82fe966af25cfddirk        ++failures;
4639930a02337b58a07e01e4b3fc82fe966af25cfddirk        cout << "Line: " << __LINE__
4739930a02337b58a07e01e4b3fc82fe966af25cfddirk          << "  Read images failed, number of frames is "
4839930a02337b58a07e01e4b3fc82fe966af25cfddirk          << first.size()
4939930a02337b58a07e01e4b3fc82fe966af25cfddirk          << " rather than 6 as expected." << endl;
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5139930a02337b58a07e01e4b3fc82fe966af25cfddirk
5239930a02337b58a07e01e4b3fc82fe966af25cfddirk    writeImages(first.begin(),first.end(),"testmagick_anim_out.miff");
5339930a02337b58a07e01e4b3fc82fe966af25cfddirk
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list<Image> second;
5539930a02337b58a07e01e4b3fc82fe966af25cfddirk    readImages(&second,"testmagick_anim_out.miff");
5639930a02337b58a07e01e4b3fc82fe966af25cfddirk
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list<Image>::iterator firstIter = first.begin();
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list<Image>::iterator secondIter = second.begin();
5939930a02337b58a07e01e4b3fc82fe966af25cfddirk    while (firstIter != first.end() && secondIter != second.end())
6039930a02337b58a07e01e4b3fc82fe966af25cfddirk    {
6139930a02337b58a07e01e4b3fc82fe966af25cfddirk      if (firstIter->scene() != secondIter->scene())
6239930a02337b58a07e01e4b3fc82fe966af25cfddirk        {
6339930a02337b58a07e01e4b3fc82fe966af25cfddirk          ++failures;
6439930a02337b58a07e01e4b3fc82fe966af25cfddirk          cout << "Line: " << __LINE__
6539930a02337b58a07e01e4b3fc82fe966af25cfddirk            << "  Image scene: " << secondIter->scene()
6639930a02337b58a07e01e4b3fc82fe966af25cfddirk            << " is not equal to original "
6739930a02337b58a07e01e4b3fc82fe966af25cfddirk            << firstIter->scene()
6839930a02337b58a07e01e4b3fc82fe966af25cfddirk            << endl;
6939930a02337b58a07e01e4b3fc82fe966af25cfddirk        }
7039930a02337b58a07e01e4b3fc82fe966af25cfddirk
7139930a02337b58a07e01e4b3fc82fe966af25cfddirk      if (firstIter->rows() != secondIter->rows())
7239930a02337b58a07e01e4b3fc82fe966af25cfddirk        {
7339930a02337b58a07e01e4b3fc82fe966af25cfddirk          ++failures;
7439930a02337b58a07e01e4b3fc82fe966af25cfddirk          cout << "Line: " << __LINE__
7539930a02337b58a07e01e4b3fc82fe966af25cfddirk            << "  Image rows " << secondIter->rows()
7639930a02337b58a07e01e4b3fc82fe966af25cfddirk            << " are not equal to original "
7739930a02337b58a07e01e4b3fc82fe966af25cfddirk            << firstIter->rows()
7839930a02337b58a07e01e4b3fc82fe966af25cfddirk            << endl;
7939930a02337b58a07e01e4b3fc82fe966af25cfddirk        }
8039930a02337b58a07e01e4b3fc82fe966af25cfddirk
8139930a02337b58a07e01e4b3fc82fe966af25cfddirk      if (firstIter->columns() != secondIter->columns())
8239930a02337b58a07e01e4b3fc82fe966af25cfddirk        {
8339930a02337b58a07e01e4b3fc82fe966af25cfddirk          ++failures;
8439930a02337b58a07e01e4b3fc82fe966af25cfddirk          cout << "Line: " << __LINE__
8539930a02337b58a07e01e4b3fc82fe966af25cfddirk            << "  Image columns " << secondIter->columns()
8639930a02337b58a07e01e4b3fc82fe966af25cfddirk            << " are not equal to original "
8739930a02337b58a07e01e4b3fc82fe966af25cfddirk            << firstIter->rows()
8839930a02337b58a07e01e4b3fc82fe966af25cfddirk            << endl;
8939930a02337b58a07e01e4b3fc82fe966af25cfddirk        }
9039930a02337b58a07e01e4b3fc82fe966af25cfddirk
9139930a02337b58a07e01e4b3fc82fe966af25cfddirk      firstIter++;
9239930a02337b58a07e01e4b3fc82fe966af25cfddirk      secondIter++;
9339930a02337b58a07e01e4b3fc82fe966af25cfddirk    }
9439930a02337b58a07e01e4b3fc82fe966af25cfddirk
9539930a02337b58a07e01e4b3fc82fe966af25cfddirk    Image third(*first.begin());
9639930a02337b58a07e01e4b3fc82fe966af25cfddirk    third.write("testmagick_anim_out");
9739930a02337b58a07e01e4b3fc82fe966af25cfddirk
9839930a02337b58a07e01e4b3fc82fe966af25cfddirk    Image fourth;
9939930a02337b58a07e01e4b3fc82fe966af25cfddirk    fourth.read("testmagick_anim_out");
10039930a02337b58a07e01e4b3fc82fe966af25cfddirk
10139930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (fourth.magick() != "MIFF")
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10339930a02337b58a07e01e4b3fc82fe966af25cfddirk        ++failures;
10439930a02337b58a07e01e4b3fc82fe966af25cfddirk        cout << "Line: " << __LINE__
10539930a02337b58a07e01e4b3fc82fe966af25cfddirk          << "  Image magick: " << fourth.magick()
10639930a02337b58a07e01e4b3fc82fe966af25cfddirk          << " is not equal to MIFF"
10739930a02337b58a07e01e4b3fc82fe966af25cfddirk          << endl;
10839930a02337b58a07e01e4b3fc82fe966af25cfddirk      }
10939930a02337b58a07e01e4b3fc82fe966af25cfddirk
11039930a02337b58a07e01e4b3fc82fe966af25cfddirk    third.write("testmagick_anim_out.ico");
11139930a02337b58a07e01e4b3fc82fe966af25cfddirk    fourth.read("testmagick_anim_out.ico");
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11339930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (fourth.magick() != "ICO")
11439930a02337b58a07e01e4b3fc82fe966af25cfddirk      {
11539930a02337b58a07e01e4b3fc82fe966af25cfddirk        ++failures;
11639930a02337b58a07e01e4b3fc82fe966af25cfddirk        cout << "Line: " << __LINE__
11739930a02337b58a07e01e4b3fc82fe966af25cfddirk          << "  Image magick: " << fourth.magick()
11839930a02337b58a07e01e4b3fc82fe966af25cfddirk          << " is not equal to ICO"
11939930a02337b58a07e01e4b3fc82fe966af25cfddirk          << endl;
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12239930a02337b58a07e01e4b3fc82fe966af25cfddirk    third.magick("BMP");
12339930a02337b58a07e01e4b3fc82fe966af25cfddirk    third.write("testmagick_anim_out.ico");
12439930a02337b58a07e01e4b3fc82fe966af25cfddirk    fourth.read("testmagick_anim_out.ico");
12539930a02337b58a07e01e4b3fc82fe966af25cfddirk
12639930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (fourth.magick() != "BMP")
12739930a02337b58a07e01e4b3fc82fe966af25cfddirk      {
12839930a02337b58a07e01e4b3fc82fe966af25cfddirk        ++failures;
12939930a02337b58a07e01e4b3fc82fe966af25cfddirk        cout << "Line: " << __LINE__
13039930a02337b58a07e01e4b3fc82fe966af25cfddirk          << "  Image magick: " << fourth.magick()
13139930a02337b58a07e01e4b3fc82fe966af25cfddirk          << " is not equal to BMP"
13239930a02337b58a07e01e4b3fc82fe966af25cfddirk          << endl;
13339930a02337b58a07e01e4b3fc82fe966af25cfddirk      }
13439930a02337b58a07e01e4b3fc82fe966af25cfddirk
13539930a02337b58a07e01e4b3fc82fe966af25cfddirk    third.write("PDB:testmagick_anim_out.ico");
13639930a02337b58a07e01e4b3fc82fe966af25cfddirk    fourth.read("testmagick_anim_out.ico");
13739930a02337b58a07e01e4b3fc82fe966af25cfddirk
13839930a02337b58a07e01e4b3fc82fe966af25cfddirk    if (fourth.magick() != "PDB")
13939930a02337b58a07e01e4b3fc82fe966af25cfddirk      {
14039930a02337b58a07e01e4b3fc82fe966af25cfddirk        ++failures;
14139930a02337b58a07e01e4b3fc82fe966af25cfddirk        cout << "Line: " << __LINE__
14239930a02337b58a07e01e4b3fc82fe966af25cfddirk          << "  Image magick: " << fourth.magick()
14339930a02337b58a07e01e4b3fc82fe966af25cfddirk          << " is not equal to PDB"
14439930a02337b58a07e01e4b3fc82fe966af25cfddirk          << endl;
14539930a02337b58a07e01e4b3fc82fe966af25cfddirk      }
14649ccbc806b20f4892e6c8588768617afdfcee3cddirk
14749ccbc806b20f4892e6c8588768617afdfcee3cddirk    third.magick("");
14849ccbc806b20f4892e6c8588768617afdfcee3cddirk    third.write("testmagick_anim_out.ico");
14949ccbc806b20f4892e6c8588768617afdfcee3cddirk    fourth.read("testmagick_anim_out.ico");
15049ccbc806b20f4892e6c8588768617afdfcee3cddirk
15149ccbc806b20f4892e6c8588768617afdfcee3cddirk    if (fourth.magick() != "ICO")
15249ccbc806b20f4892e6c8588768617afdfcee3cddirk      {
15349ccbc806b20f4892e6c8588768617afdfcee3cddirk        ++failures;
15449ccbc806b20f4892e6c8588768617afdfcee3cddirk        cout << "Line: " << __LINE__
15549ccbc806b20f4892e6c8588768617afdfcee3cddirk          << "  Image magick: " << fourth.magick()
15649ccbc806b20f4892e6c8588768617afdfcee3cddirk          << " is not equal to ICO"
15749ccbc806b20f4892e6c8588768617afdfcee3cddirk          << endl;
15849ccbc806b20f4892e6c8588768617afdfcee3cddirk      }
15939930a02337b58a07e01e4b3fc82fe966af25cfddirk  }
16039930a02337b58a07e01e4b3fc82fe966af25cfddirk  catch(Exception &error_)
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      cout << "Caught exception: " << error_.what() << endl;
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return 1;
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
16539930a02337b58a07e01e4b3fc82fe966af25cfddirk  catch(exception &error_)
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      cout << "Caught exception: " << error_.what() << endl;
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return 1;
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17139930a02337b58a07e01e4b3fc82fe966af25cfddirk  if (failures)
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      cout << failures << " failures" << endl;
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return 1;
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17639930a02337b58a07e01e4b3fc82fe966af25cfddirk
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return 0;
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
180