[core] unify UTF-8/16 conversion to <boost/locale/encoding_utf.hpp>
This commit is contained in:
@@ -142,8 +142,6 @@ else()
|
||||
message(STATUS "Can't find ccache — consider installing ccache to improve recompilation performance")
|
||||
endif()
|
||||
|
||||
include(cmake/codecvt.cmake)
|
||||
|
||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/platform/${MBGL_PLATFORM}/config.cmake)
|
||||
message(ERROR "Can't find config.cmake file for platform ${MBGL_PLATFORM}")
|
||||
endif()
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
add_library(codecvt INTERFACE)
|
||||
|
||||
# Determine if the STL has codecvt
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/features/codecvt/main.cpp" "#include <codecvt>\nint main() {}")
|
||||
try_compile(STL_SUPPORTS_CODECVT
|
||||
"${CMAKE_BINARY_DIR}/features/codecvt"
|
||||
SOURCES "${CMAKE_BINARY_DIR}/features/codecvt/main.cpp"
|
||||
CMAKE_FLAGS "-DCMAKE_MACOSX_BUNDLE:STRING=YES" "-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED:STRING=NO"
|
||||
COMPILE_DEFINITIONS "-std=c++14" # CXX_STANDARD wasn't added to try_compile until CMake 3.8
|
||||
OUTPUT_VARIABLE CODECVT_TEST_OUTPUT
|
||||
)
|
||||
|
||||
if (NOT STL_SUPPORTS_CODECVT)
|
||||
if ($ENV{V})
|
||||
message("codecvt support not detected: ${CODECVT_TEST_OUTPUT}")
|
||||
endif()
|
||||
target_include_directories(codecvt INTERFACE platform/default/codecvt)
|
||||
target_add_mason_package(codecvt INTERFACE boost)
|
||||
endif()
|
||||
@@ -7,8 +7,6 @@ target_include_directories(mbgl-core
|
||||
PRIVATE src
|
||||
)
|
||||
|
||||
target_link_libraries(mbgl-core PRIVATE codecvt)
|
||||
|
||||
target_add_mason_package(mbgl-core PUBLIC geometry)
|
||||
target_add_mason_package(mbgl-core PUBLIC variant)
|
||||
target_add_mason_package(mbgl-core PRIVATE unique_resource)
|
||||
|
||||
@@ -19,7 +19,7 @@ mason_use(cheap-ruler VERSION 2.5.3 HEADER_ONLY)
|
||||
mason_use(vector-tile VERSION 1.0.2 HEADER_ONLY)
|
||||
|
||||
if(MBGL_PLATFORM STREQUAL "android")
|
||||
mason_use(jni.hpp VERSION 4.0.0 HEADER_ONLY)
|
||||
mason_use(jni.hpp VERSION 4.0.1 HEADER_ONLY)
|
||||
elseif(MBGL_PLATFORM STREQUAL "ios")
|
||||
# noop
|
||||
elseif(MBGL_PLATFORM STREQUAL "linux")
|
||||
|
||||
@@ -69,7 +69,6 @@ macro(mbgl_filesource)
|
||||
target_add_mason_package(mbgl-filesource PUBLIC jni.hpp)
|
||||
|
||||
target_link_libraries(mbgl-filesource
|
||||
PRIVATE codecvt
|
||||
PUBLIC sqlite
|
||||
PUBLIC -llog
|
||||
PUBLIC -landroid
|
||||
@@ -84,8 +83,11 @@ add_library(mapbox-gl SHARED
|
||||
platform/android/src/main.cpp
|
||||
)
|
||||
|
||||
target_include_directories(mapbox-gl
|
||||
PRIVATE src
|
||||
)
|
||||
|
||||
target_link_libraries(mapbox-gl
|
||||
PRIVATE codecvt
|
||||
PRIVATE mbgl-core
|
||||
PRIVATE mbgl-filesource
|
||||
)
|
||||
@@ -106,7 +108,6 @@ macro(mbgl_platform_test)
|
||||
)
|
||||
|
||||
target_link_libraries(mbgl-test
|
||||
PRIVATE codecvt
|
||||
PRIVATE mbgl-core
|
||||
PRIVATE mbgl-filesource
|
||||
)
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// This is a minimal polyfill that'll only work exactly for how we use codecvt
|
||||
|
||||
#include <string>
|
||||
#include <boost/locale/encoding_utf.hpp>
|
||||
|
||||
namespace std {
|
||||
|
||||
template <typename Codecvt, typename Elem = wchar_t>
|
||||
class wstring_convert {
|
||||
public:
|
||||
static_assert(std::is_same<Elem, typename Codecvt::Elem>::value, "type mismatch");
|
||||
|
||||
inline std::basic_string<Elem> from_bytes(const string& str) {
|
||||
return boost::locale::conv::utf_to_utf<Elem>(str);
|
||||
}
|
||||
|
||||
inline string to_bytes(const std::basic_string<Elem>& str) {
|
||||
return boost::locale::conv::utf_to_utf<char>(str);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename E>
|
||||
class codecvt_utf8_utf16 {
|
||||
public:
|
||||
using Elem = E;
|
||||
};
|
||||
|
||||
} // namespace std
|
||||
17
platform/default/jni/string_conversion.hpp
Normal file
17
platform/default/jni/string_conversion.hpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
// This file replaces the default implementation in jni.hpp.
|
||||
|
||||
#include <mbgl/util/utf.hpp>
|
||||
|
||||
namespace jni {
|
||||
|
||||
inline std::u16string convertUTF8ToUTF16(const std::string& str) {
|
||||
return mbgl::util::convertUTF8ToUTF16(str);
|
||||
}
|
||||
|
||||
inline std::string convertUTF16ToUTF8(const std::u16string& str) {
|
||||
return mbgl::util::convertUTF16ToUTF8(str);
|
||||
}
|
||||
|
||||
} // namespace jni
|
||||
@@ -1,13 +1,16 @@
|
||||
#include <mbgl/util/utf.hpp>
|
||||
|
||||
#include <locale>
|
||||
#include <codecvt>
|
||||
#include <boost/locale/encoding_utf.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
namespace util {
|
||||
|
||||
std::u16string utf8_to_utf16::convert(const std::string& utf8) {
|
||||
return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().from_bytes(utf8);
|
||||
std::u16string convertUTF8ToUTF16(const std::string& str) {
|
||||
return boost::locale::conv::utf_to_utf<char16_t>(str);
|
||||
}
|
||||
|
||||
std::string convertUTF16ToUTF8(const std::u16string& str) {
|
||||
return boost::locale::conv::utf_to_utf<char>(str);
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
namespace mbgl {
|
||||
namespace util {
|
||||
|
||||
std::u16string utf8_to_utf16::convert(std::string const& utf8) {
|
||||
std::u16string convertUTF8ToUTF16(std::string const& utf8) {
|
||||
auto utf16 = QString::fromUtf8(utf8.data(), utf8.length());
|
||||
|
||||
// Newers Qt have QString::toStdU16String(), but this is how it is
|
||||
|
||||
@@ -123,7 +123,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters,
|
||||
u8string = platform::lowercase(u8string);
|
||||
}
|
||||
|
||||
ft.formattedText->addSection(applyArabicShaping(util::utf8_to_utf16::convert(u8string)),
|
||||
ft.formattedText->addSection(applyArabicShaping(util::convertUTF8ToUTF16(u8string)),
|
||||
section.fontScale ? *section.fontScale : 1.0,
|
||||
section.fontStack ? FontStackHasher()(*section.fontStack) : baseFontStackHash);
|
||||
|
||||
|
||||
@@ -609,7 +609,7 @@ bool charInSupportedScript(char16_t chr) {
|
||||
}
|
||||
|
||||
bool isStringInSupportedScript(const std::string& input) {
|
||||
auto u16string = util::utf8_to_utf16::convert(input);
|
||||
auto u16string = util::convertUTF8ToUTF16(input);
|
||||
for (char16_t chr : u16string) {
|
||||
if (!charInSupportedScript(chr)) {
|
||||
return false;
|
||||
|
||||
@@ -5,10 +5,8 @@
|
||||
namespace mbgl {
|
||||
namespace util {
|
||||
|
||||
class utf8_to_utf16 {
|
||||
public:
|
||||
static std::u16string convert(std::string const&);
|
||||
};
|
||||
std::u16string convertUTF8ToUTF16(const std::string&);
|
||||
std::string convertUTF16ToUTF8(const std::u16string&);
|
||||
|
||||
} // namespace util
|
||||
} // namespace mbgl
|
||||
|
||||
Reference in New Issue
Block a user