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