1 | /* |
2 | * Copyright © 2007,2008,2009 Red Hat, Inc. |
3 | * Copyright © 2011,2012 Google, Inc. |
4 | * |
5 | * This is part of HarfBuzz, a text shaping library. |
6 | * |
7 | * Permission is hereby granted, without written agreement and without |
8 | * license or royalty fees, to use, copy, modify, and distribute this |
9 | * software and its documentation for any purpose, provided that the |
10 | * above copyright notice and the following two paragraphs appear in |
11 | * all copies of this software. |
12 | * |
13 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
14 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
15 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
16 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
17 | * DAMAGE. |
18 | * |
19 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
20 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
21 | * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
22 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
23 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
24 | * |
25 | * Red Hat Author(s): Behdad Esfahbod |
26 | * Google Author(s): Behdad Esfahbod |
27 | */ |
28 | |
29 | #ifndef HB_HH |
30 | #define HB_HH |
31 | |
32 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC |
33 | #ifdef _MSC_VER |
34 | #pragma warning( disable: 4068 ) /* Unknown pragma */ |
35 | #endif |
36 | #if defined(__GNUC__) || defined(__clang__) |
37 | /* Rules: |
38 | * |
39 | * - All pragmas are declared GCC even if they are clang ones. Otherwise GCC |
40 | * nags, even though we instruct it to ignore -Wunknown-pragmas. ¯\_(ツ)_/¯ |
41 | * |
42 | * - Within each category, keep sorted. |
43 | * |
44 | * - Warnings whose scope can be expanded in future compiler versions shall |
45 | * be declared as "warning". Otherwise, either ignored or error. |
46 | */ |
47 | |
48 | /* Setup. Don't sort order within this category. */ |
49 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING |
50 | #pragma GCC diagnostic warning "-Wall" |
51 | #pragma GCC diagnostic warning "-Wextra" |
52 | #endif |
53 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED |
54 | #pragma GCC diagnostic ignored "-Wpragmas" |
55 | #pragma GCC diagnostic ignored "-Wunknown-pragmas" |
56 | #pragma GCC diagnostic ignored "-Wunknown-warning-option" |
57 | #endif |
58 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING |
59 | //#pragma GCC diagnostic warning "-Weverything" |
60 | #endif |
61 | |
62 | /* Error. Should never happen. */ |
63 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR |
64 | #pragma GCC diagnostic error "-Wbitwise-instead-of-logical" |
65 | #pragma GCC diagnostic error "-Wcast-align" |
66 | #pragma GCC diagnostic error "-Wcast-function-type" |
67 | #pragma GCC diagnostic error "-Wconstant-conversion" |
68 | #pragma GCC diagnostic error "-Wcomma" |
69 | #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" |
70 | #pragma GCC diagnostic error "-Wembedded-directive" |
71 | #pragma GCC diagnostic error "-Wextra-semi-stmt" |
72 | #pragma GCC diagnostic error "-Wformat-security" |
73 | #pragma GCC diagnostic error "-Wimplicit-function-declaration" |
74 | #pragma GCC diagnostic error "-Winit-self" |
75 | #pragma GCC diagnostic error "-Winjected-class-name" |
76 | #pragma GCC diagnostic error "-Wmissing-braces" |
77 | #pragma GCC diagnostic error "-Wmissing-declarations" |
78 | #pragma GCC diagnostic error "-Wmissing-prototypes" |
79 | #pragma GCC diagnostic error "-Wnarrowing" |
80 | #pragma GCC diagnostic error "-Wnested-externs" |
81 | #pragma GCC diagnostic error "-Wold-style-definition" |
82 | #pragma GCC diagnostic error "-Wpointer-arith" |
83 | #pragma GCC diagnostic error "-Wredundant-decls" |
84 | #pragma GCC diagnostic error "-Wreorder" |
85 | #pragma GCC diagnostic error "-Wsign-compare" |
86 | #pragma GCC diagnostic error "-Wstrict-prototypes" |
87 | #pragma GCC diagnostic error "-Wstring-conversion" |
88 | #pragma GCC diagnostic error "-Wswitch-enum" |
89 | #pragma GCC diagnostic error "-Wtautological-overlap-compare" |
90 | #pragma GCC diagnostic error "-Wunneeded-internal-declaration" |
91 | #pragma GCC diagnostic error "-Wunused" |
92 | #pragma GCC diagnostic error "-Wunused-local-typedefs" |
93 | #pragma GCC diagnostic error "-Wunused-value" |
94 | #pragma GCC diagnostic error "-Wunused-variable" |
95 | #pragma GCC diagnostic error "-Wvla" |
96 | #pragma GCC diagnostic error "-Wwrite-strings" |
97 | #endif |
98 | |
99 | /* Warning. To be investigated if happens. */ |
100 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING |
101 | #pragma GCC diagnostic warning "-Wbuiltin-macro-redefined" |
102 | #pragma GCC diagnostic warning "-Wdeprecated" |
103 | #pragma GCC diagnostic warning "-Wdeprecated-declarations" |
104 | #pragma GCC diagnostic warning "-Wdisabled-optimization" |
105 | #pragma GCC diagnostic warning "-Wdouble-promotion" |
106 | #pragma GCC diagnostic warning "-Wformat=2" |
107 | #pragma GCC diagnostic warning "-Wformat-signedness" |
108 | #pragma GCC diagnostic warning "-Wignored-pragma-optimize" |
109 | #pragma GCC diagnostic warning "-Wlogical-op" |
110 | #pragma GCC diagnostic warning "-Wmaybe-uninitialized" |
111 | #pragma GCC diagnostic warning "-Wmissing-format-attribute" |
112 | #pragma GCC diagnostic warning "-Wundef" |
113 | #pragma GCC diagnostic warning "-Wunsafe-loop-optimizations" |
114 | #pragma GCC diagnostic warning "-Wunused-but-set-variable" |
115 | #endif |
116 | |
117 | /* Ignored currently, but should be fixed at some point. */ |
118 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED |
119 | #pragma GCC diagnostic ignored "-Wconversion" // TODO fix |
120 | #pragma GCC diagnostic ignored "-Wshadow" // TODO fix |
121 | #pragma GCC diagnostic ignored "-Wunused-parameter" // TODO fix |
122 | #if defined(__GNUC__) && !defined(__clang__) |
123 | #pragma GCC diagnostic ignored "-Wunused-result" // TODO fix |
124 | #endif |
125 | #endif |
126 | |
127 | /* Ignored intentionally. */ |
128 | #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED |
129 | #pragma GCC diagnostic ignored "-Wclass-memaccess" |
130 | #pragma GCC diagnostic ignored "-Wcast-function-type-strict" // https://github.com/harfbuzz/harfbuzz/pull/3859#issuecomment-1295409126 |
131 | #pragma GCC diagnostic ignored "-Wdangling-reference" // https://github.com/harfbuzz/harfbuzz/issues/4043 |
132 | #pragma GCC diagnostic ignored "-Wformat-nonliteral" |
133 | #pragma GCC diagnostic ignored "-Wformat-zero-length" |
134 | #pragma GCC diagnostic ignored "-Wmissing-field-initializers" |
135 | #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang |
136 | #pragma GCC diagnostic ignored "-Wrange-loop-analysis" // https://github.com/harfbuzz/harfbuzz/issues/2834 |
137 | #pragma GCC diagnostic ignored "-Wstrict-aliasing" |
138 | #pragma GCC diagnostic ignored "-Wtype-limits" |
139 | #pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it |
140 | #endif |
141 | |
142 | #endif |
143 | #endif |
144 | |
145 | |
146 | #include "hb-config.hh" |
147 | #include "hb-limits.hh" |
148 | |
149 | |
150 | /* |
151 | * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to |
152 | * config.h.in. Copied here for the convenience of those embedding |
153 | * HarfBuzz and not using our build system. |
154 | */ |
155 | /* Enable extensions on AIX 3, Interix. */ |
156 | #ifndef _ALL_SOURCE |
157 | # define _ALL_SOURCE 1 |
158 | #endif |
159 | /* Enable GNU extensions on systems that have them. */ |
160 | #ifndef _GNU_SOURCE |
161 | # define _GNU_SOURCE 1 |
162 | #endif |
163 | /* Enable threading extensions on Solaris. */ |
164 | #ifndef _POSIX_PTHREAD_SEMANTICS |
165 | # define _POSIX_PTHREAD_SEMANTICS 1 |
166 | #endif |
167 | /* Enable extensions on HP NonStop. */ |
168 | #ifndef _TANDEM_SOURCE |
169 | # define _TANDEM_SOURCE 1 |
170 | #endif |
171 | /* Enable general extensions on Solaris. */ |
172 | #ifndef __EXTENSIONS__ |
173 | # define __EXTENSIONS__ 1 |
174 | #endif |
175 | |
176 | #if defined (_MSC_VER) && defined (HB_DLL_EXPORT) |
177 | #define HB_EXTERN __declspec (dllexport) extern |
178 | #endif |
179 | |
180 | #include "hb.h" |
181 | #define HB_H_IN |
182 | #include "hb-ot.h" |
183 | #define HB_OT_H_IN |
184 | #include "hb-aat.h" |
185 | #define HB_AAT_H_IN |
186 | |
187 | #include <cassert> |
188 | #include <cfloat> |
189 | #include <climits> |
190 | #if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES) |
191 | # define _USE_MATH_DEFINES |
192 | #endif |
193 | #include <cmath> |
194 | #include <cstdarg> |
195 | #include <cstddef> |
196 | #include <cstdio> |
197 | #include <cstdlib> |
198 | #include <cstring> |
199 | |
200 | #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) |
201 | #ifdef __MINGW32_VERSION |
202 | #ifndef WIN32_LEAN_AND_MEAN |
203 | #define WIN32_LEAN_AND_MEAN 1 |
204 | #endif |
205 | #else |
206 | #include <intrin.h> |
207 | #endif |
208 | #endif |
209 | |
210 | #ifdef _WIN32 |
211 | #include <windows.h> |
212 | #include <winapifamily.h> |
213 | #endif |
214 | |
215 | #define HB_PASTE1(a,b) a##b |
216 | #define HB_PASTE(a,b) HB_PASTE1(a,b) |
217 | |
218 | |
219 | /* Compile-time custom allocator support. */ |
220 | |
221 | #if !defined(HB_CUSTOM_MALLOC) \ |
222 | && defined(hb_malloc_impl) \ |
223 | && defined(hb_calloc_impl) \ |
224 | && defined(hb_realloc_impl) \ |
225 | && defined(hb_free_impl) |
226 | #define HB_CUSTOM_MALLOC |
227 | #endif |
228 | |
229 | #ifdef HB_CUSTOM_MALLOC |
230 | extern "C" void* hb_malloc_impl(size_t size); |
231 | extern "C" void* hb_calloc_impl(size_t nmemb, size_t size); |
232 | extern "C" void* hb_realloc_impl(void *ptr, size_t size); |
233 | extern "C" void hb_free_impl(void *ptr); |
234 | #define hb_malloc hb_malloc_impl |
235 | #define hb_calloc hb_calloc_impl |
236 | #define hb_realloc hb_realloc_impl |
237 | #define hb_free hb_free_impl |
238 | #else |
239 | #define hb_malloc malloc |
240 | #define hb_calloc calloc |
241 | #define hb_realloc realloc |
242 | #define hb_free free |
243 | #endif |
244 | |
245 | |
246 | /* |
247 | * Compiler attributes |
248 | */ |
249 | |
250 | // gcc 10 has __has_builtin but not earlier versions. Sanction any gcc >= 5 |
251 | // clang defines it so no need. |
252 | #ifdef __has_builtin |
253 | #define hb_has_builtin __has_builtin |
254 | #else |
255 | #define hb_has_builtin(x) ((defined(__GNUC__) && __GNUC__ >= 5)) |
256 | #endif |
257 | |
258 | #if defined(__OPTIMIZE__) && hb_has_builtin(__builtin_expect) |
259 | #define likely(expr) __builtin_expect (bool(expr), 1) |
260 | #define unlikely(expr) __builtin_expect (bool(expr), 0) |
261 | #else |
262 | #define likely(expr) (expr) |
263 | #define unlikely(expr) (expr) |
264 | #endif |
265 | |
266 | #if !defined(__GNUC__) && !defined(__clang__) |
267 | #undef __attribute__ |
268 | #define __attribute__(x) |
269 | #endif |
270 | |
271 | #if defined(__GNUC__) && (__GNUC__ >= 3) |
272 | #define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx))) |
273 | #else |
274 | #define HB_PRINTF_FUNC(format_idx, arg_idx) |
275 | #endif |
276 | #if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__) |
277 | #define HB_UNUSED __attribute__((unused)) |
278 | #elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */ |
279 | #define HB_UNUSED __pragma(warning(suppress: 4100 4101)) |
280 | #else |
281 | #define HB_UNUSED |
282 | #endif |
283 | |
284 | #ifndef HB_INTERNAL |
285 | # if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC) |
286 | # define HB_INTERNAL __attribute__((__visibility__("hidden"))) |
287 | # elif defined(__MINGW32__) |
288 | /* We use -export-symbols on mingw32, since it does not support visibility attributes. */ |
289 | # define HB_INTERNAL |
290 | # elif defined (_MSC_VER) && defined (HB_DLL_EXPORT) |
291 | /* We do not try to export internal symbols on Visual Studio */ |
292 | # define HB_INTERNAL |
293 | #else |
294 | # define HB_INTERNAL |
295 | # define HB_NO_VISIBILITY 1 |
296 | # endif |
297 | #endif |
298 | |
299 | /* https://github.com/harfbuzz/harfbuzz/issues/1651 */ |
300 | #if defined(__clang__) && __clang_major__ < 10 |
301 | #define static_const static |
302 | #else |
303 | #define static_const static const |
304 | #endif |
305 | |
306 | #if defined(__GNUC__) && (__GNUC__ >= 3) |
307 | #define HB_FUNC __PRETTY_FUNCTION__ |
308 | #elif defined(_MSC_VER) |
309 | #define HB_FUNC __FUNCSIG__ |
310 | #else |
311 | #define HB_FUNC __func__ |
312 | #endif |
313 | |
314 | #if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140) |
315 | /* https://github.com/harfbuzz/harfbuzz/issues/630 */ |
316 | #define __restrict |
317 | #endif |
318 | |
319 | #ifndef HB_ALWAYS_INLINE |
320 | #if defined(_MSC_VER) |
321 | #define HB_ALWAYS_INLINE __forceinline |
322 | #else |
323 | #define HB_ALWAYS_INLINE __attribute__((always_inline)) inline |
324 | #endif |
325 | #endif |
326 | |
327 | /* |
328 | * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411 |
329 | * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch |
330 | * cases that fall through without a break or return statement. HB_FALLTHROUGH |
331 | * is only needed on cases that have code: |
332 | * |
333 | * switch (foo) { |
334 | * case 1: // These cases have no code. No fallthrough annotations are needed. |
335 | * case 2: |
336 | * case 3: |
337 | * foo = 4; // This case has code, so a fallthrough annotation is needed: |
338 | * HB_FALLTHROUGH; |
339 | * default: |
340 | * return foo; |
341 | * } |
342 | */ |
343 | #if defined(__clang__) && __cplusplus >= 201103L |
344 | /* clang's fallthrough annotations are only available starting in C++11. */ |
345 | # define HB_FALLTHROUGH [[clang::fallthrough]] |
346 | #elif defined(__GNUC__) && (__GNUC__ >= 7) |
347 | /* GNU fallthrough attribute is available from GCC7 */ |
348 | # define HB_FALLTHROUGH __attribute__((fallthrough)) |
349 | #elif defined(_MSC_VER) |
350 | /* |
351 | * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis): |
352 | * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx |
353 | */ |
354 | # include <sal.h> |
355 | # define HB_FALLTHROUGH __fallthrough |
356 | #else |
357 | # define HB_FALLTHROUGH /* FALLTHROUGH */ |
358 | #endif |
359 | |
360 | /* A tag to enforce use of return value for a function */ |
361 | #if __cplusplus >= 201703L |
362 | # define HB_NODISCARD [[nodiscard]] |
363 | #elif defined(__GNUC__) || defined(__clang__) |
364 | # define HB_NODISCARD __attribute__((warn_unused_result)) |
365 | #elif defined(_MSC_VER) |
366 | # define HB_NODISCARD _Check_return_ |
367 | #else |
368 | # define HB_NODISCARD |
369 | #endif |
370 | |
371 | /* https://github.com/harfbuzz/harfbuzz/issues/1852 */ |
372 | #if defined(__clang__) && !(defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__))) |
373 | /* Disable certain sanitizer errors. */ |
374 | /* https://github.com/harfbuzz/harfbuzz/issues/1247 */ |
375 | #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow"))) |
376 | #else |
377 | #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW |
378 | #endif |
379 | |
380 | |
381 | #ifdef _WIN32 |
382 | /* We need Windows Vista for both Uniscribe backend and for |
383 | * MemoryBarrier. We don't support compiling on Windows XP, |
384 | * though we run on it fine. */ |
385 | # if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600 |
386 | # undef _WIN32_WINNT |
387 | # endif |
388 | # ifndef _WIN32_WINNT |
389 | # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
390 | # define _WIN32_WINNT 0x0600 |
391 | # endif |
392 | # endif |
393 | # ifndef WIN32_LEAN_AND_MEAN |
394 | # define WIN32_LEAN_AND_MEAN 1 |
395 | # endif |
396 | # ifndef STRICT |
397 | # define STRICT 1 |
398 | # endif |
399 | |
400 | # if defined(_WIN32_WCE) |
401 | /* Some things not defined on Windows CE. */ |
402 | # define vsnprintf _vsnprintf |
403 | # ifndef HB_NO_GETENV |
404 | # define HB_NO_GETENV |
405 | # endif |
406 | # if _WIN32_WCE < 0x800 |
407 | # define HB_NO_SETLOCALE |
408 | # define HB_NO_ERRNO |
409 | # endif |
410 | # elif !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
411 | # ifndef HB_NO_GETENV |
412 | # define HB_NO_GETENV |
413 | # endif |
414 | # endif |
415 | # if defined(_MSC_VER) && _MSC_VER < 1900 |
416 | # define snprintf _snprintf |
417 | # endif |
418 | #endif |
419 | |
420 | #ifdef HB_NO_GETENV |
421 | #define getenv(Name) nullptr |
422 | #endif |
423 | |
424 | #ifndef HB_NO_ERRNO |
425 | # include <cerrno> |
426 | #else |
427 | static int HB_UNUSED _hb_errno = 0; |
428 | # undef errno |
429 | # define errno _hb_errno |
430 | #endif |
431 | |
432 | #define HB_STMT_START do |
433 | #define HB_STMT_END while (0) |
434 | |
435 | #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) |
436 | /* atexit() is only safe to be called from shared libraries on certain |
437 | * platforms. Whitelist. |
438 | * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */ |
439 | # if defined(__linux) && defined(__GLIBC_PREREQ) |
440 | # if __GLIBC_PREREQ(2,3) |
441 | /* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */ |
442 | # define HB_USE_ATEXIT 1 |
443 | # endif |
444 | # elif defined(_MSC_VER) || defined(__MINGW32__) |
445 | /* For MSVC: |
446 | * https://msdn.microsoft.com/en-us/library/tze57ck3.aspx |
447 | * https://msdn.microsoft.com/en-us/library/zk17ww08.aspx |
448 | * mingw32 headers say atexit is safe to use in shared libraries. |
449 | */ |
450 | # define HB_USE_ATEXIT 1 |
451 | # elif defined(__ANDROID__) |
452 | /* This is available since Android NKD r8 or r8b: |
453 | * https://issuetracker.google.com/code/p/android/issues/detail?id=6455 |
454 | */ |
455 | # define HB_USE_ATEXIT 1 |
456 | # elif defined(__APPLE__) |
457 | /* For macOS and related platforms, the atexit man page indicates |
458 | * that it will be invoked when the library is unloaded, not only |
459 | * at application exit. |
460 | */ |
461 | # define HB_USE_ATEXIT 1 |
462 | # endif |
463 | #endif /* defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) */ |
464 | #ifdef HB_NO_ATEXIT |
465 | # undef HB_USE_ATEXIT |
466 | #endif |
467 | #ifndef HB_USE_ATEXIT |
468 | # define HB_USE_ATEXIT 0 |
469 | #endif |
470 | #ifndef hb_atexit |
471 | #if !HB_USE_ATEXIT |
472 | # define hb_atexit(_) HB_STMT_START { if (0) (_) (); } HB_STMT_END |
473 | #else /* HB_USE_ATEXIT */ |
474 | # ifdef HAVE_ATEXIT |
475 | # define hb_atexit atexit |
476 | # else |
477 | template <void (*function) (void)> struct hb_atexit_t { ~hb_atexit_t () { function (); } }; |
478 | # define hb_atexit(f) static hb_atexit_t<f> _hb_atexit_##__LINE__; |
479 | # endif |
480 | #endif |
481 | #endif |
482 | |
483 | |
484 | // Locale business |
485 | |
486 | #if !defined(HB_NO_SETLOCALE) && (!defined(HAVE_NEWLOCALE) || !defined(HAVE_USELOCALE)) |
487 | #define HB_NO_SETLOCALE 1 |
488 | #endif |
489 | |
490 | #ifndef HB_NO_SETLOCALE |
491 | |
492 | #include <locale.h> |
493 | #ifdef HAVE_XLOCALE_H |
494 | #include <xlocale.h> // Needed on BSD/OS X for uselocale |
495 | #endif |
496 | |
497 | #ifdef WIN32 |
498 | #define hb_locale_t _locale_t |
499 | #else |
500 | #define hb_locale_t locale_t |
501 | #endif |
502 | #define hb_setlocale setlocale |
503 | #define hb_uselocale uselocale |
504 | |
505 | #else |
506 | |
507 | #define hb_locale_t void * |
508 | #define hb_setlocale(Category, Locale) "C" |
509 | #define hb_uselocale(Locale) ((hb_locale_t) 0) |
510 | |
511 | #endif |
512 | |
513 | |
514 | /* Lets assert int types. Saves trouble down the road. */ |
515 | static_assert ((sizeof (hb_codepoint_t) == 4), "" ); |
516 | static_assert ((sizeof (hb_position_t) == 4), "" ); |
517 | static_assert ((sizeof (hb_mask_t) == 4), "" ); |
518 | static_assert ((sizeof (hb_var_int_t) == 4), "" ); |
519 | |
520 | |
521 | /* Pie time. */ |
522 | // https://github.com/harfbuzz/harfbuzz/issues/4166 |
523 | #define HB_PI 3.14159265358979f |
524 | #define HB_2_PI (2.f * HB_PI) |
525 | |
526 | |
527 | /* Headers we include for everyone. Keep topologically sorted by dependency. |
528 | * They express dependency amongst themselves, but no other file should include |
529 | * them directly.*/ |
530 | #include "hb-cplusplus.hh" |
531 | #include "hb-meta.hh" |
532 | #include "hb-mutex.hh" |
533 | #include "hb-number.hh" |
534 | #include "hb-atomic.hh" // Requires: hb-meta |
535 | #include "hb-null.hh" // Requires: hb-meta |
536 | #include "hb-algs.hh" // Requires: hb-meta hb-null hb-number |
537 | #include "hb-iter.hh" // Requires: hb-algs hb-meta |
538 | #include "hb-debug.hh" // Requires: hb-algs hb-atomic |
539 | #include "hb-array.hh" // Requires: hb-algs hb-iter hb-null |
540 | #include "hb-vector.hh" // Requires: hb-array hb-null |
541 | #include "hb-object.hh" // Requires: hb-atomic hb-mutex hb-vector |
542 | |
543 | #endif /* HB_HH */ |
544 | |