diff options
Diffstat (limited to 'common/vgui_surfacelib/Win32Font.h')
| -rw-r--r-- | common/vgui_surfacelib/Win32Font.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/common/vgui_surfacelib/Win32Font.h b/common/vgui_surfacelib/Win32Font.h new file mode 100644 index 0000000..7122fa9 --- /dev/null +++ b/common/vgui_surfacelib/Win32Font.h @@ -0,0 +1,148 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef WIN32FONT_H +#define WIN32FONT_H +#ifdef _WIN32 +#pragma once +#endif + +#if !defined( _X360 ) +#define WIN32_LEAN_AND_MEAN +#define OEMRESOURCE +#include <windows.h> +#endif +#ifdef GetCharABCWidths +#undef GetCharABCWidths +#endif + +#include "utlrbtree.h" +#include "tier1/utlsymbol.h" + +struct newChar_t; + +//----------------------------------------------------------------------------- +// Purpose: encapsulates a windows font +//----------------------------------------------------------------------------- + +class CWin32Font +{ +public: + CWin32Font(); + ~CWin32Font(); + + // creates the font from windows. returns false if font does not exist in the OS. + virtual bool Create(const char *windowsFontName, 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 + 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 + virtual void SetAsActiveFont(HDC hdc); + + // returns the height of the font, in pixels + virtual int GetHeight(); + + // returns requested height of 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 + bool GetUnderlined() { return m_bUnderlined; } + + // gets the name of this font + const char *GetName() { return m_szName.String(); } + const char *GetFamilyName() { return NULL; } + + // gets the width of ch given its position around before and after chars + void GetKernedCharWidth( wchar_t ch, wchar_t chBefore, wchar_t chAfter, float &wide, float &abcA ); + +#if defined( _X360 ) + // generates texture data for a set of chars + virtual void GetCharsRGBA( newChar_t *newChars, int numNewChars, unsigned char *pRGBA ); + + virtual void CloseResource(); +#endif + +private: + +#if !defined( _X360 ) + HFONT m_hFont; + HDC m_hDC; + HBITMAP m_hDIB; +#else + HXUIFONT m_hFont; + HDC m_hDC; +#endif + + // pointer to buffer for use when generated bitmap versions of a texture + unsigned char *m_pBuf; + +protected: + CUtlSymbol m_szName; + + short m_iTall; + unsigned short m_iWeight; + unsigned short m_iFlags; + unsigned short m_iScanLines; + unsigned short m_iBlur; + unsigned short m_rgiBitmapSize[2]; + bool m_bUnderlined; + + unsigned int m_iHeight : 8; + unsigned int m_iMaxCharWidth : 8; + unsigned int m_iAscent : 8; + unsigned int m_iDropShadowOffset : 1; + unsigned int m_iOutlineSize : 1; + unsigned int m_bAntiAliased : 1; + unsigned int m_bRotary : 1; + unsigned int m_bAdditive : 1; //29 + +private: + // abc widths + struct abc_t + { + short b; + char a; + char c; + }; + +#if !defined( _X360 ) + // On PC we cache char widths on demand when actually requested to minimize our use of the kernels + // paged pool (GDI may cache information about glyphs we have requested and take up lots of paged pool) + 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); +#else + // 360 requires all possible characters during font init + enum { ABCWIDTHS_CACHE_SIZE = 256 }; + abc_t m_ABCWidthsCache[ABCWIDTHS_CACHE_SIZE]; +#endif +}; + +#endif // WIN32FONT_H |