Implement MxDisplaySurface::VTable0x34 (#1264)

* Implement MxDisplaySurface::VTable0x34

* Match

* Remove function count since we got them all

* Update README.md

* Remove emphasis on work-in-progress

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Anonymous Maarten
2024-12-23 19:18:14 +01:00
committed by GitHub
parent 5ffa91d5fd
commit 938a5d7f19
4 changed files with 79 additions and 13 deletions

View File

@@ -66,13 +66,13 @@ public:
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

@@ -1,6 +1,7 @@
#include "mxdisplaysurface.h"
#include "mxbitmap.h"
#include "mxdebug.h"
#include "mxmisc.h"
#include "mxomni.h"
#include "mxpalette.h"
@@ -739,10 +740,75 @@ sixteen_bit:
}
}
// STUB: LEGO1 0x100bb850
undefined4 MxDisplaySurface::VTable0x34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4)
// FUNCTION: LEGO1 0x100bb850
// FUNCTION: BETA10 0x10141191
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) {
MxU8* pixels = p_pixels;
switch (m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount) {
case 8: {
if (p_bpp == 16) {
MxTrace("16 bit source to 8 bit display NOT_IMPLEMENTED");
assert(0);
return;
}
MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + p_x;
MxLong stride = p_width;
MxLong length = surfaceDesc.lPitch;
while (p_height--) {
memcpy(dst, pixels, p_width);
pixels += stride;
dst += length;
}
break;
}
case 16: {
if (p_bpp == 16) {
MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + p_x;
MxLong stride = p_width * 2;
MxLong length = surfaceDesc.lPitch;
while (p_height--) {
memcpy(dst, pixels, 2 * p_width);
pixels += stride;
dst += length;
}
}
else if (p_bpp == 8) {
MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + 2 * p_x;
MxLong stride = p_width * 2;
MxLong length = -2 * p_width + surfaceDesc.lPitch;
for (MxS32 i = 0; i < p_height; i++) {
for (MxS32 j = 0; j < p_width; j++) {
*(MxU16*) dst = m_16bitPal[*pixels++];
dst += 2;
}
pixels += stride;
dst += length;
}
}
}
}
m_ddSurface2->Unlock(surfaceDesc.lpSurface);
}
}
// FUNCTION: LEGO1 0x100bba50