29#include <TGUI/Config.hpp>
37#if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
39 #pragma warning(disable:4127)
51 template <
typename CharT>
52 void encodeCharUtf8(
char32_t input, std::basic_string<CharT>& outStrUtf8)
56 outStrUtf8.push_back(
static_cast<CharT
>(input));
61 if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
65 std::size_t bytestoWrite;
66 std::uint8_t firstByteMask;
72 else if (input < 0x10000)
84 std::array<CharT, 4> bytes;
85 if (bytestoWrite == 4) { bytes[3] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
86 if (bytestoWrite >= 3) { bytes[2] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
87 bytes[1] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6;
88 bytes[0] =
static_cast<CharT
>(input | firstByteMask);
91 outStrUtf8.append(bytes.begin(), bytes.begin() + bytestoWrite);
102 template <
typename CharIt>
103 CharIt decodeCharUtf8(CharIt inputCharIt, CharIt inputEndIt, std::u32string& outStrUtf32)
105 if (
static_cast<std::uint8_t
>(*inputCharIt) < 128)
107 outStrUtf32.push_back(
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt)));
108 return ++inputCharIt;
112 static const std::uint32_t offsetsMap[6] = { 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 };
113 static const std::uint8_t trailingMap[128] =
115 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,
116 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,
117 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,
118 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
122 const std::uint8_t trailingBytes = trailingMap[
static_cast<std::uint8_t
>(*inputCharIt) - 128];
123 const std::uint32_t offset = offsetsMap[trailingBytes];
124 const auto remainingBytes = std::distance(inputCharIt, inputEndIt) - 1;
125 if (remainingBytes >=
static_cast<decltype(remainingBytes)
>(trailingBytes))
127 char32_t outputChar = 0;
128 for (std::uint8_t i = 0; i < trailingBytes; ++i)
130 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
134 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
135 outputChar -= offset;
136 outStrUtf32.push_back(outputChar);
139 inputCharIt = inputEndIt;
145#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201811L)
151 inline std::u8string convertUtf32toUtf8(
const std::u32string& strUtf32)
153 std::u8string outStrUtf8;
154 outStrUtf8.reserve(strUtf32.length() + 1);
155 for (
const char32_t& codepoint : strUtf32)
156 encodeCharUtf8(codepoint, outStrUtf8);
168 template <
typename CharIt>
169 std::u32string convertUtf8toUtf32(CharIt inputBegin, CharIt inputEnd)
171 std::u32string outStrUtf32;
172 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
174 auto it = inputBegin;
175 while (it < inputEnd)
176 it = decodeCharUtf8(it, inputEnd, outStrUtf32);
188 template <
typename U16CharIt>
189 std::u32string convertUtf16toUtf32(U16CharIt inputBegin, U16CharIt inputEnd)
191 std::u32string outStrUtf32;
192 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
194 auto it = inputBegin;
195 while (it < inputEnd)
197 const char16_t first = *it++;
200 if ((first < 0xD800) || (first > 0xDBFF))
202 outStrUtf32.push_back(
static_cast<char32_t>(first));
210 const char16_t second = *it++;
211 if ((second >= 0xDC00) && (second <= 0xDFFF))
212 outStrUtf32.push_back(((
static_cast<char32_t>(first) - 0xD800) << 10) + (
static_cast<char32_t>(second) - 0xDC00) + 0x0010000);
225 template <
typename WCharIt>
226 std::u32string convertWidetoUtf32(WCharIt inputBegin, WCharIt inputEnd)
228 std::u32string outStrUtf32;
229 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
232 for (
auto it = inputBegin; it != inputEnd; ++it)
233 outStrUtf32.push_back(
static_cast<char32_t>(*it));
245 inline std::string convertUtf32toLatin1(
const std::u32string& strUtf32)
248 outStr.reserve(strUtf32.length() + 1);
249 for (
const char32_t codepoint : strUtf32)
252 outStr.push_back(
static_cast<char>(codepoint));
264 inline std::string convertUtf32toStdStringUtf8(
const std::u32string& strUtf32)
266 std::string outStrUtf8;
267 outStrUtf8.reserve(strUtf32.length() + 1);
268 for (
const char32_t codepoint : strUtf32)
269 encodeCharUtf8(codepoint, outStrUtf8);
280 inline std::wstring convertUtf32toWide(
const std::u32string& strUtf32)
283 outStr.reserve(strUtf32.length() + 1);
285#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
286 if constexpr (
sizeof(wchar_t) == 4)
288 if (
sizeof(
wchar_t) == 4)
292 for (
const char32_t codepoint : strUtf32)
293 outStr.push_back(
static_cast<wchar_t>(codepoint));
298 for (
const char32_t codepoint : strUtf32)
300 if ((codepoint < 0xD800) || ((codepoint > 0xDFFF) && (codepoint <= 0xFFFF)))
301 outStr.push_back(
static_cast<wchar_t>(codepoint));
314 inline std::u16string convertUtf32toUtf16(
const std::u32string& strUtf32)
316 std::u16string outStrUtf16;
317 outStrUtf16.reserve(strUtf32.length() + 1);
319 for (
const char32_t codepoint : strUtf32)
322 if (codepoint <= 0xFFFF)
324 if ((codepoint < 0xD800) || (codepoint > 0xDFFF))
325 outStrUtf16.push_back(
static_cast<char16_t>(codepoint));
329 else if (codepoint > 0x0010FFFF)
333 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) >> 10) + 0xD800));
334 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) & 0x3FFUL) + 0xDC00));
344#if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36