From d9bf9bbb95c2b8f83ac98f3571f70730706d5217 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Sun, 19 Jul 2026 20:44:28 -0700 Subject: [PATCH] support gdi text under win95 --- NTMakefile | 2 +- WatMakefile | 2 +- include/Mw/TypeDefs.h | 4 ++ src/text/gdi.c | 124 +++++++++++++++++++++++++++++++++++++++--- tools/genmk.pl | 2 +- 5 files changed, 122 insertions(+), 12 deletions(-) diff --git a/NTMakefile b/NTMakefile index 47ef312..a3fc76a 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,7 +1,7 @@ CC = cl /TC /c /nologo LD = link /nologo -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_TRUETYPE /DUSE_STB_IMAGE /DSTBI_NO_SIMD +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = diff --git a/WatMakefile b/WatMakefile index 5f3e000..afeb560 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_TRUETYPE -dUSE_STB_IMAGE -dSTBI_NO_SIMD +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index 4944105..edad6bf 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -248,6 +248,10 @@ struct _MwMouse { int button; }; +enum _MwTTFType { + MwTTFTypeUNKNOWN = 0 +}; + struct _MwTTFInfo { char* family; int weight; diff --git a/src/text/gdi.c b/src/text/gdi.c index 0d5913d..cf4e655 100644 --- a/src/text/gdi.c +++ b/src/text/gdi.c @@ -1,6 +1,11 @@ #ifdef USE_GDI_TEXT #include +static HANDLE WINAPI (*AddFontMemResourceEx)(PVOID pFileView, DWORD cjSize, PVOID pvResrved, DWORD* pNumFonts) = NULL; +static BOOL WINAPI (*RemoveFontMemResourceEx)(HANDLE h) = NULL; +static HANDLE WINAPI AddFontMemResourceExPolyFill(PVOID pFileView, DWORD cjSize, PVOID pvResrved, DWORD* pNumFonts); +static BOOL WINAPI RemoveFontMemResourceExPolyFill(HANDLE h); + struct _MwFLFont { HANDLE handle; HFONT font; @@ -121,15 +126,30 @@ static void* GDI_MwFontLoad(unsigned char* data, unsigned int size, int px) { ttf->dc = GetDC(NULL); - if((ttf->handle = AddFontMemResourceEx(data, size, 0, &c)) == NULL) { - ReleaseDC(NULL, ttf->dc); - MwTTFFreeInfo(info); - free(ttf); - return NULL; - } + ttf->handle = NULL; - if((ttf->font = CreateFont(-px, 0, 0, 0, info->weight, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, info->family)) == NULL) { - RemoveFontMemResourceEx(ttf->handle); + if(AddFontMemResourceEx) { + if((ttf->handle = AddFontMemResourceEx(data, size, 0, &c)) == NULL) { + ReleaseDC(NULL, ttf->dc); + MwTTFFreeInfo(info); + free(ttf); + return NULL; + } + } /*else { + if((ttf->handle = AddFontMemResourceExPolyFill(data, size, 0, &c)) == NULL) { + ReleaseDC(NULL, ttf->dc); + MwTTFFreeInfo(info); + free(ttf); + return NULL; + } + }*/ + + if((ttf->font = CreateFont(-px, 0, 0, 0, info->weight, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, ttf->handle ? info->family : "Sans Serif")) == NULL) { + if(RemoveFontMemResourceEx) { + RemoveFontMemResourceEx(ttf->handle); + } else { + RemoveFontMemResourceExPolyFill(ttf->handle); + } ReleaseDC(NULL, ttf->dc); MwTTFFreeInfo(info); free(ttf); @@ -147,12 +167,97 @@ static void GDI_MwFontFree(void* handle) { MwFLFont ttf = handle; DeleteObject(ttf->font); - RemoveFontMemResourceEx(ttf->handle); + if(RemoveFontMemResourceEx) { + RemoveFontMemResourceEx(ttf->handle); + } else { + RemoveFontMemResourceExPolyFill(ttf->handle); + } ReleaseDC(NULL, ttf->dc); free(ttf); } +static HANDLE WINAPI AddFontMemResourceExPolyFill(PVOID pFileView, DWORD cjSize, PVOID pvResrved, DWORD* pNumFonts) { + CHAR temp_path_dir[MAX_PATH]; + CHAR temp_path_name[MAX_PATH]; + HANDLE tempFile = NULL; + int hr; + + (void)pvResrved; + + hr = GetTempPathA(MAX_PATH, temp_path_dir); + if(hr == 0) { + printf("GetTempPathA error %08lX\n", hr); + return hr; + } + hr = GetTempFileNameA(temp_path_dir, TEXT("MILSKO"), 0, temp_path_name); + if(hr == 0) { + printf("GetTempFileNameA error %08lX\n", hr); + return hr; + } + + printf("extracting mem font to %s\n", temp_path_name); + + tempFile = CreateFileA(temp_path_name, + GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + + if(tempFile == INVALID_HANDLE_VALUE) { + DWORD err = GetLastError(); + if(err == ERROR_ALREADY_EXISTS) { + tempFile = CreateFileA(temp_path_name, + GENERIC_WRITE, + 0, + NULL, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + printf("%d\n", tempFile); + if(tempFile != INVALID_HANDLE_VALUE) { + goto success; + } else { + err = GetLastError(); + } + } + printf("CreateFileA error %08lX\n", err); + return hr; + } + +success: + hr = WriteFile(tempFile, pFileView, cjSize, NULL, NULL); + if(hr != 0) { + printf("WriteFile error %08lX\n", hr); + return 0; + } + + *pNumFonts = AddFontResource(temp_path_name); + + return tempFile; +}; +static BOOL WINAPI RemoveFontMemResourceExPolyFill(HANDLE h) { + if(h) + CloseHandle(h); + return TRUE; +}; + int MwFL_GDISetup(void) { + void* gdilib = LoadLibrary("gdi32.dll"); + if(!gdilib) { + printf("gdi32.dll not found(?????)\n"); + } else { + AddFontMemResourceEx = (void*)GetProcAddress(gdilib, "AddFontMemResourceEx"); + if(!AddFontMemResourceEx) { + AddFontMemResourceEx = AddFontMemResourceExPolyFill; + } + RemoveFontMemResourceEx = (void*)GetProcAddress(gdilib, "RemoveFontMemResourceEx"); + if(!RemoveFontMemResourceEx) { + RemoveFontMemResourceEx = RemoveFontMemResourceExPolyFill; + } + } + MwFLDrawText = GDI_MwDrawText; MwFLTextWidth = GDI_MwTextWidth; MwFLTextHeight = GDI_MwTextHeight; @@ -160,4 +265,5 @@ int MwFL_GDISetup(void) { MwFLFontFree = GDI_MwFontFree; return 0; } + #endif diff --git a/tools/genmk.pl b/tools/genmk.pl index 4b419b1..9903c11 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -116,7 +116,7 @@ sub generate { print(OUT "LD = $link\n"); print(OUT "\n"); print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_TRUETYPE ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n");