Home | History | Annotate | Download | only in tests
      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   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 	{ "green", 0,0.5019607843137256,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