00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Image/ColorOps.H"
00039 #include "Image/IO.H"
00040 #include "Image/Image.H"
00041 #include "Image/MathOps.H"
00042 #include "Image/Pixels.H"
00043 #include "Image/Transforms.H"
00044 #include "Raster/GenericFrame.H"
00045 #include "Raster/PfmParser.H"
00046 #include "Raster/PfmWriter.H"
00047 #include "Raster/Raster.H"
00048 #include "TestSuite/TestSuite.H"
00049 #include "Util/log.H"
00050 #include "Util/sformat.H"
00051 #include "rutz/rand.h"
00052
00053 #include <algorithm>
00054 #include <deque>
00055 #include <limits>
00056 #include <string>
00057 #include <unistd.h>
00058
00059 namespace
00060 {
00061
00062 class TempFile
00063 {
00064 static int theCounter;
00065 std::string itsName;
00066 public:
00067 TempFile(const char* ext = "")
00068 :
00069 itsName(sformat("test-Raster-%d-tmp-%d.%s",
00070 int(getpid()), theCounter++, ext))
00071 {}
00072
00073 ~TempFile()
00074 {
00075 unlink(itsName.c_str());
00076 }
00077
00078 const char* name() const { return itsName.c_str(); }
00079 };
00080
00081 int TempFile::theCounter = 1;
00082
00083 template <class T>
00084 struct Randomizer
00085 {
00086 T top;
00087
00088 Randomizer(T val = std::numeric_limits<T>::max()) : top(val) {}
00089
00090 T operator()() const
00091 {
00092 return T( randomDouble() * double(top) );;
00093 }
00094 };
00095
00096 template <class T>
00097 struct Randomizer<PixRGB<T> >
00098 {
00099 Randomizer<T> randomT;
00100
00101 PixRGB<T> operator()() const
00102 {
00103 return PixRGB<T>(randomT(), randomT(), randomT());
00104 }
00105 };
00106
00107 template <>
00108 struct Randomizer<float>
00109 {
00110 float operator()() const
00111 {
00112 return float(255.0f*randomDouble());
00113 }
00114 };
00115
00116 template <class T>
00117 Image<T> randImage(int w, int h)
00118 {
00119 Image<T> result(w, h, NO_INIT);
00120
00121 std::generate(result.beginw(), result.endw(), Randomizer<T>());
00122
00123 return result;
00124 }
00125
00126 template <class T>
00127 Image<T> randImage()
00128 {
00129 Randomizer<int> r(500);
00130
00131 return randImage<T>(r()+10, r()+10);
00132 }
00133 }
00134
00135
00136
00137
00138
00139
00140
00141 static void Raster_xx_img_gray_write_bw_read_gray_xx_1(TestSuite& suite)
00142 {
00143 Image<byte> i1 = randImage<byte>();
00144
00145 TempFile tf("pbm"); Raster::WriteGray(i1, tf.name());
00146
00147 Image<byte> i2 = Raster::ReadGray(tf.name());
00148
00149 REQUIRE_EQ(i2, makeBinary(i1, byte(127), byte(0), byte(255)));
00150 }
00151
00152 static void Raster_xx_img_gray_write_gray_read_gray_xx_1(TestSuite& suite)
00153 {
00154 Image<byte> i1 = randImage<byte>();
00155
00156 TempFile tf("pgm"); Raster::WriteGray(i1, tf.name());
00157
00158 Image<byte> i2 = Raster::ReadGray(tf.name());
00159
00160 REQUIRE_EQ(i2, i1);
00161 }
00162
00163 static void Raster_xx_img_gray_write_gray_read_rgb_xx_1(TestSuite& suite)
00164 {
00165 Image<byte> i1 = randImage<byte>();
00166
00167 TempFile tf("pgm"); Raster::WriteGray(i1, tf.name());
00168
00169 Image<PixRGB<byte> > i2 = Raster::ReadRGB(tf.name());
00170
00171 Image<byte> r, g, b; getComponents(i2, r, g, b);
00172 REQUIRE_EQ(r, i1);
00173 REQUIRE_EQ(g, i1);
00174 REQUIRE_EQ(b, i1);
00175 }
00176
00177 static void Raster_xx_img_gray_write_rgb_read_gray_xx_1(TestSuite& suite)
00178 {
00179 Image<byte> i1 = randImage<byte>();
00180
00181 TempFile tf("ppm"); Raster::WriteRGB(i1, tf.name());
00182
00183 Image<byte> i2 = Raster::ReadGray(tf.name());
00184
00185 REQUIRE_EQ(i2, i1);
00186 }
00187
00188 static void Raster_xx_img_gray_write_rgb_read_rgb_xx_1(TestSuite& suite)
00189 {
00190 Image<byte> i1 = randImage<byte>();
00191
00192 TempFile tf("ppm"); Raster::WriteRGB(i1, tf.name());
00193
00194 Image<PixRGB<byte> > i2 = Raster::ReadRGB(tf.name());
00195
00196 Image<byte> r, g, b; getComponents(i2, r, g, b);
00197 REQUIRE_EQ(r, i1);
00198 REQUIRE_EQ(g, i1);
00199 REQUIRE_EQ(b, i1);
00200 }
00201
00202 static void Raster_xx_img_rgb_write_gray_read_gray_xx_1(TestSuite& suite)
00203 {
00204 Image<PixRGB<byte> > i1 = randImage<PixRGB<byte> >();
00205
00206 TempFile tf("pgm"); Raster::WriteGray(luminance(i1), tf.name());
00207
00208 Image<byte> i2 = Raster::ReadGray(tf.name());
00209
00210 REQUIRE_EQ(i2, luminance(i1));
00211 }
00212
00213 static void Raster_xx_img_rgb_write_gray_read_rgb_xx_1(TestSuite& suite)
00214 {
00215 Image<PixRGB<byte> > i1 = randImage<PixRGB<byte> >();
00216
00217 TempFile tf("pgm"); Raster::WriteGray(luminance(i1), tf.name());
00218
00219 Image<PixRGB<byte> > i2 = Raster::ReadRGB(tf.name());
00220
00221 REQUIRE_EQ(luminance(i2), luminance(i1));
00222 }
00223
00224 static void Raster_xx_img_rgb_write_rgb_read_gray_xx_1(TestSuite& suite)
00225 {
00226 Image<PixRGB<byte> > i1 = randImage<PixRGB<byte> >();
00227
00228 TempFile tf("ppm"); Raster::WriteRGB(i1, tf.name());
00229
00230 Image<byte> i2 = Raster::ReadGray(tf.name());
00231
00232 REQUIRE_EQ(i2, luminance(i1));
00233 }
00234
00235 static void Raster_xx_img_rgb_write_rgb_read_rgb_xx_1(TestSuite& suite)
00236 {
00237 Image<PixRGB<byte> > i1 = randImage<PixRGB<byte> >();
00238
00239 TempFile tf("ppm"); Raster::WriteRGB(i1, tf.name());
00240
00241 Image<PixRGB<byte> > i2 = Raster::ReadRGB(tf.name());
00242
00243 REQUIRE_EQ(i2, i1);
00244 }
00245
00246 static void Raster_xx_img_float_write_float_read_float_xx_1(TestSuite& suite)
00247 {
00248 Image<float> i1 = randImage<float>();
00249
00250 TempFile tf("pfm"); Raster::WriteFloat(i1, 0, tf.name());
00251
00252 Image<float> i2 = Raster::ReadFloat(tf.name());
00253
00254 REQUIRE_EQ(i2, i1);
00255 }
00256
00257 static void Raster_xx_pfm_tags_xx_1(TestSuite& suite)
00258 {
00259 const Image<float> i1 = randImage<float>();
00260
00261 std::deque<std::string> tagNames;
00262 std::deque<std::string> tagValues;
00263
00264 tagNames.push_back("test tag name #1");
00265 tagValues.push_back("test tag value #1");
00266
00267 tagNames.push_back("test tag name #2");
00268 tagValues.push_back("test tag value #2");
00269
00270 TempFile tf("pfm");
00271
00272 PfmWriter::writeFloat(i1, tf.name(), tagNames, tagValues);
00273
00274 PfmParser parser(tf.name());
00275
00276 REQUIRE_EQ(parser.getTagCount(), uint(2));
00277
00278 std::string name, value;
00279
00280 REQUIRE_EQ(parser.getTag(0, name, value), true);
00281 REQUIRE_EQ(name, tagNames[0]);
00282 REQUIRE_EQ(value, tagValues[0]);
00283
00284 REQUIRE_EQ(parser.getTag(1, name, value), true);
00285 REQUIRE_EQ(name, tagNames[1]);
00286 REQUIRE_EQ(value, tagValues[1]);
00287
00288 REQUIRE_EQ(parser.getComments(), std::string());
00289
00290 const Image<float> i2 = parser.getFrame().asFloat();
00291
00292 REQUIRE_EQ(i1, i2);
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302 int main(int argc, const char** argv)
00303 {
00304 initRandomNumbers();
00305
00306 TestSuite suite;
00307
00308 suite.ADD_TEST(Raster_xx_img_gray_write_bw_read_gray_xx_1);
00309 suite.ADD_TEST(Raster_xx_img_gray_write_gray_read_gray_xx_1);
00310 suite.ADD_TEST(Raster_xx_img_gray_write_gray_read_rgb_xx_1);
00311 suite.ADD_TEST(Raster_xx_img_gray_write_rgb_read_gray_xx_1);
00312 suite.ADD_TEST(Raster_xx_img_gray_write_rgb_read_rgb_xx_1);
00313 suite.ADD_TEST(Raster_xx_img_rgb_write_gray_read_gray_xx_1);
00314 suite.ADD_TEST(Raster_xx_img_rgb_write_gray_read_rgb_xx_1);
00315 suite.ADD_TEST(Raster_xx_img_rgb_write_rgb_read_gray_xx_1);
00316 suite.ADD_TEST(Raster_xx_img_rgb_write_rgb_read_rgb_xx_1);
00317 suite.ADD_TEST(Raster_xx_img_float_write_float_read_float_xx_1);
00318 suite.ADD_TEST(Raster_xx_pfm_tags_xx_1);
00319
00320 suite.parseAndRun(argc, argv);
00321
00322 return 0;
00323 }
00324
00325
00326
00327
00328
00329