X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui.cpp;h=b1ffb370a3bc7eaee05c4ae27598c0d6e708c704;hb=da2d8843238769dbc93dd978f48c2c3843fce52d;hp=17e522c9b7074ee6ed8ef272450c393f5ec42850;hpb=99461abfcbc562e740a5e0900167ece9a4a5a035;p=virtualjaguar diff --git a/src/gui.cpp b/src/gui.cpp index 17e522c..b1ffb37 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -5,10 +5,19 @@ // by James L. Hammons // +#include +#include +#include #include "types.h" #include "tom.h" +#include "font1.h" #include "gui.h" +// Private function prototypes + +uint32 CountROMFiles(char * path); + + void InitGUI(void) { } @@ -17,7 +26,251 @@ void GUIDone(void) { } -void DrawText(uint16 * screen, uint32 x, uint32 y, const char * string) +// +// Render the backbuffer to the primary screen surface +// +void BlitBackbuffer(void) +{ + extern SDL_Surface * surface, * mainSurface; + extern int16 * backbuffer; + + if (SDL_MUSTLOCK(surface)) + while (SDL_LockSurface(surface) < 0) + SDL_Delay(10); + + memcpy(surface->pixels, backbuffer, tom_getVideoModeWidth() * tom_getVideoModeHeight() * 2); + + if (SDL_MUSTLOCK(surface)) + SDL_UnlockSurface(surface); + + SDL_Rect srcrect, dstrect; + srcrect.x = srcrect.y = 0, srcrect.w = surface->w, srcrect.h = surface->h; + dstrect.x = dstrect.y = 0, dstrect.w = surface->w, dstrect.h = surface->h; + SDL_BlitSurface(surface, &srcrect, mainSurface, &dstrect); + SDL_Flip(mainSurface); +} + +// +// Draw text at the given x/y coordinates. Can invert text as well. +// +void DrawText(int16 * screen, uint32 x, uint32 y, bool invert, const char * text, ...) { - uint32 pitch = TOMGetSDLScreenPitch(); + char string[4096]; + va_list arg; + + va_start(arg, text); + vsprintf(string, text, arg); + va_end(arg); + + uint32 pitch = TOMGetSDLScreenPitch() / 2; // Returns pitch in bytes but we need words... + uint32 length = strlen(string), address = x + (y * pitch); + + for(uint32 i=0; id_name, '.'); + if (ext != NULL) + { + if (stricmp(ext, ".zip") == 0 || stricmp(ext, ".jag") == 0) + { + // Do a QnD insertion sort... + // (Yeah, it's n^2/2 time, but there aren't that many items...) + uint32 pos = 0; + + for(int k=0; kd_name) < 0) + pos++; + else + break; + } + + uint32 blockSize = (i - pos) * FILENAME_MAX; + + if (blockSize) +//This only works on Win32 for some reason... +// memcpy(&names[(pos + 1) * FILENAME_MAX], &names[pos * FILENAME_MAX], blockSize); + for(int k=blockSize-1; k>=0; k--) + names[((pos + 1) * FILENAME_MAX) + k] = names[(pos * FILENAME_MAX) + k]; + + strcpy(&names[pos * FILENAME_MAX], de->d_name); + i++; + } + } + } + + closedir(dp); + + // Main GUI selection loop + + uint32 cursor = 0, startFile = 0; + + if (numFiles > 1) // Only go GUI if more than one possibility! + { + bool done = false; + uint32 limit = (numFiles > 24 ? 24 : numFiles); + SDL_Event event; + + while (!done) + { + while (SDL_PollEvent(&event)) + { + // Draw the GUI... + memset(backbuffer, 0x11, tom_getVideoModeWidth() * tom_getVideoModeHeight() * 2); + + for(uint32 i=0; i= SDLK_a && key <= SDLK_z) + { + // Advance cursor to filename with first letter pressed... + uint8 which = (key - SDLK_a) + 65; // Convert key to A-Z char + for(uint32 i=0; i startFile + limit - 1) + startFile = i - limit + 1, + cursor = limit - 1; + if (i < startFile) + startFile = i, + cursor = 0; + break; + } + } + } + } + } + } + } + + strcpy(filename, path); + // Potential GPF here: If length of dir is zero, then this will cause a page fault! + if (path[strlen(path) - 1] != '/') + strcat(filename, "/"); + strcat(filename, &names[(cursor + startFile) * FILENAME_MAX]); + free(names); + + return true; +} + +// +// Count # of possible ROM files in the current directory +// +uint32 CountROMFiles(char * path) +{ + uint32 numFiles = 0; + DIR * dp = opendir(path); + + if (dp == NULL) + { + WriteLog("VJ: Could not open directory \"%s\"!\nAborting!\n", path); + return 0; + } + else + { + dirent * de; + + while ((de = readdir(dp)) != NULL) + { + char * ext = strrchr(de->d_name, '.'); + if (ext != NULL) + if (stricmp(ext, ".zip") == 0 || stricmp(ext, ".jag") == 0) + numFiles++; + } + + closedir(dp); + } + + return numFiles; }