Foxit PDF Conversion SDK
fx_system.h
Go to the documentation of this file.
1 
14 //<<<+++OPENSOURCE
15 //<<<+++OPENSOURCE_LICENSE
16 //<<<+++OPENSOURCE_BEGIN LIC==FOXIT||LIC==GOOGLE
17 
23 /*
24  * @brief System dependant service routines.
25  * All system-specific function and non-standard C/C++ routines go here
26  *
27  * FPDFAPI PREDEFINED MACROES
28  *
29  * FPDFAPI makes use of a number of predefined macroes to support all kind of platforms
30  * with a single set of codes. In most of times, application developers can ignore those
31  * macroes because they are properly defined according to system or compiler environment
32  * settings. However, sometimes, especially for cross platform development, FPDFAPI might
33  * take incorrect settings of the host platform, rather then the target platform. In such
34  * case, the application developers should manually set necessary macroes in their project
35  * settings.
36  *
37  *
38  * Currently the following macroes are defined:
39  * - #_FX_OS_ The target operating system
40  * - #_FX_COMPILER_ The compiler
41  * - #_FX_CPU_ The CPU
42  * - #_FX_ENDIAN_ Little endian or big endian
43  *
44  * #_FX_OS_ can be one of the followings:
45  * - #_FX_WIN32_DESKTOP_ Windows desktop OS (from Windows 95)
46  * - #_FX_WIN32_MOBILE_ Windows Mobile OS (from Windows CE 4.0)
47  * - #_FX_WIN64_ Windows 64 bit
48  * - #_FX_LINUX_DESKTOP_ Linux Desktop OS
49  * - #_FX_LINUX_EMBEDDED_ Embedded Linux OS
50  * - #_FX_SYMBIAN_ Symbian OS (from 7.0)
51  * - #_FX_MACOSX_ MAC OS X
52  * - #_FX_EMBEDDED_ Embedded OS
53  * - #_FX_SOLARIS_ Solaris 8 or later
54  * - #_FX_PALMOS_ PalmOS (5.0 or later)
55  * - #_FX_NETBSD_ NetBSD
56  * - #_FX_ANDROID_ Android
57  * - #_FX_VXWORKS_ VxWorks
58  *
59  * #_FX_COMPILER_ can be one of the following:
60  * - #_FX_VC6_ Microsoft Visual C++ 6.0
61  * - #_FX_VC7_ Microsoft Visual Studio.Net 2003
62  * - #_FX_VC8_ Microsoft Visual Studio.Net 2005
63  * - #_FX_GCC_ GNU C++ Compiler
64  * - #_FX_ADS_ ADS 1.2 Compiler
65  * - #_FX_RVCT_ RVCT 2.1 Compiler
66  * - #_FX_IARCC_ IAR C/C++ Compiler
67  * - #_FX_NOKIA_X86_ Nokia X86 Compiler
68  * - #_FX_METROWERKS_ Metrowerks C/C++ Compiler (with MSL)
69  * - #_FX_PACC_ Protein C/C++ Compiler (used by PalmOS)
70  * - #_FX_MIPS_SDE_ MIPS SDE
71  *
72  * #_FX_CPU_ can be one of the following:
73  * - #_FX_X86_ 32-bit x86 CPU
74  * - #_FX_X64_ 64-bit x86 CPU
75  * - #_FX_POWERPC_ Power PC
76  * - #_FX_ARM_ ARM
77  * - #_FX_SPARC_ Sparc
78  * - #_FX_MIPS_ MIPS
79  * - #_FX_ARM64_ 64-bit ARM
80  *
81  * #_FX_ENDIAN_ can be one of the following:
82  * - #_FX_BIG_ENDIAN_
83  * - #_FX_LITTLE_ENDIAN_
84  *
85  * #_FX_WORDSIZE_ can be one of the following:
86  * - #_FX_W32_ 32-bit instruct
87  * - #_FX_W64_ 64-bit instruct
88  */
89 
90 //<<<+++OPENSOURCE_MUST_BEGIN
91 #ifndef _FX_SYSTEM_H_
92 #define _FX_SYSTEM_H_
93 //<<<+++OPENSOURCE_MUST_END
94 
95 #ifdef _WIN32_WCE
96  #ifndef _SIZE_T_DEFINED
97  #define _SIZE_T_DEFINED
98  #endif //_SIZE_T_DEFINED
99 #endif
100 
105 
107 #define _FX_WIN32_DESKTOP_ 1
108  //<<<+++OPENSOURCE_BEGIN LIC==FOXIT
110  #define _FX_WIN32_MOBILE_ 2
111 
112  #define _FX_WIN64_ 3
113  //<<<+++OPENSOURCE_END
114 
116 #define _FX_LINUX_DESKTOP_ 4
117 
119  #define _FX_LINUX_EMBEDDED_ 5
120 
121  #define _FX_SYMBIAN_ 6
122 
124 #define _FX_MACOSX_ 7
125 
127  #define _FX_EMBEDDED_ 8
128 
129  #define _FX_SOLARIS_ 9
130 
131  #define _FX_PALMOS_ 10
132 
133  #define _FX_NETBSD_ 11
134  //<<<+++OPENSOURCE_END
135 
137 #define _FX_ANDROID_ 12
138 
140  #define _FX_VXWORKS_ 13
141 
142  #define _FX_MTK_ 14
143 
144  #define _FX_IOS_ 15
145 
147 #define _FXM_PLATFORM_WINDOWS_ 1
148 
149 #define _FXM_PLATFORM_LINUX_ 2
150 
151 #define _FXM_PLATFORM_APPLE_ 3
152 
153 #define _FXM_PLATFORM_ANDROID_ 4
154 
155 #ifdef __pnacl__
156 #define _CHROME_PNACL_
157 #endif
158 
159 #if defined(_FXM_PLATFORM_LINUX_JS_) || defined(_CHROME_PNACL_)
160  #define _FX_OS_ _FX_LINUX_DESKTOP_
161  #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
162 #endif
163 
164 /* OS */
165 
166 #ifndef _FX_OS_
167  #if defined(__SYMBIAN32__) || defined(__symbian__)
168  #define _FX_OS_ _FX_SYMBIAN_
169  #elif defined(_WIN32_WCE)
170  #define _FX_OS_ _FX_WIN32_MOBILE_
171  #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
172  #if defined (_WIN32_WCE) && (_WIN32_WCE == 0x600)
173  #define UNSUPPORT_CPP0X
174  #endif
175  #elif defined(__linux__) || defined(__native_client__)
176  #if ((defined(__arm__) || defined(__aarch64__)) && defined(__ARM_EABI__)) && (!defined(OS_CHROMEOS))
177  #define _FX_OS_ _FX_LINUX_EMBEDDED_
178  #else
179  #define _FX_OS_ _FX_LINUX_DESKTOP_
180  #endif
181  #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
182  #elif defined(__NetBSD__)
183  #define _FX_OS_ _FX_NETBSD_
184  #elif defined(_WIN64)
185  #define _FX_OS_ _FX_WIN64_
186  #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
187  #elif defined(_WIN32)
188  #define _FX_OS_ _FX_WIN32_DESKTOP_
189  #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
190  #elif defined(__sparc__)
191  #define _FX_OS_ _FX_SOLARIS_
192  #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
193  #elif defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__TMS470__)
194  #define _FX_OS_ _FX_EMBEDDED_
195  #elif defined(__APPLE__)
196  #include "TargetConditionals.h"
197  #if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR == 1)
198  #define _FX_OS_ _FX_IOS_
199  #else
200  #define _FX_OS_ _FX_MACOSX_
201  #endif
202  #define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
203  #elif defined(__ARM_EABI__)
204  #define _FX_OS_ _FX_EMBEDDED_
205  #endif
206 #else
207  #if _FX_OS_ == _FX_ANDROID_
208  #ifndef _FXM_PLATFORM_
209  #define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
210  #endif
211  #elif (_FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ || _FX_OS_ == _FX_WIN32_DESKTOP_)
212  #ifndef _FXM_PLATFORM_
213  #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
214  #endif
215  #elif (_FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_MACOSX_)
216  #ifndef _FXM_PLATFORM_
217  #define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
218  #endif
219  #elif _FX_OS_ == _FX_SOLARIS_ || _FX_OS_ == _FX_LINUX_EMBEDDED_ || _FX_OS_ == _FX_LINUX_DESKTOP_
220  #ifndef _FXM_PLATFORM_
221  #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
222  #endif
223  #endif
224 #endif //_FX_OS_
225 
226 #if !defined(_FX_OS_) || _FX_OS_ == 0
227  #error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.
228 #endif
229 
230 //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
231 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
232 
233  #define _CRT_SECURE_NO_WARNINGS
234  #if defined(_MSC_VER) && _MSC_VER < 1300
235  #define _WIN32_WINNT 0x400
236  #endif
237  #if defined(_MSC_VER) && _MSC_VER < 1600
238  #define UNSUPPORT_CPP0X
239  #endif
240  #ifndef NOMINMAX
241  #define NOMINMAX
242  #endif
243  #include <windows.h>
244 
245  #ifdef WINAPI_FAMILY
246  #if (0x00000001 == WINAPI_PARTITION_DESKTOP) && (0x00000002 == WINAPI_PARTITION_APP) //Macros in Windows Kit/8
247  #define _FX_WIN8_
248  #else //Macros in Windows Kit/8.1
249  #define _FX_WIN81_
250  #endif //(0x00000001 == WINAPI_PARTITION_DESKTOP) && (0x00000002 == WINAPI_PARTITION_APP)
251 
252  #ifdef _FX_WIN8_
253  #if /*defined(WINAPI_FAMILY) && */((WINAPI_FAMILY&WINAPI_PARTITION_APP) == WINAPI_PARTITION_APP)
254 
255  #define _FX_WINAPI_PARTITION_APP_
256  #endif
257  #if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY&WINAPI_PARTITION_DESKTOP) == WINAPI_PARTITION_DESKTOP)
258 
259  #define _FX_WINAPI_PARTITION_DESKTOP_
260  #endif
261  #endif //_FX_WIN8_
262 
263  #ifdef _FX_WIN81_
264 
265  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
266 
267  #define _FX_WINAPI_PARTITION_APP_
268  #endif
269 
270  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
271 
272  #define _FX_WINAPI_PARTITION_PHONE_APP_
273  #endif
274 
275  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
276 
277  #define _FX_WINAPI_PARTITION_DESKTOP_
278  #endif
279  #endif //_FX_WIN81_
280  #else // !defined(WINAPI_FAMILY)
281  #ifndef _WIN32_WCE
282  #define _FX_WINAPI_PARTITION_DESKTOP_
283  #endif
284  #endif //WINAPI_FAMILY
285 #endif //(_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
286 //<<<+++OPENSOURCE_MUST_END
287 
294 
296 #define _FX_VC6_ 1
297 
298 #define _FX_VC7_ 2
299 
300 #define _FX_VC8_ 3
301 
302 #define _FX_GCC_ 4
303 
304 #define _FX_ADS_ 5
305 
306 #define _FX_RVCT_ 6
307 
308 #define _FX_IARCC_ 7
309 
310 #define _FX_NOKIA_X86_ 8
311 
312 #define _FX_METROWERKS_ 9
313 
314 #define _FX_PACC_ 10
315 
316 #define _FX_TMS470_ 11
317 
318 #define _FX_MIPS_SDE_ 12
319 
320 /* Compiler */
321 #ifndef _FX_COMPILER_
322  #ifdef _MSC_VER
323  #if _MSC_VER >= 1400
324  #define _FX_COMPILER_ _FX_VC8_
325  #elif _MSC_VER >= 1300
326  #define _FX_COMPILER_ _FX_VC7_
327  #else
328 
347  #define _FX_COMPILER_ _FX_VC6_
348  #endif
349  #elif defined(__GNUC__)
350  #define _FX_COMPILER_ _FX_GCC_
351  #elif defined(__ARMCC_VERSION)
352  #if __ARMCC_VERSION < 200000
353  #define _FX_COMPILER_ _FX_ADS_
354  #else
355  #define _FX_COMPILER_ _FX_RVCT_
356  #endif
357  #elif defined(__ICCARM__)
358  #define _FX_COMPILER_ _FX_IARCC_
359  #elif defined(_PACC_VER)
360  #define _FX_COMPILER_ _FX_PACC_
361  #elif defined(__TMS470__)
362  #define _FX_COMPILER_ _FX_TMS470_
363  #endif
364 #endif /* !_FX_COMPILER_ */
365 #if !defined(_FX_COMPILER_) || _FX_COMPILER_ == 0
366  #error Sorry, can not figure out what compiler you are using. Please specify _FX_COMPILER_ macro.
367 #endif
368 //<<<+++OPENSOURCE_MUST_END
369 
376 
378 #define _FX_X86_ 1
379 
380 #define _FX_ARM_ 2
381 
382 #define _FX_POWERPC_ 3
383 
384 #define _FX_SPARC_ 4
385 
386 #define _FX_IA64_ 5
387 
388 #define _FX_MIPS_ 6
389 
390 #define _FX_X64_ 7
391 
392 #define _FX_ARM64_ 8
393 
394 #define _FX_MIPS64_ 9
395 
396 #define _FX_LOONGARCH64_ 10
397 
398 #define _FX_SW64_ 11
399 
400 #if defined(_FXM_PLATFORM_LINUX_JS_)
401 #if defined(__wasm64__)
402 #define _FX_CPU_ _FX_X64_
403 #else
404 #define _FX_CPU_ _FX_X86_
405 #endif // defined(__wasm64__)
406 #endif // defined(_FXM_PLATFORM_LINUX_JS_)
407 
408 #if defined(_CHROME_PNACL_)
409  #define _FX_CPU_ _FX_X86_
410 #endif
411 /* CPU */
412 #ifndef _FX_CPU_
413  #if defined(__arm__) || defined(ARM) || defined(_ARM_) || defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__arm) || defined(arm9) || defined(_M_ARM)
414  #define _FX_CPU_ _FX_ARM_
415  #elif defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_ARM64_) || defined(_M_ARM64)
416  #define _FX_CPU_ _FX_ARM64_
417  #elif defined(_M_IX86) || defined(__i386__)
418 
433  #define _FX_CPU_ _FX_X86_
434  #elif defined(_M_X64) || defined(__x86_64__)
435  #define _FX_CPU_ _FX_X64_
436  #elif defined(_M_IA64)
437  #define _FX_CPU_ _FX_IA64_
438  #elif defined(__POWERPC__)
439  #define _FX_CPU_ _FX_POWERPC_
440  #elif defined(__sparc__)
441  #define _FX_CPU_ _FX_SPARC_
442  #elif defined(__mips64)
443  #define _FX_CPU_ _FX_MIPS64_
444  #elif defined(__loongarch64)
445  #define _FX_CPU_ _FX_LOONGARCH64_
446  #elif defined(__sw_64__) || defined(__sw_64)
447  #define _FX_CPU_ _FX_SW64_
448  #elif defined(MIPS) || defined(_MIPS_) || defined(__mips)
449  #define _FX_CPU_ _FX_MIPS_
450  #endif
451 #endif
452 #if !defined(_FX_CPU_) || _FX_CPU_ == 0
453  #error Sorry, can not figure out what CPU you are targeting to. Please specify _FX_CPU_ macro.
454 #endif
455 //<<<+++OPENSOURCE_MUST_END
456 
458 #ifdef _MSC_VER
459  #if _MSC_VER >= 1600
460  #define _FX_EMBEDFONT_PRINT_
461  #endif
462 #endif
463 
468 
469 //<<<+++OPENSOURCE_MUST_BEGIN
471 #define _FX_W32_ 1
472 
473 #define _FX_W64_ 2
474 
475 /* Word size or instruct length */
476 #ifndef _FX_WORDSIZE_
477 #if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || \
478  defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || \
479  __WORDSIZE == 64 || defined(__LP64__) || defined(__mips64) || defined(__loongarch64)
480 #define _FX_WORDSIZE_ _FX_W64_
481 #else
482 #define _FX_WORDSIZE_ _FX_W32_
483 #endif
484 #endif
485 //<<<+++OPENSOURCE_MUST_END
486 
493 
495 #define _FX_BIG_ENDIAN_ 1
496 
497 #define _FX_LITTLE_ENDIAN_ 2
498 
499 /* Byte Order */
500 #ifndef _FX_ENDIAN_
501  #if _FX_CPU_ == _FX_POWERPC_ || _FX_CPU_ == _FX_SPARC_
502  #define _FX_ENDIAN_ _FX_BIG_ENDIAN_
503  #else
504 
513  #define _FX_ENDIAN_ _FX_LITTLE_ENDIAN_
514  #endif
515 #endif
516 
519 /* Include basic headers */
520 #include <stddef.h>
521 #include <stdarg.h>
522 #include <setjmp.h>
523 #include <float.h>
524 
525  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
526  #ifndef _FX_NO_ANSIC_
527  #include <stdlib.h>
528  #include <stdio.h>
529  #include <string.h>
530  #include <assert.h>
531  #if _FX_OS_ != _FX_VXWORKS_ && ((_FX_COMPILER_ == _FX_GCC_ && _FX_OS_ != _FX_SYMBIAN_) || _FX_COMPILER_ == _FX_NOKIA_X86_ || _FX_COMPILER_ == _FX_METROWERKS_ || _FX_COMPILER_ == _FX_IARCC_)
532  #include <wchar.h>
533  #endif
534  #endif
535  //<<<+++OPENSOURCE_MUST_END
536 
537 //<<<+++OPENSOURCE_MUST_BEGIN
538 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
539  #include <libkern/OSAtomic.h>
540  #if _FX_OS_ == _FX_MACOSX_
541  #include <Carbon/Carbon.h>
542  #elif _FX_OS_ == _FX_IOS_
543  #include <CoreText/CoreText.h>
544  #include <CoreGraphics/CoreGraphics.h>
545  #endif
546 #endif
547 //<<<+++OPENSOURCE_MUST_END
548 
549 #ifdef _UNICODE
550  #define GetObject GetObjectW
551  #define GetModuleFileName GetModuleFileNameW
552  #define GetFullPathName GetFullPathNameW
553 #else
554 
558  #define GetObject GetObjectA
559 
564  #define GetModuleFileName GetModuleFileNameA
565 
570  #define GetFullPathName GetFullPathNameA
571 #endif
572 
573 #if ( _FX_OS_ == _FX_IOS_ && (_FX_CPU_ == _FX_ARM_ || _FX_CPU_ == _FX_ARM64_)) || (_FX_OS_ == _FX_ANDROID_) || (_FX_OS_ == _FX_WIN32_MOBILE_)
574  #ifndef _FXCORE_LIMITED_MEMORY_
575  #define _FXCORE_LIMITED_MEMORY_
576  #endif
577  #ifndef _FXCORE_LIMITED_CPU_
578  #define _FXCORE_LIMITED_CPU_
579  #endif
580 #endif
581 
582 #if _FX_COMPILER_ == _FX_ADS_ || _FX_COMPILER_ == _FX_RVCT_ || _FX_COMPILER_ == _FX_TMS470_ || _FX_OS_ == _FX_ANDROID_
583  //#define _FX_NO_EXCEPTION_ //Removed by Malcolm J. Xue, Sep. 9th, 2010, should be defined outside
584  #define _FX_NO_NAMESPACE_
585 #endif
586 
591 
593 #define _FX_DEFAULT_TARGET_ 0
594 
595 #define _FX_BREW_ 1
596 
598 //<<<+++OPENSOURCE_MUST_END
599 
600 #if (((_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) && (defined(_FX_WINAPI_PARTITION_DESKTOP_) || defined(_FX_WINAPI_PARTITION_APP_))) || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_MACOSX_)
601 #ifndef _FX_NO_SIMD_
602 #if !defined(_FXM_PLATFORM_LINUX_JS_) && !defined(_CHROME_PNACL_) && (_FX_CPU_ != _FX_ARM_) && \
603  (_FX_CPU_ != _FX_ARM64_) && (_FX_CPU_ != _FX_MIPS_) && (_FX_CPU_ != _FX_MIPS64_) && \
604  (_FX_CPU_ != _FX_LOONGARCH64_) && (_FX_CPU_ != _FX_SW64_)
605 #define _FXM_SIMD_
606 #endif
607 #endif
608 #endif
609 #if _FX_OS_ != _FX_MACOSX_
610  //#define _FXM_OPENMP_
611 #endif
612 
613 #ifndef _FX_NO_OPENSSL_
614  #define _FX_NO_OPENSSL_
615 #endif
616 
617 #if (((_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) && defined(_FX_WINAPI_PARTITION_DESKTOP_)) || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_MACOSX_)
618 #ifndef _FX_NO_JPEG_TURBO_
619  #if !defined(_CHROME_PNACL_)
620  #define _FX_JPEG_TURBO_
621  #endif
622 #endif
623 #ifndef _FX_NO_OPENSSL_
624  #define _FXM_OPENSSL_
625 #endif
626  #define _FX_LARGEFILE_SUPPORT_
627 #ifndef _FX_NO_SIMD_
628  #define WITH_SIMD
629 #endif
630  #define _FPDF_STREAM_RENDER_
631 #ifndef _FX_ENABLE_OVERPRINT_
632  #define _FX_ENABLE_OVERPRINT_
633 #endif
634 #endif
635 
636 #if _FX_OS_ == _FX_LINUX_EMBEDDED_
637 #ifndef _FX_ENABLE_OVERPRINT_
638  #define _FX_ENABLE_OVERPRINT_
639 #endif
640 #endif
641 
642 #ifdef _FX_WINAPI_PARTITION_APP_
643 #define _FPDF_STREAM_RENDER_
644 #endif
645 //<<<+++OPENSOURCE_MUST_END
646 
647 //<<<+++OPENSOURCE_MUST_BEGIN
648 #ifdef __cplusplus
649 extern "C" {
650 #endif
651 //<<<+++OPENSOURCE_MUST_END
652 
658 typedef void* FX_LPVOID;
660 typedef void const* FX_LPCVOID;
662  typedef void* FX_POSITION;
663 
665 typedef signed char FX_INT8;
667 typedef unsigned char FX_UINT8;
669 typedef unsigned char FX_BYTE;
671 typedef unsigned char* FX_LPBYTE;
673 typedef unsigned char const* FX_LPCBYTE;
675 typedef short FX_INT16;
677 typedef unsigned short FX_UINT16;
679 typedef short FX_SHORT;
681 typedef unsigned short FX_WORD;
683 typedef unsigned short* FX_LPWORD;
685 typedef unsigned short const* FX_LPCWORD;
687 typedef int FX_INT32;
689 typedef float FX_FLOAT;
690 #ifdef __cplusplus
691 
692 typedef bool FX_BOOL;
693 #else
694 
695 typedef int FX_BOOL;
696 #endif
697 
698 typedef int FX_ERR;
700 #define FX_SUCCEEDED(Status) ((FX_ERR)(Status) >= 0)
701 
702 #define FX_FAILED(Status) ((FX_ERR)(Status) < 0)
703 
705 typedef char FX_CHAR;
707 typedef char* FX_LPSTR;
709 typedef char const* FX_LPCSTR;
710 
711  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
721  #if !defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_ || _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_ || _FX_CPU_ == _FX_SW64_)
722 
723  typedef unsigned int FX_DWORD;
725  typedef unsigned int* FX_LPDWORD;
726  #else
727 
728  typedef unsigned long FX_DWORD;
730  typedef unsigned long* FX_LPDWORD;
731  #endif
732 
734  typedef wchar_t FX_WCHAR;
736  typedef wchar_t* FX_LPWSTR;
738  typedef wchar_t const* FX_LPCWSTR;
739 
740  #ifdef _MSC_VER
741 
742  typedef __int64 FX_INT64;
744  typedef unsigned __int64 FX_UINT64;
745  #else
746  typedef long long int FX_INT64;
747  typedef unsigned long long FX_UINT64;
748  #endif
749 
750  #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
751 
752  typedef INT_PTR FX_INTPTR;
754  typedef UINT_PTR FX_UINTPTR;
755  #else
756  #if (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_ || _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_|| _FX_CPU_ == _FX_SW64_)
757  typedef FX_INT64 FX_INTPTR;
758  typedef FX_UINT64 FX_UINTPTR;
759  #else
760  typedef int FX_INTPTR;
761  typedef unsigned int FX_UINTPTR;
762  #endif
763  #endif
764  //<<<+++OPENSOURCE_MUST_END
765 
766 //<<<+++OPENSOURCE_MUST_BEGIN
770 typedef FX_UINT64 FX_QWORD;
771 
773 #define FX_DEFINEHANDLE(name) typedef struct _##name {FX_LPVOID pData;} * name;
774 
775 #if defined(DEBUG) && !defined(_DEBUG)
776  #define _DEBUG
777 #endif
778 
779 #ifndef __cplusplus
780 #ifndef TRUE
781 
782  #define TRUE 1
783 #endif
784 
785 #ifndef FALSE
786 
787  #define FALSE 0
788 #endif
789 #endif
790 
791 #ifndef NULL
792 
793  #define NULL 0
794 #endif
795 //<<<+++OPENSOURCE_MUST_END
796 
797 /* Assertion */
798 
799  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
800  #if !defined(_FX_NO_ANSIC_)
801 
805  #define FXSYS_assert assert
806  #else
807  void FXSYS_assert(int condition);
808  #endif
809  //<<<+++OPENSOURCE_MUST_END
810 
811 //<<<+++OPENSOURCE_MUST_BEGIN
812 #ifndef ASSERT
813  #ifdef _DEBUG
814  #define ASSERT FXSYS_assert
815  #else
816 
820  #define ASSERT(a)
821  #endif
822 #endif
823 
825 #define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
826 
827 #define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
828 
830 #define FX_PI 3.1415926535897932384626433832795f
831 
833 #if _FX_WORDSIZE_ == _FX_W64_ && _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
834  #define _FX_CRT_MALLOC_LIMIT_ 0x7fffffffffffffffL
835 #else
836  #define _FX_CRT_MALLOC_LIMIT_ 0x7fffffffL
837 #endif
838 
839 //<<<+++OPENSOURCE_MUST_END
840 
847 
848  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
849  #if !defined(_FX_NO_ANSIC_)
850 
854  #define FXSYS_sprintf sprintf
855 
859  #ifdef _WIN32
860  #define FXSYS_snprintf _snprintf
861  #define FXSYS_vsnprintf _vsnprintf
862  #else
863  #define FXSYS_snprintf snprintf
864  #define FXSYS_vsnprintf vsnprintf
865  #endif
866 
870  #define FXSYS_vsprintf vsprintf
871 
875  #define FXSYS_strchr strchr
876 
880  #define FXSYS_strlen strlen
881 
885  #define FXSYS_strncmp strncmp
886 
890  #define FXSYS_strcmp strcmp
891 
895  #define FXSYS_strcpy strcpy
896 
900  #define FXSYS_strncpy strncpy
901 
905  #define FXSYS_strstr strstr
906  #else
907  int FXSYS_sprintf(char* buffer, const char* format, ...);
908  int FXSYS_vsprintf(char *buffer, const char *format, va_list args);
909  char* FXSYS_strchr(const char* str, int ch);
910  long FXSYS_strlen(const char* str);
911  int FXSYS_strncmp(const char* str1, const char* str2, size_t len);
912  int FXSYS_strcmp(const char* str1, const char* str2);
913  char* FXSYS_strcpy(char* dest, const char* src);
914  char* FXSYS_strncpy(char* dest, const char* src, size_t len);
915  char* FXSYS_strstr(const char *string, const char *strFind);
916  #endif
917  //<<<+++OPENSOURCE_MUST_END
918 
925  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
926  #if !defined(_FX_NO_ANSIC_) && !defined(__EMSCRIPTEN__)
927 
931  #define FXSYS_FILE FILE
932 
936  #define FXSYS_fopen fopen
937 
941  #define FXSYS_fclose fclose
942 
946  #define FXSYS_SEEK_END SEEK_END
947 
951  #define FXSYS_SEEK_SET SEEK_SET
952 
956  #define FXSYS_fseek fseek
957 
961  #define FXSYS_ftell ftell
962 
966  #define FXSYS_fread fread
967 
971  #define FXSYS_fwrite fwrite
972 
976  #define FXSYS_fprintf fprintf
977 
981  #define FXSYS_fflush fflush
982  #else
983  #define FXSYS_FILE void
984  FXSYS_FILE* FXSYS_fopen(const char* filename, const char* mode);
985  int FXSYS_fclose(FXSYS_FILE*);
986  #define FXSYS_SEEK_END 2
987  #define FXSYS_SEEK_SET 0
988  int FXSYS_fseek(FXSYS_FILE*, long, int);
989  long FXSYS_ftell(FXSYS_FILE*);
990  size_t FXSYS_fread(void*, size_t, size_t, FXSYS_FILE*);
991  long FXSYS_fwrite(const void*, long, long, FXSYS_FILE*);
992  int FXSYS_fprintf(FXSYS_FILE*, const char*, ...);
993  int FXSYS_fflush(FXSYS_FILE*);
994  #endif
995 
996  // For now, we provide wide-string file name support for Windows only
997  #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_
998 
1002  #ifdef _NATIVE_WCHAR_T_DEFINED
1003  #define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
1004  #else
1005  #define FXSYS_wfopen _wfopen
1006  #endif
1007  #else
1008  FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
1009  #endif
1010 
1017 
1018  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1019  /* Basic wide string operations, not available in ADS/RVCT/PACC/Android/MIPS_SDE */
1020  #if _FX_OS_ != _FX_VXWORKS_ && _FX_OS_ != _FX_ANDROID_ && !defined(_FX_NO_ANSIC_) && _FX_COMPILER_ != _FX_ADS_ && _FX_COMPILER_ != _FX_RVCT_ && _FX_COMPILER_ != _FX_PACC_ && _FX_COMPILER_ != _FX_TMS470_ && _FX_COMPILER_ != _FX_MIPS_SDE_
1021  #ifdef _NATIVE_WCHAR_T_DEFINED
1022  #define FXSYS_wcslen(str) wcslen((wchar_t*)(str))
1023  #define FXSYS_wcscmp(str1, str2) wcscmp((wchar_t*)(str1), (wchar_t*)(str2))
1024  #else
1025 
1029  #define FXSYS_wcslen wcslen
1030 
1034  #define FXSYS_wcscmp wcscmp
1035  #endif
1036  #else
1037  size_t FXSYS_wcslen(const wchar_t*);
1038  int FXSYS_wcscmp(const wchar_t*, const wchar_t*);
1039  #endif
1040 
1041  /* Some other wide string functions, not available in ADS/RVCT/GCCE/PACC/Android/MIPS_SDE */
1042  #if _FX_OS_ != _FX_VXWORKS_ && _FX_OS_ != _FX_ANDROID_ && !defined(_FX_NO_ANSIC_) && _FX_COMPILER_ != _FX_ADS_ && _FX_COMPILER_ != _FX_RVCT_ && !(_FX_COMPILER_ == _FX_GCC_ && _FX_OS_ == _FX_SYMBIAN_) && _FX_COMPILER_ != _FX_PACC_ && _FX_COMPILER_ != _FX_TMS470_ && _FX_COMPILER_ != _FX_MIPS_SDE_
1043  #ifdef _NATIVE_WCHAR_T_DEFINED
1044  #define FXSYS_wcschr(str, ch) (FX_LPCWSTR)wcschr((wchar_t*)(str), ch)
1045  #define FXSYS_wcsstr(str1, str2) (FX_LPCWSTR)wcsstr((wchar_t*)(str1), (wchar_t*)(str2))
1046  #define FXSYS_wcsncmp(str1, str2, n) wcsncmp((wchar_t*)(str1), (wchar_t*)(str2), n)
1047  #else
1048 
1052  #define FXSYS_wcschr wcschr
1053 
1057  #define FXSYS_wcsstr wcsstr
1058 
1062  #define FXSYS_wcsncmp wcsncmp
1063  #endif
1064 
1068  #define FXSYS_vswprintf vswprintf
1069  #else
1070  wchar_t* FXSYS_wcschr(const wchar_t*, wchar_t);
1071  wchar_t* FXSYS_wcsstr(const wchar_t*, const wchar_t*);
1072  int FXSYS_wcsncmp(const wchar_t*, const wchar_t*, size_t);
1073  #if _FX_OS_ != _FX_ANDROID_
1074  int FXSYS_vswprintf(wchar_t*, const wchar_t*, va_list);
1075  #else
1076  #define FXSYS_vswprintf vswprintf
1077  #endif
1078  #endif
1079 
1080  #if !defined(_FX_NO_ANSIC_) && _FX_COMPILER_ != _FX_TMS470_
1081 
1085  #define FXSYS_mbstowcs mbstowcs
1086 
1090  #define FXSYS_wcstombs wcstombs
1091  #else
1092  size_t FXSYS_mbstowcs(wchar_t *dest, const char *src, size_t n);
1093  size_t FXSYS_wcstombs(char *dest, const wchar_t *src, size_t n);
1094  #endif
1095  //<<<+++OPENSOURCE_MUST_END
1096 
1099  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1104 
1105  #if !defined(_FX_NO_ANSIC_)
1106 
1110  #define FXSYS_memcmp memcmp
1111 
1115  #define FXSYS_memcpy memcpy
1116 
1122  #define FXSYS_memmove memmove
1123 
1127  #define FXSYS_memset memset
1128 
1132  #define FXSYS_memchr memchr
1133  #else
1134  int FXSYS_memcmp(const void*, const void*, size_t);
1135  void* FXSYS_memcpy(void*, const void*, size_t);
1136  void* FXSYS_memmove(void*, const void*, size_t);
1137  void* FXSYS_memset(void*, int, size_t);
1138  void* FXSYS_memchr(const void*, int, size_t);
1139  #endif
1140 
1143  /* Others */
1144  #if !defined(_FX_NO_ANSIC_)
1145 
1149  #define FXSYS_qsort qsort
1150  #else
1151  void FXSYS_qsort(void*, unsigned, unsigned, int (*)(const void*, const void*));
1152  #endif
1153 
1154  #if _FX_OS_ != _FX_WIN32_MOBILE_ && !defined(_FX_NO_ANSIC_) && _FX_OS_ != _FX_SYMBIAN_
1155 
1159  #define FXSYS_bsearch bsearch
1160  #else
1161  /* WinCE doesn't support bsearch. The bsearch function comes with Symbian also has crash problem. */
1162  void * FXSYS_bsearch(const void *key, const void *base, size_t num, size_t width, int (*compare)(const void *, const void *));
1163  #endif
1164 
1165  #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1166  /* On Windows platform, we can replace more system calls */
1167 
1172  #define FXSYS_itoa _itoa
1173 
1177  #define FXSYS_strlwr _strlwr
1178 
1182  #define FXSYS_strupr _strupr
1183 
1187  #define FXSYS_stricmp _stricmp
1188 
1189  #ifdef _NATIVE_WCHAR_T_DEFINED
1190  #define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
1191  #define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
1192  #define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
1193  #define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
1194  #define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
1195  #else
1196 
1200  #define FXSYS_wcsicmp _wcsicmp
1201 
1205  #define FXSYS_WideCharToMultiByte WideCharToMultiByte
1206 
1210  #define FXSYS_MultiByteToWideChar MultiByteToWideChar
1211 
1215  #define FXSYS_wcslwr _wcslwr
1216 
1220  #define FXSYS_wcsupr _wcsupr
1221  #endif
1222 
1223  #ifndef _FX_WINAPI_PARTITION_DESKTOP_
1224  int FXSYS_IntersectRect(struct FX_RECT*, const struct FX_RECT*, const struct FX_RECT*);
1225  int FXSYS_GetACP(void);
1226  FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
1227  FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
1228  #else
1229 
1233  #define FXSYS_GetFullPathName GetFullPathName
1234 
1238  #define FXSYS_GetModuleFileName GetModuleFileName
1239 
1243  #define FXSYS_GetACP GetACP
1244  #endif
1245  #else
1246  char* FXSYS_itoa(int value, char* string, int radix);
1247  int FXSYS_GetACP(void);
1248  int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
1249  char* buf, int buflen, const char* default_str, int* pUseDefault);
1250  int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
1251  wchar_t* buf, int buflen);
1252  FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
1253  FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
1254 
1255  char* FXSYS_strlwr(char* str);
1256  char* FXSYS_strupr(char* str);
1257  int FXSYS_stricmp(const char*, const char*);
1258  int FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
1259 
1260  wchar_t* FXSYS_wcslwr(wchar_t* str);
1261  wchar_t* FXSYS_wcsupr(wchar_t* str);
1262  #endif
1263  //<<<+++OPENSOURCE_MUST_END
1264 
1265  //*****************************************************************************
1266  //* Memory utilities
1267  //*****************************************************************************
1272 
1285  void* FXSYS_memcpy32(void* dst, const void* src, size_t size);
1286 
1303  FX_INT32 FXSYS_memcmp32(const void* buf1, const void* buf2, size_t size);
1304 
1316  void* FXSYS_memset32(void* dst, FX_INT32 v, size_t size);
1317 
1329  void* FXSYS_memset8(void* dst, FX_BYTE v, size_t size);
1330 
1340  void* FXSYS_memmove32(void* dst, const void* src, size_t size);
1342 //<<<+++OPENSOURCE_MUST_END
1343 
1344 //<<<+++OPENSOURCE_MUST_BEGIN
1345 #ifdef __cplusplus
1346 }
1347 #endif
1348 //<<<+++OPENSOURCE_MUST_END
1349 
1350  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1355 
1356  #if _FX_OS_ == _FX_PALMOS_ && _FX_COMPILER_ == _FX_METROWERKS_
1357  #ifdef __cplusplus
1358  extern "C" {
1359  #endif
1360 
1361  /* Metrowerks for Palm OS (9.3) doesn't support standard math.h */
1362  extern double __ieee754_pow(double, double);
1363  extern double __ieee754_sqrt(double);
1364  extern double __fabs(double);
1365  extern double __ieee754_atan2(double, double);
1366  extern double __ceil(double);
1367  extern double __floor(double);
1368  extern double __cos(double);
1369  extern double __ieee754_acos(double);
1370  extern double __sin(double);
1371  extern double __ieee754_log(double);
1372  extern double __ieee754_log10(double);
1373 
1374  #define FXSYS_pow(x, y) __ieee754_pow(x, y)
1375  #define FXSYS_sqrt(x) __ieee754_sqrt(x)
1376  #define FXSYS_fabs(x) __fabs(x)
1377  #define FXSYS_atan2(x, y) __ieee754_atan2(x, y)
1378  #define FXSYS_ceil(x) __ceil(x)
1379  #define FXSYS_floor(x) __floor(x)
1380  #define FXSYS_cos(x) __cos(x)
1381  #define FXSYS_acos(x) __ieee754_acos(x)
1382  #define FXSYS_sin(x) __sin(x)
1383  #define FXSYS_log(x) __ieee754_log(x)
1384  #define FXSYS_log10(x) __ieee754_log10(x)
1385 
1386  #ifdef __cplusplus
1387  }
1388  #endif
1389  #else
1390  #include <math.h>
1391  #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ || _FX_OS_ == _FX_LINUX_DESKTOP_
1392 
1396  #define FXSYS_pow powf
1397 
1401  #define FXSYS_sqrt sqrtf
1402 
1406  #define FXSYS_fabs fabsf
1407 
1411  #define FXSYS_atan2 atan2f
1412 
1416  #define FXSYS_ceil ceilf
1417 
1421  #define FXSYS_floor floorf
1422 
1426  #define FXSYS_cos cosf
1427 
1431  #define FXSYS_acos acosf
1432 
1436  #define FXSYS_sin sinf
1437 
1441  #define FXSYS_log logf
1442 
1446  #define FXSYS_log10 log10f
1447 
1451  #define FXSYS_fmod fmodf
1452  #else
1453  #define FXSYS_pow(a, b) (FX_FLOAT)pow(a, b)
1454  #define FXSYS_sqrt(a) (FX_FLOAT)sqrt(a)
1455  #define FXSYS_fabs(a) (FX_FLOAT)fabs(a)
1456  #define FXSYS_atan2(a, b) (FX_FLOAT)atan2(a, b)
1457  #define FXSYS_ceil(a) (FX_FLOAT)ceil(a)
1458  #define FXSYS_floor(a) (FX_FLOAT)floor(a)
1459  #define FXSYS_cos(a) (FX_FLOAT)cos(a)
1460  #define FXSYS_acos(a) (FX_FLOAT)acos(a)
1461  #define FXSYS_sin(a) (FX_FLOAT)sin(a)
1462  #define FXSYS_log(a) (FX_FLOAT)log(a)
1463  #define FXSYS_log10(a) (FX_FLOAT)log10(a)
1464  #define FXSYS_fmod(a, b) (FX_FLOAT)fmod(a, b)
1465  #endif
1466  #endif
1467 
1468  #if !defined(_FX_NO_ANSIC_)
1469 
1473  #define FXSYS_abs abs
1474  #else
1475  #define FXSYS_abs(a) ((a)<0?-(a):(a))
1476  #endif
1477 
1479  //<<<+++OPENSOURCE_MUST_END
1480 
1481 //<<<+++OPENSOURCE_MUST_BEGIN
1482 #ifdef __cplusplus
1483 extern "C" {
1484 #endif
1485 //<<<+++OPENSOURCE_MUST_END
1486 
1487  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1488  #ifdef _FX_NO_GLOBAL_
1489  /* If platform doesn't support global variable, then we have to get from static functions */
1491  void FXSYS_SetStaticPointer1(void*);
1493  void* FXSYS_GetStaticPointer1(void);
1495  void FXSYS_SetStaticPointer2(void*);
1497  void* FXSYS_GetStaticPointer2(void);
1498  #endif
1499 
1500  /* CPU byte order */
1501  #if _FX_ENDIAN_ == _FX_BIG_ENDIAN_
1502  #define _FX_MSB_FIRST_
1503  #define FXDWORD_FROM_LSBFIRST(i) ( ((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24) )
1504  #define FXDWORD_FROM_MSBFIRST(i) (i)
1505  #else
1506  #define _FX_LSB_FIRST_
1507  #define FXDWORD_FROM_LSBFIRST(i) (i)
1508  #define FXDWORD_FROM_MSBFIRST(i) ( ((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24) )
1509  #endif
1510 
1511  #if _FX_CPU_ == _FX_X86_ || _FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_ARM64_ || _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_ || _FX_CPU_ == _FX_SW64_
1512  #define FXDWORD_GET_LSBFIRST(p) (*(FX_DWORD*)(p))
1513  #else
1514  #define FXDWORD_GET_LSBFIRST(p) ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
1515  #endif
1516 
1517 #define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
1518 
1519 #define FXSYS_HIBYTE(word) ((FX_BYTE)((word) >> 8))
1520 #define FXSYS_LOBYTE(word) ((FX_BYTE)(word))
1521 #define FXSYS_HIWORD(dword) ((FX_WORD)((dword) >> 16))
1522 #define FXSYS_LOWORD(dword) ((FX_WORD)(dword))
1523 
1525 #define FXSYS_strtol strtol
1526 
1550 FX_INT64 FXSYS_atoi64(FX_LPCSTR str);
1558 FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str);
1568 FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
1578 FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
1586 int FXSYS_round(FX_FLOAT f);
1588 #define FXSYS_Mul(a, b) ((a) * (b))
1589 
1590 #define FXSYS_Div(a, b) ((a) / (b))
1591 
1592 #define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
1593 
1594 #define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
1595 
1596 //*****************************************************************************
1597 //* Multiple thread controls
1598 //*****************************************************************************
1600 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1601  typedef CRITICAL_SECTION FX_MUTEX;
1602  FX_DEFINEHANDLE(FX_RWLOCK)
1603 #elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_EMBEDDED_ || _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_
1604  #include <pthread.h>
1605  typedef pthread_mutex_t FX_MUTEX;
1606  #if _FX_OS_ == _FX_ANDROID_
1607  FX_DEFINEHANDLE(FX_RWLOCK)
1608  #else
1609  typedef pthread_rwlock_t FX_RWLOCK;
1610  #endif
1611 #else
1613  FX_DEFINEHANDLE(FX_RWLOCK)
1614 #endif
1615 // The following five functions are defined in fx_process.h, please refer there.
1616 FX_BOOL FX_Mutex_Initialize(FX_MUTEX* pMutex);
1617 void FX_Mutex_Destroy(FX_MUTEX* pMutex);
1618 FX_BOOL FX_Mutex_TryLock(FX_MUTEX* pMutex);
1619 void FX_Mutex_Lock(FX_MUTEX* pMutex);
1620 void FX_Mutex_Unlock(FX_MUTEX* pMutex);
1621 
1622 #define FX_CRITICAL_SECTION FX_MUTEX
1623 #define FX_InitializeCriticalSection(a) FX_Mutex_Initialize(a)
1624 #define FX_DeleteCriticalSection(a) FX_Mutex_Destroy(a)
1625 #define FX_TryEnterCriticalSection(a) FX_Mutex_TryLock(a)
1626 #define FX_EnterCriticalSection(a) FX_Mutex_Lock(a)
1627 #define FX_LeaveCriticalSection(a) FX_Mutex_Unlock(a)
1628 
1630 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1631  typedef void* FX_SPINLOCK;
1632 #elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_==_FX_LINUX_EMBEDDED_
1633  #ifdef _FX_SPINLOCK_USEGCCCAS_
1634  typedef size_t FX_SPINLOCK;
1635  #else
1636 #ifndef _CHROME_PNACL_
1637  typedef pthread_spinlock_t FX_SPINLOCK;
1638 #else
1639  typedef size_t FX_SPINLOCK;
1640 #endif
1641  #endif
1642 #elif _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
1643  typedef OSSpinLock FX_SPINLOCK;
1644 #else // android/embeded linux/other os
1646 #endif
1647 //<<<+++OPENSOURCE_MUST_END
1648 
1649 //<<<+++OPENSOURCE_MUST_BEGIN
1650 #ifdef __cplusplus
1651 };
1652 #endif
1653 //<<<+++OPENSOURCE_MUST_END
1654 
1655 #if _FX_OS_ == _FX_PALMOS_ && _FX_COMPILER_ == _FX_PACC_
1656  #include <errtrycatch.h>
1657  #define setjmp ErrSetJump
1658  #define longjmp ErrLongJump
1659  #define jmp_buf ErrJumpBuf
1660 #else
1661  #include <setjmp.h>
1662 #endif
1663 
1664 #if _FX_OS_ == _FX_MACOSX_
1665  #include <Carbon/Carbon.h>
1666 #elif _FX_OS_ == _FX_IOS_
1667  #include <CoreText/CoreText.h>
1668  #include <CoreGraphics/CoreGraphics.h>
1669 #endif
1670 //<<<+++OPENSOURCE_MUST_END
1671 //<<<+++OPENSOURCE_MUST_BEGIN
1672 #endif /* _FPDF_SYSTEM_H_ */
1673 //<<<+++OPENSOURCE_MUST_END
1674 
1677 //<<<+++OPENSOURCE_END
void * FXSYS_memset8(void *dst, FX_BYTE v, size_t size)
Set buffer data to specified value.
void * FX_LPVOID
Pointer to any type.
Definition: fx_system.h:658
wchar_t FX_WCHAR
Compiler dependant Unicode character (16-bit for Microsoft Compiler, 32-bit for gcc).
Definition: fx_system.h:734
#define FXSYS_wcslwr
Convert a wide-character string to lowercase.
Definition: fx_system.h:1215
unsigned long FX_DWORD
32-bit unsigned integer.
Definition: fx_system.h:728
#define FXSYS_mbstowcs
Converts a sequence of multi-byte characters to a corresponding sequence of wide characters.
Definition: fx_system.h:1085
FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)
Convert an integer to an wide string.
#define FXSYS_fwrite
Writes data to a file.
Definition: fx_system.h:971
#define FXSYS_fprintf
Print formatted data to a file.
Definition: fx_system.h:976
FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)
Convert an integer to an ANSI string.
#define FXSYS_wcsncmp
Compare characters of two wide-character strings.
Definition: fx_system.h:1062
#define FXSYS_FILE
File structure.
Definition: fx_system.h:931
void const * FX_LPCVOID
Pointer to any constant type.
Definition: fx_system.h:660
int FXSYS_round(FX_FLOAT f)
Get nearest integer.
#define FXSYS_strcpy
Copy an ANSIC string.
Definition: fx_system.h:895
#define FXSYS_fflush
Flush file.
Definition: fx_system.h:981
FX_DWORD FX_UINT32
unsigned 32bits integer.
Definition: fx_system.h:768
wchar_t const * FX_LPCWSTR
Pointer to constant Unicode characters.
Definition: fx_system.h:738
#define FXSYS_GetFullPathName
Get the full path and file name of a specified file.
Definition: fx_system.h:1233
#define FXSYS_strlen
Get the length of a ANSIC string.
Definition: fx_system.h:880
#define FXSYS_wcsupr
Convert a wide-character string to uppercase.
Definition: fx_system.h:1220
#define FXSYS_strncpy
Copy an ANSIC string with length limitation.
Definition: fx_system.h:900
#define FXSYS_wcschr
Find a wide-character in a wide-character string.
Definition: fx_system.h:1052
FX_INT32 FXSYS_memcmp32(const void *buf1, const void *buf2, size_t size)
Compare data in two buffers.
char * FX_LPSTR
Pointer to 8-bit Windows (ANSI) characters.
Definition: fx_system.h:707
#define FXSYS_wfopen
Open a file using wide-string parameters. Only supported on Windows platforms now.
Definition: fx_system.h:1005
#define FXSYS_memmove
Moves one buffer to another. If some regions of the source area and the destination overlap,...
Definition: fx_system.h:1122
CRITICAL_SECTION FX_MUTEX
Definition for mutex/critical section and read-write lock.
Definition: fx_system.h:1601
#define FXSYS_memcpy
Copy from one buffer to another.
Definition: fx_system.h:1115
void * FX_POSITION
A value used to denote the position of an element in a collection.
Definition: fx_system.h:662
#define FXSYS_vswprintf
Write formatted output wide character string using a pointer to a list of arguments.
Definition: fx_system.h:1068
#define FXSYS_itoa
Convert an integer to a ANSIC string.
Definition: fx_system.h:1172
FX_INT64 FXSYS_atoi64(FX_LPCSTR str)
Convert an ANSI string to an integer.
#define FXSYS_strchr
Find a character in a ANSIC string.
Definition: fx_system.h:875
#define FXSYS_strlwr
Convert a ANSIC string to lowercase.
Definition: fx_system.h:1177
int FX_INT32
32-bit signed integer.
Definition: fx_system.h:687
#define FXSYS_GetModuleFileName
Get the fully-qualified path for specified module.
Definition: fx_system.h:1238
void * FXSYS_memset32(void *dst, FX_INT32 v, size_t size)
Set buffer data to specified value.
#define FXSYS_memcmp
Compares two buffers.
Definition: fx_system.h:1110
int FX_BOOL
Boolean variable (should be TRUE or FALSE).
Definition: fx_system.h:695
unsigned short * FX_LPWORD
Pointer to a WORD.
Definition: fx_system.h:683
#define FXSYS_fseek
Moves the file pointer to a specified location.
Definition: fx_system.h:956
char const * FX_LPCSTR
Pointer to constant 8-bit Windows (ANSI) characters.
Definition: fx_system.h:709
#define FXSYS_wcslen
Get the length of a wide-character string.
Definition: fx_system.h:1029
FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)
Convert a wide string to an integer.
signed char FX_INT8
Signed 8bits integer.
Definition: fx_system.h:665
#define FXSYS_wcscmp
Compare wide-character strings.
Definition: fx_system.h:1034
#define FXSYS_GetACP
Retrieve the current ANSI code-page identifier for the system.
Definition: fx_system.h:1243
FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)
Convert a wide string to an integer.
#define FXSYS_fread
Reads data from a file.
Definition: fx_system.h:966
UINT_PTR FX_UINTPTR
Unsigned integral type for pointer precision.
Definition: fx_system.h:754
#define FXSYS_qsort
Performs a quick sort. A generic algorithm.
Definition: fx_system.h:1149
#define FXSYS_wcsicmp
Compare two wide character strings. case-insensitive.
Definition: fx_system.h:1200
void * FX_SPINLOCK
Definition for spinlock.
Definition: fx_system.h:1631
unsigned long * FX_LPDWORD
Pointer to a DWORD.
Definition: fx_system.h:730
short FX_SHORT
Short integer (16 bits).
Definition: fx_system.h:679
#define FXSYS_fopen
Open a file.
Definition: fx_system.h:936
#define FXSYS_bsearch
Performs a binary search of a sorted array. A generic algorithm.
Definition: fx_system.h:1159
#define FXSYS_MultiByteToWideChar
Maps a character string to a wide-character string.
Definition: fx_system.h:1210
unsigned char * FX_LPBYTE
Pointer to a FX_BYTE.
Definition: fx_system.h:671
#define FXSYS_strstr
Find a substring.
Definition: fx_system.h:905
#define FXSYS_wcsstr
Find a sub-wide-character-string.
Definition: fx_system.h:1057
char FX_CHAR
8-bit Windows (ANSI) character.
Definition: fx_system.h:705
float FX_FLOAT
32-bit floating-point number.
Definition: fx_system.h:689
#define FXSYS_assert
Assertion.
Definition: fx_system.h:805
unsigned short FX_UINT16
Unsigned 16bits integer.
Definition: fx_system.h:677
#define FXSYS_memchr
Search for a byte in a memory block.
Definition: fx_system.h:1132
#define FXSYS_strcmp
Compare ANSIC strings.
Definition: fx_system.h:890
#define FXSYS_WideCharToMultiByte
Maps a wide-character string to a character string.
Definition: fx_system.h:1205
unsigned char FX_UINT8
Unsigned 8bits integer.
Definition: fx_system.h:667
unsigned short const * FX_LPCWORD
Pointer to a WORD.
Definition: fx_system.h:685
#define FXSYS_fclose
Close a file.
Definition: fx_system.h:941
#define FXSYS_ftell
Gets the current position of a file pointer.
Definition: fx_system.h:961
#define FXSYS_stricmp
Compare two ANSIC strings. case-insensitive.
Definition: fx_system.h:1187
#define FXSYS_strncmp
Compare characters of two ANSIC strings.
Definition: fx_system.h:885
unsigned short FX_WORD
16-bit unsigned integer.
Definition: fx_system.h:681
short FX_INT16
Signed 16bits integer.
Definition: fx_system.h:675
#define FXSYS_memset
Use given character to initialize the buffer.
Definition: fx_system.h:1127
FX_INT32 FXSYS_atoi(FX_LPCSTR str)
Convert an ANSI string to an integer.
unsigned char const * FX_LPCBYTE
Pointer to a constant FX_BYTE.
Definition: fx_system.h:673
wchar_t * FX_LPWSTR
Pointer to Unicode characters.
Definition: fx_system.h:736
#define FXSYS_sprintf
Write formatted data to a ANSIC string.
Definition: fx_system.h:854
#define FX_DEFINEHANDLE(name)
Macro to define a handle type.
Definition: fx_system.h:773
#define FXSYS_wcstombs
Converts a sequence of wide characters to a corresponding sequence of multi-byte characters.
Definition: fx_system.h:1090
#define FXSYS_vsprintf
Write formatted output using a pointer to a list of arguments.
Definition: fx_system.h:870
void * FXSYS_memmove32(void *dst, const void *src, size_t size)
Move source buffer data into destination.
#define FXSYS_strupr
Convert a ANSIC string to uppercase.
Definition: fx_system.h:1182
void * FXSYS_memcpy32(void *dst, const void *src, size_t size)
Copy buffer data from source to destination.
FX_UINT64 FX_QWORD
unsigned quad-word integer.
Definition: fx_system.h:770
INT_PTR FX_INTPTR
Signed integral type for pointer precision.
Definition: fx_system.h:752
unsigned char FX_BYTE
Byte (8 bits).
Definition: fx_system.h:669
int FX_ERR
Error indicator.
Definition: fx_system.h:698