diff --git a/include/mbgl/util/traits.hpp b/include/mbgl/util/traits.hpp index 9d6f947cd..5b9401aad 100644 --- a/include/mbgl/util/traits.hpp +++ b/include/mbgl/util/traits.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace mbgl { @@ -9,4 +10,19 @@ constexpr auto underlying_type(T t) -> typename std::underlying_type_t { return typename std::underlying_type_t(t); } +template struct is_utf16char_like: std::false_type {}; +template struct is_utf16char_like: is_utf16char_like {}; +template <> struct is_utf16char_like: std::true_type {}; +template <> struct is_utf16char_like: std::true_type {}; +template <> struct is_utf16char_like: std::true_type {}; + +template using is_utf16char_like_pointer = std::integral_constant::value + && is_utf16char_like::type>::value>; + +template +typename std::enable_if::value && is_utf16char_like_pointer::value, OutPointer>::type utf16char_cast(InChar *in) +{ + return reinterpret_cast(in); +} + } // namespace mbgl diff --git a/platform/default/bidi.cpp b/platform/default/bidi.cpp index 08a02ee60..d9ed2658e 100644 --- a/platform/default/bidi.cpp +++ b/platform/default/bidi.cpp @@ -1,9 +1,11 @@ -#include - #include +#include + #include #include +#include + namespace mbgl { class BiDiImpl { @@ -28,7 +30,7 @@ std::u16string applyArabicShaping(const std::u16string& input) { UErrorCode errorCode = U_ZERO_ERROR; const int32_t outputLength = - u_shapeArabic(input.c_str(), static_cast(input.size()), NULL, 0, + u_shapeArabic(mbgl::utf16char_cast(input.c_str()), static_cast(input.size()), NULL, 0, (U_SHAPE_LETTERS_SHAPE & U_SHAPE_LETTERS_MASK) | (U_SHAPE_TEXT_DIRECTION_LOGICAL & U_SHAPE_TEXT_DIRECTION_MASK), &errorCode); @@ -38,7 +40,7 @@ std::u16string applyArabicShaping(const std::u16string& input) { std::u16string outputText(outputLength, 0); - u_shapeArabic(input.c_str(), static_cast(input.size()), &outputText[0], outputLength, + u_shapeArabic(mbgl::utf16char_cast(input.c_str()), static_cast(input.size()), mbgl::utf16char_cast(&outputText[0]), outputLength, (U_SHAPE_LETTERS_SHAPE & U_SHAPE_LETTERS_MASK) | (U_SHAPE_TEXT_DIRECTION_LOGICAL & U_SHAPE_TEXT_DIRECTION_MASK), &errorCode); @@ -89,7 +91,7 @@ std::vector BiDi::processText(const std::u16string& input, std::set lineBreakPoints) { UErrorCode errorCode = U_ZERO_ERROR; - ubidi_setPara(impl->bidiText, input.c_str(), static_cast(input.size()), + ubidi_setPara(impl->bidiText, mbgl::utf16char_cast(input.c_str()), static_cast(input.size()), UBIDI_DEFAULT_LTR, NULL, &errorCode); if (U_FAILURE(errorCode)) {