forked from nillerusr/source-engine
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFontManager.h
129 lines (106 loc) · 4.27 KB
/
FontManager.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef FONTMANAGER_H
#define FONTMANAGER_H
#ifdef _WIN32
#pragma once
#endif
#include <vgui/VGUI.h>
#include "common/vgui_surfacelib/FontAmalgam.h"
#include "materialsystem/imaterialsystem.h"
#include "filesystem.h"
#include "vguifont.h"
#ifdef POSIX
#include <ft2build.h>
#include FT_FREETYPE_H
typedef void *(*FontDataHelper)( const char *pchFontName, int &size, const char *fontFileName );
#endif
#ifdef CreateFont
#undef CreateFont
#endif
using vgui::HFont;
//-----------------------------------------------------------------------------
// Purpose: Creates and maintains list of actively used fonts
//-----------------------------------------------------------------------------
class CFontManager
{
public:
CFontManager();
~CFontManager();
void SetLanguage(const char *language);
// clears the current font list, frees any resources
void ClearAllFonts();
HFont CreateFont();
bool SetFontGlyphSet(HFont font, const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags);
bool SetFontGlyphSet(HFont font, const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags, int nRangeMin, int nRangeMax);
bool SetBitmapFontGlyphSet(HFont font, const char *windowsFontName, float scalex, float scaley, int flags);
void SetFontScale(HFont font, float sx, float sy);
const char *GetFontName( HFont font );
const char *GetFontFamilyName( HFont font );
void GetCharABCwide(HFont font, int ch, int &a, int &b, int &c);
int GetFontTall(HFont font);
int GetFontTallRequested(HFont font);
int GetFontAscent(HFont font, wchar_t wch);
int GetCharacterWidth(HFont font, int ch);
bool GetFontUnderlined( HFont font );
void GetTextSize(HFont font, const wchar_t *text, int &wide, int &tall);
font_t *GetFontForChar(HFont, wchar_t wch);
bool IsFontAdditive(HFont font);
bool IsBitmapFont(HFont font );
void SetInterfaces( IFileSystem *pFileSystem, IMaterialSystem *pMaterialSystem )
{
m_pFileSystem = pFileSystem;
m_pMaterialSystem = pMaterialSystem;
}
IFileSystem *FileSystem() { return m_pFileSystem; }
IMaterialSystem *MaterialSystem() { return m_pMaterialSystem; }
#ifdef POSIX
FT_Library GetFontLibraryHandle() { return library; }
void SetFontDataHelper( FontDataHelper helper ) { m_pFontDataHelper = helper; }
#endif
#if defined( _X360 )
// secondary cache to speed TTF setup
bool GetCachedXUIMetrics( const char *pWindowsFontName, int tall, int style, XUIFontMetrics *pFontMetrics, XUICharMetrics charMetrics[256] );
void SetCachedXUIMetrics( const char *pWindowsFontName, int tall, int style, XUIFontMetrics *pFontMetrics, XUICharMetrics charMetrics[256] );
#endif
// used as a hint that intensive TTF operations are finished
void ClearTemporaryFontCache();
void GetKernedCharWidth( vgui::HFont font, wchar_t ch, wchar_t chBefore, wchar_t chAfter, float &wide, float &abcA, float &abcC );
private:
bool IsFontForeignLanguageCapable(const char *windowsFontName);
font_t *CreateOrFindWin32Font(const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags);
CBitmapFont *CreateOrFindBitmapFont(const char *windowsFontName, float scalex, float scaley, int flags);
const char *GetFallbackFontName(const char *windowsFontName);
const char *GetForeignFallbackFontName();
CUtlVector<CFontAmalgam> m_FontAmalgams;
CUtlVector<font_t *> m_Win32Fonts;
#ifdef POSIX
FT_Library library;
FontDataHelper m_pFontDataHelper;
#endif
char m_szLanguage[64];
IFileSystem *m_pFileSystem;
IMaterialSystem *m_pMaterialSystem;
#if defined( _X360 )
// These are really bounded by the number of fonts that the game would ever realistically create, so ~100 is expected.
// Many of these fonts are redundant and the same underlying metrics can be used. This avoid the very expensive TTF font metric lookup.
struct XUIMetricCache_t
{
// the font signature that can change
CUtlSymbol fontSymbol;
int tall;
int style;
// the metrics
XUIFontMetrics fontMetrics;
XUICharMetrics charMetrics[256];
};
CUtlVector< XUIMetricCache_t > m_XUIMetricCache;
#endif
};
// singleton accessor
extern CFontManager &FontManager();
#endif // FONTMANAGER_H