29#include <TGUI/Config.hpp>
38#if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
40 #pragma warning(disable:4127)
52 template <
typename CharT>
53 void encodeCharUtf8(
char32_t input, std::basic_string<CharT>& outStrUtf8)
57 outStrUtf8.push_back(
static_cast<CharT
>(input));
62 if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
66 std::size_t bytestoWrite;
69 else if (input < 0x10000)
71 else if (input <= 0x0010FFFF)
76 static const std::uint8_t firstByteMask[5] = { 0, 0, 0xC0, 0xE0, 0xF0 };
79 std::array<CharT, 4> bytes;
80 if (bytestoWrite == 4) { bytes[3] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
81 if (bytestoWrite >= 3) { bytes[2] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
82 if (bytestoWrite >= 2) { bytes[1] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
83 if (bytestoWrite >= 1) { bytes[0] =
static_cast<CharT
>(input | firstByteMask[bytestoWrite]); }
86 outStrUtf8.append(bytes.begin(), bytes.begin() + bytestoWrite);
97 template <
typename CharIt>
98 CharIt decodeCharUtf8(CharIt inputCharIt, CharIt inputEndIt, std::u32string& outStrUtf32)
100 if (
static_cast<std::uint8_t
>(*inputCharIt) < 128)
102 outStrUtf32.push_back(
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt)));
103 return ++inputCharIt;
107 static const std::uint32_t offsetsMap[6] = { 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 };
108 static const std::uint8_t trailingMap[128] =
110 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,
111 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,
112 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,
113 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
117 const std::uint8_t trailingBytes = trailingMap[
static_cast<std::uint8_t
>(*inputCharIt) - 128];
118 const std::uint32_t offset = offsetsMap[trailingBytes];
119 const auto remainingBytes = std::distance(inputCharIt, inputEndIt) - 1;
120 if (remainingBytes >=
static_cast<decltype(remainingBytes)
>(trailingBytes))
122 char32_t outputChar = 0;
123 for (std::uint8_t i = 0; i < trailingBytes; ++i)
125 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
129 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
130 outputChar -= offset;
131 outStrUtf32.push_back(outputChar);
134 inputCharIt = inputEndIt;
140#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201811L)
146 inline std::u8string convertUtf32toUtf8(
const std::u32string& strUtf32)
148 std::u8string outStrUtf8;
149 outStrUtf8.reserve(strUtf32.length() + 1);
150 for (
const char32_t& codepoint : strUtf32)
151 encodeCharUtf8(codepoint, outStrUtf8);
163 template <
typename CharIt>
164 std::u32string convertUtf8toUtf32(CharIt inputBegin, CharIt inputEnd)
166 std::u32string outStrUtf32;
167 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
169 auto it = inputBegin;
170 while (it < inputEnd)
171 it = decodeCharUtf8(it, inputEnd, outStrUtf32);
183 template <
typename U16CharIt>
184 std::u32string convertUtf16toUtf32(U16CharIt inputBegin, U16CharIt inputEnd)
186 std::u32string outStrUtf32;
187 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
189 auto it = inputBegin;
190 while (it < inputEnd)
192 const char16_t first = *it++;
195 if ((first < 0xD800) || (first > 0xDBFF))
197 outStrUtf32.push_back(
static_cast<char32_t>(first));
205 const char16_t second = *it++;
206 if ((second >= 0xDC00) && (second <= 0xDFFF))
207 outStrUtf32.push_back(((
static_cast<char32_t>(first) - 0xD800) << 10) + (
static_cast<char32_t>(second) - 0xDC00) + 0x0010000);
220 template <
typename WCharIt>
221 std::u32string convertWidetoUtf32(WCharIt inputBegin, WCharIt inputEnd)
223 std::u32string outStrUtf32;
224 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
227 for (
auto it = inputBegin; it != inputEnd; ++it)
228 outStrUtf32.push_back(
static_cast<char32_t>(*it));
240 inline std::string convertUtf32toLatin1(
const std::u32string& strUtf32)
243 outStr.reserve(strUtf32.length() + 1);
244 for (
const char32_t codepoint : strUtf32)
247 outStr.push_back(
static_cast<char>(codepoint));
259 inline std::string convertUtf32toStdStringUtf8(
const std::u32string& strUtf32)
261 std::string outStrUtf8;
262 outStrUtf8.reserve(strUtf32.length() + 1);
263 for (
const char32_t codepoint : strUtf32)
264 encodeCharUtf8(codepoint, outStrUtf8);
275 inline std::wstring convertUtf32toWide(
const std::u32string& strUtf32)
278 outStr.reserve(strUtf32.length() + 1);
280#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
281 if constexpr (
sizeof(wchar_t) == 4)
283 if (
sizeof(
wchar_t) == 4)
287 for (
const char32_t codepoint : strUtf32)
288 outStr.push_back(static_cast<wchar_t>(codepoint));
293 for (
const char32_t codepoint : strUtf32)
295 if ((codepoint < 0xD800) || ((codepoint > 0xDFFF) && (codepoint <= 0xFFFF)))
296 outStr.push_back(
static_cast<wchar_t>(codepoint));
309 inline std::u16string convertUtf32toUtf16(
const std::u32string& strUtf32)
311 std::u16string outStrUtf16;
312 outStrUtf16.reserve(strUtf32.length() + 1);
314 for (
const char32_t codepoint : strUtf32)
317 if (codepoint <= 0xFFFF)
319 if ((codepoint < 0xD800) || (codepoint > 0xDFFF))
320 outStrUtf16.push_back(
static_cast<char16_t>(codepoint));
324 else if (codepoint > 0x0010FFFF)
328 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) >> 10) + 0xD800));
329 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) & 0x3FFUL) + 0xDC00));
339#if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36