Skip to content

Commit

Permalink
Implement MxDisplaySurface::VTable0x34
Browse files Browse the repository at this point in the history
  • Loading branch information
madebr committed Dec 23, 2024
1 parent 1b99d75 commit dcbcf7a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 10 deletions.
14 changes: 7 additions & 7 deletions LEGO1/omni/include/mxdisplaysurface.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ class MxDisplaySurface : public MxCore {
MxS32 p_height,
MxBool p_RLE
); // vtable+0x30
virtual undefined4 VTable0x34(
undefined4,
undefined4,
undefined4,
undefined4,
undefined4,
undefined4
virtual void VTable0x34(
MxU8* p_pixels,
MxS32 p_bpp,
MxS32 p_width,
MxS32 p_height,
MxS32 p_x,
MxS32 p_y
); // vtable+0x34
virtual void Display(
MxS32 p_left,
Expand Down
62 changes: 59 additions & 3 deletions LEGO1/omni/src/video/mxdisplaysurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -739,10 +739,66 @@ void MxDisplaySurface::DrawTransparentRLE(
}
}

// STUB: LEGO1 0x100bb850
undefined4 MxDisplaySurface::VTable0x34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4)
// FUNCTION: LEGO1 0x100bb850
void MxDisplaySurface::VTable0x34(MxU8 *p_pixels, MxS32 p_bpp, MxS32 p_width, MxS32 p_height, MxS32 p_x, MxS32 p_y)
{
return 0;
DDSURFACEDESC surfaceDesc;
memset(&surfaceDesc, 0, sizeof(surfaceDesc));
surfaceDesc.dwSize = sizeof(surfaceDesc);
HRESULT result = m_ddSurface2->Lock(NULL, &surfaceDesc, DDLOCK_WAIT, NULL);
if (result == DDERR_SURFACELOST) {
m_ddSurface2->Restore();
result = m_ddSurface2->Lock(NULL, &surfaceDesc, DDLOCK_WAIT, NULL);
}
if (result != DD_OK) {
return;
}
int dst_bitcount = m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount;
switch (dst_bitcount) {
case 8:
if (p_bpp == 16) {
// BUG: should go to end of function and unlock m_ddSurface2
return;
} else {
MxU8 *dst = (MxU8 *)surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + p_x;
MxU8 *src = p_pixels;
while (p_height != 0) {
p_height--;
memcpy(dst, src, p_width);
src += p_width;
dst += surfaceDesc.lPitch;
}
}
break;
case 16:
switch (p_bpp) {
case 16: {
MxU8 *dst = (MxU8 *)surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + 2 * p_x;
MxU8 *src = p_pixels;
while (p_height != 0) {
p_height--;
memcpy(dst, src, 2 * p_width);
src += 2 * p_width;
dst += surfaceDesc.lPitch;
}
break;
}
case 8: {
MxU8 *dst = (MxU8 *)surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + 2 * p_x;
MxU8 *src = p_pixels;
for (MxS32 i = 0; i < p_height; src += p_width, dst += surfaceDesc.lPitch, i++) {
for (MxS32 j = 0; j < p_width; dst += 2, src += 1, j++) {
*(MxU16 *) dst = m_16bitPal[*src];
}
}
break;
}
default:
break;
}
break;
}
m_ddSurface2->Unlock(surfaceDesc.lpSurface);
}

// FUNCTION: LEGO1 0x100bba50
Expand Down

0 comments on commit dcbcf7a

Please sign in to comment.