aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrAutoLocaleSetter.h
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2015-03-16 14:00:52 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-16 14:00:52 -0700
commit6f7f2012eed634695dc76aad720d3ee0820bd9d2 (patch)
treef910b5b871b9da01b28d189845b504cacc40e344 /src/gpu/GrAutoLocaleSetter.h
parent82b0748f1c440059cf5f33fceef3b94de9e04052 (diff)
Move GrAutoLocaleSetter to new file and fix issue with null locale
TBR=egdaniel@google.com NOTREECHECKS=true Review URL: https://codereview.chromium.org/1002623004
Diffstat (limited to 'src/gpu/GrAutoLocaleSetter.h')
-rw-r--r--src/gpu/GrAutoLocaleSetter.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/gpu/GrAutoLocaleSetter.h b/src/gpu/GrAutoLocaleSetter.h
new file mode 100644
index 0000000000..dd17bbef68
--- /dev/null
+++ b/src/gpu/GrAutoLocaleSetter.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrAutoLocaleSetter_DEFINED
+#define GrAutoLocaleSetter_DEFINED
+
+#include "GrTypes.h"
+
+#if !defined(SK_BUILD_FOR_ANDROID)
+#include <locale.h>
+#endif
+
+#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
+#include <xlocale.h>
+#endif
+
+/**
+ * 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.
+ */
+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);
+ if (fLocale) {
+ 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)
+ if (fLocale) {
+ uselocale(fOldLocale);
+ 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
+