1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

Restore old font bitmaps when the game is in legacy mode

Arabic is disabled in this mode.
This commit is contained in:
Mathieu Schroeter 2022-10-22 18:35:56 +02:00
parent e619f998ac
commit df91ad1c84
No known key found for this signature in database
GPG Key ID: 8B9145A5FA9DA8A8
2 changed files with 267 additions and 4 deletions

View File

@ -1688,7 +1688,8 @@ CEvent::CEvent ()
m_Languages.push_back (Language::tr);
m_Languages.push_back (Language::pt);
m_Languages.push_back (Language::he);
m_Languages.push_back (Language::ar);
if (!(g_settingsOverload & SETTING_LEGACY))
m_Languages.push_back (Language::ar);
this->m_LangStart = GetLocale ();
@ -1708,7 +1709,7 @@ CEvent::CEvent ()
m_Lang = m_Languages.begin () + 7;
else if (this->m_LangStart == "he")
m_Lang = m_Languages.begin () + 8;
else if (this->m_LangStart == "ar")
else if (this->m_LangStart == "ar" && !(g_settingsOverload & SETTING_LEGACY))
m_Lang = m_Languages.begin () + 9;
else
m_Lang = m_Languages.begin ();
@ -4201,7 +4202,7 @@ CEvent::GetStartLanguage ()
return Language::pt;
if (this->m_LangStart == "he")
return Language::he;
if (this->m_LangStart == "ar")
if (this->m_LangStart == "ar" && !(g_settingsOverload & SETTING_LEGACY))
return Language::ar;
return Language::en;
}

View File

