Serious-Engine/Sources/SeriousSam/SplashScreen.cpp

198 lines
5.3 KiB
C++
Raw Normal View History

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
#include "SeriousSam/StdH.h"
2016-03-11 14:57:17 +01:00
#include "resource.h"
#ifdef PLATFORM_WIN32
#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);
}
#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;
}
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);
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) {
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);
}
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