📄 win32.cpp
字号:
lpDDSurface2 = DirectX.lpDDSPrimary2; } else lpDDSurface2 = pDDSurface; if (GUI.Stretch || GUI.Scale == 1 || !GUI.FullScreen || !LockSurface2 (lpDDSurface2, &Dst)) { lpDDSurface2 = DirectX.lpDDSOffScreen2; if (!LockSurface2 (lpDDSurface2, &Dst)) return (false); PrimarySurfaceLockFailed = true; } if (Settings.SixteenBit && GUI.Scale >= 3 && GUI.Scale <= 6) { // Clear the old areas of the SNES rendered image otherwise the // image processors might try to access some of the old rendered // data. static int LastWidth; static int LastHeight; if (Width < LastWidth) { for (int i = 0; i < Height; i++) memset (GFX.Screen + Width * 2 + i * GFX.Pitch, 0, 4); } if (Height < LastHeight) { int ww = LastWidth > Width ? LastWidth : Width; for (int i = Height; i < Height + 3; i++) memset (GFX.Screen + i * GFX.Pitch, 0, ww * 2); } LastWidth = Width; LastHeight = Height; } if (GUI.NeedDepthConvert) { if (GUI.Scale <= 1) { srcRect.left = srcRect.top = 0; srcRect.right = Width; srcRect.bottom = Height; ConvertDepth (&Src, &Dst, &srcRect); } else { SSurface tmp; BYTE buf [MAX_SNES_WIDTH * MAX_SNES_HEIGHT * 4]; tmp.Surface = buf; tmp.Pitch = MAX_SNES_WIDTH * 4; tmp.Width = MAX_SNES_WIDTH; tmp.Height = MAX_SNES_HEIGHT; RenderMethod (Src, tmp, &srcRect); ConvertDepth (&tmp, &Dst, &srcRect); } } else RenderMethod (Src, Dst, &srcRect); } RECT lastRect = GUI.SizeHistory [GUI.FlipCounter % GUI.NumFlipFrames]; if (PrimarySurfaceLockFailed) { POINT p; if (GUI.Stretch) { /* p.x = p.y = 0; ClientToScreen (GUI.hWnd, &p); GetClientRect (GUI.hWnd, &dstRect); OffsetRect(&dstRect, p.x, p.y);
*/
p.x = p.y = 0;
ClientToScreen (GUI.hWnd, &p);
GetClientRect (GUI.hWnd, &dstRect);
dstRect.bottom = int(double(dstRect.bottom) * double(239.0 / 240.0));
OffsetRect(&dstRect, p.x, p.y); } else { GetClientRect (GUI.hWnd, &dstRect); int width = srcRect.right - srcRect.left; int height = srcRect.bottom - srcRect.top; if (GUI.Scale == 1) { width = MAX_SNES_WIDTH; if (height < 240) height *= 2; } p.x = ((dstRect.right - dstRect.left) - width) >> 1; p.y = ((dstRect.bottom - dstRect.top) - height) >> 1; ClientToScreen (GUI.hWnd, &p); dstRect.top = p.y; dstRect.left = p.x; dstRect.bottom = dstRect.top + height; dstRect.right = dstRect.left + width; } } else dstRect = srcRect; lpDDSurface2->Unlock (Dst.Surface); if (PrimarySurfaceLockFailed) { DDSCAPS caps; caps.dwCaps = DDSCAPS_BACKBUFFER; if (DirectX.lpDDSPrimary2->GetAttachedSurface (&caps, &pDDSurface) != DD_OK || pDDSurface == NULL) { lpDDSurface2 = DirectX.lpDDSPrimary2; } else lpDDSurface2 = pDDSurface; while (lpDDSurface2->Blt (&dstRect, DirectX.lpDDSOffScreen2, &srcRect, DDBLT_WAIT, NULL) == DDERR_SURFACELOST) lpDDSurface2->Restore (); } RECT rect; DDBLTFX fx; memset (&fx, 0, sizeof (fx)); fx.dwSize = sizeof (fx); if (GUI.FlipCounter >= GUI.NumFlipFrames) { if (lastRect.top < dstRect.top) { rect.top = lastRect.top; rect.bottom = dstRect.top; rect.left = min(lastRect.left, dstRect.left); rect.right = max(lastRect.right, dstRect.right); lpDDSurface2->Blt (&rect, NULL, &rect, DDBLT_WAIT | DDBLT_COLORFILL, &fx); } if (lastRect.bottom > dstRect.bottom) { rect.left = min(lastRect.left, dstRect.left); rect.right = max(lastRect.right, dstRect.right); rect.top = dstRect.bottom; rect.bottom = lastRect.bottom; lpDDSurface2->Blt (&rect, NULL, &rect, DDBLT_WAIT | DDBLT_COLORFILL, &fx); } if (lastRect.left < dstRect.left) { rect.left = lastRect.left; rect.right = dstRect.left; rect.top = dstRect.top; rect.bottom = dstRect.bottom; lpDDSurface2->Blt (&rect, NULL, &rect, DDBLT_WAIT | DDBLT_COLORFILL, &fx); } if (lastRect.right > dstRect.right) { rect.left = dstRect.right; rect.right = lastRect.right; rect.top = dstRect.top; rect.bottom = dstRect.bottom; lpDDSurface2->Blt (&rect, NULL, &rect, DDBLT_WAIT | DDBLT_COLORFILL, &fx); } } DirectX.lpDDSPrimary2->Flip (NULL, DDFLIP_WAIT); } else { srcRect.top = 0; srcRect.bottom = Height; srcRect.left = 0; srcRect.right = Width; dstRect = srcRect; RenderMethod (Src, Dst, &srcRect); } GUI.SizeHistory [GUI.FlipCounter % GUI.NumFlipFrames] = dstRect; GUI.FlipCounter++; return (true);}void InitSnes9X( void){#ifdef DEBUGGER// extern FILE *trace;// trace = fopen( "SNES9X.TRC", "wt"); freopen( "SNES9X.OUT", "wt", stdout); freopen( "SNES9X.ERR", "wt", stderr);// CPU.Flags |= TRACE_FLAG;// APU.Flags |= TRACE_FLAG;#endif#ifdef GENERATE_OFFSETS_H offsets_h = fopen ("offsets.h", "wt"); generate_offsets_h (0, NULL); fclose (offsets_h);#endif Memory.Init(); ScreenBuf1 = new BYTE [EXT_PITCH * EXT_HEIGHT]; ScreenBuf2 = new BYTE [EXT_PITCH * EXT_HEIGHT]; SubScreenBuffer = new BYTE [EXT_PITCH * EXT_HEIGHT]; ZBuffer = new BYTE [EXT_WIDTH * EXT_HEIGHT]; SubZBuffer = new BYTE [EXT_WIDTH * EXT_HEIGHT]; ScreenBuffer = ScreenBuf1 + EXT_OFFSET; memset (ScreenBuf1, 0, EXT_PITCH * EXT_HEIGHT); memset (ScreenBuf2, 0, EXT_PITCH * EXT_HEIGHT); memset (SubScreenBuffer, 0, EXT_PITCH * EXT_HEIGHT); memset (ZBuffer, 0, EXT_WIDTH * EXT_HEIGHT); memset (SubZBuffer, 0, EXT_WIDTH * EXT_HEIGHT); GFX.Pitch = EXT_PITCH; GFX.RealPitch = EXT_PITCH; GFX.Screen = ScreenBuf1 + EXT_OFFSET; GFX.SubScreen = SubScreenBuffer; GFX.Delta = (GFX.SubScreen - GFX.Screen) >> 1; S9xSetWinPixelFormat (); S9xGraphicsInit(); S9xInitAPU(); S9xInitSound (7, true, _blocksize); so.playback_rate = Settings.SoundPlaybackRate; so.stereo = Settings.Stereo; so.sixteen_bit = Settings.SixteenBitSound; so.buffer_size = _blocksize; // Sound options Settings.SoundBufferSize = Settings.SoundBufferSize;#ifdef USE_GLIDE Settings.GlideEnable = FALSE;#endif S9xMovieInit (); for (int C = 0; C != 16; C ++) Joystick[C].Attached = joyGetDevCaps (JOYSTICKID1+C, &Joystick[C].Caps, sizeof( JOYCAPS)) == JOYERR_NOERROR;}extern "C"{void DeinitS9x(){ if(ScreenBuf1) delete [] ScreenBuf1; if(ScreenBuf2) delete [] ScreenBuf2; if(SubScreenBuffer) delete [] SubScreenBuffer; if(ZBuffer) delete [] ZBuffer; if(SubZBuffer) delete [] SubZBuffer; if (SoundBuffer) { SoundBuffer -= 32 * 1024; delete [] SoundBuffer; SoundBuffer = NULL; } if(GUI.GunSight) DestroyCursor(GUI.GunSight);//= LoadCursor (hInstance, MAKEINTRESOURCE (IDC_CURSOR_SCOPE)); if(GUI.Arrow) DestroyCursor(GUI.Arrow);// = LoadCursor (NULL, IDC_ARROW); if(GUI.Accelerators) DestroyAcceleratorTable(GUI.Accelerators);// = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDR_SNES9X_ACCELERATORS)); S9xMovieStop (TRUE);}}int ffs (uint32 mask){ int m = 0; if (mask) { while (!(mask & (1 << m))) m++; return (m); } return (0);}void S9xSetWinPixelFormat (){ extern int Init_2xSaI (uint32 BitFormat); S9xSetRenderPixelFormat (RGB565); Init_2xSaI (565); GUI.NeedDepthConvert = FALSE; if (VOODOO_MODE) { GUI.ScreenDepth = 16; GUI.RedShift = 11; GUI.GreenShift = 5; GUI.BlueShift = 0; Settings.SixteenBit = TRUE; } else if (OPENGL_MODE) { GUI.ScreenDepth = 16; GUI.RedShift = 11; GUI.GreenShift = 6; GUI.BlueShift = 1; Settings.SixteenBit = TRUE; S9xSetRenderPixelFormat (RGB5551); Init_2xSaI (555); } else { GUI.ScreenDepth = DirectX.DDPixelFormat.dwRGBBitCount; if (GUI.ScreenDepth == 15) GUI.ScreenDepth = 16; GUI.RedShift = ffs (DirectX.DDPixelFormat.dwRBitMask); GUI.GreenShift = ffs (DirectX.DDPixelFormat.dwGBitMask); GUI.BlueShift = ffs (DirectX.DDPixelFormat.dwBBitMask); if((DirectX.DDPixelFormat.dwFlags&DDPF_RGB) != 0 && GUI.ScreenDepth == 16 && DirectX.DDPixelFormat.dwRBitMask == 0xF800 && DirectX.DDPixelFormat.dwGBitMask == 0x07E0 && DirectX.DDPixelFormat.dwBBitMask == 0x001F) { S9xSetRenderPixelFormat (RGB565); Init_2xSaI (565); } else if( (DirectX.DDPixelFormat.dwFlags&DDPF_RGB) != 0 && GUI.ScreenDepth == 16 && DirectX.DDPixelFormat.dwRBitMask == 0x7C00 && DirectX.DDPixelFormat.dwGBitMask == 0x03E0 && DirectX.DDPixelFormat.dwBBitMask == 0x001F) { S9xSetRenderPixelFormat (RGB555); Init_2xSaI (555); } else if((DirectX.DDPixelFormat.dwFlags&DDPF_RGB) != 0 && GUI.ScreenDepth == 16 && DirectX.DDPixelFormat.dwRBitMask == 0x001F && DirectX.DDPixelFormat.dwGBitMask == 0x07E0 && DirectX.DDPixelFormat.dwBBitMask == 0xF800) { S9xSetRenderPixelFormat (BGR565); Init_2xSaI (565); } else if( (DirectX.DDPixelFormat.dwFlags&DDPF_RGB) != 0 && GUI.ScreenDepth == 16 && DirectX.DDPixelFormat.dwRBitMask == 0x001F && DirectX.DDPixelFormat.dwGBitMask == 0x03E0 && DirectX.DDPixelFormat.dwBBitMask == 0x7C00) { S9xSetRenderPixelFormat (BGR555); Init_2xSaI (555); } else if (DirectX.DDPixelFormat.dwRGBBitCount == 8 || DirectX.DDPixelFormat.dwRGBBitCount == 24 || DirectX.DDPixelFormat.dwRGBBitCount == 32) { S9xSetRenderPixelFormat (RGB565); Init_2xSaI (565); } if (!VOODOO_MODE && !OPENGL_MODE && ((GUI.ScreenDepth == 8 && Settings.SixteenBit) || (GUI.ScreenDepth == 16 && !Settings.SixteenBit) || GUI.ScreenDepth == 24 || GUI.ScreenDepth == 32)) GUI.NeedDepthConvert = TRUE; if (Settings.SixteenBit && (GUI.ScreenDepth == 24 || GUI.ScreenDepth == 32)) { GUI.RedShift += 3; GUI.GreenShift += 3; GUI.BlueShift += 3; } } int l = 0; int i; for (i = 0; i < 6; i++) { int r = (i * 31) / (6 - 1); for (int j = 0; j < 6; j++) { int g = (j * 31) / (6 - 1); for (int k = 0; k < 6; k++) { int b = (k * 31) / (6 - 1); FixedColours [l].red = r << 3; FixedColours [l].green = g << 3; FixedColours [l++].blue = b << 3; } } } int *color_diff = new int [0x10000]; int diffr, diffg, diffb, maxdiff = 0, won = 0, lost; int r, d = 8; for (r = 0; r <= (int) MAX_RED; r++) { int cr, g, q; int k = 6 - 1; cr = (r * k) / MAX_RED; q = (r * k) % MAX_RED; if (q > d && cr < k) cr++; diffr = abs (cr * k - r); for (g = 0; g <= (int) MAX_GREEN; g++) { int cg, b; k = 6 - 1; cg = (g * k) / MAX_GREEN; q = (g * k) % MAX_GREEN; if(q > d && cg < k) cg++; diffg = abs (cg * k - g); for (b = 0; b <= (int) MAX_BLUE; b++) { int cb; int rgb = BUILD_PIXEL2(r, g, b); k = 6 - 1; cb = (b * k) / MAX_BLUE; q = (b * k) % MAX_BLUE; if (q > d && cb < k) cb++; diffb = abs (cb * k - b); palette[rgb] = (cr * 6 + cg) * 6 + cb; color_diff[rgb] = diffr + diffg + diffb; if (color_diff[rgb] > maxdiff) maxdiff = color_diff[rgb]; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -