diff --git a/LEGO1/omni/include/mxdisplaysurface.h b/LEGO1/omni/include/mxdisplaysurface.h index a6925e3d..eb5d9ea3 100644 --- a/LEGO1/omni/include/mxdisplaysurface.h +++ b/LEGO1/omni/include/mxdisplaysurface.h @@ -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, diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index 2d179d01..d88038bd 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -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