00001 #include "PNGTests.h"
00002
00003
00004 void
00005 PNGTests::testLoader() {
00006 static const string base = "images/pngsuite/";
00007
00008 static const char* good[] = {
00009 "basi0g01.png",
00010 "basi0g02.png",
00011 "basi0g04.png",
00012 "basi0g08.png",
00013 "basi0g16.png",
00014 "basi2c08.png",
00015 "basi2c16.png",
00016 "basi3p01.png",
00017 "basi3p02.png",
00018 "basi3p04.png",
00019 "basi3p08.png",
00020 "basi4a08.png",
00021 "basi4a16.png",
00022 "basi6a08.png",
00023 "basi6a16.png",
00024 "basn0g01.png",
00025 "basn0g02.png",
00026 "basn0g04.png",
00027 "basn0g08.png",
00028 "basn0g16.png",
00029 "basn2c08.png",
00030 "basn2c16.png",
00031 "basn3p01.png",
00032 "basn3p02.png",
00033 "basn3p04.png",
00034 "basn3p08.png",
00035 "basn4a08.png",
00036 "basn4a16.png",
00037 "basn6a08.png",
00038 "basn6a16.png",
00039 "bgai4a08.png",
00040 "bgai4a16.png",
00041 "bgan6a08.png",
00042 "bgan6a16.png",
00043 "bgbn4a08.png",
00044 "bggn4a16.png",
00045 "bgwn6a08.png",
00046 "bgyn6a16.png",
00047 "ccwn2c08.png",
00048 "ccwn3p08.png",
00049 "cdfn2c08.png",
00050 "cdhn2c08.png",
00051 "cdsn2c08.png",
00052 "cdun2c08.png",
00053 "ch1n3p04.png",
00054 "ch2n3p08.png",
00055 "cm0n0g04.png",
00056 "cm7n0g04.png",
00057 "cm9n0g04.png",
00058 "cs3n2c16.png",
00059 "cs3n3p08.png",
00060 "cs5n2c08.png",
00061 "cs5n3p08.png",
00062 "cs8n2c08.png",
00063 "cs8n3p08.png",
00064 "ct0n0g04.png",
00065 "ct1n0g04.png",
00066 "ctzn0g04.png",
00067 "f00n0g08.png",
00068 "f00n2c08.png",
00069 "f01n0g08.png",
00070 "f01n2c08.png",
00071 "f02n0g08.png",
00072 "f02n2c08.png",
00073 "f03n0g08.png",
00074 "f03n2c08.png",
00075 "f04n0g08.png",
00076 "f04n2c08.png",
00077 "g03n0g16.png",
00078 "g03n2c08.png",
00079 "g03n3p04.png",
00080 "g04n0g16.png",
00081 "g04n2c08.png",
00082 "g04n3p04.png",
00083 "g05n0g16.png",
00084 "g05n2c08.png",
00085 "g05n3p04.png",
00086 "g07n0g16.png",
00087 "g07n2c08.png",
00088 "g07n3p04.png",
00089 "g10n0g16.png",
00090 "g10n2c08.png",
00091 "g10n3p04.png",
00092 "g25n0g16.png",
00093 "g25n2c08.png",
00094 "g25n3p04.png",
00095 "oi1n0g16.png",
00096 "oi1n2c16.png",
00097 "oi2n0g16.png",
00098 "oi2n2c16.png",
00099 "oi4n0g16.png",
00100 "oi4n2c16.png",
00101 "oi9n0g16.png",
00102 "oi9n2c16.png",
00103 "pngsuite_logo.png",
00104 "pp0n2c16.png",
00105 "pp0n6a08.png",
00106 "ps1n0g08.png",
00107 "ps1n2c16.png",
00108 "ps2n0g08.png",
00109 "ps2n2c16.png",
00110 "s01i3p01.png",
00111 "s01n3p01.png",
00112 "s02i3p01.png",
00113 "s02n3p01.png",
00114 "s03i3p01.png",
00115 "s03n3p01.png",
00116 "s04i3p01.png",
00117 "s04n3p01.png",
00118 "s05i3p02.png",
00119 "s05n3p02.png",
00120 "s06i3p02.png",
00121 "s06n3p02.png",
00122 "s07i3p02.png",
00123 "s07n3p02.png",
00124 "s08i3p02.png",
00125 "s08n3p02.png",
00126 "s09i3p02.png",
00127 "s09n3p02.png",
00128 "s32i3p04.png",
00129 "s32n3p04.png",
00130 "s33i3p04.png",
00131 "s33n3p04.png",
00132 "s34i3p04.png",
00133 "s34n3p04.png",
00134 "s35i3p04.png",
00135 "s35n3p04.png",
00136 "s36i3p04.png",
00137 "s36n3p04.png",
00138 "s37i3p04.png",
00139 "s37n3p04.png",
00140 "s38i3p04.png",
00141 "s38n3p04.png",
00142 "s39i3p04.png",
00143 "s39n3p04.png",
00144 "s40i3p04.png",
00145 "s40n3p04.png",
00146 "tbbn1g04.png",
00147 "tbbn2c16.png",
00148 "tbbn3p08.png",
00149 "tbgn2c16.png",
00150 "tbgn3p08.png",
00151 "tbrn2c08.png",
00152 "tbwn1g16.png",
00153 "tbwn3p08.png",
00154 "tbyn3p08.png",
00155 "tp0n1g08.png",
00156 "tp0n2c08.png",
00157 "tp0n3p08.png",
00158 "tp1n3p08.png",
00159 "z00n2c08.png",
00160 "z03n2c08.png",
00161 "z06n2c08.png",
00162 "z09n2c08.png",
00163 };
00164 static const int good_length = sizeof(good) / sizeof(*good);
00165
00166 static const char* bad[] = {
00167 "x00n0g01.png",
00168 "xcrn0g04.png",
00169 "xlfn0g04.png",
00170 };
00171 static const int bad_length = sizeof(bad) / sizeof(*bad);
00172
00173
00174 for (int i = 0; i < good_length; ++i) {
00175 string fn = base + good[i];
00176 auto_ptr<Image> image(OpenImage(fn.c_str()));
00177 CPPUNIT_ASSERT_MESSAGE("should work - opening " + fn, image.get() != 0);
00178 }
00179
00180 for (int i = 0; i < bad_length; ++i) {
00181 string fn = base + bad[i];
00182 auto_ptr<Image> image(OpenImage(fn.c_str()));
00183 CPPUNIT_ASSERT_MESSAGE("should fail - opening " + fn, image.get() == 0);
00184 }
00185 }
00186
00187
00188 void
00189 setRandomBytes(byte* b, int size) {
00190 while (size--) {
00191 *b++ = byte(rand() % 256);
00192 }
00193 }
00194
00195
00196 void
00197 PNGTests::testWriter() {
00198 static const int width = 256;
00199 static const int height = 256;
00200
00201
00202 auto_ptr<Image> image(CreateImage(width, height, PF_R8G8B8A8));
00203 setRandomBytes((byte*)image->getPixels(), width * height * 4);
00204
00205
00206 char* filename = tmpnam(0);
00207 CPPUNIT_ASSERT_MESSAGE("opening temporary file", filename != 0);
00208
00209
00210 CPPUNIT_ASSERT(SaveImage(filename, FF_PNG, image.get()) == true);
00211
00212
00213 auto_ptr<Image> img2(OpenImage(filename, PF_R8G8B8A8));
00214 CPPUNIT_ASSERT_MESSAGE("reloading image file", img2.get() != 0);
00215
00216 AssertImagesEqual(
00217 "comparing saved with loaded",
00218 image.get(),
00219 img2.get());
00220
00221
00222 auto_ptr<Image> img3(OpenImage(filename, PF_R8G8B8));
00223 CPPUNIT_ASSERT(SaveImage(filename, FF_PNG, img3.get()) == true);
00224
00225 remove(filename);
00226
00227
00228
00229
00230
00231 #if 0
00232 char* plt_filename = tmpnam(0);
00233 CPPUNIT_ASSERT_MESSAGE("opening temporary file (palette)", plt_filename != 0);
00234 auto_ptr<Image> plt(CreateImage(256, 256, PF_I8, 256, PF_R8G8B8));
00235 setRandomBytes((byte*)plt->getPixels(), 256 * 256);
00236 setRandomBytes((byte*)plt->getPalette(), 256);
00237
00238 CPPUNIT_ASSERT(SaveImage(plt_filename, FF_PNG, plt.get()) == true);
00239
00240 auto_ptr<Image> plt2(OpenImage(plt_filename, FF_PNG));
00241 CPPUNIT_ASSERT_MESSAGE("reloading palettized image", plt2.get() != 0);
00242 CPPUNIT_ASSERT(plt2->getPaletteSize() == 256);
00243 CPPUNIT_ASSERT(plt2->getPaletteFormat() == PF_R8G8B8);
00244 CPPUNIT_ASSERT(plt2->getFormat() == PF_I8);
00245 AssertImagesEqual("Comparing palettized image", plt.get(), plt2.get());
00246
00247 remove(plt_filename);
00248 #endif
00249 }
00250
00251
00252 Test*
00253 PNGTests::suite() {
00254 typedef TestCaller<PNGTests> Caller;
00255
00256 TestSuite* suite = new TestSuite();
00257 suite->addTest(new Caller("Test PNG Loader", &PNGTests::testLoader));
00258 suite->addTest(new Caller("Test PNG Writer", &PNGTests::testWriter));
00259 return suite;
00260 }