From 4ee21d7f25b4810bea59b26d22d8ee796ee2f591 Mon Sep 17 00:00:00 2001 From: BLooperZ Date: Wed, 28 Aug 2024 17:54:31 +0300 Subject: [PATCH] Adjust utf-32 conversion --- Source/engine/render/text_render.cpp | 5 +- Source/utils/unicode-bidi.cpp | 5 +- test/utf8_test.cpp | 87 ++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/Source/engine/render/text_render.cpp b/Source/engine/render/text_render.cpp index 4d08d809695..df8ce3775af 100644 --- a/Source/engine/render/text_render.cpp +++ b/Source/engine/render/text_render.cpp @@ -421,8 +421,9 @@ uint32_t DoDrawString(const Surface &out, std::string_view text, Rectangle rect, } }; - std::u32string_view remaining32 = ConvertLogicalToVisual(ConvertUtf8ToUtf32(remaining)); - remaining = ConvertUtf32ToUtf8(remaining32); + std::u32string remaining32 = ConvertLogicalToVisual(ConvertUtf8ToUtf32(remaining)); + std::string line = ConvertUtf32ToUtf8(remaining32); + remaining = line; for (; !remaining.empty() && remaining[0] != '\0' && (next = DecodeFirstUtf8CodePoint(remaining, &cpLen)) != Utf8DecodeError; diff --git a/Source/utils/unicode-bidi.cpp b/Source/utils/unicode-bidi.cpp index 965a7857c42..903dce94fdd 100644 --- a/Source/utils/unicode-bidi.cpp +++ b/Source/utils/unicode-bidi.cpp @@ -7,8 +7,9 @@ namespace devilution { std::u32string ConvertLogicalToVisual(std::u32string_view input) { - FriBidiChar *logical = new FriBidiChar[input.size()]; - FriBidiChar *visual = new FriBidiChar[input.size()]; + // return std::u32string(input); + FriBidiChar *logical = new FriBidiChar[input.size()]; + FriBidiChar *visual = new FriBidiChar[input.size()]; for (size_t i = 0; i < input.size(); i++) { logical[i] = input[i]; diff --git a/test/utf8_test.cpp b/test/utf8_test.cpp index 003eb3079a5..9750df362d9 100644 --- a/test/utf8_test.cpp +++ b/test/utf8_test.cpp @@ -2,6 +2,7 @@ #include #include "utils/utf8.hpp" +#include "utils/unicode-bidi.hpp" namespace devilution { namespace { @@ -81,5 +82,91 @@ TEST(Utf8CodeUnits, BasicLatin) EXPECT_FALSE(IsBasicLatin('\xFF')) << "Multibyte Utf8 code units are not Basic Latin symbols"; } +TEST(ConvertUtf8ToUtf32Test, EmptyString) +{ + std::string_view input; + auto result = ConvertUtf8ToUtf32(input); + EXPECT_TRUE(result.empty()); +} + +TEST(ConvertUtf8ToUtf32Test, BasicLatin) +{ + std::string_view input = "Hello, world!"; + auto result = ConvertUtf8ToUtf32(input); + EXPECT_EQ(result, U"Hello, world!"); +} + +TEST(ConvertUtf8ToUtf32Test, MultibyteUtf8) +{ + std::string_view input = "こんにちは、世界!"; + auto result = ConvertUtf8ToUtf32(input); + EXPECT_EQ(result, U"こんにちは、世界!"); +} + +TEST(ConvertUtf32ToUtf8Test, EmptyString) +{ + std::u32string_view input; + auto result = ConvertUtf32ToUtf8(input); + EXPECT_TRUE(result.empty()); +} + +TEST(ConvertUtf32ToUtf8Test, BasicLatin) +{ + std::u32string_view input = U"Hello, world!"; + auto result = ConvertUtf32ToUtf8(input); + EXPECT_EQ(result, "Hello, world!"); +} + +TEST(ConvertUtf32ToUtf8Test, MultibyteUtf8) +{ + std::u32string_view input = U"こんにちは、世界!"; + auto result = ConvertUtf32ToUtf8(input); + EXPECT_EQ(result, "こんにちは、世界!"); +} + +TEST(ConvertUtf32ToUtf8Test, Inverse) +{ + std::u32string_view input = U"こんにちは、世界!"; + auto utf8 = ConvertUtf32ToUtf8(input); + auto utf32 = ConvertUtf8ToUtf32(utf8); + EXPECT_EQ(input, utf32); +} + +TEST(ConvertUtf32ToUtf8Test, InverseInverse) +{ + std::string_view input = "こんにちは、世界!"; + auto utf32 = ConvertUtf8ToUtf32(input); + auto utf8 = ConvertUtf32ToUtf8(utf32); + EXPECT_EQ(input, utf8); +} + +TEST(ConvertLogicalToVisualTest, EmptyString) +{ + std::u32string_view input; + auto result = ConvertLogicalToVisual(input); + EXPECT_TRUE(result.empty()); +} + +TEST(ConvertLogicalToVisualTest, BasicLatin) +{ + std::u32string_view input = U"Hello, world!"; + auto result = ConvertLogicalToVisual(input); + EXPECT_EQ(result, U"Hello, world!"); +} + +TEST(ConvertLogicalToVisualTest, Hebrew) +{ + std::u32string_view input = U"שלום, עולם!"; + auto result = ConvertLogicalToVisual(input); + EXPECT_EQ(result, U"!םלוע ,םולש"); +} + +// TEST(ConvertLogicalToVisualTest, MultiLineString) +// { +// std::u32string_view input = U"שלום\nכיתה א!"; +// auto result = ConvertLogicalToVisual(input); +// EXPECT_EQ(ConvertUtf32ToUtf8(result), "םולש\n!א התיכ"); +// } + } // namespace } // namespace devilution