| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright © 2007,2008,2009  Red Hat, Inc. |     2  * Copyright © 2007,2008,2009  Red Hat, Inc. | 
|     3  * Copyright © 2011,2012  Google, Inc. |     3  * Copyright © 2011,2012  Google, Inc. | 
|     4  * |     4  * | 
|     5  *  This is part of HarfBuzz, a text shaping library. |     5  *  This is part of HarfBuzz, a text shaping library. | 
|     6  * |     6  * | 
|     7  * Permission is hereby granted, without written agreement and without |     7  * Permission is hereby granted, without written agreement and without | 
|     8  * license or royalty fees, to use, copy, modify, and distribute this |     8  * license or royalty fees, to use, copy, modify, and distribute this | 
|     9  * software and its documentation for any purpose, provided that the |     9  * software and its documentation for any purpose, provided that the | 
|    10  * above copyright notice and the following two paragraphs appear in |    10  * above copyright notice and the following two paragraphs appear in | 
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   112 #endif |   112 #endif | 
|   113  |   113  | 
|   114 #if __GNUC__ >= 3 |   114 #if __GNUC__ >= 3 | 
|   115 #define HB_FUNC __PRETTY_FUNCTION__ |   115 #define HB_FUNC __PRETTY_FUNCTION__ | 
|   116 #elif defined(_MSC_VER) |   116 #elif defined(_MSC_VER) | 
|   117 #define HB_FUNC __FUNCSIG__ |   117 #define HB_FUNC __FUNCSIG__ | 
|   118 #else |   118 #else | 
|   119 #define HB_FUNC __func__ |   119 #define HB_FUNC __func__ | 
|   120 #endif |   120 #endif | 
|   121  |   121  | 
 |   122 /* | 
 |   123  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411 | 
 |   124  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch | 
 |   125  * cases that fall through without a break or return statement. HB_FALLTHROUGH | 
 |   126  * is only needed on cases that have code: | 
 |   127  * | 
 |   128  * switch (foo) { | 
 |   129  *   case 1: // These cases have no code. No fallthrough annotations are needed. | 
 |   130  *   case 2: | 
 |   131  *   case 3: | 
 |   132  *     foo = 4; // This case has code, so a fallthrough annotation is needed: | 
 |   133  *     HB_FALLTHROUGH; | 
 |   134  *   default: | 
 |   135  *     return foo; | 
 |   136  * } | 
 |   137  */ | 
 |   138 #if defined(__clang__) && __cplusplus >= 201103L | 
 |   139    /* clang's fallthrough annotations are only available starting in C++11. */ | 
 |   140 #  define HB_FALLTHROUGH [[clang::fallthrough]] | 
 |   141 #elif defined(_MSC_VER) | 
 |   142    /* | 
 |   143     * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis): | 
 |   144     * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx | 
 |   145     */ | 
 |   146 #  include <sal.h> | 
 |   147 #  define HB_FALLTHROUGH __fallthrough | 
 |   148 #else | 
 |   149 #  define HB_FALLTHROUGH /* FALLTHROUGH */ | 
 |   150 #endif | 
 |   151  | 
|   122 #if defined(_WIN32) || defined(__CYGWIN__) |   152 #if defined(_WIN32) || defined(__CYGWIN__) | 
|   123    /* We need Windows Vista for both Uniscribe backend and for |   153    /* We need Windows Vista for both Uniscribe backend and for | 
|   124     * MemoryBarrier.  We don't support compiling on Windows XP, |   154     * MemoryBarrier.  We don't support compiling on Windows XP, | 
|   125     * though we run on it fine. */ |   155     * though we run on it fine. */ | 
|   126 #  if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600 |   156 #  if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600 | 
|   127 #    undef _WIN32_WINNT |   157 #    undef _WIN32_WINNT | 
|   128 #  endif |   158 #  endif | 
|   129 #  ifndef _WIN32_WINNT |   159 #  ifndef _WIN32_WINNT | 
|   130 #    define _WIN32_WINNT 0x0600 |   160 #    define _WIN32_WINNT 0x0600 | 
|   131 #  endif |   161 #  endif | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   203 /* A const version, but does not detect erratically being called on pointers. */ |   233 /* A const version, but does not detect erratically being called on pointers. */ | 
|   204 #define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__
      array[0]))) |   234 #define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__
      array[0]))) | 
|   205  |   235  | 
|   206 #define HB_STMT_START do |   236 #define HB_STMT_START do | 
|   207 #define HB_STMT_END   while (0) |   237 #define HB_STMT_END   while (0) | 
|   208  |   238  | 
|   209 #define _ASSERT_STATIC1(_line, _cond)   HB_UNUSED typedef int _static_assert_on_
      line_##_line##_failed[(_cond)?1:-1] |   239 #define _ASSERT_STATIC1(_line, _cond)   HB_UNUSED typedef int _static_assert_on_
      line_##_line##_failed[(_cond)?1:-1] | 
