2016-03-12 01:20:51 +01:00
/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software ; you can redistribute it and / or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License along
with this program ; if not , write to the Free Software Foundation , Inc . ,
51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA . */
2016-03-11 14:57:17 +01:00
2016-03-29 03:03:54 +02:00
# include "SeriousSam/StdH.h"
2016-03-11 14:57:17 +01:00
# include "resource.h"
2016-03-29 03:03:54 +02:00
# ifdef PLATFORM_WIN32
2016-04-09 08:18:57 +02:00
# define NAME "Splash"
2016-03-11 14:57:17 +01:00
static HBITMAP _hbmSplash = NULL ;
static BITMAP _bmSplash ;
static HBITMAP _hbmSplashMask = NULL ;
static BITMAP _bmSplashMask ;
static HWND hwnd = NULL ;
static long FAR PASCAL SplashWindowProc ( HWND hWnd , UINT message ,
WPARAM wParam , LPARAM lParam )
{
switch ( message ) {
case WM_PAINT : {
PAINTSTRUCT ps ;
BeginPaint ( hWnd , & ps ) ;
HDC hdcMem = CreateCompatibleDC ( ps . hdc ) ;
SelectObject ( hdcMem , _hbmSplashMask ) ;
BitBlt ( ps . hdc , 0 , 0 , _bmSplash . bmWidth , _bmSplash . bmHeight , hdcMem , 0 , 0 ,
SRCAND ) ;
SelectObject ( hdcMem , _hbmSplash ) ;
BitBlt ( ps . hdc , 0 , 0 , _bmSplash . bmWidth , _bmSplash . bmHeight , hdcMem , 0 , 0 ,
SRCPAINT ) ;
DeleteDC ( hdcMem ) ;
EndPaint ( hWnd , & ps ) ;
return 0 ;
} break ;
case WM_ERASEBKGND : return 1 ; break ;
}
return DefWindowProc ( hWnd , message , wParam , lParam ) ;
}
void ShowSplashScreen ( HINSTANCE hInstance )
{
_hbmSplash = LoadBitmapA ( hInstance , ( char * ) IDB_SPLASH ) ;
if ( _hbmSplash = = NULL ) {
return ;
}
_hbmSplashMask = LoadBitmapA ( hInstance , ( char * ) IDB_SPLASHMASK ) ;
if ( _hbmSplashMask = = NULL ) {
return ;
}
GetObject ( _hbmSplash , sizeof ( BITMAP ) , ( LPSTR ) & _bmSplash ) ;
GetObject ( _hbmSplashMask , sizeof ( BITMAP ) , ( LPSTR ) & _bmSplashMask ) ;
if ( _bmSplashMask . bmWidth ! = _bmSplash . bmWidth
| | _bmSplashMask . bmHeight ! = _bmSplash . bmHeight ) {
return ;
}
int iScreenX = : : GetSystemMetrics ( SM_CXSCREEN ) ; // screen size
int iScreenY = : : GetSystemMetrics ( SM_CYSCREEN ) ;
WNDCLASSA wc ;
wc . style = CS_HREDRAW | CS_VREDRAW ;
wc . lpfnWndProc = SplashWindowProc ;
wc . cbClsExtra = 0 ;
wc . cbWndExtra = 0 ;
wc . hInstance = hInstance ;
wc . hIcon = LoadIcon ( hInstance , ( LPCTSTR ) IDR_MAINFRAME ) ;
wc . hCursor = LoadCursor ( NULL , IDC_ARROW ) ;
wc . hbrBackground = NULL ;
wc . lpszMenuName = NAME ;
wc . lpszClassName = NAME ;
RegisterClassA ( & wc ) ;
/*
* create a window
*/
hwnd = CreateWindowExA (
WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW ,
NAME ,
" SeriousSam loading... " , // title
WS_POPUP ,
iScreenX / 2 - _bmSplash . bmWidth / 2 ,
iScreenY / 2 - _bmSplash . bmHeight / 2 ,
_bmSplash . bmWidth , _bmSplash . bmHeight , // window size
NULL ,
NULL ,
hInstance ,
NULL ) ;
if ( ! hwnd ) {
return ;
}
ShowWindow ( hwnd , SW_SHOW ) ;
RECT rect ;
GetClientRect ( hwnd , & rect ) ;
InvalidateRect ( hwnd , & rect , TRUE ) ;
UpdateWindow ( hwnd ) ;
}
void HideSplashScreen ( void )
{
if ( hwnd = = NULL ) {
return ;
}
DestroyWindow ( hwnd ) ;
DeleteObject ( _hbmSplash ) ;
DeleteObject ( _hbmSplashMask ) ;
2016-03-29 03:03:54 +02:00
}
2016-04-09 08:18:57 +02:00
# else // this is the non-win32 code, below.
# include "SDL_shape.h"
static SDL_Window * window = NULL ;
static SDL_Renderer * renderer = NULL ;
static SDL_Texture * texture = NULL ;
void HideSplashScreen ( void )
{
if ( texture ) { SDL_DestroyTexture ( texture ) ; texture = NULL ; }
if ( renderer ) { SDL_DestroyRenderer ( renderer ) ; renderer = NULL ; }
if ( window ) { SDL_DestroyWindow ( window ) ; window = NULL ; }
}
void ShowSplashScreen ( HINSTANCE hInstance )
{
SDL_Surface * bmp = SDL_LoadBMP ( " splash.bmp " ) ;
if ( ! bmp ) {
return ;
}
SDL_Surface * bmpmask = SDL_LoadBMP ( " splashmask.bmp " ) ;
if ( bmpmask ) {
if ( ( bmpmask - > w ! = bmp - > w ) | | ( bmpmask - > h ! = bmp - > h ) ) {
SDL_FreeSurface ( bmpmask ) ;
SDL_FreeSurface ( bmp ) ;
return ;
}
2016-04-12 07:21:25 +02:00
window = SDL_CreateShapedWindow ( " SeriousSam loading... " , SDL_WINDOWPOS_CENTERED , SDL_WINDOWPOS_CENTERED , bmp - > w , bmp - > h , SDL_WINDOW_BORDERLESS ) ; // RAKE!: commented out as its post SDL2.0.4 |SDL_WINDOW_SKIP_TASKBAR);
2016-04-09 08:18:57 +02:00
if ( window ) {
SDL_WindowShapeMode mode ;
SDL_zero ( mode ) ;
mode . mode = ShapeModeColorKey ;
SDL_GetRGBA ( SDL_MapRGB ( bmpmask - > format , 0xFF , 0xFF , 0xFF ) , bmpmask - > format , & mode . parameters . colorKey . r , & mode . parameters . colorKey . g , & mode . parameters . colorKey . b , & mode . parameters . colorKey . a ) ;
if ( SDL_SetWindowShape ( window , bmpmask , & mode ) ! = 0 ) {
SDL_DestroyWindow ( window ) ;
window = NULL ;
}
}
SDL_FreeSurface ( bmpmask ) ;
}
if ( ! window ) {
2016-04-12 07:21:25 +02:00
window = SDL_CreateWindow ( " SeriousSam loading... " , SDL_WINDOWPOS_CENTERED , SDL_WINDOWPOS_CENTERED , bmp - > w , bmp - > h , SDL_WINDOW_BORDERLESS ) ; // RAKE!: commented out as its post SDL2.0.4 |SDL_WINDOW_SKIP_TASKBAR);
2016-04-09 08:18:57 +02:00
}
bool okay = false ;
if ( window ) {
renderer = SDL_CreateRenderer ( window , - 1 , 0 ) ;
if ( renderer ) {
SDL_SetRenderDrawColor ( renderer , 0 , 0 , 0 , 0 ) ;
SDL_RenderClear ( renderer ) ;
SDL_RenderPresent ( renderer ) ;
texture = SDL_CreateTextureFromSurface ( renderer , bmp ) ;
if ( texture ) {
okay = true ;
}
}
}
SDL_FreeSurface ( bmp ) ;
if ( ! okay ) {
HideSplashScreen ( ) ;
} else {
SDL_RenderCopy ( renderer , texture , NULL , NULL ) ;
SDL_RenderPresent ( renderer ) ;
}
}
# endif