From 4c398a4a010f590c8c1b0736ca0cdcaa0bb14ed0 Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 27 May 2008 04:40:03 +0000 Subject: [PATCH] give ability to display messages that will display in the movie. the only movie that is displaying this way is "Movie playback stopped." but we can make any message display that way. however, we'll need a tiny bit more work to be able to display the frame counter in the movie. --- src/drawing.cpp | 23 ++-- src/drawing.h | 2 +- src/fceu.h | 1 + src/movie.cpp | 2 +- src/video.cpp | 291 +++++++++++++++++++++++++----------------------- src/video.h | 16 ++- 6 files changed, 180 insertions(+), 155 deletions(-) diff --git a/src/drawing.cpp b/src/drawing.cpp index 19523e70..d0c59115 100644 --- a/src/drawing.cpp +++ b/src/drawing.cpp @@ -125,13 +125,16 @@ void DrawTextLineBG(uint8 *dest) } - -void DrawMessage(void) +void DrawMessage(bool beforeMovie) { - if(howlong) + if(guiMessage.howlong) { + //don't display movie messages if we're not before the movie + if(beforeMovie && !guiMessage.isMovieMessage) + return; + uint8 *t; - howlong--; + guiMessage.howlong--; t=XBuf+FCEU_TextScanlineOffsetFromBottom(16); /* @@ -148,12 +151,12 @@ void DrawMessage(void) if(t>=XBuf) { int color = 0x20; - if(howlong == 39) color = 0x38; - if(howlong <= 30) color = 0x2C; - if(howlong <= 20) color = 0x1C; - if(howlong <= 10) color = 0x11; - if(howlong <= 5) color = 0x1; - DrawTextTrans(t, 256, (uint8 *)errmsg, color+0x80); + if(guiMessage.howlong == 39) color = 0x38; + if(guiMessage.howlong <= 30) color = 0x2C; + if(guiMessage.howlong <= 20) color = 0x1C; + if(guiMessage.howlong <= 10) color = 0x11; + if(guiMessage.howlong <= 5) color = 0x1; + DrawTextTrans(t, 256, (uint8 *)guiMessage.errmsg, color+0x80); } } } diff --git a/src/drawing.h b/src/drawing.h index b4183a2a..567f9014 100644 --- a/src/drawing.h +++ b/src/drawing.h @@ -1,7 +1,7 @@ #include void DrawTextLineBG(uint8 *dest); -void DrawMessage(void); +void DrawMessage(bool beforeMovie); void FCEU_DrawRecordingStatus(uint8* XBuf); void FCEU_DrawNumberRow(uint8 *XBuf, int *nstatus, int cur); void DrawTextTrans(uint8 *dest, uint32 width, uint8 *textmsg, uint8 fgcolor); \ No newline at end of file diff --git a/src/fceu.h b/src/fceu.h index 107ade2c..3783fc3f 100644 --- a/src/fceu.h +++ b/src/fceu.h @@ -96,6 +96,7 @@ extern FCEUS FSettings; void FCEU_PrintError(char *format, ...); void FCEU_printf(char *format, ...); void FCEU_DispMessage(char *format, ...); +void FCEU_DispMessageOnMovie(char *format, ...); void SetNESDeemph(uint8 d, int force); void DrawTextTrans(uint8 *dest, uint32 width, uint8 *textmsg, uint8 fgcolor); diff --git a/src/movie.cpp b/src/movie.cpp index 25bb81c4..f524460e 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -358,7 +358,7 @@ void LoadFM2(MovieData& movieData, FILE *fp) /// Stop movie playback. void StopPlayback() { - FCEU_DispMessage("Movie playback stopped."); + FCEU_DispMessageOnMovie("Movie playback stopped."); movieMode = MOVIEMODE_INACTIVE; } diff --git a/src/video.cpp b/src/video.cpp index a6cf6bf0..71ee10b1 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -46,6 +46,8 @@ uint8 *XBuf=NULL; uint8 *XBackBuf=NULL; static uint8 *xbsave=NULL; +GUIMESSAGE guiMessage; + //for input display extern int input_display; extern uint32 cur_input_display; @@ -133,8 +135,6 @@ int FCEU_InitVirtualVideo(void) return 1; } -int howlong; -char errmsg[65]; #ifdef FRAMESKIP @@ -165,176 +165,183 @@ void FCEUI_SaveSnapshot(void) static void ReallySnap(void) { - int x=SaveSnapshot(); - if(!x) - FCEU_DispMessage("Error saving screen snapshot."); - else - FCEU_DispMessage("Screen snapshot %d saved.",x-1); + int x=SaveSnapshot(); + if(!x) + FCEU_DispMessage("Error saving screen snapshot."); + else + FCEU_DispMessage("Screen snapshot %d saved.",x-1); } void FCEU_PutImage(void) { - #ifdef SHOWFPS +#ifdef SHOWFPS ShowFPS(); - #endif -/* - // HACK to record input and/or frame counter into AVI - extern int frame_display, input_display, movcounter; - int movieDrawInAVI = FCEUI_AviIsRecording() && (frame_display || input_display) && movcounter; - if(movieDrawInAVI) - { - FCEU_DrawMovies(XBuf); - DrawMessage(); - } -*/ - if(GameInfo->type==GIT_NSF) - { - DrawNSF(XBuf); - /* Save snapshot after NSF screen is drawn. Why would we want to - do it before? - */ - if(dosnapsave) - { - ReallySnap(); - dosnapsave=0; - } - } - else - { - /* Update AVI before overlay stuff is written */ - if(!FCEUI_EmulationPaused()) - FCEUI_AviVideoUpdate(XBuf); - /* Save backbuffer before overlay stuff is written. */ - if(!FCEUI_EmulationPaused()) - memcpy(XBackBuf, XBuf, 256*256); - /* Save snapshot before overlay stuff is written. */ - if(dosnapsave) - { - ReallySnap(); - dosnapsave=0; - } - if(GameInfo->type==GIT_VSUNI) - FCEU_VSUniDraw(XBuf); - FCEU_DrawSaveStates(XBuf); - FCEU_DrawMovies(XBuf); - FCEU_DrawNTSCControlBars(XBuf); - FCEU_DrawRecordingStatus(XBuf); - } -// if(!movieDrawInAVI) - DrawMessage(); - FCEU_DrawInput(XBuf); - - //Fancy input display code - if(input_display) +#endif + + if(GameInfo->type==GIT_NSF) + { + DrawNSF(XBuf); + + //Save snapshot after NSF screen is drawn. Why would we want to do it before? + if(dosnapsave) { - int controller, c, color; - int i, j; - uint8 *t = XBuf+(FSettings.LastSLine-9)*256 + 20; //mbg merge 7/17/06 changed t to uint8* - if(input_display > 4) input_display = 4; - for(controller = 0; controller < input_display; controller++, t += 56) + ReallySnap(); + dosnapsave=0; + } + } + else + { + + //Some messages need to be displayed before the avi is dumped + DrawMessage(true); + + //Update AVI before overlay stuff is written + if(!FCEUI_EmulationPaused()) + FCEUI_AviVideoUpdate(XBuf); + + //Save backbuffer before overlay stuff is written. + if(!FCEUI_EmulationPaused()) + memcpy(XBackBuf, XBuf, 256*256); + + //Save snapshot before overlay stuff is written. + if(dosnapsave) + { + ReallySnap(); + dosnapsave=0; + } + if(GameInfo->type==GIT_VSUNI) + FCEU_VSUniDraw(XBuf); + + FCEU_DrawSaveStates(XBuf); + FCEU_DrawMovies(XBuf); + FCEU_DrawNTSCControlBars(XBuf); + FCEU_DrawRecordingStatus(XBuf); + } + + DrawMessage(false); + FCEU_DrawInput(XBuf); + + //Fancy input display code + if(input_display) + { + int controller, c, color; + int i, j; + uint8 *t = XBuf+(FSettings.LastSLine-9)*256 + 20; //mbg merge 7/17/06 changed t to uint8* + if(input_display > 4) input_display = 4; + for(controller = 0; controller < input_display; controller++, t += 56) + { + for(i = 0; i < 34;i++) + for(j = 0; j <9 ; j++) + t[i+j*256] = (t[i+j*256] & 15) | 0xC0; + for(i = 3; i < 6; i++) + for(j = 3; j< 6; j++) + t[i+j*256] = 3; + c = cur_input_display >> (controller * 8); + c &= 255; + //A + color = c&1?4:3; + for(i=0; i < 4; i++) { - for(i = 0; i < 34;i++) - for(j = 0; j <9 ; j++) - t[i+j*256] = (t[i+j*256] & 15) | 0xC0; - for(i = 3; i < 6; i++) - for(j = 3; j< 6; j++) - t[i+j*256] = 3; - c = cur_input_display >> (controller * 8); - c &= 255; - //A - color = c&1?4:3; - for(i=0; i < 4; i++) + for(j = 0; j < 4; j++) { - for(j = 0; j < 4; j++) - { - if(i%3==0 && j %3 == 0) - continue; - t[30+4*256+i+j*256] = color; - } + if(i%3==0 && j %3 == 0) + continue; + t[30+4*256+i+j*256] = color; } - //B - color = c&2?4:3; - for(i=0; i < 4; i++) + } + //B + color = c&2?4:3; + for(i=0; i < 4; i++) + { + for(j = 0; j < 4; j++) { - for(j = 0; j < 4; j++) - { - if(i%3==0 && j %3 == 0) - continue; - t[24+4*256+i+j*256] = color; - } + if(i%3==0 && j %3 == 0) + continue; + t[24+4*256+i+j*256] = color; } - //Select - color = c&4?4:3; - for(i = 0; i < 4; i++) + } + //Select + color = c&4?4:3; + for(i = 0; i < 4; i++) + { + t[11+5*256+i] = color; + t[11+6*256+i] = color; + } + //Start + color = c&8?4:3; + for(i = 0; i < 4; i++) + { + t[17+5*256+i] = color; + t[17+6*256+i] = color; + } + //Up + color = c&16?4:3; + for(i = 0; i < 3; i++) + { + for(j = 0; j < 3; j++) { - t[11+5*256+i] = color; - t[11+6*256+i] = color; + t[3+i+256*j] = color; } - //Start - color = c&8?4:3; - for(i = 0; i < 4; i++) + } + //Down + color = c&32?4:3; + for(i = 0; i < 3; i++) + { + for(j = 0; j < 3; j++) { - t[17+5*256+i] = color; - t[17+6*256+i] = color; + t[3+i+256*j+6*256] = color; } - //Up - color = c&16?4:3; - for(i = 0; i < 3; i++) + } + //Left + color = c&64?4:3; + for(i = 0; i < 3; i++) + { + for(j = 0; j < 3; j++) { - for(j = 0; j < 3; j++) - { - t[3+i+256*j] = color; - } + t[3*256+i+256*j] = color; } - //Down - color = c&32?4:3; - for(i = 0; i < 3; i++) + } + //Right + color = c&128?4:3; + for(i = 0; i < 3; i++) + { + for(j = 0; j < 3; j++) { - for(j = 0; j < 3; j++) - { - t[3+i+256*j+6*256] = color; - } - } - //Left - color = c&64?4:3; - for(i = 0; i < 3; i++) - { - for(j = 0; j < 3; j++) - { - t[3*256+i+256*j] = color; - } - } - //Right - color = c&128?4:3; - for(i = 0; i < 3; i++) - { - for(j = 0; j < 3; j++) - { - t[6+3*256+i+256*j] = color; - } + t[6+3*256+i+256*j] = color; } } } + } +} + +void FCEU_DispMessageOnMovie(char *format, ...) +{ + va_list ap; + + va_start(ap,format); + vsprintf(guiMessage.errmsg,format,ap); + va_end(ap); + + guiMessage.howlong = 180; + guiMessage.isMovieMessage = true; } void FCEU_DispMessage(char *format, ...) { - va_list ap; + va_list ap; - va_start(ap,format); - vsprintf(errmsg,format,ap); - va_end(ap); + va_start(ap,format); + vsprintf(guiMessage.errmsg,format,ap); + va_end(ap); - howlong=180; - - //mbg movie 5/23/08 - //extern int movcounter; - //movcounter=0; + guiMessage.howlong = 180; + guiMessage.isMovieMessage = false; } -void FCEU_ResetMessages(void) +void FCEU_ResetMessages() { - howlong=0; + guiMessage.howlong = 0; + guiMessage.isMovieMessage = false; } diff --git a/src/video.h b/src/video.h index c7285218..1adb6bab 100644 --- a/src/video.h +++ b/src/video.h @@ -3,5 +3,19 @@ void FCEU_KillVirtualVideo(void); int SaveSnapshot(void); extern uint8 *XBuf; extern uint8 *XBackBuf; -extern int howlong; + +extern struct GUIMESSAGE +{ + //countdown for gui messages + int howlong; + + //the current gui message + char errmsg[65]; + + //indicates that the movie should be drawn even on top of movies + bool isMovieMessage; + +} guiMessage; + + void FCEU_DrawNumberRow(uint8 *XBuf, int *nstatus, int cur);