void GBAConfigInit(struct GBAConfig* config, const char* port) { ConfigurationInit(&config->configTable); ConfigurationInit(&config->defaultsTable); if (port) { config->port = malloc(strlen("ports.") + strlen(port) + 1); snprintf(config->port, strlen("ports.") + strlen(port) + 1, "ports.%s", port); } else { config->port = 0; } }
void SettingsSetActiveById(uint8_t Setting) { if (Setting < SETTINGS_COUNT) { GlobalSettings.ActiveSetting = Setting; GlobalSettings.ActiveSettingPtr = &GlobalSettings.Settings[GlobalSettings.ActiveSetting]; /* Settings have changed. Progress changes through system */ ConfigurationInit(); } }
bool mGLES2ShaderLoad(struct VideoShader* shader, struct VDir* dir) { struct VFile* manifest = dir->openFile(dir, "manifest.ini", O_RDONLY); if (!manifest) { return false; } bool success = false; struct Configuration description; ConfigurationInit(&description); if (ConfigurationReadVFile(&description, manifest)) { int inShaders; success = _lookupIntValue(&description, "shader", "passes", &inShaders); if (inShaders > MAX_PASSES || inShaders < 1) { success = false; } if (success) { struct mGLES2Shader* shaderBlock = malloc(sizeof(struct mGLES2Shader) * inShaders); int n; for (n = 0; n < inShaders; ++n) { char passName[12]; snprintf(passName, sizeof(passName), "pass.%u", n); const char* fs = ConfigurationGetValue(&description, passName, "fragmentShader"); const char* vs = ConfigurationGetValue(&description, passName, "vertexShader"); if (fs && (fs[0] == '.' || strstr(fs, PATH_SEP))) { success = false; break; } if (vs && (vs[0] == '.' || strstr(vs, PATH_SEP))) { success = false; break; } char* fssrc = 0; char* vssrc = 0; if (fs) { struct VFile* fsf = dir->openFile(dir, fs, O_RDONLY); if (!fsf) { success = false; break; } fssrc = malloc(fsf->size(fsf) + 1); fssrc[fsf->size(fsf)] = '\0'; fsf->read(fsf, fssrc, fsf->size(fsf)); fsf->close(fsf); } if (vs) { struct VFile* vsf = dir->openFile(dir, vs, O_RDONLY); if (!vsf) { success = false; free(fssrc); break; } vssrc = malloc(vsf->size(vsf) + 1); vssrc[vsf->size(vsf)] = '\0'; vsf->read(vsf, vssrc, vsf->size(vsf)); vsf->close(vsf); } int width = 0; int height = 0; int scaling = 0; _lookupIntValue(&description, passName, "width", &width); _lookupIntValue(&description, passName, "height", &height); _lookupIntValue(&description, passName, "integerScaling", &scaling); struct mGLES2UniformList uniformVector; mGLES2UniformListInit(&uniformVector, 0); ConfigurationEnumerateSections(&description, _uniformHandler, &uniformVector); size_t u; for (u = 0; u < mGLES2UniformListSize(&uniformVector); ++u) { struct mGLES2Uniform* uniform = mGLES2UniformListGetPointer(&uniformVector, u); if (!_loadUniform(&description, n, uniform)) { mGLES2UniformListShift(&uniformVector, u, 1); --u; } } u = mGLES2UniformListSize(&uniformVector); struct mGLES2Uniform* uniformBlock = malloc(sizeof(*uniformBlock) * u); memcpy(uniformBlock, mGLES2UniformListGetPointer(&uniformVector, 0), sizeof(*uniformBlock) * u); mGLES2UniformListDeinit(&uniformVector); mGLES2ShaderInit(&shaderBlock[n], vssrc, fssrc, width, height, scaling, uniformBlock, u); int b = 0; _lookupIntValue(&description, passName, "blend", &b); if (b) { shaderBlock[n].blend = b; } b = 0; _lookupIntValue(&description, passName, "filter", &b); if (b) { shaderBlock[n].filter = b; } free(fssrc); free(vssrc); } if (success) { shader->nPasses = inShaders; shader->passes = shaderBlock; shader->name = ConfigurationGetValue(&description, "shader", "name"); if (shader->name) { shader->name = strdup(shader->name); } shader->author = ConfigurationGetValue(&description, "shader", "author"); if (shader->author) { shader->author = strdup(shader->author); } shader->description = ConfigurationGetValue(&description, "shader", "description"); if (shader->description) { shader->description = strdup(shader->description); } } else { inShaders = n; for (n = 0; n < inShaders; ++n) { mGLES2ShaderDeinit(&shaderBlock[n]); } } } } manifest->close(manifest); ConfigurationDeinit(&description); return success; }