Files
Work/proto/source/DISPLAY.CPP
2024-08-07 09:16:27 -04:00

149 lines
3.8 KiB
C++

#include <proto/display.hpp>
#include <common/guiwnd.hpp>
#include <common/keydata.hpp>
#include <engine/asmutil.hpp>
#include <engine/dib3d.hpp>
#include <engine/vector3d.hpp>
#include <proto/pureobj.hpp>
DisplayManager::DisplayManager(GUIWindow &displayWindow,const PurePalette &systemPalette)
: mDisplayWindow(displayWindow), mSystemPalette(systemPalette), mIsCancelled(FALSE),
mBitmapBkGnd("stars1.bmp")
{
mSizeHandler.setCallback(this,&DisplayManager::sizeHandler);
mKeyDownHandler.setCallback(this,&DisplayManager::keyDownHandler);
mDialogCodeHandler.setCallback(this,&DisplayManager::dialogCodeHandler);
mDisplayWindow.insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
mDisplayWindow.insertHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler);
mDisplayWindow.insertHandler(VectorHandler::DialogCodeHandler,&mDialogCodeHandler);
mDIB3D=::new DIB3D(mDisplayWindow,mSystemPalette);
mDIB3D.disposition(PointerDisposition::Delete);
}
DisplayManager::~DisplayManager()
{
shutdown();
}
CallbackData::ReturnType DisplayManager::sizeHandler(CallbackData &someCallbackData)
{
mMutex.requestMutex();
mDIB3D.destroy();
mDIB3D=::new DIB3D(mDisplayWindow,mSystemPalette);
mDIB3D.disposition(PointerDisposition::Delete);
mMutex.releaseMutex();
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType DisplayManager::dialogCodeHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)DLGC_WANTALLKEYS;
}
CallbackData::ReturnType DisplayManager::keyDownHandler(CallbackData &someCallbackData)
{
KeyData keyData(someCallbackData);
keyDownHandler(keyData);
return (CallbackData::ReturnType)FALSE;
}
void DisplayManager::shutdown(void)
{
::OutputDebugString("cancelling...\n");
cancel();
::OutputDebugString("waiting for message to complete.\n");
waitForProcess();
::OutputDebugString("waiting for thread shutdown.\n");
wait();
mDisplayWindow.removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
bool DisplayManager::isCancelled(void)const
{
return mIsCancelled;
}
void DisplayManager::cancel(void)
{
mIsCancelled=true;
}
// virtuals
void DisplayManager::processHandler(void)
{
PureDevice pureDevice(mDisplayWindow);
if(!mDIB3D.isOkay())return;
if(0==initializeHandler(mPureObjects))return;
mDIB3D->usePalette(true);
while(!isCancelled())
{
mMutex.requestMutex();
setBackground();
// ASMRoutines::clearBitmap((DWORD)mDIBitmap->ptrData(),mDIBitmap->imageExtent());
for(int index=0;index<mPureObjects.size();index++)
{
PointerPureObject &pureObject=mPureObjects[index];
if(!preprocessHandler(pureObject))continue;
if(!pureObject->isInView(mDIB3D))
{
if(scopeHandler(pureObject))pureObject->setState(PureObject::Delete);
}
else pureObject->map(mDIB3D);
}
mDIB3D->bitBlt(pureDevice);
mMutex.releaseMutex();
for(index=0;index<mPureObjects.size();index++)
{
PointerPureObject &pureObject=mPureObjects[index];
if(PureObject::Delete==pureObject->getState())
{
mPureObjects.remove(index);
index=-1;
}
}
}
}
void DisplayManager::setBackground(void)
{
char *ptrSrcData;
char *ptrDstData;
int rows(mDIB3D->height()>mBitmapBkGnd.height()?mBitmapBkGnd.height():mDIB3D->height());
int cols((*mDIB3D).width()>mBitmapBkGnd.width()?mBitmapBkGnd.width():(*mDIB3D).width());
ptrDstData=(char*)mDIB3D->ptrData();
ptrSrcData=(char*)mBitmapBkGnd.ptrData();
for(int row=0;row<rows;row++)
{
::memcpy(ptrDstData,ptrSrcData,cols);
ptrDstData+=mDIB3D->width();
ptrSrcData+=mBitmapBkGnd.width();
}
}
// virtuals
bool DisplayManager::initializeHandler(PointerPureObjectBlock &pureObjects)
{
return false;
}
bool DisplayManager::preprocessHandler(PointerPureObject &pureObject)
{
return true;
}
bool DisplayManager::scopeHandler(PointerPureObject &pureObject)
{
return true;
}
void DisplayManager::keyDownHandler(const KeyData &keyData)
{
return;
}