• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(int,char ** argv)16 int main( int /*argc*/, char **argv)
17 {
18 
19   // Initialize ImageMagick install location for Windows
20   InitializeMagick(*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 }
155