You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.8 KiB
147 lines
3.8 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef OSXFONT_H
|
||
|
#define OSXFONT_H
|
||
|
|
||
|
#include "utlrbtree.h"
|
||
|
#include "utlsymbol.h"
|
||
|
#include "tier1/strtools.h"
|
||
|
#include "tier1/utlstring.h"
|
||
|
#include <tier0/memdbgoff.h>
|
||
|
#include <ApplicationServices/ApplicationServices.h>
|
||
|
#include <Carbon/Carbon.h>
|
||
|
#include <tier0/memdbgon.h>
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: encapsulates a OSX font
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class COSXFont
|
||
|
{
|
||
|
public:
|
||
|
COSXFont();
|
||
|
~COSXFont();
|
||
|
|
||
|
// 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
|
||
|
ATSUStyle *SetAsActiveFont( CGContextRef cgContext );
|
||
|
|
||
|
// 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
|
||
|
virtual 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 weight of the font
|
||
|
virtual int GetWeight() { return m_iWeight; }
|
||
|
|
||
|
// 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 );
|
||
|
|
||
|
#ifdef DBGFLAG_VALIDATE
|
||
|
void Validate( CValidator &validator, char *pchName );
|
||
|
#endif
|
||
|
|
||
|
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_iMaxCharWidth;
|
||
|
int m_iAscent;
|
||
|
|
||
|
int m_iScanLines;
|
||
|
int m_iBlur;
|
||
|
float *m_pGaussianDistribution;
|
||
|
|
||
|
private:
|
||
|
bool CreateStyle( float flFontSize, bool bBold );
|
||
|
bool CreateTextLayout();
|
||
|
|
||
|
// 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;
|
||
|
};
|
||
|
|
||
|
// Cache for storing asian abc widths (since it's too big too just store them all).
|
||
|
struct kernedSize
|
||
|
{
|
||
|
float wide;
|
||
|
float abcA;
|
||
|
};
|
||
|
|
||
|
struct kerned_abc_cache_t
|
||
|
{
|
||
|
wchar_t wch;
|
||
|
wchar_t wchBefore;
|
||
|
wchar_t wchAfter;
|
||
|
kernedSize abc;
|
||
|
};
|
||
|
|
||
|
static bool ExtendedABCWidthsCacheLessFunc(const abc_cache_t &lhs, const abc_cache_t &rhs);
|
||
|
static bool ExtendedKernedABCWidthsCacheLessFunc(const kerned_abc_cache_t &lhs, const kerned_abc_cache_t &rhs);
|
||
|
|
||
|
CUtlRBTree<abc_cache_t, unsigned short> m_ExtendedABCWidthsCache;
|
||
|
CUtlRBTree<kerned_abc_cache_t, unsigned short> m_ExtendedKernedABCWidthsCache;
|
||
|
|
||
|
char *m_pContextMemory;
|
||
|
ATSUFontID m_ATSUFont;
|
||
|
CGContextRef m_ContextRef;
|
||
|
ATSUStyle m_ATSUStyle;
|
||
|
ATSUTextLayout m_ATSUTextLayout;
|
||
|
};
|
||
|
|
||
|
#endif // OSXFONT_H
|