diff options
author | Toad King | 2012-06-14 03:21:06 -0400 |
---|---|---|
committer | Toad King | 2012-06-14 03:21:06 -0400 |
commit | 6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119 (patch) | |
tree | 885cf7f507139b795ba7b2a6fb829dc044da39dd /src/theme.c | |
download | snes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.tar.gz snes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.tar.bz2 snes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.zip |
initial pocketsnes commit
Diffstat (limited to 'src/theme.c')
-rw-r--r-- | src/theme.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/theme.c b/src/theme.c new file mode 100644 index 0000000..9b4a0ba --- /dev/null +++ b/src/theme.c @@ -0,0 +1,165 @@ +/* + Simple theming handling library + Under GPL v2 License + 2011 by bitrider +*/ + +#include "string.h" +#include "stdio.h" + +#include "minIni.h" +#include "graphics.h" +#include "config.h" +#include "png.h" + +gBITMAP *tBmpBackground = NULL; +gBITMAP *tBmpBar = NULL; +gBITMAP *tBmpLoading = NULL; +gBITMAP *tBmpInGame = NULL; + +unsigned short tTextColorTitle = RGB16(255, 0, 0); +unsigned short tTextColorFocus = RGB16(0, 0, 0); +unsigned short tTextColorItem = RGB16(255, 255, 255); +unsigned short tTextColorVersion = RGB16(0, 0, 255); +unsigned short tTextColorInfo = RGB16(255, 127, 40); +unsigned short tTextColorLoading = RGB16(255, 255,255); +unsigned short tBackgroundColor = RGB16(0,0,0); + +static gBITMAP *_loadBitmapFromIni(char *ini_file, char *ini_entry, char *dir) { + char f[1024]; + char def[] = "none"; + int len; + gBITMAP *bmp; + + strcpy(f, dir); + len = strlen(f); + ini_gets("bitmaps", ini_entry, def, f + len, sizeof(f) - len, ini_file); + if (strcmp(f + len, def) == 0) { + printf("- No \"%s\" image specified\n", ini_entry); + return NULL; + } + printf("- Loading bitmap: %s", f); + bmp = load_png(f, NULL); + if (!bmp) { + printf(" - ERROR loading file !!\n", f); + return NULL; + } + printf(" - OK\n"); + + return bmp; +} + +static int _loadColorFromIni(char *ini_file, char *ini_entry) { + char f[1024]; + char def[] = "none"; + int r = -1; + int g = -1; + int b = -1; + + ini_gets("colors", ini_entry, def, f, sizeof(f), ini_file); + if (strcmp(f, def) == 0) { + printf("- No \"%s\" color specified\n", ini_entry); + return -1; + } + printf("- Parsing color : %s", ini_entry); + sscanf(f, "RGB(%d, %d, %d)", &r, &g, &b); + if ((r < 0) || (r > 255) || + (g < 0) || (g > 255) || + (b < 0) || (b > 255)) { + printf(" - ERROR parsing color !!\n", f); + return -1; + } + printf(" - OK: RGB(%d,%d,%d)\n", r, g, b); + + return RGB16(r, g, b); +} + +int loadTheme(char *name) { + char themes_dir[] = "themes"; + char ini[1024]; + char dir[1024]; + gBITMAP *bgnd, *bar, *loading, *ingame; + int cTitle, cFocus, cItem, cVersion, cInfo, cLoading, cBackground; + + sprintf(ini, "%s/%s.ini", themes_dir, name); + printf("Loading theme file from: %s\n", ini); + + // Load colors + cTitle = _loadColorFromIni(ini, "text_title"); + cFocus = _loadColorFromIni(ini, "text_focus"); + cItem = _loadColorFromIni(ini, "text_item"); + cVersion = _loadColorFromIni(ini, "text_version"); + cInfo = _loadColorFromIni(ini, "text_info"); + cLoading = _loadColorFromIni(ini, "text_loading"); + cBackground = _loadColorFromIni(ini, "background"); + + // Load bitmaps + sprintf(dir, "%s/%s/", themes_dir, name); // build bitmaps directory + + bgnd = _loadBitmapFromIni(ini, "background", dir); + if (!bgnd) return -1; + + bar = _loadBitmapFromIni(ini, "bar", dir); + if (!bar) { + gDestroyBitmap(bgnd); + return -1; + } + + // Not required: can be null + loading = _loadBitmapFromIni(ini, "loading", dir); + ingame = _loadBitmapFromIni(ini, "ingame", dir); + + // Everything went OK, so replace current theme values with just loaded ones + gDestroyBitmap(tBmpBackground); + tBmpBackground = bgnd; + gDestroyBitmap(tBmpBar); + tBmpBar = bar; + gDestroyBitmap(tBmpInGame); + tBmpInGame = ingame; + gDestroyBitmap(tBmpLoading); + tBmpLoading = loading; + + if (cTitle >= 0) tTextColorTitle = cTitle; + if (cFocus >= 0) tTextColorFocus = cFocus; + if (cItem >= 0) tTextColorItem = cItem; + if (cVersion >= 0) tTextColorVersion = cVersion; + if (cInfo >= 0) tTextColorInfo = cInfo; + if (cLoading >= 0) tTextColorLoading = cLoading; + if (cBackground >= 0) tBackgroundColor = cBackground; + + return 0; +} + +int initTheme() { + char theme[256]; + getConfigValue(CONFIG_THEME, theme, sizeof(theme)); + return loadTheme(theme); +} + +void destroyTheme() { + + // Destroy bitmaps + gDestroyBitmap(tBmpBackground); + tBmpBackground = NULL; + gDestroyBitmap(tBmpBar); + tBmpBar = NULL; + gDestroyBitmap(tBmpLoading); + tBmpLoading = NULL; + gDestroyBitmap(tBmpInGame); + tBmpInGame = NULL; + + // Restore text colors + tTextColorTitle = RGB16(255, 0, 0); + tTextColorFocus = RGB16(0, 0, 0); + tTextColorItem = RGB16(255, 255, 255); + tTextColorVersion = RGB16(0, 0, 255); + tTextColorInfo = RGB16(255, 127, 40); + tTextColorLoading = RGB16(255, 255,255); + tBackgroundColor = RGB16(0,0,0); +} + +int isThemeActive() { + if (tBmpBackground != NULL) return 1; + else return 0; +} + |