Browse Source

Error if the ImageData given to love.window.setIcon is not a 32 bit RGBA format.

--HG--
branch : minor
Alex Szpakowski 7 years ago
parent
commit
b6cb6aed47
2 changed files with 9 additions and 3 deletions
  1. 6 2
      src/modules/window/sdl/Window.cpp
  2. 3 1
      src/modules/window/wrap_Window.cpp

+ 6 - 2
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)

+ 3 - 1
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<image::ImageData>(L, 1);
-	luax_pushboolean(L, instance()->setIcon(i));
+	bool success = false;
+	luax_catchexcept(L, [&]() { success = instance()->setIcon(i); });
+	luax_pushboolean(L, success);
 	return 1;
 }