1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
9 #define _FX_WIN32_DESKTOP_ 1
10 #define _FX_LINUX_DESKTOP_ 4
12 #define _FX_ANDROID_ 12
13 #define _FXM_PLATFORM_WINDOWS_ 1
14 #define _FXM_PLATFORM_LINUX_ 2
15 #define _FXM_PLATFORM_APPLE_ 3
16 #define _FXM_PLATFORM_ANDROID_ 4
18 #if defined(__ANDROID__)
19 #define _FX_OS_ _FX_ANDROID_
20 #define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
21 #elif defined(_WIN32) || defined(_WIN64)
22 #define _FX_OS_ _FX_WIN32_DESKTOP_
23 #define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
24 #elif defined(__linux__)
25 #define _FX_OS_ _FX_LINUX_DESKTOP_
26 #define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
27 #elif defined(__APPLE__)
28 #define _FX_OS_ _FX_MACOSX_
29 #define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
32 #if !defined(_FX_OS_) || _FX_OS_ == 0
33 #error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.
35 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
36 #define _CRT_SECURE_NO_WARNINGS
42 #if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64 || defined(__LP64__)
43 #define _FX_WORDSIZE_ _FX_W64_
45 #define _FX_WORDSIZE_ _FX_W32_
56 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
57 #include <libkern/OSAtomic.h>
58 #if _FX_OS_ == _FX_MACOSX_
59 #include <Carbon/Carbon.h>
60 #elif _FX_OS_ == _FX_IOS_
61 #include <CoreText/CoreText.h>
62 #include <CoreGraphics/CoreGraphics.h>
68 typedef void* FX_LPVOID;
69 typedef void const* FX_LPCVOID;
70 typedef void* FX_POSITION;
71 typedef signed char FX_INT8;
72 typedef unsigned char FX_UINT8;
73 typedef unsigned char FX_BYTE;
74 typedef unsigned char* FX_LPBYTE;
75 typedef unsigned char const* FX_LPCBYTE;
76 typedef short FX_INT16;
77 typedef unsigned short FX_UINT16;
78 typedef short FX_SHORT;
79 typedef unsigned short FX_WORD;
80 typedef unsigned short* FX_LPWORD;
81 typedef unsigned short const* FX_LPCWORD;
83 typedef float FX_FLOAT;
86 #define FX_SUCCEEDED(Status) ((FX_ERR)(Status) >= 0)
87 #define FX_FAILED(Status) ((FX_ERR)(Status) < 0)
89 typedef char* FX_LPSTR;
90 typedef char const* FX_LPCSTR;
91 typedef unsigned int FX_DWORD;
92 typedef unsigned int* FX_LPDWORD;
93 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
94 typedef __int64 FX_INT64;
95 typedef unsigned __int64 FX_UINT64;
97 typedef long long int FX_INT64;
98 typedef unsigned long long FX_UINT64;
100 #if _FX_WORDSIZE_ == _FX_W64_
101 typedef FX_INT64 FX_INTPTR;
102 typedef FX_UINT64 FX_UINTPTR;
104 typedef int FX_INTPTR;
105 typedef unsigned int FX_UINTPTR;
107 typedef wchar_t FX_WCHAR;
108 typedef wchar_t* FX_LPWSTR;
109 typedef wchar_t const* FX_LPCWSTR;
110 typedef FX_DWORD FX_UINT32;
111 typedef FX_UINT64 FX_QWORD;
112 #define FX_DEFINEHANDLE(name) typedef struct _##name {FX_LPVOID pData;} * name;
113 #if defined(DEBUG) && !defined(_DEBUG)
128 #define FXSYS_assert assert
131 #define ASSERT FXSYS_assert
137 #define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
138 #define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
139 #define FX_PI 3.1415926535897932384626433832795f
140 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
141 #define FXSYS_snprintf _snprintf
143 #define FXSYS_snprintf snprintf
145 #define FXSYS_sprintf sprintf
146 #define FXSYS_vsprintf vsprintf
147 #define FXSYS_strchr strchr
148 #define FXSYS_strlen strlen
149 #define FXSYS_strncmp strncmp
150 #define FXSYS_strcmp strcmp
151 #define FXSYS_strcpy strcpy
152 #define FXSYS_strncpy strncpy
153 #define FXSYS_strstr strstr
154 #define FXSYS_FILE FILE
155 #define FXSYS_fopen fopen
156 #define FXSYS_fclose fclose
157 #define FXSYS_SEEK_END SEEK_END
158 #define FXSYS_SEEK_SET SEEK_SET
159 #define FXSYS_fseek fseek
160 #define FXSYS_ftell ftell
161 #define FXSYS_fread fread
162 #define FXSYS_fwrite fwrite
163 #define FXSYS_fprintf fprintf
164 #define FXSYS_fflush fflush
165 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
166 #ifdef _NATIVE_WCHAR_T_DEFINED
167 #define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
169 #define FXSYS_wfopen _wfopen
172 FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
175 #define FXSYS_wcslen wcslen
176 #define FXSYS_wcscmp wcscmp
177 #define FXSYS_wcschr wcschr
178 #define FXSYS_wcsstr wcsstr
179 #define FXSYS_wcsncmp wcsncmp
180 #define FXSYS_vswprintf vswprintf
181 #define FXSYS_mbstowcs mbstowcs
182 #define FXSYS_wcstombs wcstombs
183 #define FXSYS_memcmp memcmp
184 #define FXSYS_memcpy memcpy
185 #define FXSYS_memmove memmove
186 #define FXSYS_memset memset
187 #define FXSYS_memchr memchr
188 #define FXSYS_qsort qsort
189 #define FXSYS_bsearch bsearch
190 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
191 #define FXSYS_GetACP GetACP
192 #define FXSYS_itoa _itoa
193 #define FXSYS_strlwr _strlwr
194 #define FXSYS_strupr _strupr
195 #define FXSYS_stricmp _stricmp
196 #ifdef _NATIVE_WCHAR_T_DEFINED
197 #define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
198 #define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
199 #define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
200 #define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
201 #define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
203 #define FXSYS_wcsicmp _wcsicmp
204 #define FXSYS_WideCharToMultiByte WideCharToMultiByte
205 #define FXSYS_MultiByteToWideChar MultiByteToWideChar
206 #define FXSYS_wcslwr _wcslwr
207 #define FXSYS_wcsupr _wcsupr
209 #define FXSYS_GetFullPathName GetFullPathName
210 #define FXSYS_GetModuleFileName GetModuleFileName
212 int FXSYS_GetACP(void);
213 char* FXSYS_itoa(int value, char* string, int radix);
214 int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
215 char* buf, int buflen, const char* default_str, int* pUseDefault);
216 int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
217 wchar_t* buf, int buflen);
218 FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
219 FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
220 char* FXSYS_strlwr(char* str);
221 char* FXSYS_strupr(char* str);
222 int FXSYS_stricmp(const char*, const char*);
223 int FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
224 wchar_t* FXSYS_wcslwr(wchar_t* str);
225 wchar_t* FXSYS_wcsupr(wchar_t* str);
227 #define FXSYS_memcpy32 FXSYS_memcpy
228 #define FXSYS_memcmp32 FXSYS_memcmp
229 #define FXSYS_memset32 FXSYS_memset
230 #define FXSYS_memset8 FXSYS_memset
231 #define FXSYS_memmove32 FXSYS_memmove
236 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
237 #define FXSYS_pow(a, b) (FX_FLOAT)powf(a, b)
239 #define FXSYS_pow(a, b) (FX_FLOAT)pow(a, b)
241 #define FXSYS_sqrt(a) (FX_FLOAT)sqrt(a)
242 #define FXSYS_fabs(a) (FX_FLOAT)fabs(a)
243 #define FXSYS_atan2(a, b) (FX_FLOAT)atan2(a, b)
244 #define FXSYS_ceil(a) (FX_FLOAT)ceil(a)
245 #define FXSYS_floor(a) (FX_FLOAT)floor(a)
246 #define FXSYS_cos(a) (FX_FLOAT)cos(a)
247 #define FXSYS_acos(a) (FX_FLOAT)acos(a)
248 #define FXSYS_sin(a) (FX_FLOAT)sin(a)
249 #define FXSYS_log(a) (FX_FLOAT)log(a)
250 #define FXSYS_log10(a) (FX_FLOAT)log10(a)
251 #define FXSYS_fmod(a, b) (FX_FLOAT)fmod(a, b)
252 #define FXSYS_abs abs
256 #define _FX_LSB_FIRST_
257 #define FXDWORD_FROM_LSBFIRST(i) (i)
258 #define FXDWORD_FROM_MSBFIRST(i) (((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))
259 #define FXDWORD_GET_LSBFIRST(p) ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
260 #define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
261 #define FXSYS_HIBYTE(word) ((FX_BYTE)((word) >> 8))
262 #define FXSYS_LOBYTE(word) ((FX_BYTE)(word))
263 #define FXSYS_HIWORD(dword) ((FX_WORD)((dword) >> 16))
264 #define FXSYS_LOWORD(dword) ((FX_WORD)(dword))
265 FX_INT32 FXSYS_atoi(FX_LPCSTR str);
266 FX_INT32 FXSYS_wtoi(FX_LPCWSTR str);
267 FX_INT64 FXSYS_atoi64(FX_LPCSTR str);
268 FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str);
269 FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
270 FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
271 int FXSYS_round(FX_FLOAT f);
272 #define FXSYS_Mul(a, b) ((a) * (b))
273 #define FXSYS_Div(a, b) ((a) / (b))
274 #define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
275 #define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
279 #include "../../../third_party/numerics/safe_math.h"
280 typedef base::CheckedNumeric<FX_DWORD> FX_SAFE_DWORD;
281 typedef base::CheckedNumeric<FX_INT32> FX_SAFE_INT32;
282 typedef base::CheckedNumeric<size_t> FX_SAFE_SIZE_T;
283 #if defined(__clang__) || _MSC_VER >= 1700
284 #define FX_FINAL final
285 #elif defined(__GNUC__) && __cplusplus >= 201103 && \
286 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
287 #define FX_FINAL final