support gdi text under win95

This commit is contained in:
IoIxD 2026-07-19 20:44:28 -07:00
commit d9bf9bbb95
5 changed files with 122 additions and 12 deletions

2
NTMakefile generated
View file

@ -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 =

2
WatMakefile generated
View file

@ -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

View file

@ -248,6 +248,10 @@ struct _MwMouse {
int button;
};
enum _MwTTFType {
MwTTFTypeUNKNOWN = 0
};
struct _MwTTFInfo {
char* family;
int weight;

View file

@ -1,6 +1,11 @@
#ifdef USE_GDI_TEXT
#include <Mw/Milsko.h>
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

View file

@ -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");