Index: include/gpu/GrTypesPriv.h |
diff --git a/include/gpu/GrTypesPriv.h b/include/gpu/GrTypesPriv.h |
index 412de897c6543b851dad3134020c0f9d1788deca..151de1991ac3b7b79525786687f513055bb7b149 100644 |
--- a/include/gpu/GrTypesPriv.h |
+++ b/include/gpu/GrTypesPriv.h |
@@ -264,4 +264,51 @@ private: |
SkIRect fRect; |
}; |
+ |
+/** |
+ * Helper class for ensuring that we don't use the wrong locale when building shaders. Android |
+ * doesn't support locale in the NDK, so this is a no-op there. |
+ */ |
+#if !defined(SK_BUILD_FOR_ANDROID) |
+#include <locale.h> |
+#endif |
+ |
+#if defined(SK_BUILD_FOR_MAC) |
+#include <xlocale.h> |
+#endif |
+ |
+class GrAutoLocaleSetter { |
+public: |
+ GrAutoLocaleSetter (const char* name) { |
+#if defined(SK_BUILD_FOR_WIN) |
+ fOldPerThreadLocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); |
+ fOldLocale = setlocale(LC_ALL, name); |
+#elif !defined(SK_BUILD_FOR_ANDROID) |
+ fLocale = newlocale(LC_ALL, name, 0); |
+ fOldLocale = uselocale(fLocale); |
+#else |
+ (void) name; // suppress unused param warning. |
+#endif |
+ } |
+ |
+ ~GrAutoLocaleSetter () { |
+#if defined(SK_BUILD_FOR_WIN) |
+ setlocale(LC_ALL, fOldLocale); |
+ _configthreadlocale(fOldPerThreadLocale); |
+#elif !defined(SK_BUILD_FOR_ANDROID) |
+ SkASSERT(uselocale(fOldLocale) == fLocale); |
+ freelocale(fLocale); |
+#endif |
+ } |
+ |
+private: |
+#if defined(SK_BUILD_FOR_WIN) |
+ int fOldPerThreadLocale; |
+ const char* fOldLocale; |
+#elif !defined(SK_BUILD_FOR_ANDROID) |
+ locale_t fOldLocale; |
+ locale_t fLocale; |
+#endif |
+}; |
+ |
#endif |