diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index a9532e87..67a7805c 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -72,8 +72,8 @@ class LegoVideoManager : public MxVideoManager { MxS32 m_cursorYCopy; // 0x508 MxS32 m_cursorX; // 0x50c MxS32 m_cursorY; // 0x510 - LPDIRECTDRAWSURFACE m_unk0x514; // 0x514 - RECT m_unk0x518; // 0x518 + LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514 + RECT m_cursorRect; // 0x518 undefined4 m_unk0x528; // 0x528 MxBool m_drawFPS; // 0x52c RECT m_fpsRect; // 0x530 diff --git a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp index 2a5d1643..3c586323 100644 --- a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp +++ b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp @@ -309,18 +309,19 @@ inline void LegoVideoManager::DrawCursor() LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2(); - if (!m_unk0x514) { - m_unk0x518.top = 0; - m_unk0x518.left = 0; - m_unk0x518.bottom = 16; - m_unk0x518.right = 16; - m_unk0x514 = MxDisplaySurface::FUN_100bc070(); + if (!m_cursorSurface) { + m_cursorRect.top = 0; + m_cursorRect.left = 0; + m_cursorRect.bottom = 16; + m_cursorRect.right = 16; + m_cursorSurface = MxDisplaySurface::CreateCursorSurface(); - if (!m_unk0x514) + if (!m_cursorSurface) 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 diff --git a/LEGO1/omni/include/mxdisplaysurface.h b/LEGO1/omni/include/mxdisplaysurface.h index dde3d086..1d26264c 100644 --- a/LEGO1/omni/include/mxdisplaysurface.h +++ b/LEGO1/omni/include/mxdisplaysurface.h @@ -91,7 +91,7 @@ class MxDisplaySurface : public MxCore { ); // vtable+0x44 void ClearScreen(); - static LPDIRECTDRAWSURFACE FUN_100bc070(); + static LPDIRECTDRAWSURFACE CreateCursorSurface(); inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; } diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index a065b1b1..8f9827c0 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -680,7 +680,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( } // FUNCTION: LEGO1 0x100bc070 -LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() +LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface() { LPDIRECTDRAWSURFACE newSurface = NULL; IDirectDraw* draw = MVideoManager()->GetDirectDraw(); @@ -700,17 +700,18 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() ddsd.dwWidth = 16; ddsd.dwHeight = 16; - ddsd.dwFlags = 4103; - ddsd.ddsCaps.dwCaps = 16448; + 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 &= ~0x4000; - ddsd.ddsCaps.dwCaps |= 0x800; + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + if (draw->CreateSurface(&ddsd, &newSurface, NULL) == S_OK) { memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); - if (newSurface->Lock(NULL, &ddsd, 1, NULL) != S_OK) { + if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != S_OK) { if (newSurface) { newSurface->Release(); } @@ -718,18 +719,18 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() return NULL; } else { - MxU8* surface = (MxU8*) ddsd.lpSurface; + MxU16* surface = (MxU16*) ddsd.lpSurface; - for (MxU32 x = 0; x < 16; x++) { - - MxU8* surface2 = surface; - for (MxU32 y = 0; y < 16; y++) { + // draw a simple cursor to the surface + for (MxS32 x = 0; x < 16; x++) { + MxU16* surface2 = surface; + for (MxS32 y = 0; y < 16; y++) { for (y = 0; y < 16; ++y) { if ((y > 10 || x) && (x > 10 || y) && x + y != 10) { - if (x + y <= 10) - *surface2 = -1; - else + if (x + y > 10) *surface2 = 31775; + else + *surface2 = -1; } else { *surface2 = 0; @@ -737,7 +738,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() surface2++; } } - surface += ddsd.lPitch; + surface = (MxU16*) ((MxU8*) surface + ddsd.lPitch); } newSurface->Unlock(ddsd.lpSurface);