Magick++  7.1.2-29
Convert, Edit, Or Compose Bitmap Images
color.cpp
1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4 //
5 // Test Magick::Color classes
6 //
7 
8 #include <Magick++.h>
9 #include <string>
10 #include <iostream>
11 
12 using namespace std;
13 
14 using namespace Magick;
15 
16 int main( int /*argc*/, char **argv)
17 {
18 
19  // Initialize ImageMagick install location for Windows
20  MagickPlusPlusGenesis genesis(*argv);
21 
22  int failures=0;
23 
24  try {
25 
26  //
27  // Verify conversion from named colors as well as ColorRGB constructor
28  //
29 
30  {
31  struct colorStr
32  {
33  const char* color;
34  double red;
35  double green;
36  double blue;
37  };
38 
39  // Convert ratios from rgb.txt via value/255
40  struct colorStr colorMap [] =
41  {
42  { "red", 1,0,0 },
43  { "lime", 0,1,0 },
44  { "blue", 0,0,1 },
45  { "black", 0,0,0 },
46  { "white", 1,1,1 },
47  { "cyan", 0,1,1 },
48  { "magenta", 1,0,1 },
49  { "yellow", 1,1,0 },
50  { NULL, 0,0,0 }
51  };
52 
53  for ( int i = 0; colorMap[i].color != NULL; i++ )
54  {
55  {
56  Color color( colorMap[i].color );
57  ColorRGB colorMatch( colorMap[i].red,
58  colorMap[i].green,
59  colorMap[i].blue );
60  if ( color != colorMatch )
61  {
62  ++failures;
63  cout << "Line: " << __LINE__ << " Color(\""
64  << colorMap[i].color << "\") is "
65  << string(color)
66  << " rather than "
67  << string(colorMatch)
68  << endl;
69  // printf ("Green: %10.16f\n", color.green());
70  }
71  }
72  }
73  }
74 
75  // Test conversion to/from X11-style color specifications
76  {
77  const char * colorStrings[] =
78  {
79  "#ABC",
80  "#AABBCC",
81  "#AAAABBBBCCCC",
82  NULL
83  };
84 
85 #if MAGICKCORE_QUANTUM_DEPTH == 8
86  string expectedString = "#AABBCC";
87 #elif MAGICKCORE_QUANTUM_DEPTH == 16
88  string expectedString = "#AAAABBBBCCCC";
89 #elif MAGICKCORE_QUANTUM_DEPTH == 32
90  string expectedString = "#AAAAAAAABBBBBBBBCCCCCCCC";
91 #elif MAGICKCORE_QUANTUM_DEPTH == 64
92  string expectedString = "#AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCC";
93 #else
94 # error Quantum depth not supported!
95 #endif
96 
97  for ( int i = 0; colorStrings[i] != NULL; ++i )
98  {
99  if ( string(Color(colorStrings[i])) != expectedString )
100  {
101  ++failures;
102  cout << "Line: " << __LINE__
103  << " Conversion from " << colorStrings[i]
104  << " is "
105  << string(Color(colorStrings[i])) << " rather than "
106  << expectedString
107  << endl;
108  }
109  }
110  }
111 
112  // Test ColorGray
113  {
114  double resolution = 1.0/QuantumRange;
115  if ( resolution < 0.0000001 )
116  resolution = 0.0000001;
117  double max_error = resolution + MagickEpsilon;
118 
119  for( double value = 0; value < 1.0 + MagickEpsilon; value += resolution )
120  {
121  ColorGray gray(value);
122  if ( gray.shade() < value - max_error || gray.shade() > value + max_error )
123  {
124  ++failures;
125  cout << "Line: " << __LINE__
126  << " shade is "
127  << gray.shade()
128  << " rather than nominal "
129  << value
130  << endl;
131  }
132  }
133  }
134 
135  }
136  catch( Exception &error_ )
137  {
138  cout << "Caught exception: " << error_.what() << endl;
139  return 1;
140  }
141  catch( exception &error_ )
142  {
143  cout << "Caught exception: " << error_.what() << endl;
144  return 1;
145  }
146 
147  if ( failures )
148  {
149  cout << failures << " failures" << endl;
150  return 1;
151  }
152 
153  return 0;
154 }