Add HarfBuzz Text Shaping and Font Fallback Support (#3611)

Co-authored-by: alan wei chen <alanchenboy@gmail.com>
This commit is contained in:
Stefan Karschti
2025-07-29 23:00:27 +03:00
committed by GitHub
parent 60264349c1
commit 09d395d0db
82 changed files with 27006 additions and 151 deletions

View File

@@ -7,6 +7,9 @@
#include <cstddef>
#include <tuple>
#include <type_traits>
#include <string_view>
#include <optional>
#include <string>
namespace mbgl {
namespace util {
@@ -36,5 +39,53 @@ inline constexpr auto to_array(std::tuple<Ts...>&& tuple) {
std::forward<std::tuple<Ts...>>(tuple));
}
/// Convert string to integral types
template <typename T>
std::enable_if_t<std::is_integral_v<T>, std::optional<T>> parse(std::string_view str, int base = 10) noexcept {
static_assert(std::is_same_v<T, int32_t> || std::is_same_v<T, uint32_t> || std::is_same_v<T, int64_t> ||
std::is_same_v<T, uint64_t>,
"Unsupported integral type in mbgl::util::parse<T>.");
char* end = nullptr;
errno = 0;
if constexpr (std::is_same_v<T, int32_t>) {
long val = std::strtol(str.data(), &end, base);
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
} else if constexpr (std::is_same_v<T, uint32_t>) {
unsigned long val = std::strtoul(str.data(), &end, base);
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
} else if constexpr (std::is_same_v<T, int64_t>) {
long long val = std::strtoll(str.data(), &end, base);
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
} else if constexpr (std::is_same_v<T, uint64_t>) {
unsigned long long val = std::strtoull(str.data(), &end, base);
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
}
return std::nullopt;
}
/// Convert string to floating point types
template <typename T>
std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> parse(std::string_view str) noexcept {
static_assert(std::is_same_v<T, float> || std::is_same_v<T, double> || std::is_same_v<T, long double>,
"Unsupported floating point type in mbgl::util::parse<T>.");
char* end = nullptr;
errno = 0;
if constexpr (std::is_same_v<T, float>) {
float val = std::strtof(str.data(), &end);
if (errno == 0 && end == str.data() + str.size()) return val;
} else if constexpr (std::is_same_v<T, double>) {
double val = std::strtod(str.data(), &end);
if (errno == 0 && end == str.data() + str.size()) return val;
} else if constexpr (std::is_same_v<T, long double>) {
long double val = std::strtold(str.data(), &end);
if (errno == 0 && end == str.data() + str.size()) return val;
}
return std::nullopt;
}
} // namespace util
} // namespace mbgl