mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-25 11:45:53 +01:00
198 lines
5.3 KiB
C++
198 lines
5.3 KiB
C++
/* 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. */
|
|
|
|
#include "SeriousSam/StdH.h"
|
|
#include "resource.h"
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
#define NAME "Splash"
|
|
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 (window) { SDL_DestroyWindow(window); window = NULL; }
|
|
if (texture) { SDL_DestroyTexture(texture); texture = NULL; }
|
|
if (renderer) { SDL_DestroyRenderer(renderer); renderer = 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
|
|
|