Simplify sdl-imageviewer's SDL pixel format use
diff --git a/example/sdl-imageviewer/sdl-imageviewer.cc b/example/sdl-imageviewer/sdl-imageviewer.cc index d220a36..a0c7d0c 100644 --- a/example/sdl-imageviewer/sdl-imageviewer.cc +++ b/example/sdl-imageviewer/sdl-imageviewer.cc
@@ -85,12 +85,7 @@ class Wuffs_Load_RW_Callbacks : public wuffs_aux::DecodeImageCallbacks { public: - Wuffs_Load_RW_Callbacks(SDL_PixelFormat* pixfmt) - : m_rmask(pixfmt->Rmask), - m_gmask(pixfmt->Gmask), - m_bmask(pixfmt->Bmask), - m_amask(0xFFFFFFFFu ^ pixfmt->Rmask ^ pixfmt->Gmask ^ pixfmt->Bmask), - m_surface(NULL) {} + Wuffs_Load_RW_Callbacks() : m_surface(NULL) {} ~Wuffs_Load_RW_Callbacks() { if (m_surface) { @@ -114,23 +109,10 @@ private: wuffs_base__pixel_format // SelectPixfmt(const wuffs_base__image_config& image_config) override { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - bool red_first = (m_rmask)&0x80000000u; -#else - bool red_first = (m_rmask)&0x00000001u; -#endif - - // (§) Uncomment this line of code to invert the BGRA/RGBA color order. - // This isn't a generally useful feature for an image viewer, but it should - // make it obvious, when pressing the TAB key, whether you're using the - // Wuffs (inverted) or SDL_image (correct) decoder. - // - // red_first = !red_first; - - wuffs_base__pixel_format pixfmt = wuffs_base__make_pixel_format( - red_first ? WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL - : WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL); - return pixfmt; + // Regardless of endianness, SDL_PIXELFORMAT_BGRA32 (from a few lines + // below) is equivalent to WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL. + return wuffs_base__make_pixel_format( + WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL); } AllocResult // @@ -146,9 +128,17 @@ if ((w > 0xFFFFFF) || (h > 0xFFFFFF)) { return AllocResult("Wuffs_Load_RW_Callbacks: image is too large"); } - m_surface = - SDL_CreateRGBSurface(0, static_cast<int>(w), static_cast<int>(h), 32, - m_rmask, m_gmask, m_bmask, m_amask); + uint32_t sdl_pixelformat = SDL_PIXELFORMAT_BGRA32; + + // (§) Uncomment this line of code to invert the BGRA/RGBA color order. + // This isn't a generally useful feature for an image viewer, but it should + // make it obvious, when pressing the TAB key, whether you're using the + // Wuffs (inverted) or SDL_image (correct) decoder. + // + // sdl_pixelformat = SDL_PIXELFORMAT_RGBA32; + + m_surface = SDL_CreateRGBSurfaceWithFormat( + 0, static_cast<int>(w), static_cast<int>(h), 32, sdl_pixelformat); if (!m_surface) { return AllocResult( "Wuffs_Load_RW_Callbacks: SDL_CreateRGBSurface failed"); @@ -160,10 +150,6 @@ m_surface->h * m_surface->pitch)); } - const uint32_t m_rmask; - const uint32_t m_gmask; - const uint32_t m_bmask; - const uint32_t m_amask; SDL_Surface* m_surface; }; @@ -205,26 +191,17 @@ // -------- -// Wuffs_Load_RW loads the image from the given file into the given format -// (which must be 32-bits per pixel). It is similar to SDL_image's IMG_Load_RW -// function but it returns any error in-band (as a std::string) instead of -// separately (global state accessible via SDL_GetError). +// Wuffs_Load_RW loads the image from the input rw. It is like SDL_image's +// IMG_Load_RW function but it returns any error in-band (as a std::string) +// instead of separately (global state accessible via SDL_GetError). // // On success, the SDL_Surface* returned will be non-NULL and the caller owns // it. Ownership means that they are responsible for calling SDL_FreeSurface on // it when done. std::pair<SDL_Surface*, std::string> // -Wuffs_Load_RW(SDL_RWops* rw, - bool take_ownership_of_rw, - SDL_PixelFormat* format) { +Wuffs_Load_RW(SDL_RWops* rw, bool take_ownership_of_rw) { + Wuffs_Load_RW_Callbacks callbacks; Wuffs_Load_RW_Input input(rw, take_ownership_of_rw); - - if (!format || (format->BitsPerPixel != 32)) { - return std::make_pair<SDL_Surface*, std::string>( - NULL, "Wuffs_Load_RW: invalid pixel format"); - } - Wuffs_Load_RW_Callbacks callbacks(format); - wuffs_aux::DecodeImageResult res = wuffs_aux::DecodeImage(callbacks, input); if (!res.error_message.empty()) { return std::make_pair<SDL_Surface*, std::string>( @@ -251,7 +228,7 @@ } bool // -load_image(SDL_Window* window, const char* filename) { +load_image(const char* filename) { if (g_image) { SDL_FreeSurface(g_image); g_image = NULL; @@ -273,8 +250,8 @@ return false; } } else { - std::pair<SDL_Surface*, std::string> p = Wuffs_Load_RW( - rw, take_ownership_of_rw, SDL_GetWindowSurface(window)->format); + std::pair<SDL_Surface*, std::string> p = + Wuffs_Load_RW(rw, take_ownership_of_rw); if (!p.second.empty()) { fprintf(stderr, "main: Wuffs_Load_RW(\"%s\"): %s\n", filename, p.second.c_str()); @@ -304,7 +281,7 @@ return 1; } - if (!load_image(window, argv[1])) { + if (!load_image(argv[1])) { return 1; } @@ -337,7 +314,7 @@ g_load_via_sdl_image = !g_load_via_sdl_image; printf("Switched to %s.\n", g_load_via_sdl_image ? "SDL_image" : "Wuffs"); - if (!load_image(window, argv[1]) || !draw(window)) { + if (!load_image(argv[1]) || !draw(window)) { return 1; } break;