X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fwin%2Fvideo.c;fp=drivers%2Fwin%2Fvideo.c;h=0000000000000000000000000000000000000000;hb=987332078d2c97ba37b73d2b946377906fb486d7;hp=a0438a03a61434062a40717ea50285a9f7e35f52;hpb=5232c20c0fa2c80964fe1d3f597c239bcf93d6fc;p=fceu.git diff --git a/drivers/win/video.c b/drivers/win/video.c deleted file mode 100644 index a0438a0..0000000 --- a/drivers/win/video.c +++ /dev/null @@ -1,1174 +0,0 @@ -/* FCE Ultra - NES/Famicom Emulator - * - * Copyright notice for this file: - * Copyright (C) 2002 Ben Parnell - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -static int RecalcCustom(void); - -#define VF_DDSTRETCHED 1 - -#define VEF_LOSTSURFACE 1 -#define VEF____INTERNAL 2 - -#define VMDF_DXBLT 1 -#define VMDF_STRFS 2 - -typedef struct { - int x; - int y; - int bpp; - int flags; - int xscale; - int yscale; - RECT srect; - RECT drect; -} vmdef; - -// left, top, right, bottom -static vmdef vmodes[11]={ - {320,240,8,0,1,1}, //0 - {320,240,8,0,1,1}, //1 - {512,384,8,0,1,1}, //2 - {640,480,8,0,1,1}, //3 - {640,480,8,0,1,1}, //4 - {640,480,8,0,1,1}, //5 - {640,480,8,VMDF_DXBLT,2,2}, //6 - {1024,768,8,VMDF_DXBLT,4,3}, //7 - {1280,1024,8,VMDF_DXBLT,5,4}, //8 - {1600,1200,8,VMDF_DXBLT,6,5}, //9 - {800,600,8,VMDF_DXBLT|VMDF_STRFS,0,0} //10 - }; -static DDCAPS caps; -static int mustrestore=0; -static DWORD CBM[3]; - -static int bpp; -static int vflags; -static int veflags; - -int fssync=0; -int winsync=0; - -static uint32 *palettetranslate=0; - -PALETTEENTRY color_palette[256]; -static int PaletteChanged=0; - -LPDIRECTDRAWCLIPPER lpClipper=0; -LPDIRECTDRAW lpDD=0; -LPDIRECTDRAW4 lpDD4=0; -LPDIRECTDRAWPALETTE lpddpal; - -DDSURFACEDESC2 ddsd; - -DDSURFACEDESC2 ddsdback; -LPDIRECTDRAWSURFACE4 lpDDSPrimary=0; -LPDIRECTDRAWSURFACE4 lpDDSDBack=0; -LPDIRECTDRAWSURFACE4 lpDDSBack=0; - -static void ShowDDErr(char *s) -{ - char tempo[512]; - sprintf(tempo,"DirectDraw: %s",s); - FCEUD_PrintError(tempo); -} - -int RestoreDD(int w) -{ - if(w) - { - if(!lpDDSBack) return 0; - if(IDirectDrawSurface4_Restore(lpDDSBack)!=DD_OK) return 0; - } - else - { - if(!lpDDSPrimary) return 0; - if(IDirectDrawSurface4_Restore(lpDDSPrimary)!=DD_OK) return 0; - } - veflags|=1; - return 1; -} - -void FCEUD_SetPalette(unsigned char index, unsigned char r, unsigned char g, unsigned char b) -{ - color_palette[index].peRed=r; - color_palette[index].peGreen=g; - color_palette[index].peBlue=b; - PaletteChanged=1; -} - -void FCEUD_GetPalette(unsigned char i, unsigned char *r, unsigned char *g, unsigned char *b) -{ - *r=color_palette[i].peRed; - *g=color_palette[i].peGreen; - *b=color_palette[i].peBlue; -} - -int InitializeDDraw(void) -{ - ddrval = DirectDrawCreate(NULL, &lpDD, NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating DirectDraw object."); - return 0; - } - - ddrval = IDirectDraw_QueryInterface(lpDD,&IID_IDirectDraw4,(LPVOID *)&lpDD4); - IDirectDraw_Release(lpDD); - - if (ddrval != DD_OK) - { - ShowDDErr("Error querying interface."); - return 0; - } - - caps.dwSize=sizeof(caps); - if(IDirectDraw4_GetCaps(lpDD4,&caps,0)!=DD_OK) - { - ShowDDErr("Error getting capabilities."); - return 0; - } - return 1; -} - -static int GetBPP(void) -{ - DDPIXELFORMAT ddpix; - - memset(&ddpix,0,sizeof(ddpix)); - ddpix.dwSize=sizeof(ddpix); - - ddrval=IDirectDrawSurface4_GetPixelFormat(lpDDSPrimary,&ddpix); - if (ddrval != DD_OK) - { - ShowDDErr("Error getting primary surface pixel format."); - return 0; - } - - if(ddpix.dwFlags&DDPF_RGB) - { - bpp=ddpix.DUMMYUNIONNAMEN(1).dwRGBBitCount; - CBM[0]=ddpix.DUMMYUNIONNAMEN(2).dwRBitMask; - CBM[1]=ddpix.DUMMYUNIONNAMEN(3).dwGBitMask; - CBM[2]=ddpix.DUMMYUNIONNAMEN(4).dwBBitMask; - } - else - { - ShowDDErr("RGB data not valid."); - return 0; - } - if(bpp==15) bpp=16; - - return 1; -} - -static int InitBPPStuff(void) -{ - if(bpp==16) - palettetranslate=malloc(65536*4); - else if(bpp>=24) - palettetranslate=malloc(256*4); - else if(bpp==8) - { - ddrval=IDirectDraw4_CreatePalette( lpDD4, DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE,color_palette,&lpddpal,NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating palette object."); - return 0; - } - ddrval=IDirectDrawSurface4_SetPalette(lpDDSPrimary, lpddpal); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting palette object."); - return 0; - } - } - return 1; -} - -int SetVideoMode(int fs) -{ - if(!lpDD4) // DirectDraw not initialized - return(1); - - if(fs) - if(!vmod) - if(!RecalcCustom()) - return(0); - - vflags=0; - veflags=1; - PaletteChanged=1; - - ResetVideo(); - - if(!fs) - { - ShowCursorAbs(1); - windowedfailed=1; - HideFWindow(0); - - ddrval = IDirectDraw4_SetCooperativeLevel ( lpDD4, hAppWnd, DDSCL_NORMAL); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting cooperative level."); - return 1; - } - - /* Beginning */ - memset(&ddsd,0,sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - ddrval = IDirectDraw4_CreateSurface ( lpDD4, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating primary surface."); - return 1; - } - - memset(&ddsdback,0,sizeof(ddsdback)); - ddsdback.dwSize=sizeof(ddsdback); - ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; - - ddsdback.dwWidth=256; - ddsdback.dwHeight=240; - - /* If no blit hardware is present, make sure buffer is created - in system memory. - */ - if(!(caps.dwCaps&DDCAPS_BLT)) - ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - - ddrval = IDirectDraw4_CreateSurface ( lpDD4, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating secondary surface."); - return 0; - } - - if(!GetBPP()) - return 0; - - if(bpp!=16 && bpp!=24 && bpp!=32) - { - ShowDDErr("Current bit depth not supported!"); - return 0; - } - - if(!InitBPPStuff()) - return 0; - - ddrval=IDirectDraw4_CreateClipper(lpDD4,0,&lpClipper,0); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating clipper."); - return 0; - } - - ddrval=IDirectDrawClipper_SetHWnd(lpClipper,0,hAppWnd); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting clipper window."); - return 0; - } - ddrval=IDirectDrawSurface4_SetClipper(lpDDSPrimary,lpClipper); - if (ddrval != DD_OK) - { - ShowDDErr("Error attaching clipper to primary surface."); - return 0; - } - - windowedfailed=0; - SetMainWindowStuff(); - } - else - { - HideFWindow(1); - - ddrval = IDirectDraw4_SetCooperativeLevel ( lpDD4, hAppWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting cooperative level."); - return 0; - } - - ddrval = IDirectDraw4_SetDisplayMode(lpDD4, vmodes[vmod].x, vmodes[vmod].y,vmodes[vmod].bpp,0,0); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting display mode."); - return 0; - } - if(vmodes[vmod].flags&VMDF_DXBLT) - { - memset(&ddsdback,0,sizeof(ddsdback)); - ddsdback.dwSize=sizeof(ddsdback); - ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; - - ddsdback.dwWidth=256; //vmodes[vmod].srect.right; - ddsdback.dwHeight=240; //vmodes[vmod].srect.bottom; - - if(!(caps.dwCaps&DDCAPS_BLT)) - ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - - ddrval = IDirectDraw4_CreateSurface ( lpDD4, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); - if(ddrval!=DD_OK) - { - ShowDDErr("Error creating secondary surface."); - return 0; - } - } - - // create foreground surface - - memset(&ddsd,0,sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - if(fssync==2) // Double buffering. - { - ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps |= DDSCAPS_COMPLEX | DDSCAPS_FLIP; - } - - ddrval = IDirectDraw4_CreateSurface ( lpDD4, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating primary surface."); - return 0; - } - - if(fssync==2) - { - DDSCAPS2 tmp; - - memset(&tmp,0,sizeof(tmp)); - tmp.dwCaps=DDSCAPS_BACKBUFFER; - - if(IDirectDrawSurface4_GetAttachedSurface(lpDDSPrimary,&tmp,&lpDDSDBack)!=DD_OK) - { - ShowDDErr("Error getting attached surface."); - return 0; - } - } - - if(!GetBPP()) - return 0; - if(!InitBPPStuff()) - return 0; - - mustrestore=1; - ShowCursorAbs(0); - } - - InputScreenChanged(fs); - fullscreen=fs; - return 1; -} - -static void BlitScreenWindow(uint8 *XBuf); -static void BlitScreenFull(uint8 *XBuf); - -void FCEUD_BlitScreen(uint8 *XBuf) -{ - doagain: - - UpdateFCEUWindow(); - - if(!(eoptions&EO_BGRUN)) - while(nofocus) - { - Sleep(50); - BlockingCheck(); - } - - - /* This complex statement deserves some explanation. - Make sure this special speed throttling hasn't been disabled by the user - first. Second, we don't want to throttle the speed if the fast-forward - button is pressed down(or during certain network play conditions). - - Now, if we're at this point, we'll throttle speed if sound is disabled. - Otherwise, it gets a bit more complicated. We'll throttle speed if focus - to FCE Ultra has been lost and we're writing to the primary sound buffer - because our sound code won't block. Blocking does seem to work when - writing to a secondary buffer, so we won't throttle when a secondary - buffer is used. - */ - - if(!(eoptions&EO_NOTHROTTLE)) - if(!NoWaiting) - if(!soundo || (soundo && nofocus && !(soundoptions&SO_SECONDARY)) ) - SpeedThrottle(); - - if(fullscreen) - { - if(fssync==1 && !NoWaiting) - IDirectDraw4_WaitForVerticalBlank(lpDD4,DDWAITVB_BLOCKBEGIN,0); - - BlitScreenFull(XBuf); - } - else - { - if(winsync && !NoWaiting) - IDirectDraw4_WaitForVerticalBlank(lpDD4,DDWAITVB_BLOCKBEGIN,0); - - if(!windowedfailed) - BlitScreenWindow(XBuf); - } - if(userpause) - { - StopSound(); - Sleep(50); - BlockingCheck(); - goto doagain; - } -} - -static INLINE void BlitVidHi(uint8 *src, uint8 *dest, /*int xr,*/ int yr, int pitch) -{ - int x,y; - int pinc; - - if(!(eoptions&EO_CLIPSIDES)) - switch(bpp) - { - case 32: - - pinc=pitch-(256<<2); - for(y=yr;y;y--) - { - for(x=256;x;x--) - { - *(uint32 *)dest=palettetranslate[(uint32)*src]; - dest+=4; - src++; - } - dest+=pinc; - src+=16; - } - break; - - case 24: - pinc=pitch-(256*3); - for(y=yr;y;y--) - { - for(x=256;x;x--) - { - uint32 tmp; - tmp=palettetranslate[(uint32)*src]; - *(uint16*)dest=(uint16)tmp; - *&dest[2]=(uint8)(tmp>>16); - dest+=3; - src++; - } - dest+=pinc; - src+=16; - } - break; - - case 16: - pinc=pitch-(256<<1); - for(y=yr;y;y--) - { - for(x=256>>1;x;x--) - { - *(unsigned long *)dest=palettetranslate[*(unsigned short *)src]; - dest+=4; - src+=2; - } - dest+=pinc; - src+=16; - } - break; - } - else - switch(bpp) - { - case 32: - - pinc=pitch-(240<<2); - for(y=yr;y;y--) - { - for(x=240;x;x--) - { - *(uint32 *)dest=palettetranslate[(uint32)*src]; - dest+=4; - src++; - } - dest+=pinc; - src+=32; - } - break; - - case 24: - pinc=pitch-(240*3); - for(y=yr;y;y--) - { - for(x=240;x;x--) - { - uint32 tmp; - tmp=palettetranslate[(uint32)*src]; - *(uint16*)dest=(uint16)tmp; - *&dest[2]=(uint8)(tmp>>16); - dest+=3; - src++; - } - dest+=pinc; - src+=32; - } - break; - case 16: - pinc=pitch-(240<<1); - for(y=yr;y;y--) - { - for(x=240>>1;x;x--) - { - *(unsigned long *)dest=palettetranslate[*(unsigned short *)src]; - dest+=4; - src+=2; - } - dest+=pinc; - src+=32; - } - break; - } -} - -static INLINE void FixPaletteHi(void) -{ - int x; - - switch(bpp) - { - case 16:{ - int cshiftr[3]; - int cshiftl[3]; - int a,x,z,y; - - cshiftl[0]=cshiftl[1]=cshiftl[2]=-1; - for(a=0;a<3;a++) - { - for(x=0,y=-1,z=0;x<16;x++) - { - if(CBM[a]&(1<>cshiftr[0])<>cshiftr[1])<>cshiftr[2])<>8].peRed>>cshiftr[0])<>8].peGreen>>cshiftr[1])<>8].peBlue>>cshiftr[2])<=16) - FixPaletteHi(); - else - for(x=0;x<=0x80;x+=0x80) - { - ddrval=IDirectDrawPalette_SetEntries(lpddpal,0,0x80^x,128,&color_palette[x]); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(0); - return; - } - } - PaletteChanged=0; - } - - if(vmodes[vmod].flags&VMDF_DXBLT) - { - ddrval=IDirectDrawSurface4_Lock(lpDDSBack,NULL,&ddsdback, 0, NULL); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(1); - return; - } - ScreenLoc=ddsdback.lpSurface; - pitch=ddsdback.DUMMYUNIONNAMEN(1).lPitch; - - srect.top=0; - srect.left=0; - srect.right=VNSWID; - srect.bottom=totallines; - if(vmodes[vmod].flags&VMDF_STRFS) - { - drect.top=0; - drect.left=0; - drect.right=vmodes[vmod].x; - drect.bottom=vmodes[vmod].y; - } - else - { - drect.top=(vmodes[vmod].y-(totallines*vmodes[vmod].yscale))>>1; - drect.bottom=drect.top+(totallines*vmodes[vmod].yscale); - drect.left=(vmodes[vmod].x-VNSWID*vmodes[vmod].xscale)>>1; - drect.right=drect.left+VNSWID*vmodes[vmod].xscale; - } - } - else - { - ddrval=IDirectDrawSurface4_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(0); - return; - } - - ScreenLoc=ddsd.lpSurface; - pitch=ddsd.DUMMYUNIONNAMEN(1).lPitch; - } - - if(veflags&1) - { - if(vmodes[vmod].flags&VMDF_DXBLT) - { - veflags|=2; - memset((char *)ScreenLoc,0,pitch*srect.bottom); - } - else - { - memset((char *)ScreenLoc,0,pitch*vmodes[vmod].y); - } - PaletteChanged=1; - veflags&=~1; - } - - if(vmod==5) - { - if(eoptions&EO_CLIPSIDES) - { - asm volatile( - "xorl %%edx, %%edx\n\t" - "akoop1:\n\t" - "movb $120,%%al \n\t" - "akoop2:\n\t" - "movb 1(%%esi),%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "xorl $0x00800080,%%edx\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne akoop2\n\t" - "addl $32,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne akoop1\n\t" - : - : "S" (XBuf+srendline*272+VNSCLIP), "D" (ScreenLoc+((240-totallines)/2)*pitch+(640-(VNSWID<<1))/2),"b" (totallines), "c" ((pitch-VNSWID)<<1) - : "%al", "%edx", "%cc" ); - } - else - { - asm volatile( - "xorl %%edx, %%edx\n\t" - "koop1:\n\t" - "movb $128,%%al \n\t" - "koop2:\n\t" - "movb 1(%%esi),%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "xorl $0x00800080,%%edx\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne koop2\n\t" - "addl $16,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne koop1\n\t" - : - : "S" (XBuf+srendline*272), "D" (ScreenLoc+((240-totallines)/2)*pitch+(640-512)/2),"b" (totallines), "c" (pitch-512+pitch) - : "%al", "%edx", "%cc" ); - } - } - else if(vmod==4) - { - if(eoptions&EO_CLIPSIDES) - { - asm volatile( - "ayoop1:\n\t" - "movb $120,%%al \n\t" - "ayoop2:\n\t" - "movb 1(%%esi),%%dh\n\t" - "movb %%dh,%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movb %%dl,%%dh\n\t" // Ugh - "xorl $0x80808080,%%edx\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne ayoop2\n\t" - "addl $32,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne ayoop1\n\t" - : - : "S" (XBuf+srendline*272+VNSCLIP), "D" (ScreenLoc+((240-totallines)/2)*pitch+(640-(VNSWID<<1))/2),"b" (totallines), "c" ((pitch-VNSWID)<<1) - : "%al", "%edx", "%cc" ); - } - else - { - asm volatile( - "yoop1:\n\t" - "movb $128,%%al \n\t" - "yoop2:\n\t" - "movb 1(%%esi),%%dh\n\t" - "movb %%dh,%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movb %%dl,%%dh\n\t" // Ugh - "xorl $0x80808080,%%edx\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne yoop2\n\t" - "addl $16,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne yoop1\n\t" - : - : "S" (XBuf+srendline*272), "D" (ScreenLoc+((240-totallines)/2)*pitch+(640-512)/2),"b" (totallines), "c" (pitch-512+pitch) - : "%al", "%edx", "%cc" ); - } - } - else - { - if(!(vmodes[vmod].flags&VMDF_DXBLT)) - { - ScreenLoc+=((vmodes[vmod].x-VNSWID)>>1)*(bpp>>3)+(((vmodes[vmod].y-totallines)>>1))*pitch; - } - if(bpp>=16) - { - BlitVidHi(XBuf+srendline*272+VNSCLIP, ScreenLoc, /*VNSWID,*/ totallines, pitch); - } - else - { - XBuf+=srendline*272+VNSCLIP; - if(eoptions&EO_CLIPSIDES) - { - for(y=totallines;y;y--) - { - for(x=60;x;x--) - { - *(long *)ScreenLoc=(*(long *)XBuf)^0x80808080; - ScreenLoc+=4; - XBuf+=4; - } - ScreenLoc+=pitch-240; - XBuf+=32; - } - } - else - { - for(y=totallines;y;y--) - { - for(x=64;x;x--) - { - *(long *)ScreenLoc=(*(long *)XBuf)^0x80808080; - ScreenLoc+=4; - XBuf+=4; - } - ScreenLoc+=pitch-256; - XBuf+=16; - } - } - } - } - - if(vmodes[vmod].flags&VMDF_DXBLT) - { - IDirectDrawSurface4_Unlock(lpDDSBack, NULL); - - if(veflags&2) - { - if(IDirectDrawSurface4_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL)==DD_OK) - { - memset(ddsd.lpSurface,0,ddsd.DUMMYUNIONNAMEN(1).lPitch*vmodes[vmod].y); - IDirectDrawSurface4_Unlock(lpDDSVPrimary, NULL); - veflags&=~2; - } - } - - - if(IDirectDrawSurface4_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_ASYNC,0)!=DD_OK) - { - ddrval=IDirectDrawSurface4_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_WAIT,0); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) - { - RestoreDD(0); - RestoreDD(1); - } - return; - } - - } - } - else - IDirectDrawSurface4_Unlock(lpDDSVPrimary, NULL); - if(fssync==2) - { - IDirectDrawSurface4_Flip(lpDDSPrimary,0,0); - - } -} - -void ResetVideo(void) -{ - ShowCursorAbs(1); - if(palettetranslate) {free(palettetranslate);palettetranslate=0;} - if(lpDD4) - if(mustrestore) - {IDirectDraw4_RestoreDisplayMode(lpDD4);mustrestore=0;} - if(lpDDSBack) {IDirectDrawSurface4_Release(lpDDSBack);lpDDSBack=0;} - if(lpDDSPrimary) {IDirectDrawSurface4_Release(lpDDSPrimary);lpDDSPrimary=0;} - if(lpClipper) {IDirectDrawClipper_Release(lpClipper);lpClipper=0;} -} - -static int RecalcCustom(void) -{ - vmodes[0].flags&=~VMDF_DXBLT; - - if(vmodes[0].flags&VMDF_STRFS) - { - vmodes[0].flags|=VMDF_DXBLT; - - vmodes[0].srect.top=srendline; - vmodes[0].srect.left=VNSCLIP; - vmodes[0].srect.right=256-VNSCLIP; - vmodes[0].srect.bottom=erendline+1; - - vmodes[0].drect.top=vmodes[0].drect.left=0; - vmodes[0].drect.right=vmodes[0].x; - vmodes[0].drect.bottom=vmodes[0].y; - } - else if(vmodes[0].xscale!=1 || vmodes[0].yscale!=1) - { - vmodes[0].flags|=VMDF_DXBLT; - if(VNSWID*vmodes[0].xscale>vmodes[0].x) - { - FCEUD_PrintError("Scaled width is out of range. Reverting to no horizontal scaling."); - vmodes[0].xscale=1; - } - if(totallines*vmodes[0].yscale>vmodes[0].y) - { - FCEUD_PrintError("Scaled height is out of range. Reverting to no vertical scaling."); - vmodes[0].yscale=1; - } - - vmodes[0].srect.left=VNSCLIP; - vmodes[0].srect.top=srendline; - vmodes[0].srect.right=256-VNSCLIP; - vmodes[0].srect.bottom=erendline+1; - - vmodes[0].drect.top=(vmodes[0].y-(totallines*vmodes[0].yscale))>>1; - vmodes[0].drect.bottom=vmodes[0].drect.top+totallines*vmodes[0].yscale; - - vmodes[0].drect.left=(vmodes[0].x-(VNSWID*vmodes[0].xscale))>>1; - vmodes[0].drect.right=vmodes[0].drect.left+VNSWID*vmodes[0].xscale; - } - - if(vmodes[0].x>3)-1,(LPARAM)(LPSTR)0); - - SetDlgItemInt(hwndDlg,200,vmodes[0].x,0); - SetDlgItemInt(hwndDlg,201,vmodes[0].y,0); - - SetDlgItemInt(hwndDlg,302,vmodes[0].xscale,0); - SetDlgItemInt(hwndDlg,303,vmodes[0].yscale,0); - CheckRadioButton(hwndDlg,300,301,(vmodes[0].flags&VMDF_STRFS)?301:300); - if(eoptions&EO_FSAFTERLOAD) - CheckDlgButton(hwndDlg,102,BST_CHECKED); - - if(eoptions&EO_CLIPSIDES) - CheckDlgButton(hwndDlg,106,BST_CHECKED); - - SetDlgItemInt(hwndDlg,500,srendlinen,0); - SetDlgItemInt(hwndDlg,501,erendlinen,0); - - SetDlgItemInt(hwndDlg,502,srendlinep,0); - SetDlgItemInt(hwndDlg,503,erendlinep,0); - - - SetDlgItemInt(hwndDlg,103,winsizemul,0); - - SendDlgItemMessage(hwndDlg,104,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); - SendDlgItemMessage(hwndDlg,105,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); - - SendDlgItemMessage(hwndDlg,104,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - SendDlgItemMessage(hwndDlg,105,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - - SendDlgItemMessage(hwndDlg,105,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Double Buffering"); - - SendDlgItemMessage(hwndDlg,104,CB_SETCURSEL,winsync,(LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg,105,CB_SETCURSEL,fssync,(LPARAM)(LPSTR)0); - break; - case WM_CLOSE: - case WM_QUIT: goto gornk; - case WM_COMMAND: - if(!(wParam>>16)) - switch(wParam&0xFFFF) - { - case 1: - gornk: - - if(IsDlgButtonChecked(hwndDlg,106)==BST_CHECKED) - eoptions|=EO_CLIPSIDES; - else - eoptions&=~EO_CLIPSIDES; - - srendlinen=GetDlgItemInt(hwndDlg,500,0,0); - erendlinen=GetDlgItemInt(hwndDlg,501,0,0); - srendlinep=GetDlgItemInt(hwndDlg,502,0,0); - erendlinep=GetDlgItemInt(hwndDlg,503,0,0); - - - if(erendlinen>239) erendlinen=239; - if(srendlinen>erendlinen) srendlinen=erendlinen; - - if(erendlinep>239) erendlinep=239; - if(srendlinep>erendlinen) srendlinep=erendlinep; - - UpdateRendBounds(); - - if(IsDlgButtonChecked(hwndDlg,301)==BST_CHECKED) - vmodes[0].flags|=VMDF_STRFS; - else - vmodes[0].flags&=~VMDF_STRFS; - - vmod=SendDlgItemMessage(hwndDlg,100,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - vmodes[0].x=GetDlgItemInt(hwndDlg,200,0,0); - vmodes[0].y=GetDlgItemInt(hwndDlg,201,0,0); - vmodes[0].bpp=(SendDlgItemMessage(hwndDlg,202,CB_GETCURSEL,0,(LPARAM)(LPSTR)0)+1)<<3; - - vmodes[0].xscale=GetDlgItemInt(hwndDlg,302,0,0); - vmodes[0].yscale=GetDlgItemInt(hwndDlg,303,0,0); - - if(IsDlgButtonChecked(hwndDlg,101)==BST_CHECKED) - fullscreen=1; - else - fullscreen=0; - if(IsDlgButtonChecked(hwndDlg,102)==BST_CHECKED) - eoptions|=EO_FSAFTERLOAD; - else - eoptions&=~EO_FSAFTERLOAD; - - { - int t=GetDlgItemInt(hwndDlg,103,0,0); - if(t>0 && t<60) - winsizemul=t; - } - winsync=SendDlgItemMessage(hwndDlg,104,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - fssync=SendDlgItemMessage(hwndDlg,105,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - EndDialog(hwndDlg,0); - break; - } - } - return 0; -} - -static void SetFSVideoMode(void) -{ - changerecursive=1; - if(!SetVideoMode(1)) - SetVideoMode(0); - changerecursive=0; -} - - - -void ConfigVideo(void) -{ - DialogBox(fceu_hInstance,"VIDEOCONFIG",hAppWnd,VideoConCallB); - UpdateRendBounds(); - if(fullscreen) - SetFSVideoMode(); - else - SetMainWindowStuff(); -} - -void DoVideoConfigFix(void) -{ - UpdateRendBounds(); -} - - -#ifdef moo - if(!vmod) - { - if(vmodes[0].x