diff options
Diffstat (limited to '3dc/win95/bink.c')
| -rw-r--r-- | 3dc/win95/bink.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/3dc/win95/bink.c b/3dc/win95/bink.c new file mode 100644 index 0000000..6050fbe --- /dev/null +++ b/3dc/win95/bink.c @@ -0,0 +1,208 @@ +/* Bink! player, KJL 99/4/30 */ +#include "bink.h" + +#include "3dc.h" +#include "d3_func.h" + +#define UseLocalAssert 1 +#include "ourasert.h" + +extern char *ScreenBuffer; +extern LPDIRECTSOUND DSObject; +extern int GotAnyKey; +extern int IntroOutroMoviesAreActive; +extern DDPIXELFORMAT DisplayPixelFormat; + +extern void DirectReadKeyboard(void); + + +static int BinkSurfaceType; + +void PlayBinkedFMV(char *filenamePtr) +{ + BINK* binkHandle; + int playing = 1; + + if (!IntroOutroMoviesAreActive) return; + +// if (!IntroOutroMoviesAreActive) return; + BinkSurfaceType = GetBinkPixelFormat(); + + /* skip FMV if surface type not supported */ + if (BinkSurfaceType == -1) return; + + /* use Direct sound */ + BinkSoundUseDirectSound(DSObject); + /* open smacker file */ + binkHandle = BinkOpen(filenamePtr,0); + if (!binkHandle) + { + char message[100]; + sprintf(message,"Unable to access file: %s\n",filenamePtr); + MessageBox(NULL,message,"AvP Error",MB_OK+MB_SYSTEMMODAL); + exit(0x111); + return; + } + + while(playing) + { + CheckForWindowsMessages(); + if (!BinkWait(binkHandle)) + playing = NextBinkFrame(binkHandle); + + FlipBuffers(); + DirectReadKeyboard(); + if (GotAnyKey) playing = 0; + } + /* close file */ + BinkClose(binkHandle); +} + +static int NextBinkFrame(BINK *binkHandle) +{ + /* unpack frame */ + BinkDoFrame(binkHandle); + + BinkCopyToBuffer(binkHandle,(void*)ScreenBuffer,640*2,480,(640-binkHandle->Width)/2,(480-binkHandle->Height)/2,BinkSurfaceType); + + //BinkToBuffer(binkHandle,(640-binkHandle->Width)/2,(480-binkHandle->Height)/2,640*2,480,(void*)ScreenBuffer,GetBinkPixelFormat(&DisplayPixelFormat)); + + /* are we at the last frame yet? */ + if ((binkHandle->FrameNum==(binkHandle->Frames-1))) return 0; + + /* next frame, please */ + BinkNextFrame(binkHandle); + return 1; +} + +static int GetBinkPixelFormat(void) +{ + if( (DisplayPixelFormat.dwFlags & DDPF_RGB) && !(DisplayPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) ) + { + int m; + int redShift=0; + int greenShift=0; + int blueShift=0; + + m = DisplayPixelFormat.dwRBitMask; + LOCALASSERT(m); + while(!(m&1)) m>>=1; + while(m&1) + { + m>>=1; + redShift++; + } + + m = DisplayPixelFormat.dwGBitMask; + LOCALASSERT(m); + while(!(m&1)) m>>=1; + while(m&1) + { + m>>=1; + greenShift++; + } + + m = DisplayPixelFormat.dwBBitMask; + LOCALASSERT(m); + while(!(m&1)) m>>=1; + while(m&1) + { + m>>=1; + blueShift++; + } + + if(redShift == 5) + { + if (greenShift == 5) + { + if (blueShift == 5) + { + return BINKSURFACE555; + } + else // not supported + { + return -1; + } + } + else if (greenShift == 6) + { + if (blueShift == 5) + { + return BINKSURFACE565; + } + else // not supported + { + return -1; + } + } + } + else if (redShift == 6) + { + if (greenShift == 5) + { + if (blueShift == 5) + { + return BINKSURFACE655; + } + else // not supported + { + return -1; + } + } + else if (greenShift == 6) + { + if (blueShift == 4) + { + return BINKSURFACE664; + } + else // not supported + { + return -1; + } + } + } + else + { + return -1; + } + } + + return -1; +} + +BINK *MenuBackground = 0; + +extern void StartMenuBackgroundBink(void) +{ + char *filenamePtr = "fmvs/menubackground.bik";//newer.bik"; + + /* open smacker file */ + MenuBackground = BinkOpen(filenamePtr,0); + BinkSurfaceType = GetBinkPixelFormat(); + BinkDoFrame(MenuBackground); +} + +extern int PlayMenuBackgroundBink(void) +{ + int newframe = 0; + if(!MenuBackground) return 0; + + if (!BinkWait(MenuBackground)&&IntroOutroMoviesAreActive) newframe=1; + + if(newframe) BinkDoFrame(MenuBackground); + + BinkCopyToBuffer(MenuBackground,(void*)ScreenBuffer,640*2,480,(640-MenuBackground->Width)/2,(480-MenuBackground->Height)/2,BinkSurfaceType|BINKSURFACECOPYALL); + + /* next frame, please */ + if(newframe)BinkNextFrame(MenuBackground); + + return 1; +} +extern void EndMenuBackgroundBink(void) +{ + if(!MenuBackground) return; + + BinkClose(MenuBackground); + MenuBackground = 0; +} + |
