w32tex
About: TeX Live provides a comprehensive TeX system including all the major TeX-related programs, macro packages, and fonts that are free software. Windows sources.
  Fossies Dox: w32tex-src.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

hb.hh
Go to the documentation of this file.
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 
33 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC
34 #ifdef _MSC_VER
35 #pragma warning( disable: 4068 ) /* Unknown pragma */
36 #endif
37 #if defined(__GNUC__) || defined(__clang__)
38 /* Rules:
39  *
40  * - All pragmas are declared GCC even if they are clang ones. Otherwise GCC
41  * nags, even though we instruct it to ignore -Wunknown-pragmas. ¯\_(ツ)_/¯
42  *
43  * - Within each category, keep sorted.
44  *
45  * - Warnings whose scope can be expanded in future compiler versions shall
46  * be declared as "warning". Otherwise, either ignored or error.
47  */
48 
49 /* Setup. Don't sort order within this category. */
50 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
51 #pragma GCC diagnostic warning "-Wall"
52 #pragma GCC diagnostic warning "-Wextra"
53 #endif
54 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
55 #pragma GCC diagnostic ignored "-Wpragmas"
56 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
57 #pragma GCC diagnostic ignored "-Wunknown-warning-option"
58 #endif
59 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
60 //#pragma GCC diagnostic warning "-Weverything"
61 #endif
62 
63 /* Error. Should never happen. */
64 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR
65 #pragma GCC diagnostic error "-Wc++11-narrowing"
66 #pragma GCC diagnostic error "-Wcast-align"
67 #pragma GCC diagnostic error "-Wcast-function-type"
68 #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor"
69 #pragma GCC diagnostic error "-Wembedded-directive"
70 #pragma GCC diagnostic error "-Wextra-semi-stmt"
71 #pragma GCC diagnostic error "-Wformat-security"
72 #pragma GCC diagnostic error "-Wimplicit-function-declaration"
73 #pragma GCC diagnostic error "-Winit-self"
74 #pragma GCC diagnostic error "-Winjected-class-name"
75 #pragma GCC diagnostic error "-Wmissing-braces"
76 #pragma GCC diagnostic error "-Wmissing-declarations"
77 #pragma GCC diagnostic error "-Wmissing-prototypes"
78 #pragma GCC diagnostic error "-Wnested-externs"
79 #pragma GCC diagnostic error "-Wold-style-definition"
80 #pragma GCC diagnostic error "-Wpointer-arith"
81 #pragma GCC diagnostic error "-Wredundant-decls"
82 #pragma GCC diagnostic error "-Wreorder"
83 #pragma GCC diagnostic error "-Wsign-compare"
84 #pragma GCC diagnostic error "-Wstrict-prototypes"
85 #pragma GCC diagnostic error "-Wstring-conversion"
86 #pragma GCC diagnostic error "-Wswitch-enum"
87 #pragma GCC diagnostic error "-Wtautological-overlap-compare"
88 #pragma GCC diagnostic error "-Wunneeded-internal-declaration"
89 #pragma GCC diagnostic error "-Wunused"
90 #pragma GCC diagnostic error "-Wunused-local-typedefs"
91 #pragma GCC diagnostic error "-Wunused-value"
92 #pragma GCC diagnostic error "-Wunused-variable"
93 #pragma GCC diagnostic error "-Wvla"
94 #pragma GCC diagnostic error "-Wwrite-strings"
95 #endif
96 
97 /* Warning. To be investigated if happens. */
98 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING
99 #pragma GCC diagnostic warning "-Wbuiltin-macro-redefined"
100 #pragma GCC diagnostic warning "-Wdeprecated"
101 #pragma GCC diagnostic warning "-Wdeprecated-declarations"
102 #pragma GCC diagnostic warning "-Wdisabled-optimization"
103 #pragma GCC diagnostic warning "-Wdouble-promotion"
104 #pragma GCC diagnostic warning "-Wformat=2"
105 #pragma GCC diagnostic warning "-Wignored-pragma-optimize"
106 #pragma GCC diagnostic warning "-Wlogical-op"
107 #pragma GCC diagnostic warning "-Wmaybe-uninitialized"
108 #pragma GCC diagnostic warning "-Wmissing-format-attribute"
109 #pragma GCC diagnostic warning "-Wundef"
110 #pragma GCC diagnostic warning "-Wunused-but-set-variable"
111 #endif
112 
113 /* Ignored currently, but should be fixed at some point. */
114 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
115 #pragma GCC diagnostic ignored "-Wconversion" // TODO fix
116 #pragma GCC diagnostic ignored "-Wformat-signedness" // TODO fix
117 #pragma GCC diagnostic ignored "-Wshadow" // TODO fix
118 #pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations" // TODO fix
119 #pragma GCC diagnostic ignored "-Wunused-parameter" // TODO fix
120 #endif
121 
122 /* Ignored intentionally. */
123 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
124 #pragma GCC diagnostic ignored "-Wclass-memaccess"
125 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
126 #pragma GCC diagnostic ignored "-Wformat-zero-length"
127 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
128 #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
129 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
130 #pragma GCC diagnostic ignored "-Wtype-limits"
131 #pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it
132 #endif
133 
134 #endif
135 #endif
136 
137 
138 #include "hb-config.hh"
139 
140 
141 /*
142  * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to
143  * config.h.in. Copied here for the convenience of those embedding
144  * HarfBuzz and not using our build system.
145  */
146 /* Enable extensions on AIX 3, Interix. */
147 #ifndef _ALL_SOURCE
148 # define _ALL_SOURCE 1
149 #endif
150 /* Enable GNU extensions on systems that have them. */
151 #ifndef _GNU_SOURCE
152 # define _GNU_SOURCE 1
153 #endif
154 /* Enable threading extensions on Solaris. */
155 #ifndef _POSIX_PTHREAD_SEMANTICS
156 # define _POSIX_PTHREAD_SEMANTICS 1
157 #endif
158 /* Enable extensions on HP NonStop. */
159 #ifndef _TANDEM_SOURCE
160 # define _TANDEM_SOURCE 1
161 #endif
162 /* Enable general extensions on Solaris. */
163 #ifndef __EXTENSIONS__
164 # define __EXTENSIONS__ 1
165 #endif
166 
167 #if defined (_MSC_VER) && defined (HB_DLL_EXPORT)
168 #define HB_EXTERN __declspec (dllexport) extern
169 #endif
170 
171 #include "hb.h"
172 #define HB_H_IN
173 #include "hb-ot.h"
174 #define HB_OT_H_IN
175 #include "hb-aat.h"
176 #define HB_AAT_H_IN
177 
178 #include <limits.h>
179 #include <math.h>
180 #include <float.h>
181 #include <stdlib.h>
182 #include <stddef.h>
183 #include <string.h>
184 #include <assert.h>
185 #include <stdio.h>
186 #include <stdarg.h>
187 
188 #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
189 #ifdef __MINGW32_VERSION
190 #ifndef WIN32_LEAN_AND_MEAN
191 #define WIN32_LEAN_AND_MEAN 1
192 #endif
193 #else
194 #include <intrin.h>
195 #endif
196 #endif
197 
198 #ifdef _WIN32
199 #include <windows.h>
200 #include <winapifamily.h>
201 #endif
202 
203 #define HB_PASTE1(a,b) a##b
204 #define HB_PASTE(a,b) HB_PASTE1(a,b)
205 
206 
207 /* Compile-time custom allocator support. */
208 
209 #if !defined(HB_CUSTOM_MALLOC) \
210  && defined(hb_malloc_impl) \
211  && defined(hb_calloc_impl) \
212  && defined(hb_realloc_impl) \
213  && defined(hb_free_impl)
214 #define HB_CUSTOM_MALLOC
215 #endif
216 
217 #ifdef HB_CUSTOM_MALLOC
218 extern "C" void* hb_malloc_impl(size_t size);
219 extern "C" void* hb_calloc_impl(size_t nmemb, size_t size);
220 extern "C" void* hb_realloc_impl(void *ptr, size_t size);
221 extern "C" void hb_free_impl(void *ptr);
222 #define malloc hb_malloc_impl
223 #define calloc hb_calloc_impl
224 #define realloc hb_realloc_impl
225 #define free hb_free_impl
226 #endif
227 
228 
229 /*
230  * Compiler attributes
231  */
232 
233 #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
234 #define likely(expr) (__builtin_expect (!!(expr), 1))
235 #define unlikely(expr) (__builtin_expect (!!(expr), 0))
236 #else
237 #define likely(expr) (expr)
238 #define unlikely(expr) (expr)
239 #endif
240 
241 #if !defined(__GNUC__) && !defined(__clang__)
242 #undef __attribute__
243 #define __attribute__(x)
244 #endif
245 
246 #if defined(__GNUC__) && (__GNUC__ >= 3)
247 #define HB_PURE_FUNC __attribute__((pure))
248 #define HB_CONST_FUNC __attribute__((const))
249 #define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
250 #else
251 #define HB_PURE_FUNC
252 #define HB_CONST_FUNC
253 #define HB_PRINTF_FUNC(format_idx, arg_idx)
254 #endif
255 #if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
256 #define HB_UNUSED __attribute__((unused))
257 #elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */
258 #define HB_UNUSED __pragma(warning(suppress: 4100 4101))
259 #else
260 #define HB_UNUSED
261 #endif
262 
263 #ifndef HB_INTERNAL
264 # if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC)
265 # define HB_INTERNAL __attribute__((__visibility__("hidden")))
266 # elif defined(__MINGW32__)
267  /* We use -export-symbols on mingw32, since it does not support visibility attributes. */
268 # define HB_INTERNAL
269 # elif defined (_MSC_VER) && defined (HB_DLL_EXPORT)
270  /* We do not try to export internal symbols on Visual Studio */
271 # define HB_INTERNAL
272 #else
273 # define HB_INTERNAL
274 # define HB_NO_VISIBILITY 1
275 # endif
276 #endif
277 
278 /* https://github.com/harfbuzz/harfbuzz/issues/1651 */
279 #if defined(__clang__) && __clang_major__ < 10
280 #define static_const static
281 #else
282 #define static_const static const
283 #endif
284 
285 #if defined(__GNUC__) && (__GNUC__ >= 3)
286 #define HB_FUNC __PRETTY_FUNCTION__
287 #elif defined(_MSC_VER)
288 #define HB_FUNC __FUNCSIG__
289 #else
290 #define HB_FUNC __func__
291 #endif
292 
293 #if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140)
294 /* https://github.com/harfbuzz/harfbuzz/issues/630 */
295 #define __restrict
296 #endif
297 
298 /*
299  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
300  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
301  * cases that fall through without a break or return statement. HB_FALLTHROUGH
302  * is only needed on cases that have code:
303  *
304  * switch (foo) {
305  * case 1: // These cases have no code. No fallthrough annotations are needed.
306  * case 2:
307  * case 3:
308  * foo = 4; // This case has code, so a fallthrough annotation is needed:
309  * HB_FALLTHROUGH;
310  * default:
311  * return foo;
312  * }
313  */
314 #if defined(__clang__) && __cplusplus >= 201103L
315  /* clang's fallthrough annotations are only available starting in C++11. */
316 # define HB_FALLTHROUGH [[clang::fallthrough]]
317 #elif defined(__GNUC__) && (__GNUC__ >= 7)
318  /* GNU fallthrough attribute is available from GCC7 */
319 # define HB_FALLTHROUGH __attribute__((fallthrough))
320 #elif defined(_MSC_VER)
321  /*
322  * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
323  * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
324  */
325 # include <sal.h>
326 # define HB_FALLTHROUGH __fallthrough
327 #else
328 # define HB_FALLTHROUGH /* FALLTHROUGH */
329 #endif
330 
331 /* A tag to enforce use of return value for a function */
332 #if __cplusplus >= 201703L
333 # define HB_NODISCARD [[nodiscard]]
334 #elif defined(__GNUC__) || defined(__clang__)
335 # define HB_NODISCARD __attribute__((warn_unused_result))
336 #elif defined(_MSC_VER)
337 # define HB_NODISCARD _Check_return_
338 #else
339 # define HB_NODISCARD
340 #endif
341 #define hb_success_t HB_NODISCARD bool
342 
343 /* https://github.com/harfbuzz/harfbuzz/issues/1852 */
344 #if defined(__clang__) && !(defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__)))
345 /* Disable certain sanitizer errors. */
346 /* https://github.com/harfbuzz/harfbuzz/issues/1247 */
347 #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow")))
348 #else
349 #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW
350 #endif
351 
352 
353 #ifdef _WIN32
354  /* We need Windows Vista for both Uniscribe backend and for
355  * MemoryBarrier. We don't support compiling on Windows XP,
356  * though we run on it fine. */
357 # if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600
358 # undef _WIN32_WINNT
359 # endif
360 # ifndef _WIN32_WINNT
361 # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
362 # define _WIN32_WINNT 0x0600
363 # endif
364 # endif
365 # ifndef WIN32_LEAN_AND_MEAN
366 # define WIN32_LEAN_AND_MEAN 1
367 # endif
368 # ifndef STRICT
369 # define STRICT 1
370 # endif
371 
372 # if defined(_WIN32_WCE)
373  /* Some things not defined on Windows CE. */
374 # define vsnprintf _vsnprintf
375 # ifndef HB_NO_GETENV
376 # define HB_NO_GETENV
377 # endif
378 # if _WIN32_WCE < 0x800
379 # define HB_NO_SETLOCALE
380 # define HB_NO_ERRNO
381 # endif
382 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
383 # ifndef HB_NO_GETENV
384 # define HB_NO_GETENV
385 # endif
386 # endif
387 # if defined(_MSC_VER) && _MSC_VER < 1900
388 # define snprintf _snprintf
389 # endif
390 #endif
391 
392 #ifdef HB_NO_GETENV
393 #define getenv(Name) nullptr
394 #endif
395 
396 #ifndef HB_NO_ERRNO
397 # include <errno.h>
398 #else
399 static int HB_UNUSED _hb_errno = 0;
400 # undef errno
401 # define errno _hb_errno
402 #endif
403 
404 #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT)
405 /* atexit() is only safe to be called from shared libraries on certain
406  * platforms. Whitelist.
407  * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
408 # if defined(__linux) && defined(__GLIBC_PREREQ)
409 # if __GLIBC_PREREQ(2,3)
410 /* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */
411 # define HB_USE_ATEXIT 1
412 # endif
413 # elif defined(_MSC_VER) || defined(__MINGW32__)
414 /* For MSVC:
415  * https://msdn.microsoft.com/en-us/library/tze57ck3.aspx
416  * https://msdn.microsoft.com/en-us/library/zk17ww08.aspx
417  * mingw32 headers say atexit is safe to use in shared libraries.
418  */
419 # define HB_USE_ATEXIT 1
420 # elif defined(__ANDROID__)
421 /* This is available since Android NKD r8 or r8b:
422  * https://issuetracker.google.com/code/p/android/issues/detail?id=6455
423  */
424 # define HB_USE_ATEXIT 1
425 # elif defined(__APPLE__)
426 /* For macOS and related platforms, the atexit man page indicates
427  * that it will be invoked when the library is unloaded, not only
428  * at application exit.
429  */
430 # define HB_USE_ATEXIT 1
431 # endif
432 #endif
433 #ifdef HB_NO_ATEXIT
434 # undef HB_USE_ATEXIT
435 #endif
436 #ifndef HB_USE_ATEXIT
437 # define HB_USE_ATEXIT 0
438 #endif
439 
440 #define HB_STMT_START do
441 #define HB_STMT_END while (0)
442 
443 /* Static-assert as expression. */
444 template <unsigned int cond> class hb_assert_constant_t;
445 template <> class hb_assert_constant_t<1> {};
446 #define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
447 
448 /* Lets assert int types. Saves trouble down the road. */
449 static_assert ((sizeof (int8_t) == 1), "");
450 static_assert ((sizeof (uint8_t) == 1), "");
451 static_assert ((sizeof (int16_t) == 2), "");
452 static_assert ((sizeof (uint16_t) == 2), "");
453 static_assert ((sizeof (int32_t) == 4), "");
454 static_assert ((sizeof (uint32_t) == 4), "");
455 static_assert ((sizeof (int64_t) == 8), "");
456 static_assert ((sizeof (uint64_t) == 8), "");
457 static_assert ((sizeof (hb_codepoint_t) == 4), "");
458 static_assert ((sizeof (hb_position_t) == 4), "");
459 static_assert ((sizeof (hb_mask_t) == 4), "");
460 static_assert ((sizeof (hb_var_int_t) == 4), "");
461 
462 #define HB_DELETE_COPY_ASSIGN(TypeName) \
463  TypeName(const TypeName&) = delete; \
464  void operator=(const TypeName&) = delete
465 #define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
466  TypeName() = delete; \
467  TypeName(const TypeName&) = delete; \
468  void operator=(const TypeName&) = delete
469 
470 
471 /* Flags */
472 
473 /* Enable bitwise ops on enums marked as flags_t */
474 /* To my surprise, looks like the function resolver is happy to silently cast
475  * one enum to another... So this doesn't provide the type-checking that I
476  * originally had in mind... :(.
477  *
478  * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
479  */
480 #ifdef _MSC_VER
481 # pragma warning(disable:4200)
482 # pragma warning(disable:4800)
483 #endif
484 #define HB_MARK_AS_FLAG_T(T) \
485  extern "C++" { \
486  static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
487  static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
488  static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
489  static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
490  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
491  static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
492  static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
493  } \
494  static_assert (true, "")
495 
496 /* Useful for set-operations on small enums.
497  * For example, for testing "x ∈ {x1, x2, x3}" use:
498  * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
499  */
500 #define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
501 #define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
502 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
503 #define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
504 #define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
505 
506 
507 /* Size signifying variable-sized array */
508 #ifndef HB_VAR_ARRAY
509 #define HB_VAR_ARRAY 1
510 #endif
511 
512 static inline float
513 _hb_roundf (float x) { return floorf (x + .5f); }
514 #define roundf(x) _hb_roundf(x)
515 
516 /* Endian swap, used in Windows related backends */
517 static inline uint16_t hb_uint16_swap (const uint16_t v)
518 { return (v >> 8) | (v << 8); }
519 static inline uint32_t hb_uint32_swap (const uint32_t v)
520 { return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
521 
522 /*
523  * Big-endian integers. Here because fundamental.
524  */
525 
526 template <typename Type, int Bytes> struct BEInt;
527 
528 template <typename Type>
529 struct BEInt<Type, 1>
530 {
531  public:
532  BEInt<Type, 1>& operator = (Type V)
533  {
534  v = V;
535  return *this;
536  }
537  operator Type () const { return v; }
538  private: uint8_t v;
539 };
540 template <typename Type>
541 struct BEInt<Type, 2>
542 {
543  public:
544  BEInt<Type, 2>& operator = (Type V)
545  {
546  v[0] = (V >> 8) & 0xFF;
547  v[1] = (V ) & 0xFF;
548  return *this;
549  }
550  operator Type () const
551  {
552 #if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
553  defined(__BYTE_ORDER) && \
554  (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
555  /* Spoon-feed the compiler a big-endian integer with alignment 1.
556  * https://github.com/harfbuzz/harfbuzz/pull/1398 */
557  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
558 #if __BYTE_ORDER == __LITTLE_ENDIAN
559  return __builtin_bswap16 (((packed_uint16_t *) this)->v);
560 #else /* __BYTE_ORDER == __BIG_ENDIAN */
561  return ((packed_uint16_t *) this)->v;
562 #endif
563 #endif
564  return (v[0] << 8)
565  + (v[1] );
566  }
567  private: uint8_t v[2];
568 };
569 template <typename Type>
570 struct BEInt<Type, 3>
571 {
572  public:
573  BEInt<Type, 3>& operator = (Type V)
574  {
575  v[0] = (V >> 16) & 0xFF;
576  v[1] = (V >> 8) & 0xFF;
577  v[2] = (V ) & 0xFF;
578  return *this;
579  }
580  operator Type () const
581  {
582  return (v[0] << 16)
583  + (v[1] << 8)
584  + (v[2] );
585  }
586  private: uint8_t v[3];
587 };
588 template <typename Type>
589 struct BEInt<Type, 4>
590 {
591  public:
592  BEInt<Type, 4>& operator = (Type V)
593  {
594  v[0] = (V >> 24) & 0xFF;
595  v[1] = (V >> 16) & 0xFF;
596  v[2] = (V >> 8) & 0xFF;
597  v[3] = (V ) & 0xFF;
598  return *this;
599  }
600  operator Type () const
601  {
602  return (v[0] << 24)
603  + (v[1] << 16)
604  + (v[2] << 8)
605  + (v[3] );
606  }
607  private: uint8_t v[4];
608 };
609 
610 
611 /*
612  * For lack of a better place, put Zawgyi script hack here.
613  * https://github.com/harfbuzz/harfbuzz/issues/1162
614  */
615 
616 #define HB_SCRIPT_MYANMAR_ZAWGYI ((hb_script_t) HB_TAG ('Q','a','a','g'))
617 
618 
619 /* Headers we include for everyone. Keep topologically sorted by dependency.
620  * They express dependency amongst themselves, but no other file should include
621  * them directly.*/
622 #include "hb-meta.hh"
623 #include "hb-mutex.hh"
624 #include "hb-number.hh"
625 #include "hb-atomic.hh" // Requires: hb-meta
626 #include "hb-null.hh" // Requires: hb-meta
627 #include "hb-algs.hh" // Requires: hb-meta hb-null hb-number
628 #include "hb-iter.hh" // Requires: hb-algs hb-meta
629 #include "hb-debug.hh" // Requires: hb-algs hb-atomic
630 #include "hb-array.hh" // Requires: hb-algs hb-iter hb-null
631 #include "hb-vector.hh" // Requires: hb-array hb-null
632 #include "hb-object.hh" // Requires: hb-atomic hb-mutex hb-vector
633 
634 #endif /* HB_HH */
__inline float __cdecl floorf(float _X)
Definition: CPAL.d:18965
#define static_assert(c, msg)
Definition: cff.cc:31
int v
Definition: dviconv.c:10
signed short int16_t
Definition: stdint.h:76
unsigned short uint16_t
Definition: stdint.h:79
signed __int64 int64_t
Definition: stdint.h:89
unsigned int uint32_t
Definition: stdint.h:80
signed int int32_t
Definition: stdint.h:77
unsigned char uint8_t
Definition: stdint.h:78
unsigned __int64 uint64_t
Definition: stdint.h:90
signed char int8_t
Definition: stdint.h:75
float x
Definition: cordic.py:15
#define V
Definition: pgmcrater.c:68
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF ptr
static int size
Definition: ppmlabel.c:24
uint32_t hb_codepoint_t
Definition: hb-common.h:106
uint32_t hb_mask_t
Definition: hb-common.h:122
int32_t hb_position_t
Definition: hb-common.h:115
static float _hb_roundf(float x)
Definition: hb.hh:513
#define HB_UNUSED
Definition: hb.hh:260
static uint32_t hb_uint32_swap(const uint32_t v)
Definition: hb.hh:519
#define __attribute__(x)
Definition: hb.hh:243
static uint16_t hb_uint16_swap(const uint16_t v)
Definition: hb.hh:517
uint8_t v
Definition: hb.hh:538
Definition: hb.hh:526