|
@@ -39,7 +39,8 @@ static char *WrapText(Font font, const char *text, float fontSize,
|
|
|
char savedChar = result[i + 1];
|
|
char savedChar = result[i + 1];
|
|
|
result[i + 1] = '\0';
|
|
result[i + 1] = '\0';
|
|
|
|
|
|
|
|
- Vector2 size = MeasureTextEx(font, &result[currentLineStartIdx], fontSize, spacing);
|
|
|
|
|
|
|
+ Vector2 size = MeasureTextEx(font, &result[currentLineStartIdx],
|
|
|
|
|
+ fontSize, spacing);
|
|
|
|
|
|
|
|
result[i + 1] = savedChar;
|
|
result[i + 1] = savedChar;
|
|
|
|
|
|
|
@@ -67,6 +68,41 @@ static char *WrapText(Font font, const char *text, float fontSize,
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int GetUtf8ByteLength(const char *text, int count)
|
|
|
|
|
+{
|
|
|
|
|
+ if (!text || count <= 0) return 0;
|
|
|
|
|
+
|
|
|
|
|
+ int byte_len = 0;
|
|
|
|
|
+ int glyph_count = 0;
|
|
|
|
|
+
|
|
|
|
|
+ while (text[byte_len] != '\0' && glyph_count < count)
|
|
|
|
|
+ {
|
|
|
|
|
+ unsigned char c = (unsigned char)text[byte_len];
|
|
|
|
|
+ int current_char_len = 1;
|
|
|
|
|
+
|
|
|
|
|
+ if (c >= 0xF0) current_char_len = 4; // Emoji (unsupported)
|
|
|
|
|
+ else if (c >= 0xE0) current_char_len = 3; // CJK
|
|
|
|
|
+ else if (c >= 0xC0) current_char_len = 2; // Cyryllic
|
|
|
|
|
+ else current_char_len = 1; // ASCII
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < current_char_len; i++) {
|
|
|
|
|
+ if (text[byte_len + i] == '\0') {
|
|
|
|
|
+ return byte_len;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Skipping emojis...
|
|
|
|
|
+ if (current_char_len == 4) {
|
|
|
|
|
+ byte_len += 4;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ byte_len += current_char_len;
|
|
|
|
|
+ glyph_count++;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return byte_len;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|