Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrAutoLocaleSetter_DEFINED
      9 #define GrAutoLocaleSetter_DEFINED
     10 
     11 #include "GrTypes.h"
     12 
     13 #if defined(SK_BUILD_FOR_WIN)
     14 #include "SkString.h"
     15 #endif
     16 
     17 #if !defined(SK_BUILD_FOR_ANDROID)
     18 #include <locale.h>
     19 #endif
     20 
     21 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
     22 #include <xlocale.h>
     23 #endif
     24 
     25 #if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION)
     26 #define HAVE_LOCALE_T 0
     27 #else
     28 #define HAVE_LOCALE_T 1
     29 #endif
     30 
     31 /**
     32  * Helper class for ensuring that we don't use the wrong locale when building shaders. Android
     33  * doesn't support locale in the NDK, so this is a no-op there.
     34  */
     35 class GrAutoLocaleSetter : public SkNoncopyable {
     36 public:
     37     GrAutoLocaleSetter (const char* name) {
     38 #if defined(SK_BUILD_FOR_WIN)
     39         fOldPerThreadLocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
     40         char* oldLocale = setlocale(LC_ALL, name);
     41         if (oldLocale) {
     42             fOldLocale = oldLocale;
     43             fShouldRestoreLocale = true;
     44         } else {
     45             fShouldRestoreLocale = false;
     46         }
     47 #elif HAVE_LOCALE_T
     48         fLocale = newlocale(LC_ALL, name, 0);
     49         if (fLocale) {
     50             fOldLocale = uselocale(fLocale);
     51         } else {
     52             fOldLocale = static_cast<locale_t>(0);
     53         }
     54 #else
     55         (void) name; // suppress unused param warning.
     56 #endif
     57     }
     58 
     59     ~GrAutoLocaleSetter () {
     60 #if defined(SK_BUILD_FOR_WIN)
     61         if (fShouldRestoreLocale) {
     62             setlocale(LC_ALL, fOldLocale.c_str());
     63         }
     64         _configthreadlocale(fOldPerThreadLocale);
     65 #elif HAVE_LOCALE_T
     66         if (fLocale) {
     67              uselocale(fOldLocale);
     68              freelocale(fLocale);
     69         }
     70 #endif
     71     }
     72 
     73 private:
     74 #if defined(SK_BUILD_FOR_WIN)
     75     int fOldPerThreadLocale;
     76     bool fShouldRestoreLocale;
     77     SkString fOldLocale;
     78 #elif HAVE_LOCALE_T
     79     locale_t fOldLocale;
     80     locale_t fLocale;
     81 #endif
     82 };
     83 
     84 #undef HAVE_LOCALE_T
     85 
     86 #endif
     87 
     88