diff options
-rw-r--r-- | common/platform_default.cpp | 25 | ||||
-rw-r--r-- | common/platform_nsstring.mm | 21 | ||||
-rw-r--r-- | include/mbgl/platform/platform.hpp | 6 | ||||
m--------- | ios/mapbox-gl-cocoa | 0 | ||||
-rw-r--r-- | linux/mapboxgl-app.gyp | 1 | ||||
-rw-r--r-- | macosx/mapboxgl-app.gyp | 1 | ||||
-rw-r--r-- | src/renderer/symbol_bucket.cpp | 5 |
7 files changed, 56 insertions, 3 deletions
diff --git a/common/platform_default.cpp b/common/platform_default.cpp new file mode 100644 index 0000000000..1acbfa8508 --- /dev/null +++ b/common/platform_default.cpp @@ -0,0 +1,25 @@ +#include <mbgl/platform/platform.hpp> + +#include <locale> + +namespace mbgl { +namespace platform { + +std::string uppercase(const std::string& string) { + // TODO: Use a proper Unicode Special Casing-aware algorithm. + const auto &convert = std::use_facet<std::ctype<char>>(std::locale()); + std::string converted = string; + convert.toupper(&converted[0], &converted[0] + converted.size()); + return converted; +} + +std::string lowercase(const std::string& string) { + // TODO: Use a proper Unicode Special Casing-aware algorithm. + const auto &convert = std::use_facet<std::ctype<char>>(std::locale()); + std::string converted = string; + convert.tolower(&converted[0], &converted[0] + converted.size()); + return converted; +} + +} +} diff --git a/common/platform_nsstring.mm b/common/platform_nsstring.mm new file mode 100644 index 0000000000..9119f2a8fe --- /dev/null +++ b/common/platform_nsstring.mm @@ -0,0 +1,21 @@ +#import <Foundation/Foundation.h> + +#include <mbgl/platform/platform.hpp> + +namespace mbgl { +namespace platform { + +std::string uppercase(const std::string &string) { + NSString *nsstring = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data()) length:string.size() encoding:NSUTF8StringEncoding freeWhenDone:NO]; + nsstring = [nsstring uppercaseString]; + return { [nsstring cStringUsingEncoding:NSUTF8StringEncoding], [nsstring lengthOfBytesUsingEncoding:NSUTF8StringEncoding] }; +} + +std::string lowercase(const std::string &string) { + NSString *nsstring = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data()) length:string.size() encoding:NSUTF8StringEncoding freeWhenDone:NO]; + nsstring = [nsstring lowercaseString]; + return { [nsstring cStringUsingEncoding:NSUTF8StringEncoding], [nsstring lengthOfBytesUsingEncoding:NSUTF8StringEncoding] }; +} + +} +}
\ No newline at end of file diff --git a/include/mbgl/platform/platform.hpp b/include/mbgl/platform/platform.hpp index 43c6ce4f5e..22405a4cfd 100644 --- a/include/mbgl/platform/platform.hpp +++ b/include/mbgl/platform/platform.hpp @@ -28,6 +28,12 @@ std::shared_ptr<Request> request_http(const std::string &url, std::function<void(Response *)> callback, std::shared_ptr<uv::loop> loop = nullptr); +// Uppercase a string, potentially using platform-specific routines. +std::string uppercase(const std::string &string); + +// Lowercase a string, potentially using platform-specific routines. +std::string lowercase(const std::string &string); + // Cancels an HTTP request. void cancel_request_http(const std::shared_ptr<Request> &req); diff --git a/ios/mapbox-gl-cocoa b/ios/mapbox-gl-cocoa -Subproject e1c709a8de0b69aa6bfbcd9ea4faf981b6e799b +Subproject 9631c7d6d9cf2a52a43820f6f54df90627b4875 diff --git a/linux/mapboxgl-app.gyp b/linux/mapboxgl-app.gyp index 7b703ed75c..e19768caf9 100644 --- a/linux/mapboxgl-app.gyp +++ b/linux/mapboxgl-app.gyp @@ -12,6 +12,7 @@ './main.cpp', '../common/settings_json.cpp', '../common/settings_json.hpp', + '../common/platform_default.cpp', '../common/glfw_view.hpp', '../common/glfw_view.cpp', '../common/curl_request.cpp', diff --git a/macosx/mapboxgl-app.gyp b/macosx/mapboxgl-app.gyp index 480dc2a114..da5c68ea35 100644 --- a/macosx/mapboxgl-app.gyp +++ b/macosx/mapboxgl-app.gyp @@ -12,6 +12,7 @@ './main.mm', '../common/settings_nsuserdefaults.hpp', '../common/settings_nsuserdefaults.mm', + '../common/platform_nsstring.mm', '../common/glfw_view.hpp', '../common/glfw_view.cpp', '../common/foundation_request.h', diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index e8c0fd1829..fa12538e4c 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -75,11 +75,10 @@ std::vector<SymbolFeature> SymbolBucket::processFeatures(const VectorTileLayer & if (text) { std::string u8string = util::replaceTokens(properties.text.field, feature.properties); - auto &convert = std::use_facet<std::ctype<char>>(std::locale()); if (properties.text.transform == TextTransformType::Uppercase) { - convert.toupper(&u8string[0], &u8string[0] + u8string.size()); + u8string = platform::uppercase(u8string); } else if (properties.text.transform == TextTransformType::Lowercase) { - convert.tolower(&u8string[0], &u8string[0] + u8string.size()); + u8string = platform::lowercase(u8string); } ft.label = ucs4conv.convert(u8string); |