diff --git a/LEGO1/omni/include/mxdiskstreamcontroller.h b/LEGO1/omni/include/mxdiskstreamcontroller.h index d74ad211..d2950e49 100644 --- a/LEGO1/omni/include/mxdiskstreamcontroller.h +++ b/LEGO1/omni/include/mxdiskstreamcontroller.h @@ -92,6 +92,9 @@ class MxDiskStreamController : public MxStreamController { // List::~List // TEMPLATE: LEGO1 0x100c7ef0 -// list::insert +// list >::insert + +// TEMPLATE: BETA10 0x10150e60 +// MxUtilityList::PushBack #endif // MXDISKSTREAMCONTROLLER_H 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/include/mxutilitylist.h b/LEGO1/omni/include/mxutilitylist.h index 92b7eba5..eec3958e 100644 --- a/LEGO1/omni/include/mxutilitylist.h +++ b/LEGO1/omni/include/mxutilitylist.h @@ -18,6 +18,9 @@ class MxUtilityList : public list { this->pop_front(); return TRUE; } + + // Note: does not take a reference + void PushBack(T p_obj) { this->push_back(p_obj); } }; #endif // MXUTILITYLIST_H diff --git a/LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp b/LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp index c1341877..3553ca05 100644 --- a/LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp +++ b/LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp @@ -248,27 +248,31 @@ MxResult MxDiskStreamController::FUN_100c7d10() } // FUNCTION: LEGO1 0x100c7db0 +// FUNCTION: BETA10 0x101551d0 MxDSStreamingAction* MxDiskStreamController::FUN_100c7db0() { AUTOLOCK(m_criticalSection); for (MxNextActionDataStartList::iterator it = m_nextActionList.begin(); it != m_nextActionList.end(); it++) { MxNextActionDataStart* data = *it; + for (MxDSObjectList::iterator it2 = m_list0x64.begin(); it2 != m_list0x64.end(); it2++) { MxDSStreamingAction* streamingAction = (MxDSStreamingAction*) *it2; + if (streamingAction->GetObjectId() == data->GetObjectId() && streamingAction->GetUnknown24() == data->GetUnknown24() && streamingAction->GetBufferOffset() == data->GetData()) { m_nextActionList.erase(it); data->SetData(m_provider->GetFileSize() + data->GetData()); - m_nextActionList.push_back(data); + m_nextActionList.PushBack(data); m_list0x64.erase(it2); return streamingAction; } } } + return NULL; } diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index 2d179d01..d08322ce 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -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 @@ void MxDisplaySurface::DrawTransparentRLE( } } -// 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