/***************************************************************************\ Clears the specified surface. \***************************************************************************/ void IMR_DirectXInterface::Clear_Surface(LPDIRECTDRAWSURFACE4 Surface) { HRESULT ddflag; RECT Area; DDSURFACEDESC2 DDSurfaceDesc; char *Mem; // Make sure the surface exists: if (!Surface) return; // Lock the surface: DDSurfaceDesc.dwSize = sizeof(DDSurfaceDesc); ddflag = Surface->Lock(&Area, &DDSurfaceDesc, DDLOCK_WAIT, NULL); if (ddflag == DDERR_SURFACELOST) { Restore(Surface); ddflag = Surface->Lock(NULL, &DDSurfaceDesc, DDLOCK_WAIT, NULL); } if (ddflag != DD_OK) return; Mem = (char *)DDSurfaceDesc.lpSurface; // Clear the surface: if (Mem) memset(Mem, 0, DDSurfaceDesc.dwSize); // And unlock the surface: Surface->Unlock(NULL); }
//===================================================================================== // FillLMapSurface //===================================================================================== static void FillLMapSurface2(DRV_LInfo *LInfo, int32 LNum) { U16 *pTempBits; int32 w, h, Width, Height, Stride; U8 *pBitPtr; RGB_LUT *Lut; geRDriver_THandle *THandle; HRESULT Result; const RECT *pRect; DDSURFACEDESC2 SurfDesc; LPDIRECTDRAWSURFACE4 Surface; int32 Extra; THandle = LInfo->THandle; pBitPtr = (U8*)LInfo->RGBLight[LNum]; Width = LInfo->Width; Height = LInfo->Height; Lut = &AppInfo.Lut1; pRect = TPage_BlockGetRect(THandle->Block); Surface = TPage_BlockGetSurface(THandle->Block); memset(&SurfDesc, 0, sizeof(DDSURFACEDESC2)); SurfDesc.dwSize = sizeof(DDSURFACEDESC2); Result = Surface->Lock((RECT*)pRect, &SurfDesc, DDLOCK_WAIT, NULL); assert(Result == DD_OK); Stride = SurfDesc.dwWidth; pTempBits = (U16*)SurfDesc.lpSurface; Extra = Stride - Width; for (h=0; h< Height; h++) { for (w=0; w< Width; w++) { U8 R, G, B; U16 Color; R = *pBitPtr++; G = *pBitPtr++; B = *pBitPtr++; Color = (U16)(Lut->R[R] | Lut->G[G] | Lut->B[B]); *pTempBits++ = Color; } pTempBits += Extra; } Result = Surface->Unlock((RECT*)pRect); assert(Result == DD_OK); }
//===================================================================================== // LoadLMapFromSystem //===================================================================================== static void LoadLMapFromSystem(DRV_LInfo *LInfo, int32 Log, int32 LNum) { U16 *pTempBits; int32 w, h, Width, Height, Size, Extra; U8 *pBitPtr; LPDIRECTDRAWSURFACE4 Surface; RGB_LUT *Lut; DDSURFACEDESC2 ddsd; HRESULT ddrval; pBitPtr = (U8*)LInfo->RGBLight[LNum]; Width = LInfo->Width; Height = LInfo->Height; Size = 1<<Log; Extra = Size - Width; Lut = &AppInfo.Lut1; Surface = SystemToVideo[Log].Surface; memset(&ddsd, 0, sizeof(DDSURFACEDESC2)); ddsd.dwSize = sizeof(DDSURFACEDESC2); ddrval = Surface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); assert(ddrval == DD_OK); U8 R, G, B; U16 Color; pTempBits = (USHORT*)ddsd.lpSurface; for (h=0; h< Height; h++) { for (w=0; w< Width; w++) { R = *pBitPtr++; G = *pBitPtr++; B = *pBitPtr++; Color = (U16)(Lut->R[R] | Lut->G[G] | Lut->B[B]); *pTempBits++ = Color; } pTempBits += Extra; } ddrval = Surface->Unlock(NULL); assert(ddrval == DD_OK); }
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { HWND hwnd; MSG msg; WNDCLASS wcl; HDC hdc; char buffer[] = "hello"; wcl.hInstance = hThisInst; wcl.lpszClassName = WINDOW_CLASS_NAME; wcl.lpfnWndProc = WindowFunc; wcl.style = CS_HREDRAW | CS_VREDRAW; wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); wcl.hCursor = LoadCursor(NULL, IDC_ARROW); wcl.lpszMenuName = WINDOW_CLASS_NAME; wcl.cbClsExtra = 0; wcl.cbWndExtra = 0; wcl.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); if(!RegisterClass(&wcl)) return 0; if(!(hwnd = CreateWindowEx ( WS_EX_TOPMOST, WINDOW_CLASS_NAME, "My First Proper Thing 2", WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hThisInst, NULL ))) return 0; ShowWindow(hwnd, nWinMode); UpdateWindow(hwnd); SetFocus(hwnd); ShowCursor(0); main_window_handle = hwnd; LoadBitmap(&colour_bmp_file,"texture2.bmp"); LoadBitmap(&height_bmp_file,"heightd2.bmp"); if (!DD_Init(hwnd)) { DestroyWindow(hwnd); return 0; } ofstream fout("myfile.dem"); int i,j,n,index = 0; for ( i = 0; i < 512; i++) { for ( j = 0; j < 512; j++) { // heights[i][j] = height_bmp_file.buffer[index++] * 8; // fout << heights[i][j] << " "; heights[i][j] = 0; } fout << "\n"; } index = 0; for ( i = 0; i < 1024; i++) { for ( j = 0; j < 1024; j++) { if ((colours[i][j] = colour_bmp_file.buffer[index++])>250) colours[i][j] = 250; } fout << "\n"; } LoadDEM(); fout.close(); LoadDEM(); while (1) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message == WM_QUIT) { DD_Shutdown(); break; } TranslateMessage(&msg); DispatchMessage(&msg); } else { memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); while ( lpddsback->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR,NULL) != DD_OK); video_buffer = (UCHAR *) ddsd.lpSurface; memset(video_buffer,0,SCREEN_WIDTH*SCREEN_HEIGHT); GameMain(); lpddsback->Unlock(NULL); sprintf(buffer,"%d",poo); if (lpddsback->GetDC(&hdc) == DD_OK) { SetBkColor(hdc, RGB(0, 0, 255)); SetTextColor(hdc, RGB(255, 255, 0)); TextOut(hdc, 0, 0, buffer, lstrlen(buffer)); lpddsback->ReleaseDC(hdc); } //Z+=10; if (Z>3840.0) Z -=3840.0; while (TRUE) { ddrval = lpddsprimary->Flip(NULL, 0); if (ddrval == DD_OK) break; if (ddrval == DDERR_SURFACELOST) { ddrval = lpddsprimary->Restore(); if (ddrval != DD_OK) break; } if (ddrval != DDERR_WASSTILLDRAWING) break; } if (KEY_DOWN(VK_ESCAPE)) { DD_Shutdown(); PostMessage(main_window_handle,WM_CLOSE,0,0); } } } DD_Shutdown(); return(msg.wParam); }