summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/platform_default.cpp25
-rw-r--r--common/platform_nsstring.mm21
-rw-r--r--include/mbgl/platform/platform.hpp6
m---------ios/mapbox-gl-cocoa0
-rw-r--r--linux/mapboxgl-app.gyp1
-rw-r--r--macosx/mapboxgl-app.gyp1
-rw-r--r--src/renderer/symbol_bucket.cpp5
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);