⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                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 + -