1// This may look like C code, but it is really -*- C++ -*-
2//
3// Copyright Bob Friesenhahn, 2003
4//
5// Test STL colorHistogram function
6//
7
8#undef USE_VECTOR
9#define USE_MAP
10
11#include <Magick++.h>
12#include <string>
13#include <iostream>
14#include <iomanip>
15#if defined(USE_VECTOR)
16#  include <vector>
17#  include <utility>
18#endif
19#if defined(USE_MAP)
20#  include <map>
21#endif
22
23using namespace std;
24
25using namespace Magick;
26
27int main( int /*argc*/, char ** argv)
28{
29
30  // Initialize ImageMagick install location for Windows
31  InitializeMagick(*argv);
32
33  int failures=0;
34
35  try {
36
37    string srcdir("");
38    if(getenv("SRCDIR") != 0)
39      srcdir = getenv("SRCDIR");
40
41    // Read image
42    Image image;
43    image.read( srcdir + "test_image.miff" );
44
45    // Create histogram vector
46#if defined(USE_MAP)
47    std::map<Color,size_t> histogram;
48#elif defined(USE_VECTOR)
49    std::vector<std::pair<Color,size_t> > histogram;
50#endif
51
52    colorHistogram( &histogram, image );
53
54    // Print out histogram
55#if (MAGICKCORE_QUANTUM_DEPTH == 8)
56    int quantum_width=3;
57#elif (MAGICKCORE_QUANTUM_DEPTH == 16)
58    int quantum_width=5;
59#else
60    int quantum_width=10;
61#endif
62
63    cout << "Histogram for file \"" << image.fileName() << "\"" << endl
64         << histogram.size() << " entries:" << endl;
65
66#if defined(USE_MAP)
67    std::map<Color,size_t>::const_iterator p=histogram.begin();
68#elif defined(USE_VECTOR)
69    std::vector<std::pair<Color,size_t> >::const_iterator p=histogram.begin();
70#endif
71    while (p != histogram.end())
72      {
73        cout << setw(10) << (int)p->second << ": ("
74             << setw(quantum_width) << (int)p->first.quantumRed() << ","
75             << setw(quantum_width) << (int)p->first.quantumGreen() << ","
76             << setw(quantum_width) << (int)p->first.quantumBlue() << ")"
77             << endl;
78        p++;
79      }
80  }
81
82  catch( Exception &error_ )
83    {
84      cout << "Caught exception: " << error_.what() << endl;
85      return 1;
86    }
87  catch( exception &error_ )
88    {
89      cout << "Caught exception: " << error_.what() << endl;
90      return 1;
91    }
92
93  if ( failures )
94    {
95      cout << failures << " failures" << endl;
96      return 1;
97    }
98
99  return 0;
100}
101
102