335 lines
7.3 KiB
C
Executable File
335 lines
7.3 KiB
C
Executable File
/***************************************************************************
|
|
cfg.c - description
|
|
-------------------
|
|
begin : Sun Oct 28 2001
|
|
copyright : (C) 2001 by Pete Bernert
|
|
email : BlackDove@addcom.de
|
|
***************************************************************************/
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. See also the license.txt file for *
|
|
* additional informations. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#define _IN_CFG
|
|
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#if defined(__linux__)
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#endif
|
|
|
|
#undef FALSE
|
|
#undef TRUE
|
|
#define MAKELONG(low,high) ((unsigned long)(((unsigned short)(low)) | (((unsigned long)((unsigned short)(high))) << 16)))
|
|
|
|
#include "externals.h"
|
|
#include "cfg.h"
|
|
#include "gpu.h"
|
|
|
|
char * pConfigFile = NULL;
|
|
|
|
// CONFIG FILE helpers....
|
|
// some helper macros:
|
|
|
|
#define GetValue(name, var) \
|
|
p = strstr(pB, name); \
|
|
if (p != NULL) { \
|
|
p+=strlen(name); \
|
|
while ((*p == ' ') || (*p == '=')) p++; \
|
|
if (*p != '\n') var = atoi(p); \
|
|
}
|
|
|
|
#define GetFloatValue(name, var) \
|
|
p = strstr(pB, name); \
|
|
if (p != NULL) { \
|
|
p+=strlen(name); \
|
|
while ((*p == ' ') || (*p == '=')) p++; \
|
|
if (*p != '\n') var = (float)atof(p); \
|
|
}
|
|
|
|
#define SetValue(name, var) \
|
|
p = strstr(pB, name); \
|
|
if (p != NULL) { \
|
|
p+=strlen(name); \
|
|
while ((*p == ' ') || (*p == '=')) p++; \
|
|
if (*p != '\n') { \
|
|
len = sprintf(t1, "%d", var); \
|
|
strncpy(p, t1, len); \
|
|
if (p[len] != ' ' && p[len] != '\n' && p[len] != 0) p[len] = ' '; \
|
|
} \
|
|
} \
|
|
else { \
|
|
size+=sprintf(pB+size, "%s = %d\n", name, var); \
|
|
}
|
|
|
|
#define SetFloatValue(name, var) \
|
|
p = strstr(pB, name); \
|
|
if (p != NULL) { \
|
|
p+=strlen(name); \
|
|
while ((*p == ' ') || (*p == '=')) p++; \
|
|
if (*p != '\n') { \
|
|
len = sprintf(t1, "%.1f", (double)var); \
|
|
strncpy(p, t1, len); \
|
|
if (p[len] != ' ' && p[len] != '\n' && p[len] != 0) p[len] = ' '; \
|
|
} \
|
|
} \
|
|
else { \
|
|
size+=sprintf(pB+size, "%s = %.1f\n", name, (double)var); \
|
|
}
|
|
|
|
void ReadConfigFile()
|
|
{
|
|
struct stat buf;
|
|
FILE *in;char t[256];int len, size;
|
|
char * pB, * p;
|
|
|
|
if(pConfigFile)
|
|
strcpy(t,pConfigFile);
|
|
else
|
|
{
|
|
strcpy(t,"dfxvideo.cfg");
|
|
in = fopen(t,"rb");
|
|
if (!in)
|
|
{
|
|
strcpy(t,"cfg/dfxvideo.cfg");
|
|
in = fopen(t,"rb");
|
|
if(!in) sprintf(t,"%s/.pcsxr/plugins/dfxvideo.cfg",getenv("HOME"));
|
|
else fclose(in);
|
|
}
|
|
else fclose(in);
|
|
}
|
|
|
|
if (stat(t, &buf) == -1) return;
|
|
size = buf.st_size;
|
|
|
|
in = fopen(t,"rb");
|
|
if (!in) return;
|
|
|
|
pB=(char *)malloc(size + 1);
|
|
memset(pB,0,size + 1);
|
|
|
|
len = fread(pB, 1, size, in);
|
|
fclose(in);
|
|
|
|
GetValue("ResX", iResX);
|
|
if(iResX<20) iResX=20;
|
|
iResX=(iResX/4)*4;
|
|
|
|
GetValue("ResY", iResY);
|
|
if(iResY<20) iResY=20;
|
|
iResY=(iResY/4)*4;
|
|
|
|
iWinSize=MAKELONG(iResX,iResY);
|
|
|
|
GetValue("NoStretch", iUseNoStretchBlt);
|
|
|
|
GetValue("Dithering", iUseDither);
|
|
|
|
GetValue("FullScreen", iWindowMode);
|
|
if(iWindowMode!=0) iWindowMode=0;
|
|
else iWindowMode=1;
|
|
|
|
GetValue("ShowFPS", iShowFPS);
|
|
if(iShowFPS<0) iShowFPS=0;
|
|
if(iShowFPS>1) iShowFPS=1;
|
|
|
|
GetValue("Maintain43", iMaintainAspect);
|
|
if(iMaintainAspect<0) iMaintainAspect=0;
|
|
if(iMaintainAspect>1) iMaintainAspect=1;
|
|
|
|
GetValue("UseFrameLimit", UseFrameLimit);
|
|
if(UseFrameLimit<0) UseFrameLimit=0;
|
|
if(UseFrameLimit>1) UseFrameLimit=1;
|
|
|
|
GetValue("UseFrameSkip", UseFrameSkip);
|
|
if(UseFrameSkip<0) UseFrameSkip=0;
|
|
if(UseFrameSkip>1) UseFrameSkip=1;
|
|
|
|
GetValue("FPSDetection", iFrameLimit);
|
|
if(iFrameLimit<1) iFrameLimit=1;
|
|
if(iFrameLimit>2) iFrameLimit=2;
|
|
|
|
GetFloatValue("FrameRate", fFrameRate);
|
|
fFrameRate/=10;
|
|
if(fFrameRate<10.0f) fFrameRate=10.0f;
|
|
if(fFrameRate>1000.0f) fFrameRate=1000.0f;
|
|
|
|
GetValue("CfgFixes", dwCfgFixes);
|
|
|
|
GetValue("UseFixes", iUseFixes);
|
|
if(iUseFixes<0) iUseFixes=0;
|
|
if(iUseFixes>1) iUseFixes=1;
|
|
|
|
free(pB);
|
|
}
|
|
|
|
void ExecCfg(char *arg) {
|
|
char cfg[256];
|
|
struct stat buf;
|
|
|
|
strcpy(cfg, "./cfgDFXVideo");
|
|
if (stat(cfg, &buf) != -1) {
|
|
int pid = fork();
|
|
if (pid == 0) {
|
|
if (fork() == 0) {
|
|
execl(cfg, "cfgDFXVideo", arg, NULL);
|
|
}
|
|
exit(0);
|
|
} else if (pid > 0) {
|
|
waitpid(pid, NULL, 0);
|
|
}
|
|
return;
|
|
}
|
|
|
|
strcpy(cfg, "./cfg/cfgDFXVideo");
|
|
if (stat(cfg, &buf) != -1) {
|
|
int pid = fork();
|
|
if (pid == 0) {
|
|
if (fork() == 0) {
|
|
execl(cfg, "cfgDFXVideo", arg, NULL);
|
|
}
|
|
exit(0);
|
|
} else if (pid > 0) {
|
|
waitpid(pid, NULL, 0);
|
|
}
|
|
return;
|
|
}
|
|
|
|
sprintf(cfg, "%s/.pcsxr/plugins/cfg/cfgDFXVideo", getenv("HOME"));
|
|
if (stat(cfg, &buf) != -1) {
|
|
int pid = fork();
|
|
if (pid == 0) {
|
|
if (fork() == 0) {
|
|
execl(cfg, "cfgDFXVideo", arg, NULL);
|
|
}
|
|
exit(0);
|
|
} else if (pid > 0) {
|
|
waitpid(pid, NULL, 0);
|
|
}
|
|
return;
|
|
}
|
|
|
|
printf("ERROR: cfgDFXVideo file not found!\n");
|
|
}
|
|
|
|
void SoftDlgProc(void)
|
|
{
|
|
ExecCfg("configure");
|
|
}
|
|
|
|
void AboutDlgProc(void)
|
|
{
|
|
ExecCfg("about");
|
|
}
|
|
|
|
void ReadConfig(void)
|
|
{
|
|
// defaults
|
|
iResX=640;iResY=480;
|
|
iWinSize=MAKELONG(iResX,iResY);
|
|
iColDepth=32;
|
|
iWindowMode=1;
|
|
iMaintainAspect=0;
|
|
UseFrameLimit=1;
|
|
UseFrameSkip=0;
|
|
iFrameLimit=2;
|
|
fFrameRate=200.0f;
|
|
dwCfgFixes=0;
|
|
iUseFixes=0;
|
|
iUseNoStretchBlt=0;
|
|
iUseDither=0;
|
|
iShowFPS=0;
|
|
|
|
// read sets
|
|
ReadConfigFile();
|
|
|
|
// additional checks
|
|
if(!iColDepth) iColDepth=32;
|
|
if(iUseFixes) dwActFixes=dwCfgFixes;
|
|
SetFixes();
|
|
}
|
|
|
|
void WriteConfig(void) {
|
|
|
|
struct stat buf;
|
|
FILE *out;char t[256];int len, size;
|
|
char * pB, * p; char t1[8];
|
|
|
|
if(pConfigFile)
|
|
strcpy(t,pConfigFile);
|
|
else
|
|
{
|
|
strcpy(t,"dfxvideo.cfg");
|
|
out = fopen(t,"rb");
|
|
if (!out)
|
|
{
|
|
strcpy(t,"cfg/dfxvideo.cfg");
|
|
out = fopen(t,"rb");
|
|
if(!out) sprintf(t,"%s/.pcsxr/plugins/dfxvideo.cfg",getenv("HOME"));
|
|
else fclose(out);
|
|
}
|
|
else fclose(out);
|
|
}
|
|
|
|
if (stat(t, &buf) != -1) size = buf.st_size;
|
|
else size = 0;
|
|
|
|
out = fopen(t,"rb");
|
|
if (!out) {
|
|
// defaults
|
|
iResX=640;iResY=480;
|
|
iColDepth=32;
|
|
iWindowMode=1;
|
|
iMaintainAspect=0;
|
|
UseFrameLimit=0;
|
|
UseFrameSkip=0;
|
|
iFrameLimit=2;
|
|
fFrameRate=200.0f;
|
|
dwCfgFixes=0;
|
|
iUseFixes=0;
|
|
iUseNoStretchBlt=0;
|
|
iUseDither=0;
|
|
iShowFPS=0;
|
|
|
|
size = 0;
|
|
pB=(char *)malloc(4096);
|
|
memset(pB,0,4096);
|
|
}
|
|
else {
|
|
pB=(char *)malloc(size+4096);
|
|
memset(pB,0,size+4096);
|
|
|
|
len = fread(pB, 1, size, out);
|
|
fclose(out);
|
|
}
|
|
|
|
SetValue("ResX", iResX);
|
|
SetValue("ResY", iResY);
|
|
SetValue("NoStretch", iUseNoStretchBlt);
|
|
SetValue("Dithering", iUseDither);
|
|
SetValue("FullScreen", !iWindowMode);
|
|
SetValue("ShowFPS", iShowFPS);
|
|
SetValue("Maintain43", iMaintainAspect);
|
|
SetValue("UseFrameLimit", UseFrameLimit);
|
|
SetValue("UseFrameSkip", UseFrameSkip);
|
|
SetValue("FPSDetection", iFrameLimit);
|
|
SetFloatValue("FrameRate", fFrameRate);
|
|
SetValue("CfgFixes", (unsigned int)dwCfgFixes);
|
|
SetValue("UseFixes", iUseFixes);
|
|
|
|
out = fopen(t,"wb");
|
|
if (!out) return;
|
|
|
|
len = fwrite(pB, 1, size, out);
|
|
fclose(out);
|
|
|
|
free(pB);
|
|
}
|