2019-05-22 20:28:53 +02: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-31 00:32:50 +02:00
|
|
|
enum {
|
2019-05-31 00:37:14 +02:00
|
|
|
FONT_BANK,
|
|
|
|
FONT_PAGER,
|
|
|
|
FONT_HEADING,
|
2019-05-31 00:32:50 +02:00
|
|
|
};
|
|
|
|
|
2019-06-25 02:34:29 +02:00
|
|
|
enum {
|
|
|
|
ALIGN_LEFT,
|
|
|
|
ALIGN_CENTER,
|
|
|
|
ALIGN_RIGHT,
|
|
|
|
};
|
|
|
|
|
2020-03-29 08:35:13 +02:00
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
FONT_LANGSET_EFIGS,
|
|
|
|
FONT_LANGSET_RUSSIAN
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2019-05-22 20:28:53 +02:00
|
|
|
class CFont
|
|
|
|
{
|
2020-03-29 08:35:13 +02:00
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
static int16 Size[2][3][193];
|
|
|
|
static uint8 LanguageSet;
|
|
|
|
static int32 Slot;
|
|
|
|
#else
|
2019-05-22 20:28:53 +02:00
|
|
|
static int16 Size[3][193];
|
2020-03-29 08:35:13 +02:00
|
|
|
#endif
|
2019-05-22 20:28:53 +02:00
|
|
|
static int16 

|
|
|
|
static CSprite2d *Sprite; //[3]
|
|
|
|
public:
|
2020-01-07 15:23:09 +01:00
|
|
|
static CFontDetails& Details;
|
|
|
|
|
2019-05-22 20:28:53 +02:00
|
|
|
static void Initialise(void);
|
|
|
|
static void Shutdown(void);
|
|
|
|
static void InitPerFrame(void);
|
|
|
|
static void PrintChar(float x, float y, uint16 c);
|
|
|
|
static void PrintString(float x, float y, uint16 *s);
|
|
|
|
static int GetNumberLines(float xstart, float ystart, uint16 *s);
|
|
|
|
static void GetTextRect(CRect *rect, float xstart, float ystart, uint16 *s);
|
|
|
|
static void PrintString(float x, float y, uint16 *start, uint16 *end, float spwidth);
|
|
|
|
static float GetCharacterWidth(uint16 c);
|
|
|
|
static float GetCharacterSize(uint16 c);
|
|
|
|
static float GetStringWidth(uint16 *s, bool spaces = false);
|
|
|
|
static uint16 *GetNextSpace(uint16 *s);
|
|
|
|
static uint16 *ParseToken(uint16 *s, uint16*);
|
|
|
|
static void DrawFonts(void);
|
|
|
|
static uint16 character_code(uint8 c);
|
|
|
|
|
2019-06-25 02:34:29 +02:00
|
|
|
static CFontDetails GetDetails() { return Details; }
|
2019-05-22 20:28:53 +02:00
|
|
|
static void SetScale(float x, float y) { Details.scaleX = x; Details.scaleY = y; }
|
|
|
|
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;
|
|
|
|
}
|
2019-06-25 02:34:29 +02:00
|
|
|
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 20:28:53 +02: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; }
|
|
|
|
|
|
|
|
// TODO: really just CRGBA but that isn't passed correctly
|
|
|
|
static void SetBackgroundColor(const CRGBA &col) { Details.backgroundColor = col; }
|
|
|
|
static void SetColor(const CRGBA &col) {
|
|
|
|
Details.color = col;
|
|
|
|
if(Details.alphaFade < 255.0f)
|
|
|
|
Details.color.a *= Details.alphaFade/255.0f;
|
|
|
|
}
|
|
|
|
static void SetDropColor(const CRGBA &col) {
|
|
|
|
Details.dropColor = col;
|
|
|
|
if(Details.alphaFade < 255.0f)
|
|
|
|
Details.dropColor.a *= Details.alphaFade/255.0f;
|
|
|
|
}
|
2020-03-29 08:35:13 +02:00
|
|
|
|
|
|
|
static void ReloadFonts(uint8 set);
|
2019-05-22 20:28:53 +02:00
|
|
|
};
|