Add RTL level property and print flag

Again, the RTL property controls whether textboxes will be
right-aligned, and that kind of stuff. It can't be font-bound, since
Space Station supports Hebrew characters and we want to be able to
support, say, a Hebrew translation or Hebrew levels in the future
without having to make a dedicated (or duplicated) font for it.
Therefore it's a property of both the language pack as well as custom
levels - like custom levels already had a <font> tag, they now also
have an <rtl> tag that sets this property.

Right now, we'll have to hardcode it so the menu option for the Arabic
font sets the <rtl> property to 1, and all the other options set it to
0. But it's future-proof in that we can later decide to split the
option for Space Station into an LTR option and an RTL option (so both
"english/..." and "עברית" would select Space Station, but one sets the
RTL property to 0 and the other sets it to 1).
This commit is contained in:
Dav999
2024-01-03 20:09:23 +01:00
committed by Misa Elizabeth Kai
parent 37c4f76988
commit 29e2b19698
11 changed files with 83 additions and 20 deletions

View File

@@ -282,11 +282,16 @@ bool is_joiner(const uint32_t codepoint)
return codepoint == 0x200C || codepoint == 0x200D;
}
bool bidi_should_transform(const char* text)
bool bidi_should_transform(const bool rtl, const char* text)
{
/* Just as an optimization, only run the whole bidi machinery if the
* language is actually an RTL one, _or_ if an RTL character is found. */
if (rtl)
{
return true;
}
const char* text_ptr = text;
uint32_t ch;
while ((ch = UTF8_next(&text_ptr)))
@@ -313,7 +318,7 @@ bool bidi_should_transform(const char* text)
return false;
}
const char* bidi_transform(const char* text)
const char* bidi_transform(const bool rtl, const char* text)
{
uint32_t utf32_in[1024];
int n_codepoints = 0;
@@ -345,7 +350,12 @@ const char* bidi_transform(const char* text)
{
return text;
}
SBParagraphRef paragraph = SBAlgorithmCreateParagraph(algorithm, 0, INT32_MAX, SBLevelDefaultRTL);
SBParagraphRef paragraph = SBAlgorithmCreateParagraph(
algorithm,
0,
INT32_MAX,
rtl ? SBLevelDefaultRTL : SBLevelDefaultLTR
);
SDL_assert(paragraph != NULL);
SBUInteger paragraph_len = SBParagraphGetLength(paragraph);
SBLineRef paragraph_line = SBParagraphCreateLine(paragraph, 0, paragraph_len);