📄 winlink.cpp
字号:
ddsd2.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX; } HRESULT hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL); if (FullScreen == 1) { if ((hRes == DDERR_OUTOFMEMORY) || (hRes == DDERR_OUTOFVIDEOMEMORY)) { ddsd2.dwBackBufferCount = 1; hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL); } } if (hRes != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (FullScreen == 1) { ddsd2.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; if (DD_Primary->GetAttachedSurface(&ddsd2.ddsCaps, &DD_BackBuffer) != DD_OK) { MessageBox(NULL, "IDirectDrawSurface7::GetAttachedSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } } else { if (lpDD->CreateClipper(0,&lpDDClipper,NULL) != DD_OK) { lpDD->Release(); lpDD=NULL; return FALSE; } if (lpDDClipper->SetHWnd(0,hMainWindow) != DD_OK) { lpDD->Release(); lpDD=NULL; return FALSE; } if (DD_Primary->SetClipper(lpDDClipper) != DD_OK) { return FALSE; } } format.dwSize = sizeof(DDPIXELFORMAT); if (DD_Primary->GetPixelFormat(&format) != DD_OK) { MessageBox(NULL, "IDirectDrawSurface7::GetPixelFormat failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } BitDepth=format.dwRGBBitCount; GBitMask=format.dwGBitMask; // 0x07E0 or not if (BitDepth==24) { MessageBox(NULL,"ZSNESw does not support 24bit color.\nPlease change your resolution to either 16bit or 32bit color","Error",MB_OK); exit(0); } converta = (BitDepth==16 && GBitMask!=0x07E0); ddsd2.dwSize = sizeof(ddsd2); ddsd2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd2.dwWidth = SurfaceX; ddsd2.dwHeight = SurfaceY; // create drawing surface if (lpDD->CreateSurface(&ddsd2, &DD_CFB, NULL) != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } AltSurface = 0; // create alt. drawing surface if ( BitDepth == 32 ) { if(DMode == 1 && HQMode == 0) ddsd2.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; ddsd2.dwFlags |= DDSD_PIXELFORMAT; ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd2.ddpfPixelFormat.dwRGBBitCount = 16; ddsd2.ddpfPixelFormat.dwRBitMask = 0xF800; ddsd2.ddpfPixelFormat.dwGBitMask = 0x07E0; ddsd2.ddpfPixelFormat.dwBBitMask = 0x001F; if (lpDD->CreateSurface(&ddsd2, &DD_CFB16, NULL) != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed. You should update your video card drivers. Alternatively, you could use a 16-bit desktop or use a non-D mode.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (((SurfaceX==512) || (SurfaceX==602) || (SurfaceX==640)) && (HQMode==0)) AltSurface = 1; } return TRUE;}BYTE* SurfBuf;DDSURFACEDESC2 ddsd;DWORD LockSurface(){ HRESULT hRes; if (AltSurface == 0) { if (DD_CFB != NULL) { memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; hRes = DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); if (hRes == DD_OK) { SurfBuf = (BYTE*)ddsd.lpSurface; return(ddsd.lPitch); } else { if (hRes == DDERR_SURFACELOST) { DD_Primary->Restore(); DD_CFB->Restore(); Clear2xSaIBuffer(); } return(0); } } else return(0); } else { if (DD_CFB16 != NULL) { memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; hRes = DD_CFB16->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); if (hRes == DD_OK) { SurfBuf = (BYTE*)ddsd.lpSurface; return(ddsd.lPitch); } else { if (hRes == DDERR_SURFACELOST) { DD_Primary->Restore(); DD_CFB16->Restore(); Clear2xSaIBuffer(); } return(0); } } else return(0); }}void UnlockSurface(){ if (AltSurface == 0) DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface); else DD_CFB16->Unlock((struct tagRECT *)ddsd.lpSurface);}extern "C" {void WinUpdateDevices();short Buffer[1800*2];int X, Y;DWORD pitch;MSG msg;DWORD SurfBufD;int count, x,count2;HRESULT hr;int i;short *Sound;DWORD CurrentPos;DWORD WritePos;DWORD T60HZEnabled=0;DWORD T36HZEnabled=0;DWORD WINAPI SemaphoreThread( LPVOID lpParam ){ while(semaphore_run) { if (T60HZEnabled) { ReleaseSemaphore(hLock, 1, NULL); Sleep(1); } else Sleep(20); } return 0;}void InitSemaphore(){ if (!hLock) { hLock = CreateSemaphore(NULL, 1, SemaphoreMax, NULL); semaphore_run = 1; hThread = CreateThread(NULL, 0, SemaphoreThread, &dwThreadParam, 0, &dwThreadId); }}void ShutdownSemaphore(){ if (hLock) { semaphore_run = 0; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(hLock); hLock = NULL; }}extern unsigned int pressed;extern unsigned char romispal;void Start60HZ(void){ update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0; if (romispal==1) { update_ticks_pc = UPDATE_TICKS_GAMEPAL * freq / 1000.0; } else { update_ticks_pc = UPDATE_TICKS_GAME * freq / 1000.0; } QueryPerformanceCounter((LARGE_INTEGER*)&start); QueryPerformanceCounter((LARGE_INTEGER*)&start2); T36HZEnabled=0; T60HZEnabled=1; InitSemaphore(); if (device1 && device2) { MouseInput->Unacquire(); MultiMouseInit(); } //if (!device1 && !device2) MouseInput->Unacquire();}void Stop60HZ(void){ T60HZEnabled=0; if (device1 && device2) MultiMouseShutdown(); MouseInput->Acquire(); ShutdownSemaphore();}void Start36HZ(void){ update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0; update_ticks_pc = UPDATE_TICKS_GUI * freq / 1000.0; QueryPerformanceCounter((LARGE_INTEGER*)&start); QueryPerformanceCounter((LARGE_INTEGER*)&start2); T60HZEnabled=0; T36HZEnabled=1;}void Stop36HZ(void){ T36HZEnabled=0;}char WinMessage[256];void clearwin();char WinName[]={"ZSNESW\0"};void NTSCFilterInit();void NTSCFilterDraw(int SurfaceX, int SurfaceY, int pitch, unsigned char* buffer);extern "C" char GUIM7VID[];void SetHiresOpt(){ if(CustomResX >= 512 && CustomResY >= 448) GUIM7VID[cvidmode] = 1; else GUIM7VID[cvidmode] = 0;}void KeepTVRatio(){ int ratiox = WindowWidth*3; int ratioy = WindowHeight*4; int marginchange; int marginmod; if (ratiox < ratioy) { marginchange = (WindowHeight-(ratiox/4))/2; marginmod = (WindowHeight-(ratiox/4))%2; rcWindow.top += marginchange; rcWindow.bottom -= (marginchange+marginmod); } else if (ratiox > ratioy) { marginchange = (WindowWidth-(ratioy/3))/2; marginmod = (WindowWidth-(ratioy/3))%2; rcWindow.left += marginchange; rcWindow.right -= (marginchange+marginmod); }}extern "C" char GUIKEEP43[];bool CheckTVRatioReq(){ return(GUIKEEP43[cvidmode] && Keep4_3Ratio);}void initwinvideo(void){ WINDOWPLACEMENT wndpl; RECT rc1; DWORD newmode=0; DWORD HQMode=0; if (FirstActivate && NTSCFilter) NTSCFilterInit(); if (cvidmode == 37 || cvidmode == 38 || cvidmode == 41) { SetHiresOpt(); } if ( hqFilter != 0 ) { if ((GUIHQ2X[cvidmode] != 0) && (hqFilterlevel == 2)) HQMode=2; if ((GUIHQ3X[cvidmode] != 0) && (hqFilterlevel == 3)) HQMode=3; if ((GUIHQ4X[cvidmode] != 0) && (hqFilterlevel == 4)) HQMode=4; } if ((CurMode!=cvidmode) || (prevHQMode!=HQMode) || (prevNTSCMode!=NTSCFilter) || (changeRes)) { CurMode=cvidmode; prevHQMode=HQMode; prevNTSCMode=NTSCFilter; changeRes = 0; newmode=1; SurfaceX=256; SurfaceY=240; X=0; Y=0; FullScreen=GUIWFVID[cvidmode]; DMode=GUIDSIZE[cvidmode]; SMode=GUISMODE[cvidmode]; DSMode=GUIDSMODE[cvidmode]; NTSCMode=GUINTVID[cvidmode]; switch (cvidmode) { case 0: WindowWidth=256; WindowHeight=224; break; case 1: WindowWidth=640; WindowHeight=480; break; case 2: case 3: WindowWidth=512; WindowHeight=448; break; case 4: case 5: case 6: case 7: case 8: WindowWidth=640; WindowHeight=480; break; case 9: case 10: WindowWidth=768; WindowHeight=672; break; case 11: case 12: case 13: case 14: case 15: WindowWidth=800; WindowHeight=600; break; case 16: case 17: case 18: case 19: case 20: WindowWidth=1024; WindowHeight=768; break; case 21: case 22: WindowWidth=1024; WindowHeight=896; break; case 23: case 24: case 25: case 26: case 27: WindowWidth=1280; WindowHeight=960; break; case 28: case 29: case 30: case 31: case 32: WindowWidth=1280; WindowHeight=1024; break; case 33: case 34: case 35: case 36: case 37: WindowWidth=1600; WindowHeight=1200; break; case 38: case 39: case 40: case 41: case 42: WindowWidth=CustomResX; WindowHeight=CustomResY; break; default: WindowWidth=256; WindowHeight=224; break; } if (DMode == 1) { if ((DSMode == 1) || (FullScreen == 0)) SurfaceX = 512; else SurfaceX = 640; SurfaceY=480; if (NTSCMode && NTSCFilter) { SurfaceX = 602; SurfaceY = 446; } } else { if ((SMode == 0) && (FullScreen == 1)) SurfaceX=320; else SurfaceX=256; SurfaceY=240; } switch ( HQMode ) { case 2: SurfaceX=512; SurfaceY=480; break; case 3: SurfaceX=768; SurfaceY=720; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -