support gdi text under win95
Some checks failed
pyrite-dev/milsko/pipeline/head There was a failure building this commit
Some checks failed
pyrite-dev/milsko/pipeline/head There was a failure building this commit
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
|
CC = cl /TC /c /nologo
|
||||||
LD = link /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
|
MW_LDFLAGS = /DLL
|
||||||
EXE_CFLAGS = /Iinclude
|
EXE_CFLAGS = /Iinclude
|
||||||
EXE_LDFLAGS =
|
EXE_LDFLAGS =
|
||||||
|
|
|
||||||
2
WatMakefile
generated
2
WatMakefile
generated
|
|
@ -1,7 +1,7 @@
|
||||||
CC = wcc386 -bt=nt -q
|
CC = wcc386 -bt=nt -q
|
||||||
LD = wlink option quiet
|
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
|
MW_LDFLAGS = system nt_dll
|
||||||
EXE_CFLAGS = -i=include
|
EXE_CFLAGS = -i=include
|
||||||
EXE_LDFLAGS = system nt
|
EXE_LDFLAGS = system nt
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,10 @@ struct _MwMouse {
|
||||||
int button;
|
int button;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum _MwTTFType {
|
||||||
|
MwTTFTypeUNKNOWN = 0
|
||||||
|
};
|
||||||
|
|
||||||
struct _MwTTFInfo {
|
struct _MwTTFInfo {
|
||||||
char* family;
|
char* family;
|
||||||
int weight;
|
int weight;
|
||||||
|
|
|
||||||
124
src/text/gdi.c
124
src/text/gdi.c
|
|
@ -1,6 +1,11 @@
|
||||||
#ifdef USE_GDI_TEXT
|
#ifdef USE_GDI_TEXT
|
||||||
#include <Mw/Milsko.h>
|
#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 {
|
struct _MwFLFont {
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
HFONT font;
|
HFONT font;
|
||||||
|
|
@ -121,15 +126,30 @@ static void* GDI_MwFontLoad(unsigned char* data, unsigned int size, int px) {
|
||||||
|
|
||||||
ttf->dc = GetDC(NULL);
|
ttf->dc = GetDC(NULL);
|
||||||
|
|
||||||
if((ttf->handle = AddFontMemResourceEx(data, size, 0, &c)) == NULL) {
|
ttf->handle = 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, info->family)) == NULL) {
|
if(AddFontMemResourceEx) {
|
||||||
RemoveFontMemResourceEx(ttf->handle);
|
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);
|
ReleaseDC(NULL, ttf->dc);
|
||||||
MwTTFFreeInfo(info);
|
MwTTFFreeInfo(info);
|
||||||
free(ttf);
|
free(ttf);
|
||||||
|
|
@ -147,12 +167,97 @@ static void GDI_MwFontFree(void* handle) {
|
||||||
MwFLFont ttf = handle;
|
MwFLFont ttf = handle;
|
||||||
|
|
||||||
DeleteObject(ttf->font);
|
DeleteObject(ttf->font);
|
||||||
RemoveFontMemResourceEx(ttf->handle);
|
if(RemoveFontMemResourceEx) {
|
||||||
|
RemoveFontMemResourceEx(ttf->handle);
|
||||||
|
} else {
|
||||||
|
RemoveFontMemResourceExPolyFill(ttf->handle);
|
||||||
|
}
|
||||||
ReleaseDC(NULL, ttf->dc);
|
ReleaseDC(NULL, ttf->dc);
|
||||||
free(ttf);
|
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) {
|
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;
|
MwFLDrawText = GDI_MwDrawText;
|
||||||
MwFLTextWidth = GDI_MwTextWidth;
|
MwFLTextWidth = GDI_MwTextWidth;
|
||||||
MwFLTextHeight = GDI_MwTextHeight;
|
MwFLTextHeight = GDI_MwTextHeight;
|
||||||
|
|
@ -160,4 +265,5 @@ int MwFL_GDISetup(void) {
|
||||||
MwFLFontFree = GDI_MwFontFree;
|
MwFLFontFree = GDI_MwFontFree;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ sub generate {
|
||||||
print(OUT "LD = $link\n");
|
print(OUT "LD = $link\n");
|
||||||
print(OUT "\n");
|
print(OUT "\n");
|
||||||
print(OUT
|
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 "MW_LDFLAGS = $dll\n");
|
||||||
print(OUT "EXE_CFLAGS = ${inc}include\n");
|
print(OUT "EXE_CFLAGS = ${inc}include\n");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue