#include #include "config.h" #include #include "test.h" #define FILE_REF1 "icon-64" // RGB #define FILE_REF2 "xeyes" // ARGB (shaped) typedef struct { const char *file; unsigned int crcs[7][7]; } td_t; /**INDENT-OFF**/ static const td_t td[] = { #if 0 { FILE_REF1, {{ 2162077252, 4214091794, 412865864, 2208852583, 4008806248, 2557426026, 3819956603 }, { 595275359, 283954495, 3441282729, 3333662483, 2515534288, 2423654221, 1122712545 }, { 4233001257, 1723457820, 1156039624, 3037040985, 3626247407, 2613094123, 2184173847 }, { 3309372516, 984665754, 3767976262, 1153555547, 1698491060, 4110238991, 1891961102 }, { 2847337837, 794693659, 1876625640, 3678611634, 1208851425, 3813154232, 2783573400 }, { 764823695, 3982871911, 1209331970, 4264374244, 1817759116, 1464496753, 3881173833 }, { 3864856322, 990950723, 372177638, 1857970971, 1641112498, 4095443635, 4181395999 }}, }, { FILE_REF2, {{ 555768304, 1646920612, 2050816676, 3770476584, 2825645535, 3113513304, 913084799 }, { 220865185, 862759789, 4159187644, 2770777978, 3461933485, 2827786048, 2219120417 }, { 2540897236, 2887022398, 65635572, 916230131, 3952902516, 62808115, 2932301957 }, { 3434262573, 3693633821, 137945133, 2937827957, 521763255, 411503651, 2049615039 }, { 239430986, 332364389, 1260118846, 554129137, 1356142132, 2853343843, 1297241144 }, { 1175312809, 3451222972, 3395731656, 295362128, 1881386666, 3061068732, 3976437623 }, { 1755782477, 704181442, 2272158502, 325667026, 1654128943, 901365279, 830163639 }}, }, #else { FILE_REF1, {{ 2162077252, 4214091794, 412865864, 2208852583, 2350556023, 3803721928, 3805112969 }, { 595275359, 283954495, 3441282729, 3333662483, 1459577645, 746253606, 1882221826 }, { 4233001257, 1723457820, 1156039624, 3037040985, 2759562314, 2222928541, 3180076325 }, { 3309372516, 984665754, 3767976262, 1153555547, 1570988457, 2288660331, 283458965 }, { 2845395143, 4101946852, 3961005890, 2640374584, 3726109921, 2179674700, 1383607771 }, { 4268776970, 2079858095, 4038148450, 2295802576, 900551271, 3346055316, 1149911542 }, { 202016275, 1526922894, 445926265, 4047069055, 3524650216, 1037461975, 2272837475 }}, }, { FILE_REF2, {{ 555768304, 1646920612, 2050816676, 3770476584, 91466078, 2087161176, 3570229076 }, { 220865185, 862759789, 4159187644, 2770777978, 2050323230, 766149810, 1618201076 }, { 2540897236, 2887022398, 65635572, 916230131, 448177749, 3260413553, 862049368 }, { 3434262573, 3693633821, 137945133, 2937827957, 2112193779, 4118876351, 361305748 }, { 837021963, 3886651388, 186086474, 1714609658, 350822765, 1584234754, 4175249876 }, { 2925744983, 3225353477, 2496627803, 4183774388, 4064257418, 340562738, 3787242720 }, { 3611274720, 2261672575, 2746509160, 186022412, 61954702, 522998935, 380650099 }}, }, #endif { FILE_REF1, // mmx {{ 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }, { 0, 0, 0, 1153555547, 1813415566, 2513294192, 1184904601 }}, }, { FILE_REF2, // mmx {{ 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }, { 0, 0, 0, 2937827957, 199400762, 1969395327, 3756282520 }}, }, }; /**INDENT-ON**/ static void test_scale_1(int alpha) { const td_t *ptd; char filei[256]; char fileo[256]; int w, h, i, j; unsigned int crc, crc_exp; Imlib_Image imi, imo; int err; #ifdef DO_MMX_ASM // Hmm.. MMX functions appear to produce a slightly different result if (!getenv("IMLIB2_ASM_OFF")) alpha += 2; #endif ptd = &td[alpha]; snprintf(filei, sizeof(filei), "%s/%s.png", IMG_SRC, ptd->file); D("Load '%s'\n", filei); imi = imlib_load_image(filei); ASSERT_TRUE(imi); crc = image_get_crc32(imi); crc_exp = ptd->crcs[3][3]; EXPECT_EQ(crc, crc_exp); for (i = -3; i <= 3; i++) { for (j = -3; j <= 3; j++) { imlib_context_set_image(imi); w = imlib_image_get_width(); h = imlib_image_get_height(); pr_info("AA=%d Alpha=%d: %dx%d -> %dx%d (%d,%d)", imlib_context_get_anti_alias(), alpha, w, h, w + i, h + j, i, j); imo = imlib_create_cropped_scaled_image(0, 0, w, h, w + i, h + j); ASSERT_TRUE(imo); imlib_context_set_image(imo); w = imlib_image_get_width(); h = imlib_image_get_height(); crc = image_get_crc32(imo); crc_exp = ptd->crcs[3 + j][3 + i]; EXPECT_EQ(crc, crc_exp); snprintf(fileo, sizeof(fileo), "%s/scale-%s-%dx%d.%s", IMG_GEN, ptd->file, w, h, "png"); imlib_image_set_format("png"); D("Save '%s'\n", fileo); imlib_save_image_with_errno_return(fileo, &err); EXPECT_EQ(err, 0); if (err) D("Error %d saving '%s'\n", err, fileo); imlib_context_set_image(imo); imlib_free_image_and_decache(); } } imlib_context_set_image(imi); imlib_free_image_and_decache(); } static void test_scale_2a(int alpha, int w0, int h0, int w1, int h1, int w2, int h2) { int w, h; Imlib_Image imi, imo; pr_info("AA=%d Alpha=%d: %dx%d -> %d:%dx%d:%d", imlib_context_get_anti_alias(), alpha, w0, h0, w1, w2, h1, h2); imi = imlib_create_image(w0, h0); ASSERT_TRUE(imi); imlib_context_set_image(imi); imlib_image_set_has_alpha(alpha); imlib_context_set_blend(0); imlib_context_set_color(0x22, 0x44, 0x66, 0x88); imlib_image_fill_rectangle(0, 0, w0, h0); for (w = w1; w <= w2; w++) { for (h = h1; h <= h2; h++) { // pr_info("Alpha=%d: %dx%d -> %dx%d", alpha, w0, h0, w, h); imlib_context_set_image(imi); imo = imlib_create_cropped_scaled_image(0, 0, w0, h0, w, h); if (w <= 0 || h <= 0) { ASSERT_FALSE(imo); continue; } ASSERT_TRUE(imo); imlib_context_set_image(imo); imlib_free_image_and_decache(); } } imlib_context_set_image(imi); imlib_free_image_and_decache(); } static void test_scale_2(int alpha, int w0, int h0, int w1, int h1, int w2, int h2) { imlib_context_set_anti_alias(0); test_scale_2a(alpha, w0, h0, w1, h1, w2, h2); imlib_context_set_anti_alias(1); test_scale_2a(alpha, w0, h0, w1, h1, w2, h2); } TEST(SCALE, scale_1_rgb) { test_scale_1(0); } TEST(SCALE, scale_1_argb) { test_scale_1(1); } TEST(SCALE, scale_2_rgb_0) { test_scale_2(0, 4, 4, 0, 0, 0, 0); } TEST(SCALE, scale_2_rgb_1_x) { test_scale_2(0, 1, 1, 1, 1, 10, 10); } TEST(SCALE, scale_2_rgb_2_x) { test_scale_2(0, 2, 2, 1, 1, 10, 10); } TEST(SCALE, scale_2_rgb_up) { test_scale_2(0, 7, 30, 7, 30, 7, 100); test_scale_2(0, 30, 9, 30, 9, 100, 9); } TEST(SCALE, scale_2_rgb_down) { test_scale_2(0, 7, 100, 7, 40, 7, 100); test_scale_2(0, 100, 9, 40, 9, 100, 9); } TEST(SCALE, scale_2_argb_0) { test_scale_2(1, 4, 4, 0, 0, 0, 0); } TEST(SCALE, scale_2_argb_1_x) { test_scale_2(1, 1, 1, 1, 1, 10, 10); } TEST(SCALE, scale_2_argb_2_x) { test_scale_2(1, 2, 2, 1, 1, 10, 10); } TEST(SCALE, scale_2_argb_up) { test_scale_2(1, 7, 30, 7, 30, 7, 100); test_scale_2(1, 30, 9, 30, 9, 100, 9); } TEST(SCALE, scale_2_argb_down) { test_scale_2(1, 7, 100, 7, 40, 7, 100); test_scale_2(1, 100, 9, 40, 9, 100, 9); }