From b6cb6aed47c54137f07edb0dcf02412811264cf6 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 26 Nov 2017 18:31:43 -0400 Subject: [PATCH] Error if the ImageData given to love.window.setIcon is not a 32 bit RGBA format. --HG-- branch : minor --- src/modules/window/sdl/Window.cpp | 8 ++++++-- src/modules/window/wrap_Window.cpp | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index 95f192d94..fbe62f0a9 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/src/modules/window/sdl/Window.cpp @@ -842,6 +842,9 @@ bool Window::setIcon(love::image::ImageData *imgd) if (!imgd) return false; + if (imgd->getFormat() != PIXELFORMAT_RGBA8) + throw love::Exception("setIcon only accepts 32-bit RGBA images."); + icon.set(imgd); if (!window) @@ -862,14 +865,15 @@ bool Window::setIcon(love::image::ImageData *imgd) int w = imgd->getWidth(); int h = imgd->getHeight(); - int pitch = imgd->getWidth() * 4; + int bytesperpixel = (int) getPixelFormatSize(imgd->getFormat()); + int pitch = w * bytesperpixel; SDL_Surface *sdlicon = nullptr; { // We don't want another thread modifying the ImageData mid-copy. love::thread::Lock lock(imgd->getMutex()); - sdlicon = SDL_CreateRGBSurfaceFrom(imgd->getData(), w, h, 32, pitch, rmask, gmask, bmask, amask); + sdlicon = SDL_CreateRGBSurfaceFrom(imgd->getData(), w, h, bytesperpixel * 8, pitch, rmask, gmask, bmask, amask); } if (!sdlicon) diff --git a/src/modules/window/wrap_Window.cpp b/src/modules/window/wrap_Window.cpp index 9a3b3fdd1..438089a66 100644 --- a/src/modules/window/wrap_Window.cpp +++ b/src/modules/window/wrap_Window.cpp @@ -365,7 +365,9 @@ int w_getPosition(lua_State *L) int w_setIcon(lua_State *L) { image::ImageData *i = luax_checktype(L, 1); - luax_pushboolean(L, instance()->setIcon(i)); + bool success = false; + luax_catchexcept(L, [&]() { success = instance()->setIcon(i); }); + luax_pushboolean(L, success); return 1; }