Foxit PDF Conversion SDK
fx_system.h
浏览该文件的文档.
1 
14 //<<<+++OPENSOURCE
15 //<<<+++OPENSOURCE_LICENSE
16 //<<<+++OPENSOURCE_BEGIN LIC==FOXIT||LIC==GOOGLE
17 
23 /*
24  * @brief 系统相关的服务例程。
25  * 所有系统特定的函数和非标准的 C/C++ 例程都在这里
26  *
27  * FPDFAPI 预定义宏
28  *
29  * FPDFAPI 使用许多预定义的宏来支持各种平台
30  * 使用单一的代码集。在大多数情况下,应用程序开发人员可以忽略这些
31  * 宏,因为它们根据系统或编译器环境设置
32  * 正确定义。然而,有时,特别是对于跨平台开发,FPDFAPI 可能
33  * 采用主机平台的错误设置,而不是目标平台。在这种
34  * 情况下,应用程序开发人员应在其项目设置中
35  * 手动设置必要的宏。
36  *
37  *
38  * 目前定义了以下宏:
39  * - #_FX_OS_ 目标操作系统
40  * - #_FX_COMPILER_ 编译器
41  * - #_FX_CPU_ CPU
42  * - #_FX_ENDIAN_ 小端序或大端序
43  *
44  * #_FX_OS_ 可以是以下之一:
45  * - #_FX_WIN32_DESKTOP_ Windows 桌面操作系统(从 Windows 95 开始)
46  * - #_FX_WIN32_MOBILE_ Windows Mobile 操作系统(从 Windows CE 4.0 开始)
47  * - #_FX_WIN64_ Windows 64 位
48  * - #_FX_LINUX_DESKTOP_ Linux 桌面操作系统
49  * - #_FX_LINUX_EMBEDDED_ 嵌入式 Linux 操作系统
50  * - #_FX_SYMBIAN_ Symbian 操作系统(从 7.0 开始)
51  * - #_FX_MACOSX_ MAC OS X
52  * - #_FX_EMBEDDED_ 嵌入式操作系统
53  * - #_FX_SOLARIS_ Solaris 8或更高版本
54  * - #_FX_PALMOS_ PalmOS(5.0或更高版本)
55  * - #_FX_NETBSD_ NetBSD
56  * - #_FX_ANDROID_ Android
57  * - #_FX_VXWORKS_ VxWorks
58  *
59  * #_FX_COMPILER_ 可以是以下之一:
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++ 编译器
64  * - #_FX_ADS_ ADS 1.2 编译器
65  * - #_FX_RVCT_ RVCT 2.1 编译器
66  * - #_FX_IARCC_ IAR C/C++ 编译器
67  * - #_FX_NOKIA_X86_ Nokia X86 编译器
68  * - #_FX_METROWERKS_ Metrowerks C/C++ 编译器(使用MSL)
69  * - #_FX_PACC_ Protein C/C++ 编译器(PalmOS使用)
70  * - #_FX_MIPS_SDE_ MIPS SDE
71  *
72  * #_FX_CPU_ 可以是以下之一:
73  * - #_FX_X86_ 32位x86 CPU
74  * - #_FX_X64_ 64位x86 CPU
75  * - #_FX_POWERPC_ Power PC
76  * - #_FX_ARM_ ARM
77  * - #_FX_SPARC_ Sparc
78  * - #_FX_MIPS_ MIPS
79  * - #_FX_ARM64_ 64位ARM
80  *
81  * #_FX_ENDIAN_ 可以是以下之一:
82  * - #_FX_BIG_ENDIAN_
83  * - #_FX_LITTLE_ENDIAN_
84  *
85  * #_FX_WORDSIZE_ 可以是以下之一:
86  * - #_FX_W32_ 32位指令
87  * - #_FX_W64_ 64位指令
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 抱歉,无法确定您的目标操作系统。请指定_FX_OS_宏。
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 #ifndef _CRT_SECURE_NO_WARNINGS
234  #define _CRT_SECURE_NO_WARNINGS
235 #endif //_CRT_SECURE_NO_WARNINGS
236  #if defined(_MSC_VER) && _MSC_VER < 1300
237  #define _WIN32_WINNT 0x400
238  #endif
239  #if defined(_MSC_VER) && _MSC_VER < 1600
240  #define UNSUPPORT_CPP0X
241  #endif
242  #ifndef NOMINMAX
243  #define NOMINMAX
244  #endif
245  #include <windows.h>
246 
247  #ifdef WINAPI_FAMILY
248  #if (0x00000001 == WINAPI_PARTITION_DESKTOP) && (0x00000002 == WINAPI_PARTITION_APP) //Macros in Windows Kit/8
249  #define _FX_WIN8_
250  #else //Macros in Windows Kit/8.1
251  #define _FX_WIN81_
252  #endif //(0x00000001 == WINAPI_PARTITION_DESKTOP) && (0x00000002 == WINAPI_PARTITION_APP)
253 
254  #ifdef _FX_WIN8_
255  #if /*defined(WINAPI_FAMILY) && */((WINAPI_FAMILY&WINAPI_PARTITION_APP) == WINAPI_PARTITION_APP)
256 
257  #define _FX_WINAPI_PARTITION_APP_
258  #endif
259  #if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY&WINAPI_PARTITION_DESKTOP) == WINAPI_PARTITION_DESKTOP)
260 
261  #define _FX_WINAPI_PARTITION_DESKTOP_
262  #endif
263  #endif //_FX_WIN8_
264 
265  #ifdef _FX_WIN81_
266 
267  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
268 
269  #define _FX_WINAPI_PARTITION_APP_
270  #endif
271 
272  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
273 
274  #define _FX_WINAPI_PARTITION_PHONE_APP_
275  #endif
276 
277  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
278 
279  #define _FX_WINAPI_PARTITION_DESKTOP_
280  #endif
281  #endif //_FX_WIN81_
282  #else // !defined(WINAPI_FAMILY)
283  #ifndef _WIN32_WCE
284  #define _FX_WINAPI_PARTITION_DESKTOP_
285  #endif
286  #endif //WINAPI_FAMILY
287 #endif //(_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
288 //<<<+++OPENSOURCE_MUST_END
289 
296 
298 #define _FX_VC6_ 1
299 
300 #define _FX_VC7_ 2
301 
302 #define _FX_VC8_ 3
303 
304 #define _FX_GCC_ 4
305 
306 #define _FX_ADS_ 5
307 
308 #define _FX_RVCT_ 6
309 
310 #define _FX_IARCC_ 7
311 
312 #define _FX_NOKIA_X86_ 8
313 
314 #define _FX_METROWERKS_ 9
315 
316 #define _FX_PACC_ 10
317 
318 #define _FX_TMS470_ 11
319 
320 #define _FX_MIPS_SDE_ 12
321 
322 /* 编译器 */
323 #ifndef _FX_COMPILER_
324  #ifdef _MSC_VER
325  #if _MSC_VER >= 1400
326  #define _FX_COMPILER_ _FX_VC8_
327  #elif _MSC_VER >= 1300
328  #define _FX_COMPILER_ _FX_VC7_
329  #else
330 
349  #define _FX_COMPILER_ _FX_VC6_
350  #endif
351  #elif defined(__GNUC__)
352  #define _FX_COMPILER_ _FX_GCC_
353  #elif defined(__ARMCC_VERSION)
354  #if __ARMCC_VERSION < 200000
355  #define _FX_COMPILER_ _FX_ADS_
356  #else
357  #define _FX_COMPILER_ _FX_RVCT_
358  #endif
359  #elif defined(__ICCARM__)
360  #define _FX_COMPILER_ _FX_IARCC_
361  #elif defined(_PACC_VER)
362  #define _FX_COMPILER_ _FX_PACC_
363  #elif defined(__TMS470__)
364  #define _FX_COMPILER_ _FX_TMS470_
365  #endif
366 #endif /* !_FX_COMPILER_ */
367 #if !defined(_FX_COMPILER_) || _FX_COMPILER_ == 0
368  #error 抱歉,无法确定您使用的编译器。请指定_FX_COMPILER_宏。
369 #endif
370 //<<<+++OPENSOURCE_MUST_END
371 
378 
380 #define _FX_X86_ 1
381 
382 #define _FX_ARM_ 2
383 
384 #define _FX_POWERPC_ 3
385 
386 #define _FX_SPARC_ 4
387 
388 #define _FX_IA64_ 5
389 
390 #define _FX_MIPS_ 6
391 
392 #define _FX_X64_ 7
393 
394 #define _FX_ARM64_ 8
395 
396 #define _FX_MIPS64_ 9
397 
398 #define _FX_LOONGARCH64_ 10
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 抱歉,无法确定您的目标CPU。请指定_FX_CPU_宏。
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 
464 #if defined linux || defined __linux__
465  #define _FX_EMBEDFONT_PRINT_
466 #endif
467 
472 
473 //<<<+++OPENSOURCE_MUST_BEGIN
475 #define _FX_W32_ 1
476 
477 #define _FX_W64_ 2
478 
479 /* 字长或指令长度 */
480 #ifndef _FX_WORDSIZE_
481 #if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || \
482  defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || \
483  __WORDSIZE == 64 || defined(__LP64__) || defined(__mips64) || defined(__loongarch64)
484 #define _FX_WORDSIZE_ _FX_W64_
485 #else
486 #define _FX_WORDSIZE_ _FX_W32_
487 #endif
488 #endif
489 //<<<+++OPENSOURCE_MUST_END
490 
497 
499 #define _FX_BIG_ENDIAN_ 1
500 
501 #define _FX_LITTLE_ENDIAN_ 2
502 
503 /* 字节序 */
504 #ifndef _FX_ENDIAN_
505  #if _FX_CPU_ == _FX_POWERPC_ || _FX_CPU_ == _FX_SPARC_
506  #define _FX_ENDIAN_ _FX_BIG_ENDIAN_
507  #else
508 
517  #define _FX_ENDIAN_ _FX_LITTLE_ENDIAN_
518  #endif
519 #endif
520 
523 /* 包含基本头文件 */
524 #include <stddef.h>
525 #include <stdarg.h>
526 #include <setjmp.h>
527 #include <float.h>
528 
529  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
530  #ifndef _FX_NO_ANSIC_
531  #include <stdlib.h>
532  #include <stdio.h>
533  #include <string.h>
534  #include <assert.h>
535  #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_)
536  #include <wchar.h>
537  #endif
538  #endif
539  //<<<+++OPENSOURCE_MUST_END
540 
541 //<<<+++OPENSOURCE_MUST_BEGIN
542 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
543  #include <libkern/OSAtomic.h>
544  #if _FX_OS_ == _FX_MACOSX_
545  #include <Carbon/Carbon.h>
546  #elif _FX_OS_ == _FX_IOS_
547  #include <CoreText/CoreText.h>
548  #include <CoreGraphics/CoreGraphics.h>
549  #endif
550 #endif
551 //<<<+++OPENSOURCE_MUST_END
552 
553 #ifdef _UNICODE
554  #define GetModuleFileName GetModuleFileNameW
555  #define GetFullPathName GetFullPathNameW
556 #else
557 
562  #define GetModuleFileName GetModuleFileNameA
563 
568  #define GetFullPathName GetFullPathNameA
569 #endif
570 
571 #if ( _FX_OS_ == _FX_IOS_ && (_FX_CPU_ == _FX_ARM_ || _FX_CPU_ == _FX_ARM64_)) || (_FX_OS_ == _FX_ANDROID_) || (_FX_OS_ == _FX_WIN32_MOBILE_)
572  #ifndef _FXCORE_LIMITED_MEMORY_
573  #define _FXCORE_LIMITED_MEMORY_
574  #endif
575  #ifndef _FXCORE_LIMITED_CPU_
576  #define _FXCORE_LIMITED_CPU_
577  #endif
578 #endif
579 
580 #if _FX_COMPILER_ == _FX_ADS_ || _FX_COMPILER_ == _FX_RVCT_ || _FX_COMPILER_ == _FX_TMS470_ || _FX_OS_ == _FX_ANDROID_
581  //#define _FX_NO_EXCEPTION_
582  #define _FX_NO_NAMESPACE_
583 #endif
584 
589 
591 #define _FX_DEFAULT_TARGET_ 0
592 
593 #define _FX_BREW_ 1
594 
596 //<<<+++OPENSOURCE_MUST_END
597 
598 #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_)
599 #ifndef _FX_NO_SIMD_
600 #if !defined(_FXM_PLATFORM_LINUX_JS_) && !defined(_CHROME_PNACL_) && (_FX_CPU_ != _FX_ARM_) && \
601  (_FX_CPU_ != _FX_ARM64_) && (_FX_CPU_ != _FX_MIPS_) && (_FX_CPU_ != _FX_MIPS64_) && \
602  (_FX_CPU_ != _FX_LOONGARCH64_)
603 #define _FXM_SIMD_
604 #endif
605 #endif
606 #endif
607 #if _FX_OS_ != _FX_MACOSX_
608  //#define _FXM_OPENMP_
609 #endif
610 
611 #ifndef _FX_NO_OPENSSL_
612  #define _FX_NO_OPENSSL_
613 #endif
614 
615 #if (((_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) && defined(_FX_WINAPI_PARTITION_DESKTOP_)) || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_MACOSX_)
616 #ifndef _FX_NO_JPEG_TURBO_
617  #if !defined(_CHROME_PNACL_)
618  #define _FX_JPEG_TURBO_
619  #endif
620 #endif
621 #ifndef _FX_NO_OPENSSL_
622  #define _FXM_OPENSSL_
623 #endif
624  #define _FX_LARGEFILE_SUPPORT_
625 #ifndef _FX_NO_SIMD_
626  #define WITH_SIMD
627 #endif
628 #ifndef _FXM_FEATURE_LIGHT_
629 #define _FPDF_STREAM_RENDER_
630 #endif
631 #ifndef _FX_ENABLE_OVERPRINT_
632 #ifndef _FXM_FEATURE_LIGHT_
633 #define _FX_ENABLE_OVERPRINT_
634 #endif
635 #endif
636 #endif
637 
638 #if _FX_OS_ == _FX_LINUX_EMBEDDED_
639 #ifndef _FX_ENABLE_OVERPRINT_
640  #define _FX_ENABLE_OVERPRINT_
641 #endif
642 #endif
643 
644 #ifdef _FX_WINAPI_PARTITION_APP_
645 #define _FPDF_STREAM_RENDER_
646 #endif
647 //<<<+++OPENSOURCE_MUST_END
648 
649 //<<<+++OPENSOURCE_MUST_BEGIN
650 #ifdef __cplusplus
651 extern "C" {
652 #endif
653 //<<<+++OPENSOURCE_MUST_END
654 
660 typedef void* FX_LPVOID;
662 typedef void const* FX_LPCVOID;
664  typedef void* FX_POSITION;
665 
667 typedef signed char FX_INT8;
669 typedef unsigned char FX_UINT8;
671 typedef unsigned char FX_BYTE;
673 typedef unsigned char* FX_LPBYTE;
675 typedef unsigned char const* FX_LPCBYTE;
677 typedef short FX_INT16;
679 typedef unsigned short FX_UINT16;
681 typedef short FX_SHORT;
683 typedef unsigned short FX_WORD;
685 typedef unsigned short* FX_LPWORD;
687 typedef unsigned short const* FX_LPCWORD;
689 typedef int FX_INT32;
691 typedef float FX_FLOAT;
692 #ifdef __cplusplus
693 
694 typedef bool FX_BOOL;
695 #else
696 
697 typedef int FX_BOOL;
698 #endif
699 
700 typedef int FX_ERR;
702 #define FX_SUCCEEDED(Status) ((FX_ERR)(Status) >= 0)
703 
704 #define FX_FAILED(Status) ((FX_ERR)(Status) < 0)
705 
707 typedef char FX_CHAR;
709 typedef char* FX_LPSTR;
711 typedef char const* FX_LPCSTR;
712 
713  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
723  #if !defined(_MSC_VER) && \
724  (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_ || \
725  _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_ || _FX_CPU_ == _FX_SW64_)
726 
727  typedef unsigned int FX_DWORD;
729  typedef unsigned int* FX_LPDWORD;
730  #else
731 
732  typedef unsigned long FX_DWORD;
734  typedef unsigned long* FX_LPDWORD;
735  #endif
736 
738  typedef wchar_t FX_WCHAR;
740  typedef wchar_t* FX_LPWSTR;
742  typedef wchar_t const* FX_LPCWSTR;
743 
744  #ifdef _MSC_VER
745 
746  typedef __int64 FX_INT64;
748  typedef unsigned __int64 FX_UINT64;
749  #else
750  typedef long long int FX_INT64;
751  typedef unsigned long long FX_UINT64;
752  #endif
753 
754  #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
755 
756  typedef INT_PTR FX_INTPTR;
758  typedef UINT_PTR FX_UINTPTR;
759  #else
760  #if (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_ || \
761  _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_ || _FX_CPU_ == _FX_SW64_)
762  typedef FX_INT64 FX_INTPTR;
763  typedef FX_UINT64 FX_UINTPTR;
764  #else
765  typedef int FX_INTPTR;
766  typedef unsigned int FX_UINTPTR;
767  #endif
768  #endif
769  //<<<+++OPENSOURCE_MUST_END
770 
771 //<<<+++OPENSOURCE_MUST_BEGIN
775 typedef FX_UINT64 FX_QWORD;
776 
778 #define FX_DEFINEHANDLE(name) typedef struct _##name {FX_LPVOID pData;} * name;
779 
780 #if defined(DEBUG) && !defined(_DEBUG)
781  #define _DEBUG
782 #endif
783 
784 #ifndef __cplusplus
785 #ifndef TRUE
786 
787  #define TRUE 1
788 #endif
789 
790 #ifndef FALSE
791 
792  #define FALSE 0
793 #endif
794 #endif
795 
796 #ifndef NULL
797 
798  #define NULL 0
799 #endif
800 //<<<+++OPENSOURCE_MUST_END
801 
802 /* 断言 */
803 
804  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
805  #if !defined(_FX_NO_ANSIC_)
806 
810  #define FXSYS_assert assert
811  #else
812  void FXSYS_assert(int condition);
813  #endif
814  //<<<+++OPENSOURCE_MUST_END
815 
816 //<<<+++OPENSOURCE_MUST_BEGIN
817 #ifndef ASSERT
818  #ifdef _DEBUG
819  #define ASSERT FXSYS_assert
820  #else
821 
825  #define ASSERT(a)
826  #endif
827 #endif
828 
830 #define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
831 
832 #define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
833 
835 #define FX_PI 3.1415926535897932384626433832795f
836 
838 #if _FX_WORDSIZE_ == _FX_W64_ && _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
839  #define _FX_CRT_MALLOC_LIMIT_ 0x7fffffffffffffffL
840 #else
841  #define _FX_CRT_MALLOC_LIMIT_ 0x7fffffffL
842 #endif
843 
844 //<<<+++OPENSOURCE_MUST_END
845 
852 
853  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
854  #if !defined(_FX_NO_ANSIC_)
855 
859  #define FXSYS_sprintf sprintf
860 
864  #ifdef _WIN32
865  #define FXSYS_snprintf _snprintf
866  #define FXSYS_vsnprintf _vsnprintf
867  #else
868  #define FXSYS_snprintf snprintf
869  #define FXSYS_vsnprintf vsnprintf
870  #endif
871 
875  #define FXSYS_vsprintf vsprintf
876 
880  #define FXSYS_strchr strchr
881 
885  #define FXSYS_strlen strlen
886 
890  #define FXSYS_strncmp strncmp
891 
895  #define FXSYS_strcmp strcmp
896 
900  #define FXSYS_strcpy strcpy
901 
905  #define FXSYS_strncpy strncpy
906 
910  #define FXSYS_strstr strstr
911  #else
912  int FXSYS_sprintf(char* buffer, const char* format, ...);
913  int FXSYS_vsprintf(char *buffer, const char *format, va_list args);
914  char* FXSYS_strchr(const char* str, int ch);
915  long FXSYS_strlen(const char* str);
916  int FXSYS_strncmp(const char* str1, const char* str2, size_t len);
917  int FXSYS_strcmp(const char* str1, const char* str2);
918  char* FXSYS_strcpy(char* dest, const char* src);
919  char* FXSYS_strncpy(char* dest, const char* src, size_t len);
920  char* FXSYS_strstr(const char *string, const char *strFind);
921  #endif
922  //<<<+++OPENSOURCE_MUST_END
923 
930  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
931  #if !defined(_FX_NO_ANSIC_) && !defined(__EMSCRIPTEN__)
932 
936  #define FXSYS_FILE FILE
937 
941  #define FXSYS_fopen fopen
942 
946  #define FXSYS_fclose fclose
947 
951  #define FXSYS_SEEK_END SEEK_END
952 
956  #define FXSYS_SEEK_SET SEEK_SET
957 
961  #define FXSYS_fseek fseek
962 
966  #define FXSYS_ftell ftell
967 
971  #define FXSYS_fread fread
972 
976  #define FXSYS_fwrite fwrite
977 
981  #define FXSYS_fprintf fprintf
982 
986  #define FXSYS_fflush fflush
987  #else
988  #define FXSYS_FILE void
989  FXSYS_FILE* FXSYS_fopen(const char* filename, const char* mode);
990  int FXSYS_fclose(FXSYS_FILE*);
991  #define FXSYS_SEEK_END 2
992  #define FXSYS_SEEK_SET 0
993  int FXSYS_fseek(FXSYS_FILE*, long, int);
994  long FXSYS_ftell(FXSYS_FILE*);
995  size_t FXSYS_fread(void*, size_t, size_t, FXSYS_FILE*);
996  long FXSYS_fwrite(const void*, long, long, FXSYS_FILE*);
997  int FXSYS_fprintf(FXSYS_FILE*, const char*, ...);
998  int FXSYS_fflush(FXSYS_FILE*);
999  #endif
1000 
1001  // 目前,我们仅在 Windows 支持宽字符串文件名
1002  #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_
1003 
1007  #ifdef _NATIVE_WCHAR_T_DEFINED
1008  #define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
1009  #else
1010  #define FXSYS_wfopen _wfopen
1011  #endif
1012  #else
1013  FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
1014  #endif
1015 
1022 
1023  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1024  /* 在 ADS/RVCT/PACC/Android/MIPS_SDE 中,宽字符串基本操作不可用 */
1025  #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_
1026  #ifdef _NATIVE_WCHAR_T_DEFINED
1027  #define FXSYS_wcslen(str) wcslen((wchar_t*)(str))
1028  #define FXSYS_wcscmp(str1, str2) wcscmp((wchar_t*)(str1), (wchar_t*)(str2))
1029  #else
1030 
1034  #define FXSYS_wcslen wcslen
1035 
1039  #define FXSYS_wcscmp wcscmp
1040  #endif
1041  #else
1042  size_t FXSYS_wcslen(const wchar_t*);
1043  int FXSYS_wcscmp(const wchar_t*, const wchar_t*);
1044  #endif
1045 
1046  /* 在 ADS/RVCT/GCCE/PACC/Android/MIPS_SDE 中,如下宽字符串函数不可用。 */
1047  #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_
1048  #ifdef _NATIVE_WCHAR_T_DEFINED
1049  #define FXSYS_wcschr(str, ch) (FX_LPCWSTR)wcschr((wchar_t*)(str), ch)
1050  #define FXSYS_wcsstr(str1, str2) (FX_LPCWSTR)wcsstr((wchar_t*)(str1), (wchar_t*)(str2))
1051  #define FXSYS_wcsncmp(str1, str2, n) wcsncmp((wchar_t*)(str1), (wchar_t*)(str2), n)
1052  #else
1053 
1057  #define FXSYS_wcschr wcschr
1058 
1062  #define FXSYS_wcsstr wcsstr
1063 
1067  #define FXSYS_wcsncmp wcsncmp
1068  #endif
1069 
1073  #define FXSYS_vswprintf vswprintf
1074  #else
1075  wchar_t* FXSYS_wcschr(const wchar_t*, wchar_t);
1076  wchar_t* FXSYS_wcsstr(const wchar_t*, const wchar_t*);
1077  int FXSYS_wcsncmp(const wchar_t*, const wchar_t*, size_t);
1078  #if _FX_OS_ != _FX_ANDROID_
1079  int FXSYS_vswprintf(wchar_t*, const wchar_t*, va_list);
1080  #else
1081  #define FXSYS_vswprintf vswprintf
1082  #endif
1083  #endif
1084 
1085  #if !defined(_FX_NO_ANSIC_) && _FX_COMPILER_ != _FX_TMS470_
1086 
1090  #define FXSYS_mbstowcs mbstowcs
1091 
1095  #define FXSYS_wcstombs wcstombs
1096  #else
1097  size_t FXSYS_mbstowcs(wchar_t *dest, const char *src, size_t n);
1098  size_t FXSYS_wcstombs(char *dest, const wchar_t *src, size_t n);
1099  #endif
1100  //<<<+++OPENSOURCE_MUST_END
1101 
1104  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1109 
1110  #if !defined(_FX_NO_ANSIC_)
1111 
1115  #define FXSYS_memcmp memcmp
1116 
1120  #define FXSYS_memcpy memcpy
1121 
1126  #define FXSYS_memmove memmove
1127 
1131  #define FXSYS_memset memset
1132 
1136  #define FXSYS_memchr memchr
1137  #else
1138  int FXSYS_memcmp(const void*, const void*, size_t);
1139  void* FXSYS_memcpy(void*, const void*, size_t);
1140  void* FXSYS_memmove(void*, const void*, size_t);
1141  void* FXSYS_memset(void*, int, size_t);
1142  void* FXSYS_memchr(const void*, int, size_t);
1143  #endif
1144 
1147  /* Others */
1148  #if !defined(_FX_NO_ANSIC_)
1149 
1153  #define FXSYS_qsort qsort
1154  #else
1155  void FXSYS_qsort(void*, unsigned, unsigned, int (*)(const void*, const void*));
1156  #endif
1157 
1158  #if _FX_OS_ != _FX_WIN32_MOBILE_ && !defined(_FX_NO_ANSIC_) && _FX_OS_ != _FX_SYMBIAN_
1159 
1163  #define FXSYS_bsearch bsearch
1164  #else
1165  /* WinCE不支持二分搜索,Symbian自带的二分搜索功能也存在崩溃问题。 */
1166  void * FXSYS_bsearch(const void *key, const void *base, size_t num, size_t width, int (*compare)(const void *, const void *));
1167  #endif
1168 
1169  #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1170  /* 在Windows平台上,我们可以替换更多的系统调用 */
1171 
1176  #define FXSYS_itoa _itoa
1177 
1181  #define FXSYS_strlwr _strlwr
1182 
1186  #define FXSYS_strupr _strupr
1187 
1191  #define FXSYS_stricmp _stricmp
1192 
1193  #ifdef _NATIVE_WCHAR_T_DEFINED
1194  #define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
1195  #define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
1196  #define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
1197  #define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
1198  #define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
1199  #else
1200 
1204  #define FXSYS_wcsicmp _wcsicmp
1205 
1209  #define FXSYS_WideCharToMultiByte WideCharToMultiByte
1210 
1214  #define FXSYS_MultiByteToWideChar MultiByteToWideChar
1215 
1219  #define FXSYS_wcslwr _wcslwr
1220 
1224  #define FXSYS_wcsupr _wcsupr
1225  #endif
1226 
1227  #ifndef _FX_WINAPI_PARTITION_DESKTOP_
1228  int FXSYS_IntersectRect(struct FX_RECT*, const struct FX_RECT*, const struct FX_RECT*);
1229  int FXSYS_GetACP(void);
1230  FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
1231  FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
1232  #else
1233 
1237  #define FXSYS_GetFullPathName GetFullPathName
1238 
1242  #define FXSYS_GetModuleFileName GetModuleFileName
1243 
1247  #define FXSYS_GetACP GetACP
1248  #endif
1249  #else
1250  char* FXSYS_itoa(int value, char* string, int radix);
1251  int FXSYS_GetACP(void);
1252  int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
1253  char* buf, int buflen, const char* default_str, int* pUseDefault);
1254  int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
1255  wchar_t* buf, int buflen);
1256  FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
1257  FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
1258 
1259  char* FXSYS_strlwr(char* str);
1260  char* FXSYS_strupr(char* str);
1261  int FXSYS_stricmp(const char*, const char*);
1262  int FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
1263 
1264  wchar_t* FXSYS_wcslwr(wchar_t* str);
1265  wchar_t* FXSYS_wcsupr(wchar_t* str);
1266  #endif
1267  //<<<+++OPENSOURCE_MUST_END
1268 
1269  //*****************************************************************************
1270  //* 内存工具
1271  //*****************************************************************************
1276 
1289  void* FXSYS_memcpy32(void* dst, const void* src, size_t size);
1290 
1307  FX_INT32 FXSYS_memcmp32(const void* buf1, const void* buf2, size_t size);
1308 
1320  void* FXSYS_memset32(void* dst, FX_INT32 v, size_t size);
1321 
1333  void* FXSYS_memset8(void* dst, FX_BYTE v, size_t size);
1334 
1344  void* FXSYS_memmove32(void* dst, const void* src, size_t size);
1346 //<<<+++OPENSOURCE_MUST_END
1347 
1348 //<<<+++OPENSOURCE_MUST_BEGIN
1349 #ifdef __cplusplus
1350 }
1351 #endif
1352 //<<<+++OPENSOURCE_MUST_END
1353 
1354  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1359 
1360  #if _FX_OS_ == _FX_PALMOS_ && _FX_COMPILER_ == _FX_METROWERKS_
1361  #ifdef __cplusplus
1362  extern "C" {
1363  #endif
1364 
1365  /* Metrowerks for Palm OS (9.3) 不支持标准数学函数库(math.h) */
1366  extern double __ieee754_pow(double, double);
1367  extern double __ieee754_sqrt(double);
1368  extern double __fabs(double);
1369  extern double __ieee754_atan2(double, double);
1370  extern double __ceil(double);
1371  extern double __floor(double);
1372  extern double __cos(double);
1373  extern double __ieee754_acos(double);
1374  extern double __sin(double);
1375  extern double __ieee754_log(double);
1376  extern double __ieee754_log10(double);
1377 
1378  #define FXSYS_pow(x, y) __ieee754_pow(x, y)
1379  #define FXSYS_sqrt(x) __ieee754_sqrt(x)
1380  #define FXSYS_fabs(x) __fabs(x)
1381  #define FXSYS_atan2(x, y) __ieee754_atan2(x, y)
1382  #define FXSYS_ceil(x) __ceil(x)
1383  #define FXSYS_floor(x) __floor(x)
1384  #define FXSYS_cos(x) __cos(x)
1385  #define FXSYS_acos(x) __ieee754_acos(x)
1386  #define FXSYS_sin(x) __sin(x)
1387  #define FXSYS_log(x) __ieee754_log(x)
1388  #define FXSYS_log10(x) __ieee754_log10(x)
1389 
1390  #ifdef __cplusplus
1391  }
1392  #endif
1393  #else
1394  #include <math.h>
1395  #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ || _FX_OS_ == _FX_LINUX_DESKTOP_
1396 
1400  #define FXSYS_pow powf
1401 
1405  #define FXSYS_sqrt sqrtf
1406 
1410  #define FXSYS_fabs fabsf
1411 
1415  #define FXSYS_atan2 atan2f
1416 
1420  #define FXSYS_ceil ceilf
1421 
1425  #define FXSYS_floor floorf
1426 
1430  #define FXSYS_cos cosf
1431 
1435  #define FXSYS_acos acosf
1436 
1440  #define FXSYS_sin sinf
1441 
1445  #define FXSYS_log logf
1446 
1450  #define FXSYS_log10 log10f
1451 
1455  #define FXSYS_fmod fmodf
1456  #else
1457  #define FXSYS_pow(a, b) (FX_FLOAT)pow(a, b)
1458  #define FXSYS_sqrt(a) (FX_FLOAT)sqrt(a)
1459  #define FXSYS_fabs(a) (FX_FLOAT)fabs(a)
1460  #define FXSYS_atan2(a, b) (FX_FLOAT)atan2(a, b)
1461  #define FXSYS_ceil(a) (FX_FLOAT)ceil(a)
1462  #define FXSYS_floor(a) (FX_FLOAT)floor(a)
1463  #define FXSYS_cos(a) (FX_FLOAT)cos(a)
1464  #define FXSYS_acos(a) (FX_FLOAT)acos(a)
1465  #define FXSYS_sin(a) (FX_FLOAT)sin(a)
1466  #define FXSYS_log(a) (FX_FLOAT)log(a)
1467  #define FXSYS_log10(a) (FX_FLOAT)log10(a)
1468  #define FXSYS_fmod(a, b) (FX_FLOAT)fmod(a, b)
1469  #endif
1470  #endif
1471 
1472  #if !defined(_FX_NO_ANSIC_)
1473 
1477  #define FXSYS_abs abs
1478  #else
1479  #define FXSYS_abs(a) ((a)<0?-(a):(a))
1480  #endif
1481 
1483  //<<<+++OPENSOURCE_MUST_END
1484 
1485 //<<<+++OPENSOURCE_MUST_BEGIN
1486 #ifdef __cplusplus
1487 extern "C" {
1488 #endif
1489 //<<<+++OPENSOURCE_MUST_END
1490 
1491  //<<<+++OPENSOURCE_MUST_BEGIN LIC==FOXIT
1492  #ifdef _FX_NO_GLOBAL_
1493  /* 如果平台不支持全局变量,那么我们必须从静态函数中获取 */
1495  void FXSYS_SetStaticPointer1(void*);
1497  void* FXSYS_GetStaticPointer1(void);
1499  void FXSYS_SetStaticPointer2(void*);
1501  void* FXSYS_GetStaticPointer2(void);
1502  #endif
1503 
1504  /* CPU字节顺序 */
1505  #if _FX_ENDIAN_ == _FX_BIG_ENDIAN_
1506  #define _FX_MSB_FIRST_
1507  #define FXDWORD_FROM_LSBFIRST(i) ( ((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24) )
1508  #define FXDWORD_FROM_MSBFIRST(i) (i)
1509  #else
1510  #define _FX_LSB_FIRST_
1511  #define FXDWORD_FROM_LSBFIRST(i) (i)
1512  #define FXDWORD_FROM_MSBFIRST(i) ( ((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24) )
1513  #endif
1514 
1515  #if _FX_CPU_ == _FX_X86_ || _FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_ARM64_ || \
1516  _FX_CPU_ == _FX_MIPS64_ || _FX_CPU_ == _FX_LOONGARCH64_ || _FX_CPU_ == _FX_SW64_
1517  #define FXDWORD_GET_LSBFIRST(p) (*(FX_DWORD*)(p))
1518  #else
1519  #define FXDWORD_GET_LSBFIRST(p) ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
1520  #endif
1521 
1522 #define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
1523 
1524 #define FXSYS_HIBYTE(word) ((FX_BYTE)((word) >> 8))
1525 #define FXSYS_LOBYTE(word) ((FX_BYTE)(word))
1526 #define FXSYS_HIWORD(dword) ((FX_WORD)((dword) >> 16))
1527 #define FXSYS_LOWORD(dword) ((FX_WORD)(dword))
1528 
1530 #define FXSYS_strtol strtol
1531 
1555 FX_INT64 FXSYS_atoi64(FX_LPCSTR str);
1563 FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str);
1573 FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
1583 FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
1591 int FXSYS_round(FX_FLOAT f);
1593 #define FXSYS_Mul(a, b) ((a) * (b))
1594 
1595 #define FXSYS_Div(a, b) ((a) / (b))
1596 
1597 #define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
1598 
1599 #define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
1600 
1601 //*****************************************************************************
1602 //* 多线程控制
1603 //*****************************************************************************
1605 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1606  typedef CRITICAL_SECTION FX_MUTEX;
1607  FX_DEFINEHANDLE(FX_RWLOCK)
1608 #elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_EMBEDDED_ || _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_
1609  #include <pthread.h>
1610  typedef pthread_mutex_t FX_MUTEX;
1611  #if _FX_OS_ == _FX_ANDROID_
1612  FX_DEFINEHANDLE(FX_RWLOCK)
1613  #else
1614  typedef pthread_rwlock_t FX_RWLOCK;
1615  #endif
1616 #else
1618  FX_DEFINEHANDLE(FX_RWLOCK)
1619 #endif
1620 
1621 // 以下五个函数在fx_process.h中定义,请参考那里。
1622 FX_BOOL FX_Mutex_Initialize(FX_MUTEX* pMutex);
1623 void FX_Mutex_Destroy(FX_MUTEX* pMutex);
1624 FX_BOOL FX_Mutex_TryLock(FX_MUTEX* pMutex);
1625 void FX_Mutex_Lock(FX_MUTEX* pMutex);
1626 void FX_Mutex_Unlock(FX_MUTEX* pMutex);
1627 
1628 #define FX_CRITICAL_SECTION FX_MUTEX
1629 #define FX_InitializeCriticalSection(a) FX_Mutex_Initialize(a)
1630 #define FX_DeleteCriticalSection(a) FX_Mutex_Destroy(a)
1631 #define FX_TryEnterCriticalSection(a) FX_Mutex_TryLock(a)
1632 #define FX_EnterCriticalSection(a) FX_Mutex_Lock(a)
1633 #define FX_LeaveCriticalSection(a) FX_Mutex_Unlock(a)
1634 
1636 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_) && !defined(_FX_NO_WINDOWS_)
1637  typedef void* FX_SPINLOCK;
1638 #elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_==_FX_LINUX_EMBEDDED_
1639  #ifdef _FX_SPINLOCK_USEGCCCAS_
1640  typedef size_t FX_SPINLOCK;
1641  #else
1642 #ifndef _CHROME_PNACL_
1643  typedef pthread_spinlock_t FX_SPINLOCK;
1644 #else
1645  typedef size_t FX_SPINLOCK;
1646 #endif
1647  #endif
1648 #elif _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
1649  typedef OSSpinLock FX_SPINLOCK;
1650 #else // android/embeded linux/other os
1652 #endif
1653 //<<<+++OPENSOURCE_MUST_END
1654 
1655 //<<<+++OPENSOURCE_MUST_BEGIN
1656 #ifdef __cplusplus
1657 };
1658 #endif
1659 //<<<+++OPENSOURCE_MUST_END
1660 
1661 #if _FX_OS_ == _FX_PALMOS_ && _FX_COMPILER_ == _FX_PACC_
1662  #include <errtrycatch.h>
1663  #define setjmp ErrSetJump
1664  #define longjmp ErrLongJump
1665  #define jmp_buf ErrJumpBuf
1666 #else
1667  #include <setjmp.h>
1668 #endif
1669 
1670 #if _FX_OS_ == _FX_MACOSX_
1671  #include <Carbon/Carbon.h>
1672 #elif _FX_OS_ == _FX_IOS_
1673  #include <CoreText/CoreText.h>
1674  #include <CoreGraphics/CoreGraphics.h>
1675 #endif
1676 //<<<+++OPENSOURCE_MUST_END
1677 //<<<+++OPENSOURCE_MUST_BEGIN
1678 #endif /* _FPDF_SYSTEM_H_ */
1679 //<<<+++OPENSOURCE_MUST_END
1680 
1683 //<<<+++OPENSOURCE_END
void * FXSYS_memset8(void *dst, FX_BYTE v, size_t size)
将缓冲区数据设置为指定值。
void * FX_LPVOID
指向任意类型的指针。
Definition: fx_system.h:660
wchar_t FX_WCHAR
编译器相关的Unicode字符(Microsoft编译器为16位,gcc为32位)。
Definition: fx_system.h:738
#define FXSYS_wcslwr
将宽字符字符串转换为小写。
Definition: fx_system.h:1219
#define FXSYS_mbstowcs
将多字节字符序列转换为相应的宽字符序列。
Definition: fx_system.h:1090
FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)
将整数转换为宽字符串。
#define FXSYS_fwrite
向文件写入数据。
Definition: fx_system.h:976
#define FXSYS_fprintf
向文件打印格式化数据。
Definition: fx_system.h:981
FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)
将整数转换为ANSI字符串。
#define FXSYS_wcsncmp
比较两个宽字符字符串的字符。
Definition: fx_system.h:1067
#define FXSYS_FILE
文件结构。
Definition: fx_system.h:936
void const * FX_LPCVOID
指向任意常量类型的指针。
Definition: fx_system.h:662
int FXSYS_round(FX_FLOAT f)
获取最接近的整数
#define FXSYS_strcpy
复制ANSIC字符串。
Definition: fx_system.h:900
#define FXSYS_fflush
刷新文件。
Definition: fx_system.h:986
FX_DWORD FX_UINT32
无符号32位整数。
Definition: fx_system.h:773
wchar_t const * FX_LPCWSTR
指向常量Unicode字符的指针。
Definition: fx_system.h:742
#define FXSYS_GetFullPathName
获取指定文件的完整路径和文件名。
Definition: fx_system.h:1237
#define FXSYS_strlen
获取ANSIC字符串的长度。
Definition: fx_system.h:885
#define FXSYS_wcsupr
将宽字符字符串转换为大写。
Definition: fx_system.h:1224
#define FXSYS_strncpy
复制有长度限制的ANSIC字符串。
Definition: fx_system.h:905
#define FXSYS_wcschr
在宽字符字符串中查找宽字符。
Definition: fx_system.h:1057
FX_INT32 FXSYS_memcmp32(const void *buf1, const void *buf2, size_t size)
比较两个缓冲区中的数据。
char * FX_LPSTR
指向8位Windows (ANSI) 字符的指针。
Definition: fx_system.h:709
#define FXSYS_wfopen
使用宽字符串参数打开文件。目前仅支持Windows平台。
Definition: fx_system.h:1010
#define FXSYS_memmove
将一个缓冲区移动到另一个缓冲区。如果源区域和目标区域的某些区域重叠, ::FXSYS_memmove 确保重叠区域中的原始源字节在被覆盖之前被复制。
Definition: fx_system.h:1126
CRITICAL_SECTION FX_MUTEX
互斥锁/临界区和读写锁的定义。
Definition: fx_system.h:1606
#define FXSYS_memcpy
从一个缓冲区复制到另一个缓冲区。
Definition: fx_system.h:1120
void * FX_POSITION
用于表示集合中元素位置的值。
Definition: fx_system.h:664
unsigned int FX_DWORD
32位无符号整数。
Definition: fx_system.h:727
#define FXSYS_vswprintf
使用指向参数列表的指针写入格式化输出宽字符字符串。
Definition: fx_system.h:1073
#define FXSYS_itoa
将整数转换为ANSIC字符串。
Definition: fx_system.h:1176
FX_INT64 FXSYS_atoi64(FX_LPCSTR str)
将ANSI字符串转换为整数。
#define FXSYS_strchr
在ANSIC字符串中查找字符。
Definition: fx_system.h:880
#define FXSYS_strlwr
将ANSIC字符串转换为小写。
Definition: fx_system.h:1181
int FX_INT32
32位有符号整数。
Definition: fx_system.h:689
#define FXSYS_GetModuleFileName
获取指定模块的完全限定路径。
Definition: fx_system.h:1242
void * FXSYS_memset32(void *dst, FX_INT32 v, size_t size)
将缓冲区数据设置为指定值。
#define FXSYS_memcmp
比较两个缓冲区。
Definition: fx_system.h:1115
int FX_BOOL
布尔变量(应为TRUE或FALSE)。
Definition: fx_system.h:697
unsigned short * FX_LPWORD
指向WORD的指针。
Definition: fx_system.h:685
#define FXSYS_fseek
将文件指针移动到指定位置。
Definition: fx_system.h:961
char const * FX_LPCSTR
指向常量8位Windows (ANSI) 字符的指针。
Definition: fx_system.h:711
#define FXSYS_wcslen
获取宽字符字符串的长度。
Definition: fx_system.h:1034
FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)
将宽字符串转换为整数。
signed char FX_INT8
有符号8位整数。
Definition: fx_system.h:667
#define FXSYS_wcscmp
比较宽字符字符串。
Definition: fx_system.h:1039
#define FXSYS_GetACP
检索系统的当前ANSI代码页标识符。
Definition: fx_system.h:1247
FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)
将宽字符串转换为整数。
#define FXSYS_fread
从文件读取数据。
Definition: fx_system.h:971
UINT_PTR FX_UINTPTR
指针精度的无符号整型。
Definition: fx_system.h:758
#define FXSYS_qsort
执行快速排序。通用算法。
Definition: fx_system.h:1153
#define FXSYS_wcsicmp
比较两个宽字符字符串,不区分大小写。
Definition: fx_system.h:1204
void * FX_SPINLOCK
自旋锁的定义。
Definition: fx_system.h:1637
short FX_SHORT
短整数(16位)。
Definition: fx_system.h:681
#define FXSYS_fopen
打开文件。
Definition: fx_system.h:941
#define FXSYS_bsearch
对排序数组执行二分搜索。通用算法。
Definition: fx_system.h:1163
#define FXSYS_MultiByteToWideChar
将字符字符串映射为宽字符字符串。
Definition: fx_system.h:1214
unsigned char * FX_LPBYTE
指向FX_BYTE的指针。
Definition: fx_system.h:673
#define FXSYS_strstr
查找子字符串
Definition: fx_system.h:910
#define FXSYS_wcsstr
查找宽字符子字符串。
Definition: fx_system.h:1062
char FX_CHAR
8位Windows (ANSI) 字符。
Definition: fx_system.h:707
float FX_FLOAT
32位浮点数。
Definition: fx_system.h:691
#define FXSYS_assert
断言。
Definition: fx_system.h:810
unsigned short FX_UINT16
无符号16位整数。
Definition: fx_system.h:679
#define FXSYS_memchr
在内存块中搜索字节。
Definition: fx_system.h:1136
#define FXSYS_strcmp
比较ANSIC字符串。
Definition: fx_system.h:895
#define FXSYS_WideCharToMultiByte
将宽字符字符串映射为字符字符串。
Definition: fx_system.h:1209
unsigned char FX_UINT8
无符号8位整数。
Definition: fx_system.h:669
unsigned short const * FX_LPCWORD
指向WORD的指针。
Definition: fx_system.h:687
#define FXSYS_fclose
关闭文件。
Definition: fx_system.h:946
#define FXSYS_ftell
获取文件指针的当前位置。
Definition: fx_system.h:966
#define FXSYS_stricmp
比较两个ANSIC字符串,不区分大小写。
Definition: fx_system.h:1191
#define FXSYS_strncmp
比较两个ANSIC字符串的字符。
Definition: fx_system.h:890
unsigned short FX_WORD
16位无符号整数。
Definition: fx_system.h:683
short FX_INT16
有符号16位整数。
Definition: fx_system.h:677
#define FXSYS_memset
使用给定字符初始化缓冲区。
Definition: fx_system.h:1131
FX_INT32 FXSYS_atoi(FX_LPCSTR str)
将ANSI字符串转换为整数。
unsigned char const * FX_LPCBYTE
指向常量FX_BYTE的指针。
Definition: fx_system.h:675
wchar_t * FX_LPWSTR
指向Unicode字符的指针。
Definition: fx_system.h:740
unsigned int * FX_LPDWORD
指向DWORD的指针。
Definition: fx_system.h:729
#define FXSYS_sprintf
将格式化数据写入ANSIC字符串。
Definition: fx_system.h:859
#define FX_DEFINEHANDLE(name)
定义句柄类型的宏。
Definition: fx_system.h:778
#define FXSYS_wcstombs
将宽字符序列转换为相应的多字节字符序列。
Definition: fx_system.h:1095
#define FXSYS_vsprintf
使用指向参数列表的指针写入格式化输出。
Definition: fx_system.h:875
void * FXSYS_memmove32(void *dst, const void *src, size_t size)
将源缓冲区数据移动到目标缓冲区。
#define FXSYS_strupr
将ANSIC字符串转换为大写。
Definition: fx_system.h:1186
void * FXSYS_memcpy32(void *dst, const void *src, size_t size)
从源缓冲区复制数据到目标缓冲区。
FX_UINT64 FX_QWORD
无符号四字整数。
Definition: fx_system.h:775
INT_PTR FX_INTPTR
指针精度的有符号整型。
Definition: fx_system.h:756
unsigned char FX_BYTE
字节(8位)。
Definition: fx_system.h:671
int FX_ERR
错误指示器。
Definition: fx_system.h:700