@ -393,6 +393,243 @@ public:
}
};
/**
* \brief Return the character offset for the sprite.
*
* \param[in] c - The character (incremented if 0xC3 or 0xC4 or 0xC5 UTF-8).
* \returns the offset.
*/
static Uint8
GetOffset (const char *& c)
{
/* clang-format off */
static const unsigned char table_c3[] = {
/* ü à â é è ë ê ï */
0xBC, 0xA0, 0xA2, 0xA9, 0xA8, 0xAB, 0xAA, 0xAF,
/* î ô ù û ä ö ç ò */
0xAE, 0xB4, 0xB9, 0xBB, 0xA4, 0xB6, 0xA7, 0xB2,
/* ì ó Ç Ö Ü õ ã */
0xAC, 0xB3, 0x87, 0x96, 0x9C, 0xB5, 0xA3
};
static const unsigned char table_c4[] = {
/* ę ć ą Ğ ğ İ ı */
0x99, 0x87, 0x85, 0x9E, 0x9F, 0xB0, 0xB1,
};
static const unsigned char table_c5[] = {
/* ń ź ż ł ś Ş ş */
0x84, 0xBA, 0xBC, 0x82, 0x9B, 0x9E, 0x9F,
};
static const unsigned char table_d7[] = {
/*a ז ו ה ד ג ב א */
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
/*a מ ל ך כ י ט ח */
0x97, 0x98, 0x99, 0x9B, 0x9A, 0x9C, 0x9E,
/*a ף פ ע ס ן נ ם */
0x9D, 0xA0, 0x9F, 0xA1, 0xA2, 0xA4, 0xA3,
/*a ת ש ר ק ץ צ */
0xA6, 0xA5, 0xA7, 0xA8, 0xA9, 0xAA,
};
/* clang-format on */
int offset = 0;
int inc = 0;
size_t size = 0;
const unsigned char * table = nullptr;
switch (static_cast<unsigned char> (*c))
{
case 0xC3:
offset = 128;
table = table_c3;
size = countof (table_c3);
inc = 1;
break;
case 0xC4:
offset = 128 + 32;
table = table_c4;
size = countof (table_c4);
inc = 1;
break;
case 0xC5:
offset = 128 + 64;
table = table_c5;
size = countof (table_c5);
inc = 1;
break;
case 0xD7:
offset = 128 + 96;
table = table_d7;
size = countof (table_d7);
inc = 1;
break;
}
for (size_t i = 0; i < size; ++i)
if (static_cast<unsigned char> (*(c + inc)) == table[i])
return offset + i;
if (*(c + inc) < 0)
return 1; // square
return *(c + inc);
}
/**
* \brief Return the character length.
*
* \param[in] c - The character (can be incremented).
* \param[in] font - The font used (little or normal).
* \returns the length.
*/
Uint8
GetCharWidth (const char *& c, Sint32 font)
{
// clang-format off
static const Uint8 table_width[] =
{
9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10,
5, 6, 9, 13, 11, 12, 12, 6, 6, 6, 12, 12, 5, 9, 6, 9,
8, 8, 9, 9, 8, 9, 8, 8, 9, 9, 6, 6, 8, 9, 10, 11,
12, 8, 9, 9, 9, 8, 8, 8, 9, 4, 8, 9, 8, 10, 9, 9,
8, 9, 8, 9, 10, 8, 9, 11, 9, 8, 10, 7, 10, 7, 13, 13,
9, 9, 8, 8, 8, 8, 6, 8, 8, 4, 6, 8, 4, 12, 8, 8,
8, 8, 7, 6, 7, 8, 8, 10, 8, 8, 7, 6, 6, 6, 10, 0,
8, 9, 9, 8, 8, 8, 8, 5, 5, 8, 8, 8, 9, 8, 8, 8,
5, 8, 9, 9, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 8, 9, 8, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 8, 7, 6, 7, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 9, 8, 8, 9, 5, 7, 9, 10, 6, 8, 8, 9, 10, 9, 6,
7, 9, 9, 8, 9, 9, 10, 9, 8, 12, 10, 0, 0, 0, 0, 0,
};
static const Uint8 table_width_little[] =
{
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5,
3, 3, 5, 8, 5, 11, 9, 3, 4, 4, 6, 6, 3, 4, 3, 6,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 6, 7, 6,
9, 8, 6, 7, 7, 5, 5, 8, 7, 2, 4, 7, 5, 10, 7, 8,
6, 8, 7, 6, 6, 6, 8, 12, 7, 6, 6, 3, 5, 3, 6, 8,
4, 6, 6, 6, 6, 6, 4, 6, 6, 2, 3, 5, 2, 10, 6, 6,
6, 6, 3, 5, 3, 6, 6, 8, 6, 6, 5, 4, 6, 4, 7, 0,
7, 6, 6, 6, 6, 6, 6, 3, 3, 6, 6, 6, 6, 6, 6, 6,
3, 6, 7, 8, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6, 5, 7, 8, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6, 5, 5, 4, 5, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7, 7, 5, 6, 7, 2, 4, 7, 7, 3, 5, 7, 6, 7, 7, 4,
3, 7, 7, 7, 8, 7, 6, 7, 7, 9, 8, 0, 0, 0, 0, 0,
};
// clang-format on
if (font == FONTLITTLE)
return table_width_little[GetOffset (c)];
return table_width[GetOffset (c)] - 1;
}
/**
* \brief Draw a text in a pixmap to a specific position.
*
* \param[in] pPixmap - The pixmap where it must be drawn.
* \param[in] pos - The coordinates for the text.
* \param[in] pText - The text.
* \param[in] font - The font style (little or normal).
* \param[in] slope - Text slope.
*/
void
DrawTextLegacy (
CPixmap * pPixmap, Point pos, const char * pText, Sint32 font, Sint32 slope)
{
Sint32 rank;
bool isLatin = false;
int numberSize = 0;
const char * it = nullptr;
int skip = 0;
Sint32 start = pos.y;
Sint32 rel = 0;
auto useD7 = strchr (pText, 0xD7) != nullptr;
auto isRightReading = useD7 && IsRightReading ();
auto length = strlen (pText);
if (length >= 1 && !useD7 && IsRightReading ())
pos.x -= GetTextWidth (pText, font);
while (*pText != '\0' || skip)
{
if (isRightReading && numberSize == 0)
{
const auto test = [](const char * text) -> bool {
return *text > ' ' && *text <= '~';
};
it = pText;
isLatin = test (pText);
if (isLatin)
{
while (test (pText))
++pText;
numberSize = pText - it;
skip = numberSize - 1;
}
}
if (numberSize)
{
pText = it + numberSize - 1;
numberSize--;
}
rank = GetOffset (pText);
if (isRightReading)
{
if (rank == '(')
rank = ')';
else if (rank == ')')
rank = '(';
}
auto inc = rank > 127;
auto lg = GetCharWidth (pText, font);
if (isRightReading)
pos.x += -lg;
rel += lg;
if (slope)
pos.y = start + rel / slope;
if (font != FONTLITTLE)
{
rank += 256 * font;
pPixmap->DrawIcon (-1, CHTEXT, rank, pos);
}
else
pPixmap->DrawIcon (-1, CHLITTLE, rank, pos);
if (!isRightReading)
pos.x += lg;
if (!numberSize && skip > 0)
{
pText += skip;
skip = 0;
}
if (inc)
pText++;
pText++;
}
}
Fonts *
GetFonts ()
{
@ -413,7 +650,10 @@ void
DrawText (
CPixmap * pPixmap, Point pos, const char * pText, Sint32 font, Sint32 slope)
{
GetFonts ()->Draw (pPixmap, font, pos, pText, slope);
if (g_settingsOverload & SETTING_LEGACY)
DrawTextLegacy(pPixmap, pos, pText, font, slope);
else
GetFonts ()->Draw (pPixmap, font, pos, pText, slope);
}
// Affiche un pavé de texte.
@ -572,9 +812,31 @@ GetTextHeight (char * pText, Sint32 font, Sint32 part)
// Retourne la longueur d'un texte.
Sint32
GetTextWidthLegacy (const char * pText, Sint32 font)
{
Sint32 width = 0;
while (*pText != 0)
{
auto rank = GetOffset (pText);
auto inc = rank > 127;
width += GetCharWidth (pText, font);
if (inc)
pText++;
pText++;
}
return width;
}
Sint32
GetTextWidth (const char * pText, Sint32 font)
{
if (g_settingsOverload & SETTING_LEGACY)
return GetTextWidthLegacy (pText, font);
return GetFonts ()->GetTextWidth (pText, font);
}