forked from pyrite-dev/milsko
support gdi text under win95
This commit is contained in:
parent
74a800b3ef
commit
d9bf9bbb95
5 changed files with 122 additions and 12 deletions
2
NTMakefile
generated
2
NTMakefile
generated
|
|
@ -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
2
WatMakefile
generated
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -248,6 +248,10 @@ struct _MwMouse {
|
|||
int button;
|
||||
};
|
||||
|
||||
enum _MwTTFType {
|
||||
MwTTFTypeUNKNOWN = 0
|
||||
};
|
||||
|
||||
struct _MwTTFInfo {
|
||||
char* family;
|
||||
int weight;
|
||||
|
|
|
|||
124
src/text/gdi.c
124
src/text/gdi.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue