Implement MxDisplaySurface::VTable0x34

This commit is contained in:
Anonymous Maarten 2024-12-23 18:02:08 +01:00
parent 1b99d75543
commit dcbcf7a8a4
2 changed files with 66 additions and 10 deletions

View File

@ -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,

View File

@ -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