You can use SDL_ConvertSurfaceFormat() now
Also, icon is guaranteed not to be NULL going into this function.
This commit is contained in:
parent
5b710cfee4
commit
8457ab1e62
1 changed files with 37 additions and 43 deletions
|
@ -286,57 +286,51 @@ WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
|
||||||
{
|
{
|
||||||
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
||||||
HICON hicon = NULL;
|
HICON hicon = NULL;
|
||||||
|
BYTE *icon_bmp;
|
||||||
|
int icon_len;
|
||||||
|
SDL_RWops *dst;
|
||||||
|
SDL_Surface *surface;
|
||||||
|
|
||||||
if (icon) {
|
/* Create temporary bitmap buffer */
|
||||||
BYTE *icon_bmp;
|
icon_len = 40 + icon->h * icon->w * 4;
|
||||||
int icon_len;
|
icon_bmp = SDL_stack_alloc(BYTE, icon_len);
|
||||||
SDL_RWops *dst;
|
dst = SDL_RWFromMem(icon_bmp, icon_len);
|
||||||
SDL_PixelFormat format;
|
if (!dst) {
|
||||||
SDL_Surface *surface;
|
SDL_stack_free(icon_bmp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create temporary bitmap buffer */
|
/* Write the BITMAPINFO header */
|
||||||
icon_len = 40 + icon->h * icon->w * 4;
|
SDL_WriteLE32(dst, 40);
|
||||||
icon_bmp = SDL_stack_alloc(BYTE, icon_len);
|
SDL_WriteLE32(dst, icon->w);
|
||||||
dst = SDL_RWFromMem(icon_bmp, icon_len);
|
SDL_WriteLE32(dst, icon->h * 2);
|
||||||
if (!dst) {
|
SDL_WriteLE16(dst, 1);
|
||||||
SDL_stack_free(icon_bmp);
|
SDL_WriteLE16(dst, 32);
|
||||||
return;
|
SDL_WriteLE32(dst, BI_RGB);
|
||||||
|
SDL_WriteLE32(dst, icon->h * icon->w * 4);
|
||||||
|
SDL_WriteLE32(dst, 0);
|
||||||
|
SDL_WriteLE32(dst, 0);
|
||||||
|
SDL_WriteLE32(dst, 0);
|
||||||
|
SDL_WriteLE32(dst, 0);
|
||||||
|
|
||||||
|
/* Convert the icon to a 32-bit surface with alpha channel */
|
||||||
|
surface = SDL_ConvertSurfaceFormat(icon, SDL_PIXELFORMAT_ARGB8888, 0);
|
||||||
|
if (surface) {
|
||||||
|
/* Write the pixels upside down into the bitmap buffer */
|
||||||
|
int y = surface->h;
|
||||||
|
while (y--) {
|
||||||
|
Uint8 *src = (Uint8 *) surface->pixels + y * surface->pitch;
|
||||||
|
SDL_RWwrite(dst, src, surface->pitch, 1);
|
||||||
}
|
}
|
||||||
|
SDL_FreeSurface(surface);
|
||||||
/* Write the BITMAPINFO header */
|
|
||||||
SDL_WriteLE32(dst, 40);
|
|
||||||
SDL_WriteLE32(dst, icon->w);
|
|
||||||
SDL_WriteLE32(dst, icon->h * 2);
|
|
||||||
SDL_WriteLE16(dst, 1);
|
|
||||||
SDL_WriteLE16(dst, 32);
|
|
||||||
SDL_WriteLE32(dst, BI_RGB);
|
|
||||||
SDL_WriteLE32(dst, icon->h * icon->w * 4);
|
|
||||||
SDL_WriteLE32(dst, 0);
|
|
||||||
SDL_WriteLE32(dst, 0);
|
|
||||||
SDL_WriteLE32(dst, 0);
|
|
||||||
SDL_WriteLE32(dst, 0);
|
|
||||||
|
|
||||||
/* Convert the icon to a 32-bit surface with alpha channel */
|
|
||||||
SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
|
|
||||||
surface = SDL_ConvertSurface(icon, &format, 0);
|
|
||||||
if (surface) {
|
|
||||||
/* Write the pixels upside down into the bitmap buffer */
|
|
||||||
int y = surface->h;
|
|
||||||
while (y--) {
|
|
||||||
Uint8 *src = (Uint8 *) surface->pixels + y * surface->pitch;
|
|
||||||
SDL_RWwrite(dst, src, surface->pitch, 1);
|
|
||||||
}
|
|
||||||
SDL_FreeSurface(surface);
|
|
||||||
|
|
||||||
/* TODO: create the icon in WinCE (CreateIconFromResource isn't available) */
|
/* TODO: create the icon in WinCE (CreateIconFromResource isn't available) */
|
||||||
#ifndef _WIN32_WCE
|
#ifndef _WIN32_WCE
|
||||||
hicon =
|
hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
|
||||||
CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
SDL_RWclose(dst);
|
|
||||||
SDL_stack_free(icon_bmp);
|
|
||||||
}
|
}
|
||||||
|
SDL_RWclose(dst);
|
||||||
|
SDL_stack_free(icon_bmp);
|
||||||
|
|
||||||
/* Set the icon for the window */
|
/* Set the icon for the window */
|
||||||
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hicon);
|
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hicon);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue