aboutsummaryrefslogtreecommitdiff
path: root/common/fmplayer_fontrom_win.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/fmplayer_fontrom_win.c')
-rw-r--r--common/fmplayer_fontrom_win.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/common/fmplayer_fontrom_win.c b/common/fmplayer_fontrom_win.c
new file mode 100644
index 0000000..8ba8300
--- /dev/null
+++ b/common/fmplayer_fontrom_win.c
@@ -0,0 +1,40 @@
+#include "fmplayer_fontrom.h"
+#include "fmdsp/font.h"
+#include <stdint.h>
+#include <stdbool.h>
+#include <wchar.h>
+#include "common/winfont.h"
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <shlwapi.h>
+
+static struct {
+ uint8_t fontrombuf[FONT_ROM_FILESIZE];
+ bool font_rom_loaded;
+} g;
+
+void fmplayer_font_rom_load(struct fmdsp_font *font) {
+ const wchar_t *path = L"font.rom";
+ wchar_t exepath[MAX_PATH];
+ if (GetModuleFileNameW(0, exepath, MAX_PATH)) {
+ PathRemoveFileSpecW(exepath);
+ if ((wcslen(exepath) + wcslen(path) + 1 + 1) < MAX_PATH) {
+ wcscat(exepath, L"\\");
+ wcscat(exepath, path);
+ path = exepath;
+ }
+ }
+ HANDLE file = CreateFileW(path, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+ if (file == INVALID_HANDLE_VALUE) goto err;
+ DWORD filesize = GetFileSize(file, 0);
+ if (filesize != FONT_ROM_FILESIZE) goto err;
+ DWORD readbytes;
+ if (!ReadFile(file, g.fontrombuf, FONT_ROM_FILESIZE, &readbytes, 0) || readbytes != FONT_ROM_FILESIZE) goto err;
+ CloseHandle(file);
+ fmdsp_font_from_font_rom(font, g.fontrombuf);
+ g.font_rom_loaded = true;
+ return;
+err:
+ if (file != INVALID_HANDLE_VALUE) CloseHandle(file);
+ fmdsp_font_win(font);
+}