mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-19 12:35:52 -04:00
reorganise Platform.c a bit and remove some unused bits from freetype
This commit is contained in:
parent
31e84040e3
commit
34fca6746f
375
src/Platform.c
375
src/Platform.c
@ -1292,9 +1292,7 @@ static void Font_Init(void) {
|
|||||||
|
|
||||||
err = FT_New_Library(&ft_mem, &ft_lib);
|
err = FT_New_Library(&ft_mem, &ft_lib);
|
||||||
if (err) Logger_Abort2(err, "Failed to init freetype");
|
if (err) Logger_Abort2(err, "Failed to init freetype");
|
||||||
|
|
||||||
FT_Add_Default_Modules(ft_lib);
|
FT_Add_Default_Modules(ft_lib);
|
||||||
FT_Set_Default_Properties(ft_lib);
|
|
||||||
|
|
||||||
if (!File_Exists(&cachePath)) {
|
if (!File_Exists(&cachePath)) {
|
||||||
Window_ShowDialog("One time load", "Initialising font cache, this can take several seconds.");
|
Window_ShowDialog("One time load", "Initialising font cache, this can take several seconds.");
|
||||||
@ -1778,6 +1776,200 @@ ReturnCode Audio_StopAndFree(AudioHandle handle) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*-----------------------------------------------------Process/Module------------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
#ifdef CC_BUILD_WIN
|
||||||
|
ReturnCode Platform_GetExePath(String* path) {
|
||||||
|
TCHAR chars[FILENAME_SIZE + 1];
|
||||||
|
DWORD len = GetModuleFileName(NULL, chars, FILENAME_SIZE);
|
||||||
|
if (!len) return GetLastError();
|
||||||
|
|
||||||
|
#ifdef UNICODE
|
||||||
|
Convert_DecodeUtf16(path, chars, len * 2);
|
||||||
|
#else
|
||||||
|
Convert_DecodeAscii(path, chars, len);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_StartProcess(const String* path, const String* args) {
|
||||||
|
String file, argv; char argvBuffer[300];
|
||||||
|
TCHAR str[300], raw[300];
|
||||||
|
STARTUPINFO si = { 0 };
|
||||||
|
PROCESS_INFORMATION pi = { 0 };
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
file = *path; Utils_UNSAFE_GetFilename(&file);
|
||||||
|
String_InitArray(argv, argvBuffer);
|
||||||
|
String_Format2(&argv, "\"%s\" %s", &file, args);
|
||||||
|
Platform_ConvertString(str, path);
|
||||||
|
Platform_ConvertString(raw, &argv);
|
||||||
|
|
||||||
|
si.cb = sizeof(STARTUPINFO);
|
||||||
|
ok = CreateProcess(str, raw, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
|
||||||
|
if (!ok) return GetLastError();
|
||||||
|
|
||||||
|
/* Don't leak memory for proess return code */
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_StartOpen(const String* args) {
|
||||||
|
TCHAR str[300];
|
||||||
|
HINSTANCE instance;
|
||||||
|
Platform_ConvertString(str, args);
|
||||||
|
instance = ShellExecute(NULL, NULL, str, NULL, NULL, SW_SHOWNORMAL);
|
||||||
|
return instance > 32 ? 0 : (ReturnCode)instance;
|
||||||
|
}
|
||||||
|
/* Don't need special execute permission on windows */
|
||||||
|
ReturnCode Platform_MarkExecutable(const String* path) { return 0; }
|
||||||
|
|
||||||
|
ReturnCode Platform_LoadLibrary(const String* path, void** lib) {
|
||||||
|
TCHAR str[300];
|
||||||
|
Platform_ConvertString(str, path);
|
||||||
|
*lib = LoadLibrary(str);
|
||||||
|
return *lib ? 0 : GetLastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol) {
|
||||||
|
*symbol = GetProcAddress(lib, name);
|
||||||
|
return *symbol ? 0 : GetLastError();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CC_BUILD_POSIX
|
||||||
|
ReturnCode Platform_StartProcess(const String* path, const String* args) {
|
||||||
|
char str[600], raw[600];
|
||||||
|
pid_t pid;
|
||||||
|
int i, j;
|
||||||
|
Platform_ConvertString(str, path);
|
||||||
|
Platform_ConvertString(raw, args);
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if (pid == -1) return errno;
|
||||||
|
|
||||||
|
if (pid == 0) {
|
||||||
|
/* Executed in child process */
|
||||||
|
char* argv[15];
|
||||||
|
argv[0] = str; argv[1] = raw;
|
||||||
|
|
||||||
|
/* need to null-terminate multiple arguments */
|
||||||
|
for (i = 0, j = 2; raw[i] && i < Array_Elems(raw); i++) {
|
||||||
|
if (raw[i] != ' ') continue;
|
||||||
|
|
||||||
|
/* null terminate previous argument */
|
||||||
|
raw[i] = '\0';
|
||||||
|
argv[j++] = &raw[i + 1];
|
||||||
|
}
|
||||||
|
argv[j] = NULL;
|
||||||
|
|
||||||
|
execvp(str, argv);
|
||||||
|
_exit(127); /* "command not found" */
|
||||||
|
} else {
|
||||||
|
/* Executed in parent process */
|
||||||
|
/* We do nothing here.. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_MarkExecutable(const String* path) {
|
||||||
|
char str[600];
|
||||||
|
struct stat st;
|
||||||
|
Platform_ConvertString(str, path);
|
||||||
|
|
||||||
|
if (stat(str, &st) == -1) return errno;
|
||||||
|
st.st_mode |= S_IXUSR;
|
||||||
|
return chmod(str, st.st_mode) == -1 ? errno : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_LoadLibrary(const String* path, void** lib) {
|
||||||
|
char str[600];
|
||||||
|
Platform_ConvertString(str, path);
|
||||||
|
*lib = dlopen(str, RTLD_NOW);
|
||||||
|
return *lib == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol) {
|
||||||
|
*symbol = dlsym(lib, name);
|
||||||
|
return *symbol == NULL; /* dlerror would be proper, but eh */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined CC_BUILD_LINUX || defined CC_BUILD_BSD || defined CC_BUILD_SOLARIS
|
||||||
|
ReturnCode Platform_StartOpen(const String* args) {
|
||||||
|
/* TODO: Can this also be used on solaris, or is it just an OpenIndiana thing */
|
||||||
|
const static String path = String_FromConst("xdg-open");
|
||||||
|
return Platform_StartProcess(&path, args);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CC_BUILD_LINUX
|
||||||
|
ReturnCode Platform_GetExePath(String* path) {
|
||||||
|
char str[600];
|
||||||
|
int len = readlink("/proc/self/exe", str, 600);
|
||||||
|
if (len == -1) return errno;
|
||||||
|
|
||||||
|
Convert_DecodeUtf8(path, str, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CC_BUILD_BSD
|
||||||
|
ReturnCode Platform_GetExePath(String* path) {
|
||||||
|
char str[600];
|
||||||
|
int mib[4];
|
||||||
|
size_t size = 600;
|
||||||
|
|
||||||
|
mib[0] = CTL_KERN;
|
||||||
|
mib[1] = KERN_PROC;
|
||||||
|
mib[2] = KERN_PROC_PATHNAME;
|
||||||
|
mib[3] = -1; /* self process id */
|
||||||
|
|
||||||
|
if (sysctl(mib, 4, str, &size, NULL, 0) == -1) return errno;
|
||||||
|
|
||||||
|
size = String_CalcLen(str, 600);
|
||||||
|
Convert_DecodeUtf8(path, str, size);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CC_BUILD_SOLARIS
|
||||||
|
ReturnCode Platform_GetExePath(String* path) {
|
||||||
|
char str[600];
|
||||||
|
int len = readlink("/proc/self/path/a.out", str, 600);
|
||||||
|
if (len == -1) return errno;
|
||||||
|
|
||||||
|
Convert_DecodeUtf8(path, str, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CC_BUILD_OSX
|
||||||
|
ReturnCode Platform_StartOpen(const String* args) {
|
||||||
|
const static String path = String_FromConst("/usr/bin/open");
|
||||||
|
return Platform_StartProcess(&path, args);
|
||||||
|
}
|
||||||
|
ReturnCode Platform_GetExePath(String* path) {
|
||||||
|
char str[600];
|
||||||
|
int len = 600;
|
||||||
|
|
||||||
|
if (_NSGetExecutablePath(str, &len) != 0) return ReturnCode_InvalidArg;
|
||||||
|
Convert_DecodeUtf8(path, str, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void* Platform_GetSymbolFrom(const char* filename, const char* name) {
|
||||||
|
void* symbol;
|
||||||
|
void* lib;
|
||||||
|
String path;
|
||||||
|
ReturnCode res;
|
||||||
|
|
||||||
|
path = String_FromReadonly(filename);
|
||||||
|
res = Platform_LoadLibrary(&path, &lib);
|
||||||
|
if (res) return NULL;
|
||||||
|
|
||||||
|
res = Platform_GetSymbol(lib, name, &symbol);
|
||||||
|
return res ? NULL : symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*--------------------------------------------------------Platform---------------------------------------------------------*
|
*--------------------------------------------------------Platform---------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -1912,71 +2104,6 @@ ReturnCode Platform_Decrypt(const uint8_t* data, int len, uint8_t** dec, int* de
|
|||||||
LocalFree(dataOut.pbData);
|
LocalFree(dataOut.pbData);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode Platform_GetExePath(String* path) {
|
|
||||||
TCHAR chars[FILENAME_SIZE + 1];
|
|
||||||
DWORD len = GetModuleFileName(NULL, chars, FILENAME_SIZE);
|
|
||||||
if (!len) return GetLastError();
|
|
||||||
|
|
||||||
#ifdef UNICODE
|
|
||||||
Convert_DecodeUtf16(path, chars, len * 2);
|
|
||||||
#else
|
|
||||||
Convert_DecodeAscii(path, chars, len);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnCode Platform_StartProcess(const String* path, const String* args) {
|
|
||||||
String file, argv; char argvBuffer[300];
|
|
||||||
TCHAR str[300], raw[300];
|
|
||||||
STARTUPINFO si = { 0 };
|
|
||||||
PROCESS_INFORMATION pi = { 0 };
|
|
||||||
BOOL ok;
|
|
||||||
|
|
||||||
file = *path; Utils_UNSAFE_GetFilename(&file);
|
|
||||||
String_InitArray(argv, argvBuffer);
|
|
||||||
String_Format2(&argv, "\"%s\" %s", &file, args);
|
|
||||||
Platform_ConvertString(str, path);
|
|
||||||
Platform_ConvertString(raw, &argv);
|
|
||||||
|
|
||||||
si.cb = sizeof(STARTUPINFO);
|
|
||||||
ok = CreateProcess(str, raw, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
|
|
||||||
if (!ok) return GetLastError();
|
|
||||||
|
|
||||||
/* Don't leak memory for proess return code */
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnCode Platform_StartOpen(const String* args) {
|
|
||||||
TCHAR str[300];
|
|
||||||
HINSTANCE instance;
|
|
||||||
Platform_ConvertString(str, args);
|
|
||||||
instance = ShellExecute(NULL, NULL, str, NULL, NULL, SW_SHOWNORMAL);
|
|
||||||
return instance > 32 ? 0 : (ReturnCode)instance;
|
|
||||||
}
|
|
||||||
/* Don't need special execute permission on windows */
|
|
||||||
ReturnCode Platform_MarkExecutable(const String* path) { return 0; }
|
|
||||||
|
|
||||||
ReturnCode Platform_LoadLibrary(const String* path, void** lib) {
|
|
||||||
TCHAR str[300];
|
|
||||||
Platform_ConvertString(str, path);
|
|
||||||
*lib = LoadLibrary(str);
|
|
||||||
return *lib ? 0 : GetLastError();
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol) {
|
|
||||||
*symbol = GetProcAddress(lib, name);
|
|
||||||
return *symbol ? 0 : GetLastError();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ReturnCode Platform_Encrypt(const uint8_t* data, int len, uint8_t** enc, int* encLen) {
|
|
||||||
return ReturnCode_NotSupported;
|
|
||||||
}
|
|
||||||
ReturnCode Platform_Decrypt(const uint8_t* data, int len, uint8_t** dec, int* decLen) {
|
|
||||||
return ReturnCode_NotSupported;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CC_BUILD_POSIX
|
#ifdef CC_BUILD_POSIX
|
||||||
int Platform_ConvertString(void* data, const String* src) {
|
int Platform_ConvertString(void* data, const String* src) {
|
||||||
@ -2025,60 +2152,11 @@ int Platform_GetCommandLineArgs(int argc, STRING_REF const char** argv, String*
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode Platform_StartProcess(const String* path, const String* args) {
|
ReturnCode Platform_Encrypt(const uint8_t* data, int len, uint8_t** enc, int* encLen) {
|
||||||
char str[600], raw[600];
|
return ReturnCode_NotSupported;
|
||||||
pid_t pid;
|
|
||||||
int i, j;
|
|
||||||
Platform_ConvertString(str, path);
|
|
||||||
Platform_ConvertString(raw, args);
|
|
||||||
|
|
||||||
pid = fork();
|
|
||||||
if (pid == -1) return errno;
|
|
||||||
|
|
||||||
if (pid == 0) {
|
|
||||||
/* Executed in child process */
|
|
||||||
char* argv[15];
|
|
||||||
argv[0] = str; argv[1] = raw;
|
|
||||||
|
|
||||||
/* need to null-terminate multiple arguments */
|
|
||||||
for (i = 0, j = 2; raw[i] && i < Array_Elems(raw); i++) {
|
|
||||||
if (raw[i] != ' ') continue;
|
|
||||||
|
|
||||||
/* null terminate previous argument */
|
|
||||||
raw[i] = '\0';
|
|
||||||
argv[j++] = &raw[i + 1];
|
|
||||||
}
|
|
||||||
argv[j] = NULL;
|
|
||||||
|
|
||||||
execvp(str, argv);
|
|
||||||
_exit(127); /* "command not found" */
|
|
||||||
} else {
|
|
||||||
/* Executed in parent process */
|
|
||||||
/* We do nothing here.. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
ReturnCode Platform_Decrypt(const uint8_t* data, int len, uint8_t** dec, int* decLen) {
|
||||||
ReturnCode Platform_MarkExecutable(const String* path) {
|
return ReturnCode_NotSupported;
|
||||||
char str[600];
|
|
||||||
struct stat st;
|
|
||||||
Platform_ConvertString(str, path);
|
|
||||||
|
|
||||||
if (stat(str, &st) == -1) return errno;
|
|
||||||
st.st_mode |= S_IXUSR;
|
|
||||||
return chmod(str, st.st_mode) == -1 ? errno : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnCode Platform_LoadLibrary(const String* path, void** lib) {
|
|
||||||
char str[600];
|
|
||||||
Platform_ConvertString(str, path);
|
|
||||||
*lib = dlopen(str, RTLD_NOW);
|
|
||||||
return *lib == NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol) {
|
|
||||||
*symbol = dlsym(lib, name);
|
|
||||||
return *symbol == NULL; /* dlerror would be proper, but eh */
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CC_BUILD_X11
|
#ifdef CC_BUILD_X11
|
||||||
@ -2099,70 +2177,13 @@ static void Platform_InitDisplay(void) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined CC_BUILD_LINUX || defined CC_BUILD_BSD || defined CC_BUILD_SOLARIS
|
#if defined CC_BUILD_LINUX || defined CC_BUILD_BSD || defined CC_BUILD_SOLARIS
|
||||||
ReturnCode Platform_StartOpen(const String* args) {
|
|
||||||
/* TODO: Can this also be used on solaris, or is it just an OpenIndiana thing */
|
|
||||||
const static String path = String_FromConst("xdg-open");
|
|
||||||
return Platform_StartProcess(&path, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Platform_Init(void) {
|
void Platform_Init(void) {
|
||||||
Platform_InitCommon();
|
Platform_InitCommon();
|
||||||
/* stopwatch always in nanoseconds */
|
/* stopwatch always in nanoseconds */
|
||||||
sw_freqDiv = 1000;
|
sw_freqDiv = 1000;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CC_BUILD_LINUX
|
|
||||||
ReturnCode Platform_GetExePath(String* path) {
|
|
||||||
char str[600];
|
|
||||||
int len = readlink("/proc/self/exe", str, 600);
|
|
||||||
if (len == -1) return errno;
|
|
||||||
|
|
||||||
Convert_DecodeUtf8(path, str, len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CC_BUILD_BSD
|
|
||||||
ReturnCode Platform_GetExePath(String* path) {
|
|
||||||
char str[600];
|
|
||||||
int mib[4];
|
|
||||||
size_t size = 600;
|
|
||||||
|
|
||||||
mib[0] = CTL_KERN;
|
|
||||||
mib[1] = KERN_PROC;
|
|
||||||
mib[2] = KERN_PROC_PATHNAME;
|
|
||||||
mib[3] = -1; /* self process id */
|
|
||||||
|
|
||||||
if (sysctl(mib, 4, str, &size, NULL, 0) == -1) return errno;
|
|
||||||
|
|
||||||
size = String_CalcLen(str, 600);
|
|
||||||
Convert_DecodeUtf8(path, str, size);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CC_BUILD_SOLARIS
|
|
||||||
ReturnCode Platform_GetExePath(String* path) {
|
|
||||||
char str[600];
|
|
||||||
int len = readlink("/proc/self/path/a.out", str, 600);
|
|
||||||
if (len == -1) return errno;
|
|
||||||
|
|
||||||
Convert_DecodeUtf8(path, str, len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CC_BUILD_OSX
|
#ifdef CC_BUILD_OSX
|
||||||
ReturnCode Platform_StartOpen(const String* args) {
|
|
||||||
const static String path = String_FromConst("/usr/bin/open");
|
|
||||||
return Platform_StartProcess(&path, args);
|
|
||||||
}
|
|
||||||
ReturnCode Platform_GetExePath(String* path) {
|
|
||||||
char str[600];
|
|
||||||
int len = 600;
|
|
||||||
|
|
||||||
if (_NSGetExecutablePath(str, &len) != 0) return ReturnCode_InvalidArg;
|
|
||||||
Convert_DecodeUtf8(path, str, len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Platform_InitDisplay(void) {
|
static void Platform_InitDisplay(void) {
|
||||||
CGDirectDisplayID display = CGMainDisplayID();
|
CGDirectDisplayID display = CGMainDisplayID();
|
||||||
CGRect bounds = CGDisplayBounds(display);
|
CGRect bounds = CGDisplayBounds(display);
|
||||||
|
@ -78,11 +78,16 @@ ReturnCode Platform_StartProcess(const String* path, const String* args);
|
|||||||
ReturnCode Platform_StartOpen(const String* args);
|
ReturnCode Platform_StartOpen(const String* args);
|
||||||
/* Marks a file as being executable. */
|
/* Marks a file as being executable. */
|
||||||
ReturnCode Platform_MarkExecutable(const String* path);
|
ReturnCode Platform_MarkExecutable(const String* path);
|
||||||
|
|
||||||
/* Attempts to load a native dynamic library from the given path. */
|
/* Attempts to load a native dynamic library from the given path. */
|
||||||
CC_API ReturnCode Platform_LoadLibrary(const String* path, void** lib);
|
CC_API ReturnCode Platform_LoadLibrary(const String* path, void** lib);
|
||||||
/* Attempts to get the address of the symbol in the given dynamic library. */
|
/* Attempts to get the address of the symbol in the given dynamic library. */
|
||||||
/* NOTE: Do NOT use this to load OpenGL functions, use GLContext_GetAddress. */
|
/* NOTE: Do NOT use this to load OpenGL functions, use GLContext_GetAddress. */
|
||||||
CC_API ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol);
|
CC_API ReturnCode Platform_GetSymbol(void* lib, const char* name, void** symbol);
|
||||||
|
/* Simple wrapper for Platform_LoadLibrary then Platform_GetSymbol. */
|
||||||
|
/* NOTE: This should ONLY be used for dynamically loading platform-specific symbols. */
|
||||||
|
/* (e.g. functionality that only exists on recent operating system versions) */
|
||||||
|
void* Platform_GetSymbolFrom(const char* filename, const char* name);
|
||||||
|
|
||||||
/* Allocates a block of memory, with undetermined contents. Exits process on allocation failure. */
|
/* Allocates a block of memory, with undetermined contents. Exits process on allocation failure. */
|
||||||
CC_API void* Mem_Alloc(uint32_t numElems, uint32_t elemsSize, const char* place);
|
CC_API void* Mem_Alloc(uint32_t numElems, uint32_t elemsSize, const char* place);
|
||||||
|
@ -100,92 +100,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
|
|
||||||
|
|
||||||
#define MAX_LENGTH 128
|
|
||||||
|
|
||||||
/* documentation is in ftmodapi.h */
|
|
||||||
|
|
||||||
FT_EXPORT_DEF( void )
|
|
||||||
FT_Set_Default_Properties( FT_Library library )
|
|
||||||
{
|
|
||||||
const char* env;
|
|
||||||
const char* p;
|
|
||||||
const char* q;
|
|
||||||
|
|
||||||
char module_name[MAX_LENGTH + 1];
|
|
||||||
char property_name[MAX_LENGTH + 1];
|
|
||||||
char property_value[MAX_LENGTH + 1];
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
|
|
||||||
env = ft_getenv( "FREETYPE_PROPERTIES" );
|
|
||||||
if ( !env )
|
|
||||||
return;
|
|
||||||
|
|
||||||
for ( p = env; *p; p++ )
|
|
||||||
{
|
|
||||||
/* skip leading whitespace and separators */
|
|
||||||
if ( *p == ' ' || *p == '\t' )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* read module name, followed by `:' */
|
|
||||||
q = p;
|
|
||||||
for ( i = 0; i < MAX_LENGTH; i++ )
|
|
||||||
{
|
|
||||||
if ( !*p || *p == ':' )
|
|
||||||
break;
|
|
||||||
module_name[i] = *p++;
|
|
||||||
}
|
|
||||||
module_name[i] = '\0';
|
|
||||||
|
|
||||||
if ( !*p || *p != ':' || p == q )
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* read property name, followed by `=' */
|
|
||||||
q = ++p;
|
|
||||||
for ( i = 0; i < MAX_LENGTH; i++ )
|
|
||||||
{
|
|
||||||
if ( !*p || *p == '=' )
|
|
||||||
break;
|
|
||||||
property_name[i] = *p++;
|
|
||||||
}
|
|
||||||
property_name[i] = '\0';
|
|
||||||
|
|
||||||
if ( !*p || *p != '=' || p == q )
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* read property value, followed by whitespace (if any) */
|
|
||||||
q = ++p;
|
|
||||||
for ( i = 0; i < MAX_LENGTH; i++ )
|
|
||||||
{
|
|
||||||
if ( !*p || *p == ' ' || *p == '\t' )
|
|
||||||
break;
|
|
||||||
property_value[i] = *p++;
|
|
||||||
}
|
|
||||||
property_value[i] = '\0';
|
|
||||||
|
|
||||||
if ( !( *p == '\0' || *p == ' ' || *p == '\t' ) || p == q )
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* we completely ignore errors */
|
|
||||||
ft_property_string_set( library,
|
|
||||||
module_name,
|
|
||||||
property_name,
|
|
||||||
property_value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
FT_EXPORT_DEF( void )
|
|
||||||
FT_Set_Default_Properties( FT_Library library )
|
|
||||||
{
|
|
||||||
FT_UNUSED( library );
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
@ -81,10 +81,6 @@ FT_BEGIN_HEADER
|
|||||||
/* FT_Remove_Module */
|
/* FT_Remove_Module */
|
||||||
/* FT_Add_Default_Modules */
|
/* FT_Add_Default_Modules */
|
||||||
/* */
|
/* */
|
||||||
/* FT_Property_Set */
|
|
||||||
/* FT_Property_Get */
|
|
||||||
/* FT_Set_Default_Properties */
|
|
||||||
/* */
|
|
||||||
/* FT_New_Library */
|
/* FT_New_Library */
|
||||||
/* FT_Done_Library */
|
/* FT_Done_Library */
|
||||||
/* FT_Reference_Library */
|
/* FT_Reference_Library */
|
||||||
@ -290,179 +286,6 @@ FT_BEGIN_HEADER
|
|||||||
FT_Module module );
|
FT_Module module );
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
*
|
|
||||||
* @function:
|
|
||||||
* FT_Property_Set
|
|
||||||
*
|
|
||||||
* @description:
|
|
||||||
* Set a property for a given module.
|
|
||||||
*
|
|
||||||
* @input:
|
|
||||||
* library ::
|
|
||||||
* A handle to the library the module is part of.
|
|
||||||
*
|
|
||||||
* module_name ::
|
|
||||||
* The module name.
|
|
||||||
*
|
|
||||||
* property_name ::
|
|
||||||
* The property name. Properties are described in section
|
|
||||||
* @properties.
|
|
||||||
*
|
|
||||||
* Note that only a few modules have properties.
|
|
||||||
*
|
|
||||||
* value ::
|
|
||||||
* A generic pointer to a variable or structure that gives the new
|
|
||||||
* value of the property. The exact definition of `value' is
|
|
||||||
* dependent on the property; see section @properties.
|
|
||||||
*
|
|
||||||
* @return:
|
|
||||||
* FreeType error code. 0~means success.
|
|
||||||
*
|
|
||||||
* @note:
|
|
||||||
* If `module_name' isn't a valid module name, or `property_name'
|
|
||||||
* doesn't specify a valid property, or if `value' doesn't represent a
|
|
||||||
* valid value for the given property, an error is returned.
|
|
||||||
*
|
|
||||||
* The following example sets property `bar' (a simple integer) in
|
|
||||||
* module `foo' to value~1.
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* FT_UInt bar;
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* bar = 1;
|
|
||||||
* FT_Property_Set( library, "foo", "bar", &bar );
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* Note that the FreeType Cache sub-system doesn't recognize module
|
|
||||||
* property changes. To avoid glyph lookup confusion within the cache
|
|
||||||
* you should call @FTC_Manager_Reset to completely flush the cache if
|
|
||||||
* a module property gets changed after @FTC_Manager_New has been
|
|
||||||
* called.
|
|
||||||
*
|
|
||||||
* It is not possible to set properties of the FreeType Cache
|
|
||||||
* sub-system itself with FT_Property_Set; use @FTC_Property_Set
|
|
||||||
* instead.
|
|
||||||
*
|
|
||||||
* @since:
|
|
||||||
* 2.4.11
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
FT_EXPORT( FT_Error )
|
|
||||||
FT_Property_Set( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
const void* value );
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
*
|
|
||||||
* @function:
|
|
||||||
* FT_Property_Get
|
|
||||||
*
|
|
||||||
* @description:
|
|
||||||
* Get a module's property value.
|
|
||||||
*
|
|
||||||
* @input:
|
|
||||||
* library ::
|
|
||||||
* A handle to the library the module is part of.
|
|
||||||
*
|
|
||||||
* module_name ::
|
|
||||||
* The module name.
|
|
||||||
*
|
|
||||||
* property_name ::
|
|
||||||
* The property name. Properties are described in section
|
|
||||||
* @properties.
|
|
||||||
*
|
|
||||||
* @inout:
|
|
||||||
* value ::
|
|
||||||
* A generic pointer to a variable or structure that gives the
|
|
||||||
* value of the property. The exact definition of `value' is
|
|
||||||
* dependent on the property; see section @properties.
|
|
||||||
*
|
|
||||||
* @return:
|
|
||||||
* FreeType error code. 0~means success.
|
|
||||||
*
|
|
||||||
* @note:
|
|
||||||
* If `module_name' isn't a valid module name, or `property_name'
|
|
||||||
* doesn't specify a valid property, or if `value' doesn't represent a
|
|
||||||
* valid value for the given property, an error is returned.
|
|
||||||
*
|
|
||||||
* The following example gets property `baz' (a range) in module `foo'.
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* typedef range_
|
|
||||||
* {
|
|
||||||
* FT_Int32 min;
|
|
||||||
* FT_Int32 max;
|
|
||||||
*
|
|
||||||
* } range;
|
|
||||||
*
|
|
||||||
* range baz;
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* FT_Property_Get( library, "foo", "baz", &baz );
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* It is not possible to retrieve properties of the FreeType Cache
|
|
||||||
* sub-system with FT_Property_Get; use @FTC_Property_Get instead.
|
|
||||||
*
|
|
||||||
* @since:
|
|
||||||
* 2.4.11
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
FT_EXPORT( FT_Error )
|
|
||||||
FT_Property_Get( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
void* value );
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* <Function> */
|
|
||||||
/* FT_Set_Default_Properties */
|
|
||||||
/* */
|
|
||||||
/* <Description> */
|
|
||||||
/* If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is */
|
|
||||||
/* set, this function reads the `FREETYPE_PROPERTIES' environment */
|
|
||||||
/* variable to control driver properties. See section @properties */
|
|
||||||
/* for more. */
|
|
||||||
/* */
|
|
||||||
/* If the compilation option is not set, this function does nothing. */
|
|
||||||
/* */
|
|
||||||
/* `FREETYPE_PROPERTIES' has the following syntax form (broken here */
|
|
||||||
/* into multiple lines for better readability). */
|
|
||||||
/* */
|
|
||||||
/* { */
|
|
||||||
/* <optional whitespace> */
|
|
||||||
/* <module-name1> ':' */
|
|
||||||
/* <property-name1> '=' <property-value1> */
|
|
||||||
/* <whitespace> */
|
|
||||||
/* <module-name2> ':' */
|
|
||||||
/* <property-name2> '=' <property-value2> */
|
|
||||||
/* ... */
|
|
||||||
/* } */
|
|
||||||
/* */
|
|
||||||
/* Example: */
|
|
||||||
/* */
|
|
||||||
/* { */
|
|
||||||
/* FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ */
|
|
||||||
/* cff:no-stem-darkening=1 \ */
|
|
||||||
/* autofitter:warping=1 */
|
|
||||||
/* } */
|
|
||||||
/* */
|
|
||||||
/* <InOut> */
|
|
||||||
/* library :: A handle to a new library object. */
|
|
||||||
/* */
|
|
||||||
/* <Since> */
|
|
||||||
/* 2.8 */
|
|
||||||
/* */
|
|
||||||
FT_EXPORT( void )
|
|
||||||
FT_Set_Default_Properties( FT_Library library );
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Function> */
|
/* <Function> */
|
||||||
|
@ -3992,148 +3992,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FT_Error
|
|
||||||
ft_property_do( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
void* value,
|
|
||||||
FT_Bool set,
|
|
||||||
FT_Bool value_is_string )
|
|
||||||
{
|
|
||||||
FT_Module* cur;
|
|
||||||
FT_Module* limit;
|
|
||||||
FT_Module_Interface interface;
|
|
||||||
|
|
||||||
FT_Service_Properties service;
|
|
||||||
|
|
||||||
#ifdef FT_DEBUG_LEVEL_ERROR
|
|
||||||
const FT_String* set_name = "FT_Property_Set";
|
|
||||||
const FT_String* get_name = "FT_Property_Get";
|
|
||||||
const FT_String* func_name = set ? set_name : get_name;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FT_Bool missing_func;
|
|
||||||
|
|
||||||
|
|
||||||
if ( !library )
|
|
||||||
return FT_THROW( Invalid_Library_Handle );
|
|
||||||
|
|
||||||
if ( !module_name || !property_name || !value )
|
|
||||||
return FT_THROW( Invalid_Argument );
|
|
||||||
|
|
||||||
cur = library->modules;
|
|
||||||
limit = cur + library->num_modules;
|
|
||||||
|
|
||||||
/* search module */
|
|
||||||
for ( ; cur < limit; cur++ )
|
|
||||||
if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ( cur == limit )
|
|
||||||
{
|
|
||||||
FT_ERROR(( "%s: can't find module `%s'\n",
|
|
||||||
func_name, module_name ));
|
|
||||||
return FT_THROW( Missing_Module );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check whether we have a service interface */
|
|
||||||
if ( !cur[0]->clazz->get_interface )
|
|
||||||
{
|
|
||||||
FT_ERROR(( "%s: module `%s' doesn't support properties\n",
|
|
||||||
func_name, module_name ));
|
|
||||||
return FT_THROW( Unimplemented_Feature );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search property service */
|
|
||||||
interface = cur[0]->clazz->get_interface( cur[0],
|
|
||||||
FT_SERVICE_ID_PROPERTIES );
|
|
||||||
if ( !interface )
|
|
||||||
{
|
|
||||||
FT_ERROR(( "%s: module `%s' doesn't support properties\n",
|
|
||||||
func_name, module_name ));
|
|
||||||
return FT_THROW( Unimplemented_Feature );
|
|
||||||
}
|
|
||||||
|
|
||||||
service = (FT_Service_Properties)interface;
|
|
||||||
|
|
||||||
if ( set )
|
|
||||||
missing_func = (FT_Bool)( !service->set_property );
|
|
||||||
else
|
|
||||||
missing_func = (FT_Bool)( !service->get_property );
|
|
||||||
|
|
||||||
if ( missing_func )
|
|
||||||
{
|
|
||||||
FT_ERROR(( "%s: property service of module `%s' is broken\n",
|
|
||||||
func_name, module_name ));
|
|
||||||
return FT_THROW( Unimplemented_Feature );
|
|
||||||
}
|
|
||||||
|
|
||||||
return set ? service->set_property( cur[0],
|
|
||||||
property_name,
|
|
||||||
value,
|
|
||||||
value_is_string )
|
|
||||||
: service->get_property( cur[0],
|
|
||||||
property_name,
|
|
||||||
value );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* documentation is in ftmodapi.h */
|
|
||||||
|
|
||||||
FT_EXPORT_DEF( FT_Error )
|
|
||||||
FT_Property_Set( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
const void* value )
|
|
||||||
{
|
|
||||||
return ft_property_do( library,
|
|
||||||
module_name,
|
|
||||||
property_name,
|
|
||||||
(void*)value,
|
|
||||||
TRUE,
|
|
||||||
FALSE );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* documentation is in ftmodapi.h */
|
|
||||||
|
|
||||||
FT_EXPORT_DEF( FT_Error )
|
|
||||||
FT_Property_Get( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
void* value )
|
|
||||||
{
|
|
||||||
return ft_property_do( library,
|
|
||||||
module_name,
|
|
||||||
property_name,
|
|
||||||
value,
|
|
||||||
FALSE,
|
|
||||||
FALSE );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
|
|
||||||
|
|
||||||
/* this variant is used for handling the FREETYPE_PROPERTIES */
|
|
||||||
/* environment variable */
|
|
||||||
|
|
||||||
FT_BASE_DEF( FT_Error )
|
|
||||||
ft_property_string_set( FT_Library library,
|
|
||||||
const FT_String* module_name,
|
|
||||||
const FT_String* property_name,
|
|
||||||
FT_String* value )
|
|
||||||
{
|
|
||||||
return ft_property_do( library,
|
|
||||||
module_name,
|
|
||||||
property_name,
|
|
||||||
(void*)value,
|
|
||||||
TRUE,
|
|
||||||
TRUE );
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
@ -110,7 +110,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#define ft_strtol strtol
|
#define ft_strtol strtol
|
||||||
#define ft_getenv getenv
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user