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;