corona
1.0.2
|
00001 #include "PaletteTests.h" 00002 00003 00004 struct RGB { 00005 byte red; 00006 byte green; 00007 byte blue; 00008 }; 00009 00010 struct BGR { 00011 byte blue; 00012 byte green; 00013 byte red; 00014 }; 00015 00016 00017 void 00018 PaletteTests::testAPI() { 00019 // make sure basic palettized image stuff works 00020 auto_ptr<Image> img1(CreateImage(32, 32, PF_I8, 00021 256, PF_R8G8B8)); 00022 byte* pixels = (byte*)img1->getPixels(); 00023 RGB* palette = (RGB*)img1->getPalette(); 00024 for (int i = 0; i < 32 * 32; ++i) { 00025 pixels[i] = i % 256; 00026 } 00027 for (int i = 0; i < 256; ++i) { 00028 palette[i].red = i; 00029 palette[i].green = i; 00030 palette[i].blue = i; 00031 } 00032 00033 CPPUNIT_ASSERT(img1->getFormat() == PF_I8); 00034 CPPUNIT_ASSERT(img1->getPaletteFormat() == PF_R8G8B8); 00035 00036 // duplicate 00037 auto_ptr<Image> clone(CloneImage(img1.get())); 00038 CPPUNIT_ASSERT(clone->getFormat() == PF_I8); 00039 CPPUNIT_ASSERT(clone->getPaletteFormat() == PF_R8G8B8); 00040 CPPUNIT_ASSERT(clone->getPaletteSize() == 256); 00041 00042 AssertImagesEqual("Comparing clone of palettized image", 00043 img1.get(), clone.get()); 00044 00045 // convert to R8G8B8 00046 auto_ptr<Image> conv(CloneImage(img1.get(), PF_R8G8B8)); 00047 CPPUNIT_ASSERT(conv->getFormat() == PF_R8G8B8); 00048 CPPUNIT_ASSERT(conv->getPalette() == 0); 00049 CPPUNIT_ASSERT(conv->getPaletteFormat() == PF_DONTCARE); 00050 CPPUNIT_ASSERT(conv->getPaletteSize() == 0); 00051 00052 // make sure the converted image is right 00053 RGB* conv_pixels = (RGB*)conv->getPixels(); 00054 bool exact = true; 00055 for (int i = 0; i < 32 * 32; ++i) { 00056 exact = exact && (conv_pixels[i].red == i % 256 && 00057 conv_pixels[i].green == i % 256 && 00058 conv_pixels[i].blue == i % 256); 00059 } 00060 CPPUNIT_ASSERT(exact == true); 00061 00062 // passing in an invalid palette size should fail 00063 auto_ptr<Image> img2(CreateImage(32, 32, PF_I8, 255, PF_R8G8B8)); 00064 auto_ptr<Image> img3(CreateImage(32, 32, PF_I8, 257, PF_R8G8B8)); 00065 CPPUNIT_ASSERT(img2.get() == 0); 00066 CPPUNIT_ASSERT(img3.get() == 0); 00067 00068 // can't create palettized images with direct-color CreateImage and 00069 // vice versa 00070 auto_ptr<Image> img4(CreateImage(32, 32, PF_I8)); 00071 auto_ptr<Image> img5(CreateImage(32, 32, PF_R8G8B8, 256, PF_R8G8B8)); 00072 auto_ptr<Image> img6(CreateImage(32, 32, PF_R8G8B8, 256, PF_I8)); 00073 CPPUNIT_ASSERT(img4.get() == 0); 00074 CPPUNIT_ASSERT(img5.get() == 0); 00075 CPPUNIT_ASSERT(img6.get() == 0); 00076 00077 00078 // test ConvertPaletteFormat 00079 00080 auto_ptr<Image> img7(CreateImage(16, 16, PF_I8, 256, PF_R8G8B8)); 00081 CPPUNIT_ASSERT(img7.get() != 0); 00082 00083 pixels = (byte*)img7->getPixels(); 00084 for (int i = 0; i < 16 * 16; ++i) { 00085 pixels[i] = i; 00086 } 00087 palette = (RGB*)img7->getPalette(); 00088 for (int i = 0; i < 256; ++i) { 00089 palette[i].red = i; 00090 palette[i].green = 255 - i; 00091 palette[i].blue = 127 + (i % 2); 00092 } 00093 00094 auto_ptr<Image> img8(ConvertPalette(CloneImage(img7.get()), PF_B8G8R8)); 00095 CPPUNIT_ASSERT(img8.get() != 0); 00096 CPPUNIT_ASSERT(img8->getWidth() == 16); 00097 CPPUNIT_ASSERT(img8->getHeight() == 16); 00098 CPPUNIT_ASSERT(img8->getFormat() == PF_I8); 00099 CPPUNIT_ASSERT(img8->getPaletteSize() == 256); 00100 CPPUNIT_ASSERT(img8->getPaletteFormat() == PF_B8G8R8); 00101 00102 bool pixels_correct = true; 00103 pixels = (byte*)img8->getPixels(); 00104 for (int i = 0; i < 16 * 16; ++i) { 00105 pixels_correct = pixels_correct && (pixels[i] == i); 00106 } 00107 CPPUNIT_ASSERT(pixels_correct == true); 00108 00109 bool palette_correct = true; 00110 BGR* bgr_palette = (BGR*)img8->getPalette(); 00111 for (int i = 0; i < 256; ++i) { 00112 palette_correct = palette_correct && ( 00113 bgr_palette[i].red == i && 00114 bgr_palette[i].green == 255 - i && 00115 bgr_palette[i].blue == 127 + (i % 2)); 00116 } 00117 CPPUNIT_ASSERT(palette_correct == true); 00118 } 00119 00120 00121 void 00122 PaletteTests::testImages() { 00123 auto_ptr<Image> pcx(OpenImage("images/palettized/pcx.pcx")); 00124 // @todo test BMP images 00125 // @todo test PNG images 00126 // @todo test GIF images 00127 00128 CPPUNIT_ASSERT(pcx.get() && pcx->getFormat() == PF_I8); 00129 } 00130 00131 00132 Test* 00133 PaletteTests::suite() { 00134 typedef TestCaller<PaletteTests> Caller; 00135 00136 TestSuite* suite = new TestSuite(); 00137 suite->addTest(new Caller("Palettized Image Tests", &PaletteTests::testAPI)); 00138 suite->addTest(new Caller("Palettized Images", &PaletteTests::testImages)); 00139 return suite; 00140 }