mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-30 03:26:12 -05:00
Implement MxDisplaySurface::CreateCursorSurface (#471)
* Update mxdisplaysurface.cpp * Fixes * Update legovideomanager.cpp * Match to 100% --------- Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
parent
67fa5e7cca
commit
93012b62f4
4 changed files with 85 additions and 14 deletions
|
@ -72,8 +72,8 @@ class LegoVideoManager : public MxVideoManager {
|
||||||
MxS32 m_cursorYCopy; // 0x508
|
MxS32 m_cursorYCopy; // 0x508
|
||||||
MxS32 m_cursorX; // 0x50c
|
MxS32 m_cursorX; // 0x50c
|
||||||
MxS32 m_cursorY; // 0x510
|
MxS32 m_cursorY; // 0x510
|
||||||
LPDIRECTDRAWSURFACE m_unk0x514; // 0x514
|
LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514
|
||||||
RECT m_unk0x518; // 0x518
|
RECT m_cursorRect; // 0x518
|
||||||
undefined4 m_unk0x528; // 0x528
|
undefined4 m_unk0x528; // 0x528
|
||||||
MxBool m_drawFPS; // 0x52c
|
MxBool m_drawFPS; // 0x52c
|
||||||
RECT m_fpsRect; // 0x530
|
RECT m_fpsRect; // 0x530
|
||||||
|
|
|
@ -30,7 +30,7 @@ LegoVideoManager::LegoVideoManager()
|
||||||
m_cursorX = m_cursorY;
|
m_cursorX = m_cursorY;
|
||||||
m_cursorYCopy = m_cursorY;
|
m_cursorYCopy = m_cursorY;
|
||||||
m_cursorXCopy = m_cursorY;
|
m_cursorXCopy = m_cursorY;
|
||||||
m_unk0x514 = NULL;
|
m_cursorSurface = NULL;
|
||||||
m_fullScreenMovie = FALSE;
|
m_fullScreenMovie = FALSE;
|
||||||
m_drawFPS = FALSE;
|
m_drawFPS = FALSE;
|
||||||
m_unk0x528 = 0;
|
m_unk0x528 = 0;
|
||||||
|
@ -309,18 +309,19 @@ inline void LegoVideoManager::DrawCursor()
|
||||||
|
|
||||||
LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2();
|
LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2();
|
||||||
|
|
||||||
if (!m_unk0x514) {
|
if (!m_cursorSurface) {
|
||||||
m_unk0x518.top = 0;
|
m_cursorRect.top = 0;
|
||||||
m_unk0x518.left = 0;
|
m_cursorRect.left = 0;
|
||||||
m_unk0x518.bottom = 16;
|
m_cursorRect.bottom = 16;
|
||||||
m_unk0x518.right = 16;
|
m_cursorRect.right = 16;
|
||||||
m_unk0x514 = MxDisplaySurface::FUN_100bc070();
|
m_cursorSurface = MxDisplaySurface::CreateCursorSurface();
|
||||||
|
|
||||||
if (!m_unk0x514)
|
if (!m_cursorSurface)
|
||||||
m_drawCursor = FALSE;
|
m_drawCursor = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ddSurface2->BltFast(m_cursorXCopy, m_cursorYCopy, m_unk0x514, &m_unk0x518, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
|
ddSurface2
|
||||||
|
->BltFast(m_cursorXCopy, m_cursorYCopy, m_cursorSurface, &m_cursorRect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x1007bbc0
|
// STUB: LEGO1 0x1007bbc0
|
||||||
|
|
|
@ -91,7 +91,7 @@ class MxDisplaySurface : public MxCore {
|
||||||
); // vtable+0x44
|
); // vtable+0x44
|
||||||
|
|
||||||
void ClearScreen();
|
void ClearScreen();
|
||||||
static LPDIRECTDRAWSURFACE FUN_100bc070();
|
static LPDIRECTDRAWSURFACE CreateCursorSurface();
|
||||||
|
|
||||||
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; }
|
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; }
|
||||||
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; }
|
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; }
|
||||||
|
|
|
@ -679,9 +679,79 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44(
|
||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100bc070
|
// FUNCTION: LEGO1 0x100bc070
|
||||||
LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070()
|
LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface()
|
||||||
{
|
{
|
||||||
|
LPDIRECTDRAWSURFACE newSurface = NULL;
|
||||||
|
IDirectDraw* draw = MVideoManager()->GetDirectDraw();
|
||||||
|
MVideoManager();
|
||||||
|
|
||||||
|
DDSURFACEDESC ddsd;
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
|
||||||
|
if (draw->GetDisplayMode(&ddsd) != S_OK) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ddsd.ddpfPixelFormat.dwRGBBitCount != 16) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ddsd.dwWidth = 16;
|
||||||
|
ddsd.dwHeight = 16;
|
||||||
|
ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
|
||||||
|
ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN;
|
||||||
|
|
||||||
|
if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK) {
|
||||||
|
ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
|
||||||
|
ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
|
||||||
|
|
||||||
|
if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
|
||||||
|
if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != S_OK)
|
||||||
|
goto done;
|
||||||
|
else {
|
||||||
|
MxU16* surface = (MxU16*) ddsd.lpSurface;
|
||||||
|
MxLong pitch = ddsd.lPitch;
|
||||||
|
|
||||||
|
// draw a simple cursor to the surface
|
||||||
|
for (MxS32 x = 0; x < 16; x++) {
|
||||||
|
MxU16* surface2 = surface;
|
||||||
|
for (MxS32 y = 0; y < 16; y++) {
|
||||||
|
if ((y > 10 || x) && (x > 10 || y) && x + y != 10) {
|
||||||
|
if (x + y > 10)
|
||||||
|
*surface2 = 31775;
|
||||||
|
else
|
||||||
|
*surface2 = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*surface2 = 0;
|
||||||
|
}
|
||||||
|
surface2++;
|
||||||
|
}
|
||||||
|
surface = (MxU16*) ((MxU8*) surface + pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
newSurface->Unlock(ddsd.lpSurface);
|
||||||
|
DDCOLORKEY colorkey;
|
||||||
|
colorkey.dwColorSpaceHighValue = 31775;
|
||||||
|
colorkey.dwColorSpaceLowValue = 31775;
|
||||||
|
newSurface->SetColorKey(DDCKEY_SRCBLT, &colorkey);
|
||||||
|
|
||||||
|
return newSurface;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (newSurface) {
|
||||||
|
newSurface->Release();
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue