diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /common/vgui_surfacelib/linuxfont.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'common/vgui_surfacelib/linuxfont.h')
| -rw-r--r-- | common/vgui_surfacelib/linuxfont.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/common/vgui_surfacelib/linuxfont.h b/common/vgui_surfacelib/linuxfont.h new file mode 100644 index 0000000..33cf4f8 --- /dev/null +++ b/common/vgui_surfacelib/linuxfont.h @@ -0,0 +1,169 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef LINUXFONT_H +#define LINUXFONT_H + +#include "utlrbtree.h" +#include <tier0/memdbgoff.h> +#include <tier0/memdbgon.h> +#include "tier1/strtools.h" +#include "tier1/utlstring.h" + +#include <ft2build.h> +#include FT_FREETYPE_H + + +//----------------------------------------------------------------------------- +// Purpose: encapsulates a OSX font +//----------------------------------------------------------------------------- +class CLinuxFont +{ +public: + CLinuxFont(); + ~CLinuxFont(); + + // creates the font from windows. returns false if font does not exist in the OS. + virtual bool CreateFromMemory(const char *windowsFontName, void *data, int size, int tall, int weight, int blur, int scanlines, int flags); + + // writes the char into the specified 32bpp texture + virtual void GetCharRGBA( wchar_t ch, int rgbaWide, int rgbaTall, unsigned char *rgba); + + // returns true if the font is equivalent to that specified + virtual bool IsEqualTo(const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags); + + // returns true only if this font is valid for use + virtual bool IsValid(); + + // gets the abc widths for a character + // A spacing is the distance to add to the current position before drawing the character glyph. + // B spacing is the width of the drawn portion of the glyph. + // C spacing is the distance to add to the current position to provide white space to the right of the glyph. + virtual void GetCharABCWidths(int ch, int &a, int &b, int &c); + + // set the font to be the one to currently draw with in the gdi + void *SetAsActiveFont( void *glContext ); + + // returns the height of the font, in pixels + virtual int GetHeight(); + + // returns the requested height of the font. + virtual int GetHeightRequested(); + + // returns the ascent of the font, in pixels (ascent=units above the base line) + virtual int GetAscent(); + + // returns the maximum width of a character, in pixels + virtual int GetMaxCharWidth(); + + // returns the flags used to make this font + virtual int GetFlags(); + + // returns true if this font is underlined + virtual bool GetUnderlined() { return m_bUnderlined; } + + // gets the name of this font + const char *GetName() { return m_szName.String(); } + const char *GetFamilyName() { return m_face ? m_face->family_name : NULL; } + + // gets the weight of the font + virtual int GetWeight() { return m_iWeight; } + + bool HasChar(wchar_t wch); + + // gets the width of ch given its position around before and after chars + virtual void GetKernedCharWidth( wchar_t ch, wchar_t chBefore, wchar_t chAfter, float &wide, float &abcA, float &abcC ); + +#ifdef DBGFLAG_VALIDATE + void Validate( CValidator &validator, char *pchName ); +#endif + + // Given a font name from windows, match it to the filename and return that. + static char *GetFontFileName(const char *windowsFontName, int flags); + + +protected: + CUtlString m_szName; + int m_iTall; + int m_iWeight; + int m_iFlags; + bool m_bAntiAliased; + bool m_bRotary; + bool m_bAdditive; + int m_iDropShadowOffset; + bool m_bUnderlined; + int m_iOutlineSize; + + int m_iHeight; + int m_iHeightRequested; + int m_iMaxCharWidth; + int m_iAscent; + + int m_iScanLines; + int m_iBlur; + +private: + static void CreateFontList(); + // abc widths + struct abc_t + { + short b; + char a; + char c; + }; + + // cache for storing asian abc widths (since it's too big too just store them all) + struct abc_cache_t + { + wchar_t wch; + abc_t abc; + }; + + + CUtlRBTree<abc_cache_t, unsigned short> m_ExtendedABCWidthsCache; + static bool ExtendedABCWidthsCacheLessFunc(const abc_cache_t &lhs, const abc_cache_t &rhs); + + // cache for storing asian abc widths (since it's too big too just store them all) + struct kernedSize + { + float wide; + }; + + struct kerned_abc_cache_t + { + wchar_t wch; + wchar_t wchBefore; + wchar_t wchAfter; + kernedSize abc; + }; + + CUtlRBTree<kerned_abc_cache_t, unsigned short> m_ExtendedKernedABCWidthsCache; + static bool ExtendedKernedABCWidthsCacheLessFunc(const kerned_abc_cache_t &lhs, const kerned_abc_cache_t &rhs); + + bool m_faceValid; + FT_Face m_face; + + struct font_name_entry + { + font_name_entry() + { + m_pchFile = NULL; + m_pchFriendlyName = NULL; + } + + char *m_pchFile; + char *m_pchFriendlyName; + bool operator<( const font_name_entry &rhs ) const + { + return V_stricmp( rhs.m_pchFriendlyName, m_pchFriendlyName ) > 0; + } + }; + static CUtlRBTree< font_name_entry > m_FriendlyNameCache; + static bool ms_bSetFriendlyNameCacheLessFunc; +}; + +#endif // LINUXFONT_H |