[ImageFont] Fix escape sequence parsing, add note to the docs.

This commit is contained in:
bruvzg 2024-08-08 22:41:09 +03:00
parent 803dfcc3cb
commit 4cc065c2db
No known key found for this signature in database
GPG Key ID: 7960FCF39844EC38
2 changed files with 5 additions and 3 deletions

View File

@ -40,7 +40,7 @@
</member> </member>
<member name="kerning_pairs" type="PackedStringArray" setter="" getter="" default="PackedStringArray()"> <member name="kerning_pairs" type="PackedStringArray" setter="" getter="" default="PackedStringArray()">
Kerning pairs for the font. Kerning pair adjust the spacing between two characters. Kerning pairs for the font. Kerning pair adjust the spacing between two characters.
Each string consist of three space separated values: "from" string, "to" string and integer offset. Each combination form the two string for a kerning pair, e.g, [code]ab cd -3[/code] will create kerning pairs [code]ac[/code], [code]ad[/code], [code]bc[/code], and [code]bd[/code] with offset [code]-3[/code]. Each string consist of three space separated values: "from" string, "to" string and integer offset. Each combination form the two string for a kerning pair, e.g, [code]ab cd -3[/code] will create kerning pairs [code]ac[/code], [code]ad[/code], [code]bc[/code], and [code]bd[/code] with offset [code]-3[/code]. [code]\uXXXX[/code] escape sequences can be used to add Unicode characters.
</member> </member>
<member name="rows" type="int" setter="" getter="" default="1"> <member name="rows" type="int" setter="" getter="" default="1">
Number of rows in the font image. See also [member columns]. Number of rows in the font image. See also [member columns].

View File

@ -293,18 +293,20 @@ Error ResourceImporterImageFont::import(const String &p_source_file, const Strin
} }
String from_tokens; String from_tokens;
for (int i = 0; i < kp_tokens[0].length(); i++) { for (int i = 0; i < kp_tokens[0].length(); i++) {
if (i <= kp_tokens[0].length() - 6 && kp_tokens[0][i] == '\\' && kp_tokens[0][i + 1] == 'u') { if (i <= kp_tokens[0].length() - 6 && kp_tokens[0][i] == '\\' && kp_tokens[0][i + 1] == 'u' && is_hex_digit(kp_tokens[0][i + 2]) && is_hex_digit(kp_tokens[0][i + 3]) && is_hex_digit(kp_tokens[0][i + 4]) && is_hex_digit(kp_tokens[0][i + 5])) {
char32_t charcode = kp_tokens[0].substr(i + 2, 4).hex_to_int(); char32_t charcode = kp_tokens[0].substr(i + 2, 4).hex_to_int();
from_tokens += charcode; from_tokens += charcode;
i += 5;
} else { } else {
from_tokens += kp_tokens[0][i]; from_tokens += kp_tokens[0][i];
} }
} }
String to_tokens; String to_tokens;
for (int i = 0; i < kp_tokens[1].length(); i++) { for (int i = 0; i < kp_tokens[1].length(); i++) {
if (i <= kp_tokens[1].length() - 6 && kp_tokens[1][i] == '\\' && kp_tokens[1][i + 1] == 'u') { if (i <= kp_tokens[1].length() - 6 && kp_tokens[1][i] == '\\' && kp_tokens[1][i + 1] == 'u' && is_hex_digit(kp_tokens[1][i + 2]) && is_hex_digit(kp_tokens[1][i + 3]) && is_hex_digit(kp_tokens[1][i + 4]) && is_hex_digit(kp_tokens[1][i + 5])) {
char32_t charcode = kp_tokens[1].substr(i + 2, 4).hex_to_int(); char32_t charcode = kp_tokens[1].substr(i + 2, 4).hex_to_int();
to_tokens += charcode; to_tokens += charcode;
i += 5;
} else { } else {
to_tokens += kp_tokens[1][i]; to_tokens += kp_tokens[1][i];
} }