#include #include #include #include #include #include #include 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;indexisInView(mDIB3D)) { if(scopeHandler(pureObject))pureObject->setState(PureObject::Delete); } else pureObject->map(mDIB3D); } mDIB3D->bitBlt(pureDevice); mMutex.releaseMutex(); for(index=0;indexgetState()) { 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;rowwidth(); 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; }