jedioutcast/code/renderer/tr_font.h
2013-04-04 13:01:17 -05:00

81 lines
2.8 KiB
C++

// Filename:- tr_font.h
//
// font support
#ifndef TR_FONT_H
#define TR_FONT_H
#define GLYPH_MAX_KOREAN_SHADERS 3
#define GLYPH_MAX_TAIWANESE_SHADERS 4
#define GLYPH_MAX_JAPANESE_SHADERS 3
#define GLYPH_MAX_ASIAN_SHADERS 4 // this MUST equal the larger of the above defines
class CFontInfo
{
private:
// From the fontdat file
glyphInfo_t mGlyphs[GLYPH_COUNT];
int mPointSize;
int mHeight;
int mAscender;
int mDescender;
int mAsianHack;
// end of fontdat data
int mShader; // handle to the shader with the glyph
char m_sFontName[MAX_QPATH]; // eg "fonts/lcd" // needed for korean font-hint if we need >1 hangul set
int m_hAsianShaders[GLYPH_MAX_ASIAN_SHADERS]; // shaders for Korean glyphs where applicable
glyphInfo_t m_AsianGlyph; // special glyph containing asian->western scaling info for all glyphs
int m_iAsianGlyphsAcross; // needed to dynamically calculate S,T coords
int m_iAsianPagesLoaded;
bool m_bAsianLastPageHalfHeight;
int m_iAsianLanguageLoaded; // doesn't matter what this is, so long as it's comparable as being changed
public:
bool mbRoundCalcs; // trying to make this !@#$%^ thing work with scaling
CFontInfo(const char *fontName);
CFontInfo(int fill) { memset(this, fill, sizeof(*this)); }
~CFontInfo(void) {}
const int GetPointSize(void) const { return(mPointSize); }
const int GetHeight(void) const { return(mHeight); }
const int GetAscender(void) const { return(mAscender); }
const int GetDescender(void) const { return(mDescender); }
const glyphInfo_t *GetLetter(const unsigned int uiLetter, int *piShader = NULL);
const int GetAsianCode(ulong uiLetter) const;
const int GetLetterWidth(const unsigned int uiLetter) const;
const int GetLetterHorizAdvance(const unsigned int uiLetter) const;
const int GetShader(void) const { return(mShader); }
void FlagNoAsianGlyphs(void) { m_hAsianShaders[0] = 0; m_iAsianLanguageLoaded = -1; } // used during constructor
bool AsianGlyphsAvailable(void) const { return !!(m_hAsianShaders[0]); }
void UpdateAsianIfNeeded( bool bForceReEval = false);
};
void R_ShutdownFonts(void);
void R_InitFonts(void);
int RE_RegisterFont(const char *psName);
int RE_Font_StrLenPixels(const char *psText, const int iFontHandle, const float fScale = 1.0f);
int RE_Font_StrLenChars(const char *psText);
int RE_Font_HeightPixels(const int iFontHandle, const float fScale = 1.0f);
void RE_Font_DrawString(int ox, int oy, const char *psText, const float *rgba, const int iFontHandle, int iMaxPixelWidth, const float fScale = 1.0f);
unsigned int AnyLanguage_ReadCharFromString( const char **ppsText, qboolean *pbIsTrailingPunctuation = NULL);
qboolean Language_IsAsian(void);
#endif // #ifndef TR_FONT_H
// end