From: Steinar H. Gunderson Date: Wed, 3 Oct 2012 18:22:36 +0000 (+0200) Subject: Let SDL convert the pixels instead of doing it ourselves. X-Git-Tag: 1.0~395 X-Git-Url: https://git.sesse.net/?p=movit;a=commitdiff_plain;h=dae484d2ac79b828fe31d7416fc5838a6d3341ef;ds=sidebyside Let SDL convert the pixels instead of doing it ourselves. --- diff --git a/main.cpp b/main.cpp index 35d5bc8..0a92aed 100644 --- a/main.cpp +++ b/main.cpp @@ -89,44 +89,34 @@ unsigned char *load_image(const char *filename, unsigned *w, unsigned *h) exit(1); } - // Convert to RGB. - SDL_PixelFormat *fmt = img->format; - SDL_LockSurface(img); - unsigned char *src_pixels = (unsigned char *)img->pixels; - unsigned char *dst_pixels = (unsigned char *)malloc(img->w * img->h * 4); - for (int i = 0; i < img->w * img->h; ++i) { - unsigned char r, g, b; - unsigned int temp; - unsigned int pixel = *(unsigned int *)(src_pixels + i * fmt->BytesPerPixel); - - temp = pixel & fmt->Rmask; - temp = temp >> fmt->Rshift; - temp = temp << fmt->Rloss; - r = temp; - - temp = pixel & fmt->Gmask; - temp = temp >> fmt->Gshift; - temp = temp << fmt->Gloss; - g = temp; - - temp = pixel & fmt->Bmask; - temp = temp >> fmt->Bshift; - temp = temp << fmt->Bloss; - b = temp; - - dst_pixels[i * 4 + 0] = b; - dst_pixels[i * 4 + 1] = g; - dst_pixels[i * 4 + 2] = r; - dst_pixels[i * 4 + 3] = 255; - } - SDL_UnlockSurface(img); + SDL_PixelFormat rgba_fmt; + rgba_fmt.palette = NULL; + rgba_fmt.BitsPerPixel = 32; + rgba_fmt.BytesPerPixel = 8; + rgba_fmt.Rloss = rgba_fmt.Gloss = rgba_fmt.Bloss = rgba_fmt.Aloss = 0; + + // NOTE: Assumes little endian. + rgba_fmt.Rmask = 0x000000ff; + rgba_fmt.Gmask = 0x0000ff00; + rgba_fmt.Bmask = 0x00ff0000; + rgba_fmt.Amask = 0xff000000; + + rgba_fmt.Rshift = 0; + rgba_fmt.Gshift = 8; + rgba_fmt.Bshift = 16; + rgba_fmt.Ashift = 24; + + rgba_fmt.colorkey = 0; + rgba_fmt.alpha = 255; + + SDL_Surface *converted = SDL_ConvertSurface(img, &rgba_fmt, SDL_SWSURFACE); *w = img->w; *h = img->h; SDL_FreeSurface(img); - return dst_pixels; + return (unsigned char *)converted->pixels; } void write_ppm(const char *filename, unsigned char *screenbuf)