29#include <TGUI/Config.hpp>
31#if !TGUI_EXPERIMENTAL_USE_STD_MODULE
39TGUI_MODULE_EXPORT
namespace tgui
48 template <
typename CharT>
49 void encodeCharUtf8(
char32_t input, std::basic_string<CharT>& outStrUtf8)
53 outStrUtf8.push_back(
static_cast<CharT
>(input));
58 if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
62 std::size_t bytestoWrite;
63 std::uint8_t firstByteMask;
69 else if (input < 0x10000)
81 std::array<CharT, 4> bytes;
82 if (bytestoWrite == 4) { bytes[3] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
83 if (bytestoWrite >= 3) { bytes[2] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
84 bytes[1] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6;
85 bytes[0] =
static_cast<CharT
>(input | firstByteMask);
88 outStrUtf8.append(bytes.begin(), bytes.begin() +
static_cast<std::ptrdiff_t
>(bytestoWrite));
99 template <
typename CharIt>
100 CharIt decodeCharUtf8(CharIt inputCharIt, CharIt inputEndIt, std::u32string& outStrUtf32)
102 if (
static_cast<std::uint8_t
>(*inputCharIt) < 128)
104 outStrUtf32.push_back(
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt)));
105 return ++inputCharIt;
109 static const std::uint32_t offsetsMap[6] = { 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 };
110 static const std::uint8_t trailingMap[128] =
112 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, 0, 0, 0, 0, 0, 0, 0,
113 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, 0, 0, 0, 0, 0, 0, 0,
114 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
115 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
119 const std::uint8_t trailingBytes = trailingMap[
static_cast<std::uint8_t
>(*inputCharIt) - 128];
120 const std::uint32_t offset = offsetsMap[trailingBytes];
121 const auto remainingBytes = std::distance(inputCharIt, inputEndIt) - 1;
122 if (remainingBytes >=
static_cast<decltype(remainingBytes)
>(trailingBytes))
124 char32_t outputChar = 0;
125 for (std::uint8_t i = 0; i < trailingBytes; ++i)
127 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
131 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
132 outputChar -= offset;
133 outStrUtf32.push_back(outputChar);
136 inputCharIt = inputEndIt;
142#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201811L)
148 TGUI_NODISCARD
inline std::u8string convertUtf32toUtf8(
const std::u32string& strUtf32)
150 std::u8string outStrUtf8;
151 outStrUtf8.reserve(strUtf32.length() + 1);
152 for (
const char32_t& codepoint : strUtf32)
153 encodeCharUtf8(codepoint, outStrUtf8);
165 template <
typename CharIt>
166 TGUI_NODISCARD std::u32string convertUtf8toUtf32(CharIt inputBegin, CharIt inputEnd)
168 std::u32string outStrUtf32;
169 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
171 auto it = inputBegin;
172 while (it < inputEnd)
173 it = decodeCharUtf8(it, inputEnd, outStrUtf32);
185 template <
typename U16CharIt>
186 TGUI_NODISCARD std::u32string convertUtf16toUtf32(U16CharIt inputBegin, U16CharIt inputEnd)
188 std::u32string outStrUtf32;
189 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
191 auto it = inputBegin;
192 while (it < inputEnd)
194 const char16_t first = *it++;
197 if ((first < 0xD800) || (first > 0xDBFF))
199 outStrUtf32.push_back(
static_cast<char32_t>(first));
207 const char16_t second = *it++;
208 if ((second >= 0xDC00) && (second <= 0xDFFF))
209 outStrUtf32.push_back(((
static_cast<char32_t>(first) - 0xD800) << 10) + (
static_cast<char32_t>(second) - 0xDC00) + 0x0010000);
222 template <
typename WCharIt>
223 TGUI_NODISCARD std::u32string convertWidetoUtf32(WCharIt inputBegin, WCharIt inputEnd)
225 std::u32string outStrUtf32;
226 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
229 for (
auto it = inputBegin; it != inputEnd; ++it)
230 outStrUtf32.push_back(
static_cast<char32_t>(*it));
242 TGUI_NODISCARD
inline std::string convertUtf32toStdStringUtf8(
const std::u32string& strUtf32)
244 std::string outStrUtf8;
245 outStrUtf8.reserve(strUtf32.length() + 1);
246 for (
const char32_t codepoint : strUtf32)
247 encodeCharUtf8(codepoint, outStrUtf8);
258 TGUI_NODISCARD
inline std::wstring convertUtf32toWide(
const std::u32string& strUtf32)
261 outStr.reserve(strUtf32.length() + 1);
263 TGUI_IF_CONSTEXPR (
sizeof(
wchar_t) == 4)
266 for (
const char32_t codepoint : strUtf32)
267 outStr.push_back(static_cast<wchar_t>(codepoint));
272 for (
const char32_t codepoint : strUtf32)
274 if ((codepoint < 0xD800) || ((codepoint > 0xDFFF) && (codepoint <= 0xFFFF)))
275 outStr.push_back(
static_cast<wchar_t>(codepoint));
288 TGUI_NODISCARD
inline std::u16string convertUtf32toUtf16(
const std::u32string& strUtf32)
290 std::u16string outStrUtf16;
291 outStrUtf16.reserve(strUtf32.length() + 1);
293 for (
const char32_t codepoint : strUtf32)
296 if (codepoint <= 0xFFFF)
298 if ((codepoint < 0xD800) || (codepoint > 0xDFFF))
299 outStrUtf16.push_back(
static_cast<char16_t>(codepoint));
303 else if (codepoint > 0x0010FFFF)
307 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) >> 10) + 0xD800));
308 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) & 0x3FFUL) + 0xDC00));
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:39