Mercurial > sdl-ios-xcode
view test/automated/common/common.c @ 3456:6b182cbe38ac
Allow some variation in the pixel values to account for blending accuracy differences.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 19 Nov 2009 05:06:01 +0000 |
parents | 5271ce790fed |
children | ab99313951cd |
line wrap: on
line source
/** * Automated SDL_Surface test. * * Written by Edgar Simo "bobbens" * * Released under Public Domain. */ #include "SDL.h" #include "SDL_at.h" #include "common/common.h" /** * @brief Compares a surface and a surface image for equality. */ int surface_compare( SDL_Surface *sur, const SurfaceImage_t *img ) { int ret; int i,j; int bpp; Uint8 *p, *pd; /* Make sure size is the same. */ if ((sur->w != img->width) || (sur->h != img->height)) return -1; SDL_LockSurface( sur ); ret = 0; bpp = sur->format->BytesPerPixel; /* Compare image - should be same format. */ for (j=0; j<sur->h; j++) { for (i=0; i<sur->w; i++) { p = (Uint8 *)sur->pixels + j * sur->pitch + i * bpp; pd = (Uint8 *)img->pixel_data + (j*img->width + i) * img->bytes_per_pixel; switch (bpp) { case 1: case 2: case 3: ret += 1; printf("%d BPP not supported yet.\n",bpp); break; case 4: { int dist = 0; Uint8 R, G, B, A; SDL_GetRGBA(*(Uint32*)p, sur->format, &R, &G, &B, &A); if (img->bytes_per_pixel == 3) { dist += (R-pd[0])*(R-pd[0]); dist += (G-pd[1])*(G-pd[1]); dist += (B-pd[2])*(B-pd[2]); } else { dist += (R-pd[0])*(R-pd[0]); dist += (G-pd[1])*(G-pd[1]); dist += (B-pd[2])*(B-pd[2]); dist += (A-pd[3])*(A-pd[3]); } /* Allow up to sqrt(32) difference in blending accuracy */ if (dist > 32) { /*printf("pixel %d,%d varies by %d\n", i, j, dist);*/ ++ret; } } break; } } } SDL_UnlockSurface( sur ); if (ret) { SDL_SaveBMP(sur, "fail.bmp"); SDL_LockSurface( sur ); bpp = sur->format->BytesPerPixel; /* Compare image - should be same format. */ if (bpp == 4) { for (j=0; j<sur->h; j++) { for (i=0; i<sur->w; i++) { p = (Uint8 *)sur->pixels + j * sur->pitch + i * bpp; pd = (Uint8 *)img->pixel_data + (j*img->width + i) * img->bytes_per_pixel; Uint8 R, G, B, A; R = pd[0]; G = pd[1]; B = pd[2]; if (img->bytes_per_pixel == 4) { A = pd[3]; } else { A = 0; } *(Uint32*)p = (A << 24) | (R << 16) | (G << 8) | B; } } } SDL_UnlockSurface( sur ); SDL_SaveBMP(sur, "good.bmp"); } return ret; }