-
Notifications
You must be signed in to change notification settings - Fork 0
/
freetype_hook.h
67 lines (55 loc) · 1.68 KB
/
freetype_hook.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#ifndef FT_EXPORT
#ifdef __cplusplus
#define FT_EXPORT( x ) extern "C" x CDECL
#else
#define FT_EXPORT( x ) extern x CDECL
#endif
#endif /* !FT_EXPORT */
#include "ft2build.h"
#include FT_FREETYPE_H
namespace NFreeType
{
FT_Error CDECL FT_New_Face_Ex( FT_Library library,
const char* filepathname,
FT_Long face_index,
FT_Face *aface )
{
TYPE_OF(&FT_Open_Face) Stub_FT_Open_face = (TYPE_OF(&FT_Open_Face))0x067577D;
FT_Open_Args args;
FT_Error Result;
if (!filepathname)
return FT_Err_Invalid_Argument;
WCHAR szwPath[MAX_PATH];
Nt_AnsiToUnicode(szwPath, countof(szwPath), (PCHAR)filepathname, -1);
NtFileDisk file;
NTSTATUS Status = file.Open(szwPath);
if (!NT_SUCCESS(Status))
{
return FT_Err_Cannot_Open_Resource;
}
#if CONSOLE_DEBUG
PrintConsoleA("load font once:%s\n", filepathname);
#endif
ULONG fileSize = file.GetSize32();
if (fileSize > (64 << 20))
{
args.flags = FT_OPEN_PATHNAME;
args.pathname = (char*)filepathname;
args.stream = NULL;
return Stub_FT_Open_face( library, &args, face_index, aface );
}
PBYTE p = new BYTE[fileSize];
file.Read(p, fileSize);
file.Close();
args.flags = FT_OPEN_MEMORY;
args.memory_base = p;
args.memory_size = fileSize;
args.stream = NULL;
Result = Stub_FT_Open_face( library, &args, face_index, aface );
if (Result)
{
delete p;
}
return Result;
}
}