|   210 #define _ASSERT_STATIC0(_line, _cond)   _ASSERT_STATIC1 (_line, (_cond)) |   240 #define _ASSERT_STATIC0(_line, _cond)   _ASSERT_STATIC1 (_line, (_cond)) | 
|   211 #define ASSERT_STATIC(_cond)            _ASSERT_STATIC0 (__LINE__, (_cond)) |   241 #define ASSERT_STATIC(_cond)            _ASSERT_STATIC0 (__LINE__, (_cond)) | 
|   212  |   242  | 
|   213 /* Note: C++ allows sizeof() of variable-lengh arrays.  So, if _cond is not |   243 template <unsigned int cond> class hb_assert_constant_t {}; | 
|   214  * constant, it still compiles (ouch!), but at least we'll get a -Wvla warning. 
      */ |   244  | 
|   215 #define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * sizeof (char[(_cond) ? 1 : -1])) |   245 #define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_con
      stant_t<_cond>)) | 
|   216  |   246  | 
|   217 #define _PASTE1(a,b) a##b |   247 #define _PASTE1(a,b) a##b | 
|   218 #define PASTE(a,b) _PASTE1(a,b) |   248 #define PASTE(a,b) _PASTE1(a,b) | 
|   219  |   249  | 
|   220 /* Lets assert int types.  Saves trouble down the road. */ |   250 /* Lets assert int types.  Saves trouble down the road. */ | 
|   221  |   251  | 
|   222 ASSERT_STATIC (sizeof (int8_t) == 1); |   252 ASSERT_STATIC (sizeof (int8_t) == 1); | 
|   223 ASSERT_STATIC (sizeof (uint8_t) == 1); |   253 ASSERT_STATIC (sizeof (uint8_t) == 1); | 
|   224 ASSERT_STATIC (sizeof (int16_t) == 2); |   254 ASSERT_STATIC (sizeof (int16_t) == 2); | 
|   225 ASSERT_STATIC (sizeof (uint16_t) == 2); |   255 ASSERT_STATIC (sizeof (uint16_t) == 2); | 
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   854   return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2); |   884   return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2); | 
|   855 } |   885 } | 
|   856  |   886  | 
|   857 template <typename T> static inline bool |   887 template <typename T> static inline bool | 
|   858 hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) |   888 hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) | 
|   859 { |   889 { | 
|   860   return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (
      u, lo3, hi3); |   890   return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (
      u, lo3, hi3); | 
|   861 } |   891 } | 
|   862  |   892  | 
|   863  |   893  | 
 |   894 /* Enable bitwise ops on enums marked as flags_t */ | 
 |   895 /* To my surprise, looks like the function resolver is happy to silently cast | 
 |   896  * one enum to another...  So this doesn't provide the type-checking that I | 
 |   897  * originally had in mind... :(. | 
 |   898  * | 
 |   899  * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163 | 
 |   900  */ | 
 |   901 #ifdef _MSC_VER | 
 |   902 # pragma warning(disable:4200) | 
 |   903 # pragma warning(disable:4800) | 
 |   904 #endif | 
 |   905 #define HB_MARK_AS_FLAG_T(T) \ | 
 |   906         extern "C++" { \ | 
 |   907           static inline T operator | (T l, T r) { return T ((unsigned) l | (unsi
      gned) r); } \ | 
 |   908           static inline T operator & (T l, T r) { return T ((unsigned) l & (unsi
      gned) r); } \ | 
 |   909           static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsi
      gned) r); } \ | 
 |   910           static inline T operator ~ (T r) { return T (~(unsigned int) r); } \ | 
 |   911           static inline T& operator |= (T &l, T r) { l = l | r; return l; } \ | 
 |   912           static inline T& operator &= (T& l, T r) { l = l & r; return l; } \ | 
 |   913           static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \ | 
 |   914         } | 
 |   915  | 
 |   916  | 
|   864 /* Useful for set-operations on small enums. |   917 /* Useful for set-operations on small enums. | 
|   865  * For example, for testing "x ∈ {x1, x2, x3}" use: |   918  * For example, for testing "x ∈ {x1, x2, x3}" use: | 
|   866  * (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3))) |   919  * (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3))) | 
|   867  */ |   920  */ | 
|   868 #define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((x) < 32) + (1U << (x))) |   921 #define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((x) < 32) + (1U << (x))) | 
|   869 #define FLAG_SAFE(x) (1U << (x)) |   922 #define FLAG_SAFE(x) (1U << (x)) | 
|   870 #define FLAG_UNSAFE(x) ((x) < 32 ? FLAG_SAFE(x) : 0) |   923 #define FLAG_UNSAFE(x) ((x) < 32 ? FLAG_SAFE(x) : 0) | 
|   871 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(
      x)) |   924 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(
      x)) | 
|   872  |   925  | 
|   873  |   926  | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   944 hb_options (void) |   997 hb_options (void) | 
|   945 { |   998 { | 
|   946   if (unlikely (!_hb_options.i)) |   999   if (unlikely (!_hb_options.i)) | 
|   947     _hb_options_init (); |  1000     _hb_options_init (); | 
|   948  |  1001  | 
|   949   return _hb_options.opts; |  1002   return _hb_options.opts; | 
|   950 } |  1003 } | 
|   951  |  1004  | 
|   952  |  1005  | 
|   953 #endif /* HB_PRIVATE_HH */ |  1006 #endif /* HB_PRIVATE_HH */ | 
| OLD | NEW |