re3/src/render/Font.h

176 lines
4.8 KiB
C
Raw Normal View History

2019-05-22 18:28:53 +00:00
#pragma once
struct CFontDetails
{
CRGBA color;
float scaleX;
float scaleY;
float slant;
float slantRefX;
float slantRefY;
bool justify;
bool centre;
bool rightJustify;
bool background;
bool backgroundOnlyText;
bool proportional;
float alphaFade;
CRGBA backgroundColor;
float wrapX;
float centreSize;
float rightJustifyWrap;
int16 style;
int32 bank;
int16 dropShadowPosition;
CRGBA dropColor;
};
class CSprite2d;
2019-05-30 22:32:50 +00:00
enum {
2019-05-30 22:37:14 +00:00
FONT_BANK,
FONT_PAGER,
FONT_HEADING,
2020-03-31 05:38:22 +00:00
#ifdef MORE_LANGUAGES
FONT_JAPANESE,
#endif
2020-04-17 05:54:14 +00:00
MAX_FONTS
2019-05-30 22:32:50 +00:00
};
enum {
ALIGN_LEFT,
ALIGN_CENTER,
ALIGN_RIGHT,
};
2020-03-29 06:35:13 +00:00
#ifdef MORE_LANGUAGES
enum
{
FONT_LANGSET_EFIGS,
2020-03-31 05:38:22 +00:00
FONT_LANGSET_RUSSIAN,
2020-04-19 19:32:59 +00:00
FONT_LANGSET_POLISH,
2020-04-26 20:49:24 +00:00
FONT_LANGSET_JAPANESE,
2020-04-19 19:32:59 +00:00
LANGSET_MAX
2020-03-29 06:35:13 +00:00
};
2020-04-26 20:49:24 +00:00
#define FONT_LOCALE(style) (CFont::IsJapanese() ? FONT_JAPANESE : style)
#else
#define FONT_LOCALE(style) (style)
#endif
2020-03-31 05:38:22 +00:00
2019-05-22 18:28:53 +00:00
class CFont
{
2020-03-29 06:35:13 +00:00
#ifdef MORE_LANGUAGES
2020-04-19 19:32:59 +00:00
static int16 Size[LANGSET_MAX][MAX_FONTS][193];
2020-03-29 06:35:13 +00:00
static uint8 LanguageSet;
static int32 Slot;
#else
2020-04-17 05:54:14 +00:00
static int16 Size[MAX_FONTS][193];
2020-03-29 06:35:13 +00:00
#endif
2020-04-17 05:54:14 +00:00
static int16 NewLine;
2019-05-22 18:28:53 +00:00
public:
2020-05-23 23:59:30 +00:00
static CSprite2d Sprite[MAX_FONTS];
2020-04-17 05:54:14 +00:00
static CFontDetails Details;
2019-05-22 18:28:53 +00:00
static void Initialise(void);
static void Shutdown(void);
static void InitPerFrame(void);
2020-04-02 06:51:35 +00:00
static void PrintChar(float x, float y, wchar c);
static void PrintString(float x, float y, wchar *s);
static int GetNumberLines(float xstart, float ystart, wchar *s);
static void GetTextRect(CRect *rect, float xstart, float ystart, wchar *s);
2020-03-31 05:38:22 +00:00
#ifdef MORE_LANGUAGES
static bool PrintString(float x, float y, wchar *start, wchar* &end, float spwidth, float japX);
#else
2020-04-02 06:51:35 +00:00
static void PrintString(float x, float y, wchar *start, wchar *end, float spwidth);
2020-03-31 05:38:22 +00:00
#endif
2020-04-02 06:51:35 +00:00
static float GetCharacterWidth(wchar c);
static float GetCharacterSize(wchar c);
static float GetStringWidth(wchar *s, bool spaces = false);
2020-04-26 20:49:24 +00:00
#ifdef MORE_LANGUAGES
static float GetStringWidth_Jap(wchar* s);
#endif
2020-03-31 05:38:22 +00:00
static uint16 *GetNextSpace(wchar *s);
#ifdef MORE_LANGUAGES
static uint16 *ParseToken(wchar *s, wchar*, bool japShit = false);
#else
static uint16 *ParseToken(wchar *s, wchar*);
#endif
2019-05-22 18:28:53 +00:00
static void DrawFonts(void);
2020-03-31 05:38:22 +00:00
static uint16 character_code(uint8 c);
2019-05-22 18:28:53 +00:00
static CFontDetails GetDetails() { return Details; }
2020-03-31 05:38:22 +00:00
static void SetScale(float x, float y);
2019-05-22 18:28:53 +00:00
static void SetSlantRefPoint(float x, float y) { Details.slantRefX = x; Details.slantRefY = y; }
static void SetSlant(float s) { Details.slant = s; }
static void SetJustifyOn(void) {
Details.justify = true;
Details.centre = false;
Details.rightJustify = false;
}
static void SetJustifyOff(void) {
Details.justify = false;
Details.rightJustify = false;
}
static void SetRightJustifyOn(void) {
Details.rightJustify = true;
Details.justify = false;
Details.centre = false;
}
static void SetRightJustifyOff(void) {
Details.rightJustify = false;
Details.justify = false;
Details.centre = false;
}
static void SetCentreOn(void) {
Details.centre = true;
Details.justify = false;
Details.rightJustify = false;
}
static void SetCentreOff(void) {
Details.centre = false;
}
static void SetAlignment(uint8 alignment) {
if (alignment == ALIGN_LEFT) {
CFont::Details.justify = true;
CFont::Details.centre = false;
CFont::Details.rightJustify = false;
}
else if (alignment == ALIGN_CENTER) {
CFont::Details.justify = false;
CFont::Details.centre = true;
CFont::Details.rightJustify = false;
}
else if (alignment == ALIGN_RIGHT) {
CFont::Details.justify = false;
CFont::Details.centre = false;
CFont::Details.rightJustify = true;
}
}
2019-05-22 18:28:53 +00:00
static void SetWrapx(float x) { Details.wrapX = x; }
static void SetCentreSize(float s) { Details.centreSize = s; }
static void SetBackgroundOn(void) { Details.background = true; }
static void SetBackgroundOff(void) { Details.background = false; }
static void SetBackGroundOnlyTextOn(void) { Details.backgroundOnlyText = true; }
static void SetBackGroundOnlyTextOff(void) { Details.backgroundOnlyText = false; }
static void SetPropOn(void) { Details.proportional = true; }
static void SetPropOff(void) { Details.proportional = false; }
static void SetFontStyle(int16 style) { Details.style = style; }
static void SetRightJustifyWrap(float wrap) { Details.rightJustifyWrap = wrap; }
static void SetAlphaFade(float fade) { Details.alphaFade = fade; }
static void SetDropShadowPosition(int16 pos) { Details.dropShadowPosition = pos; }
2020-04-26 20:49:24 +00:00
static void SetBackgroundColor(CRGBA col);
static void SetColor(CRGBA col);
static void SetDropColor(CRGBA col);
2019-05-22 18:28:53 +00:00
2020-03-31 05:38:22 +00:00
#ifdef MORE_LANGUAGES
2020-03-29 06:35:13 +00:00
static void ReloadFonts(uint8 set);
2020-04-15 21:24:49 +00:00
// japanese stuff
static bool IsAnsiCharacter(wchar* s);
2020-04-26 20:49:24 +00:00
static bool IsJapanesePunctuation(wchar* str);
2020-04-15 21:24:49 +00:00
static bool IsJapanese() { return LanguageSet == FONT_LANGSET_JAPANESE; }
static bool IsJapaneseFont() { return IsJapanese() && (Details.style == FONT_JAPANESE || Details.style == FONT_PAGER); }
2020-03-31 05:38:22 +00:00
#endif
2019-05-22 18:28:53 +00:00
};