27#ifndef _OD_PLATFORM_H_
28#define _OD_PLATFORM_H_
34#define odmin(X,Y) ((X) < (Y) ? (X) : (Y))
35#define odmax(X,Y) ((X) > (Y) ? (X) : (Y))
38#if defined(ODA_WINDOWS)
41#define Odisnan(x) (::_isnan(x) != 0)
42#define Odfinite(x) (::_finite(x) != 0)
43#ifndef OD_USE_EXTENDED_FUNCTIONS
44#define GETSS(s,n) ::fgets(s, n, stdin)
45#define OdWprintf wprintf
46#define OdPrintf printf
48#define GETSS(s,n) ::gets_s(s,n)
49#define OdWprintf _wprintf_p
50#define OdPrintf _printf_p
57#if defined(_MSC_VER) && (_MSC_VER < 1400)
59#define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam))
62#define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam))
69#define GETSS(s, n) fgets(s, n, stdin)
72#define MAX_PATH PATH_MAX
75#define OdWprintf wprintf
76#define OdPrintf printf
78#if defined(__APPLE__) || defined(__GNUC__) && ( __GNUC__>=5 || __GNUC__==4 && __GNUC_MINOR__>=9 )
80#define Odisnan(x) std::isnan(x)
81#define Odfinite(x) std::isfinite(x)
88#define Odisnan(x) std::isnan(x)
89#define Odfinite(x) (finite(x) != 0)
108#include "../../ThirdParty/wchar/stdlib_.h"
109#include "../../ThirdParty/wchar/wchar_.h"
110#define Od_atof Citrus::atof
111#define Od_abs Citrus::abs
112#define Od_labs Citrus::labs
113#define Od_llabs Citrus::llabs
114#define Od_srand Citrus::srand
115#define Od_rand Citrus::rand
116#define Od_wcstombs Citrus::wcstombs
117#define Od_wcscpy Citrus::wcscpy
118#define Od_wcscmp Citrus::wcscmp
119#define Od_wcscat Citrus::wcscat
120#define Od_wcschr Citrus::wcschr
121#define Od_wcscpy Citrus::wcscpy
122#define Od_wcslen Citrus::wcslen
123#define Od_wcsncpy Citrus::wcsncpy
126#if defined(_MSC_VER) && (_MSC_VER < 1600)
133#if defined(__BCPLUSPLUS__) || defined(__BORLANDC__) || defined(__sun)
136#if OD_SIZEOF_LONG == 4
137inline int Od_abs(
int val) {
return std::abs(val); }
139inline double Od_abs(
double val) {
return std::fabs(val); }
141#define Od_abs std::abs
145#define Od_labs std::labs
146#define Od_llabs std::llabs
147#define Od_srand srand
149#define Od_wcstombs wcstombs
150#define Od_wcscpy wcscpy
151#define Od_wcscmp wcscmp
152#define Od_wcscat wcscat
153#define Od_wcschr wcschr
154#define Od_wcslen wcslen
155#define Od_wcsncpy wcsncpy
158#if defined(_MSC_VER) && (_MSC_VER < 1800)
163 if (a - floor(a) >= 0.5)
164 result = floor(a) + 1;
170#define Od_round std::round
174#define odStrChr(str, ch) strchr(str, ch)
178#define odWStrChr(str, ch) Od_wcschr(str, ch)
189FIRSTDLL_EXPORT extern int Od_strnicmpA(
const char *s1,
const char *s2,
int len);
190FIRSTDLL_EXPORT extern int Od_stricmpA(
const char* str,
const char* str2);
195#if !defined(_WIN32_WCE)
196#define odStrUpr(str) Od_strupr(str)
197#define odStrLwr(str) Od_strlwr(str)
198#define odStrRev(str) Od_strrev(str)
204#if !defined(__linux__) && !defined(_WIN32_WCE) || defined(ANDROID)
205#define odStrICmp(str, str2) Od_stricmp(str, str2)
206#define odStrnICmp(str, str2, n) Od_strnicmp(str, str2, n)
207#define odStrnICmpA Od_strnicmpA
208#define odStrICmpA(str, str2) Od_stricmpA(str, str2)
209#define odStrUprA(str) Od_struprA(str)
210#define odStrLwrA(str) Od_strlwrA(str)
211#define odStrRevA(str) Od_strrevA(str)
272#define odStrLen(str) wcslen(str)
276#define odStrLenA(str) strlen(str)
280#define odStrCmp(str, str2) wcscmp(str, str2)
284#define odStrCmpA(str, str2) strcmp(str, str2)
287#if defined(ODA_WINDOWS)
293#if defined(ODA_WINDOWS)
294#ifndef WIN32_LEAN_AND_MEAN
295#define WIN32_LEAN_AND_MEAN
299#if defined( ANDROID ) || defined ( _WIN32_WCE ) || (defined (_MSC_VER) && _MSC_VER < 1400) || defined(_WINRT)
303 #define OFFSETTYPE(offset) (long)offset
305#elif defined(__APPLE__) || defined( __hpux )
309 #define OFFSETTYPE(offset) offset
311 #define FSEEK fseeko64
312 #define FTELL ftello64
313 #define FOPEN fopen64
314 #define OFFSETTYPE(offset) offset
317#if defined(__linux__) || defined(EMCC)
319#if !defined(EMCC) && !defined(__clang__)
320#include <bits/stl_algobase.h>
325#define wcsicmp wcscasecmp
329#define wcsnicmp wcsncasecmp
333inline wchar_t* wcsupr(
wchar_t* s)
337 for(
wchar_t* p = s; *p; ++p)
344inline wchar_t* wcslwr(
wchar_t* s)
348 for(
wchar_t* p = s; *p; ++p)
354inline wchar_t* wcsrev(
wchar_t* s)
358 wchar_t* e = s + wcslen(s) - 1;
373#define stricmp Od_stricmpA
377#define strupr Od_struprA
381#define strlwr Od_strlwrA
385#define strrev Od_strrevA
389#define strnicmp Od_strnicmpA
400#include <stringapiset.h>
401inline int Od_stricmpW(
const OdChar* str,
const OdChar* str2){
return CompareStringEx( LOCALE_NAME_INVARIANT, NORM_IGNORECASE, (
const wchar_t*)str, -1, (
const wchar_t*)str2, -1, NULL, NULL, 0) - 2; }
402#elif defined(_WIN32) ||defined(_WIN64) || defined(_WIN32_WCE)
403inline int Od_stricmpW(
const OdChar* str,
const OdChar* str2){
return CompareStringW( LOCALE_NEUTRAL, NORM_IGNORECASE, (
const wchar_t*)str, -1, (
const wchar_t*)str2, -1) - 2; }
404#elif (defined ( __BORLANDC__ ) && (__BORLANDC__) >= 0x530) ||(defined(_MSC_VER) && _MSC_VER > 1200)
409#define odStrICmp Od_stricmpW
413#if defined(ODA_WINDOWS)
414#define odStrICmpA(str, str2) _stricmp(str, str2)
416#define odStrICmpA(str, str2) stricmp(str, str2)
422#include <stringapiset.h>
423inline int Od_stricmpW(
const OdChar* str,
const OdChar* str2,
size_t n){
return CompareStringEx( LOCALE_NAME_INVARIANT, NORM_IGNORECASE, (
const wchar_t*)str, (
int)
odmin(wcslen((
const wchar_t*)str), n), (
const wchar_t*)str2, (
int)
odmin(wcslen((
const wchar_t*)str), n), NULL, NULL, 0) - 2; }
424#elif defined(_WIN32) ||defined(_WIN64) || defined(_WIN32_WCE)
425inline int Od_stricmpW(
const OdChar* str,
const OdChar* str2,
size_t n){
return CompareStringW( LOCALE_NEUTRAL, NORM_IGNORECASE, (
const wchar_t*)str, (
int)
odmin(wcslen((
const wchar_t*)str), n), (
const wchar_t*)str2, (
int)
odmin(wcslen((
const wchar_t*)str2), n))-2;}
426#elif (defined ( __BORLANDC__ ) && (__BORLANDC__) >= 0x530) || (defined(_MSC_VER) && _MSC_VER > 1200)
431#define odStrnICmp Od_stricmpW
435#if defined(ODA_WINDOWS)
436#define odStrnICmpA(str, str2, n) _strnicmp(str, str2, n)
438#define odStrnICmpA(str, str2, n) strnicmp(str, str2, n)
444#if defined(ODA_WINDOWS) && !defined(_WINRT)
451#define odStrUpr(str) Od_struprW(str)
455#if defined(ODA_WINDOWS)
456#define odStrUprA(str) _strupr(str)
458#define odStrUprA(str) strupr(str)
463#if defined(ODA_WINDOWS) && !defined(_WINRT) && !defined(_WIN32_WCE)
465#elif defined (_WINRT) || defined(_WIN32_WCE)
470#define odStrLwr(str) Od_strlwrW(str)
474#if defined(ODA_WINDOWS)
475#define odStrLwrA(str) _strlwr(str)
477#define odStrLwrA(str) strlwr(str)
482#if defined(ODA_WINDOWS)
487#define odStrRev(str) Od_strrevW(str)
491#if defined(ODA_WINDOWS)
492#define odStrRevA(str) _strrev(str)
494#define odStrRevA(str) strrev(str)
500#define odStrToInt(str) Od_strtoint(str)
505#define odStrToUInt(str) Od_strtouint(str)
509#define Od_isspace(ch) isspace(ch)
513#if defined(_MSC_VER) && (_MSC_VER <= 1310)
514 #define Od_iswspace(ch) iswctype(ch,_SPACE)
516 #define Od_iswspace(ch) iswspace(ch)
521#define Od_isdigit(ch) isdigit(ch)
525#if defined(_MSC_VER) && (_MSC_VER <= 1310)
526 #define Od_iswdigit(ch) iswctype(ch,_DIGIT)
528 #define Od_iswdigit(ch) iswdigit(ch)
533#if (defined(sgi) || defined(_AIX) || defined(sparc)) && !defined(__GNUC__)
540#if defined(TD_NEED_SWFNS) || defined(__APPLE__) || defined(ANDROID)
542#define TD_NEED_SWFNS_SCANF
548#if defined(TD_NEED_SWFNS) || defined(__APPLE__) || defined(__hpux) || (defined(ANDROID)) || defined(ODA_WINDOWS_GCC)
550#define TD_NEED_SWFNS_PRINTF
554 #if defined(TD_NEED_SWFNS_SCANF)
556 #include "../../ThirdParty/wchar/wchar_.h"
564 inline int ddswscanf(
const wchar_t*
buffer,
const wchar_t*
format, ...)
567 va_start(argList,
format);
572 #define odSScanf ddswscanf
575 #define odSScanf swscanf_s
577 #define odSScanf swscanf
583 #if defined(ODA_WINDOWS)
584 #define odSprintf _snwprintf
585 #elif defined(TD_NEED_SWFNS_PRINTF)
589 FIRSTDLL_EXPORT extern std::wstring Od_vswprintfV(
const wchar_t* lpszFormat, va_list argList);
593 va_start(argList,
format);
594 std::wstring ws = Od_vswprintfV(
format, argList);
596 int toCopy = ws.length() <
count - 1 ? ws.length() :
count - 1;
601 #define odSprintf ddswprintf
603 #define odSprintf swprintf
608 #if defined(ODA_WINDOWS)
609 #define odSprintfA _snprintf
611 #define odSprintfA snprintf
616#if defined (ODA_WINDOWS) && !defined(_WIN32_WCE)
617#define odStrToF _wtof
623 return wcstod(str, &endptr);
625#define odStrToF Od_wtof
643#define OD_BSEARCH ::bsearch
647#define TD_USING(a) using a
650#ifndef OD_LINKEDARRAY_SCOPE
651#define OD_LINKEDARRAY_SCOPE
655 #ifdef TD_NEED_WCSSTR
657 extern wchar_t *wcsstr(
const wchar_t* wcs1,
const wchar_t* wcs2);
659 #define odStrStr ::wcsstr
663#define OD_MAKEWORD(a, b) ((OdUInt16)(((OdUInt8)(a)) | ((OdUInt16)((OdUInt8)(b))) << 8))
664#define OD_MAKELONG(a, b) ((OdInt32)(((OdUInt16)(a)) | ((OdUInt32)((OdUInt16)(b))) << 16))
665#define OD_LOWORD(l) ((OdUInt16)(l))
666#define OD_HIWORD(l) ((OdUInt16)(((OdUInt32)(l) >> 16) & 0xFFFF))
667#define OD_LOBYTE(w) ((OdUInt8)(w))
668#define OD_HIBYTE(w) ((OdUInt8)(((OdUInt16)(w) >> 8) & 0xFF))
698 tmp = p[0]; p[0] = p[3]; p[3] = tmp;
699 tmp = p[1]; p[1] = p[2]; p[2] = tmp;
702#if OD_SIZEOF_LONG == 4
725#define odSwapInt64(n)
729#define odSwap2BytesNumber(n)
730#define odSwap4BytesNumber(n)
731#define odSwap8Bytes(bytes)
732#define odSwap4Bytes(bytes)
751 int nExponent = (buf[0] & 0x7F) << 4 | (buf[1] & 0xF0) >> 4;
753 int nExponent = (buf[7] & 0x7F) << 4 | (buf[6] & 0xF0) >> 4;
771 ::memset((
void*)pD, 0,
sizeof(
double));
776#define OD_INT8_FROM_BUFFPTR(pBuffPtr) *(pBuffPtr++)
781 low |= ((
OdUInt32)*pBuffPtr++) << 8;
782 low |= ((
OdUInt32)*pBuffPtr++) << 16;
783 low |= ((
OdUInt32)*pBuffPtr++) << 24;
786 high |= ((
OdUInt32)*pBuffPtr++) << 8;
787 high |= ((
OdUInt32)*pBuffPtr++) << 16;
788 high |= ((
OdUInt32)*pBuffPtr++) << 24;
796#define OD_BYTES_FROM_BUFFPTR(pBuffPtr, ResBuff, nCount) (pBuffPtr+=nCount, ::memcpy(ResBuff, pBuffPtr-nCount, nCount))
798#define OD_INT8_TO_BUFFPTR(pBuffPtr, val) (++pBuffPtr, pBuffPtr[-1] = OdUInt8(val))
799#define OD_BYTES_TO_BUFFPTR(pBuffPtr, FromBuff, nCount) (pBuffPtr+=nCount, ::memcpy(pBuffPtr-nCount, FromBuff, nCount))
805#ifdef TD_STRICT_ALIGNMENT
807#if defined(_WIN32_WCE) || defined FX_TOUCH_VERSION
808#define VISIBILITY_ATTR FIRSTDLL_EXPORT
809FIRSTDLL_EXPORT void *bsearch(
const void *key,
const void *base,
size_t numeles,
size_t widthele,
int(__cdecl *cfunc)(
const void *elem1,
const void *elem2));
811#define VISIBILITY_ATTR extern
814VISIBILITY_ATTR
double getStrictDouble(
OdUInt8** ppBuff);
815VISIBILITY_ATTR
void setStrictDouble(
OdUInt8** ppBuff,
double d);
816VISIBILITY_ATTR
void setStrictInt16(
OdUInt8** ppBuff,
OdInt16 val);
817VISIBILITY_ATTR
void setStrictInt32(
OdUInt8** ppBuff,
OdInt32 val);
818VISIBILITY_ATTR
void setStrictInt64(
OdUInt8** ppBuff,
OdInt64 val);
820#define OD_INT16_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 2, (OdInt16)( *(pBuffPtr - 2) \
821 | (*(pBuffPtr - 1) << 8)))
822#define OD_INT32_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 4, (OdInt32)( *(pBuffPtr - 4) \
823 | (*(pBuffPtr - 3) << 8) \
824 | (*(pBuffPtr - 2) << 16) \
825 | (*(pBuffPtr - 1) << 24)))
827#define OD_INT64_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 8, (OdInt64)( *(pBuffPtr - 8) \
828 | (OdInt64(*(pBuffPtr - 7)) << 8) \
829 | (OdInt64(*(pBuffPtr - 6)) << 16) \
830 | (OdInt64(*(pBuffPtr - 5)) << 24) \
831 | (OdInt64(*(pBuffPtr - 4)) << 32) \
832 | (OdInt64(*(pBuffPtr - 3)) << 40) \
833 | (OdInt64(*(pBuffPtr - 2)) << 48) \
834 | (OdInt64(*(pBuffPtr - 1)) << 56)))
836#define OD_DOUBLE_FROM_BUFFPTR(pBuffPtr) getStrictDouble(&pBuffPtr)
838#define OD_INT16_TO_BUFFPTR(pBuffPtr, val) setStrictInt16(&pBuffPtr, val)
839#define OD_INT32_TO_BUFFPTR(pBuffPtr, val) setStrictInt32(&pBuffPtr, val)
840#define OD_INT64_TO_BUFFPTR(pBuffPtr, val) setStrictInt64(&pBuffPtr, val)
842#define OD_DOUBLE_TO_BUFFPTR(pBuffPtr, val) setStrictDouble(&pBuffPtr, val)
854#define OD_INT16_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 2, *((OdInt16*)(pBuffPtr - 2)))
855#define OD_INT32_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 4, *((OdInt32*)(pBuffPtr - 4)))
856#define OD_INT64_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 8, *((OdInt64*)(pBuffPtr - 8)))
858#define OD_DOUBLE_FROM_BUFFPTR(pBuffPtr) getValidDouble(&pBuffPtr)
861#define OD_INT16_TO_BUFFPTR(pBuffPtr, val) (pBuffPtr+=2, *((OdInt16*)(pBuffPtr-2)) = OdInt16(val))
862#define OD_INT32_TO_BUFFPTR(pBuffPtr, val) (pBuffPtr+=4, *((OdInt32*)(pBuffPtr-4)) = OdInt32(val))
863#define OD_INT64_TO_BUFFPTR(pBuffPtr, val) (pBuffPtr+=8, *((OdInt64*)(pBuffPtr-8)) = OdInt64(val))
865#define OD_DOUBLE_TO_BUFFPTR(pBuffPtr, val) (pBuffPtr+=8, *((double*)(pBuffPtr-8)) = double(val))
874extern double getBeDouble(
OdUInt8** ppBuff);
879extern void setBeDouble(
OdUInt8** ppBuff,
double d);
887#define OD_INT16_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 2, (OdInt16)( *(pBuffPtr - 2) \
888 | (*(pBuffPtr - 1) << 8)))
889#define OD_INT32_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 4, (OdInt32)( *(pBuffPtr - 4) \
890 | (*(pBuffPtr - 3) << 8) \
891 | (*(pBuffPtr - 2) << 16) \
892 | (*(pBuffPtr - 1) << 24)))
893#define OD_INT64_FROM_BUFFPTR(pBuffPtr) (pBuffPtr += 8, (OdInt64)( *(pBuffPtr - 8) \
894 | (((OdInt64)(*(pBuffPtr - 7))) << 8) \
895 | (((OdInt64)(*(pBuffPtr - 6))) << 16) \
896 | (((OdInt64)(*(pBuffPtr - 5))) << 24) \
897 | (((OdInt64)(*(pBuffPtr - 4))) << 32) \
898 | (((OdInt64)(*(pBuffPtr - 3))) << 40) \
899 | (((OdInt64)(*(pBuffPtr - 2))) << 48) \
900 | (((OdInt64)(*(pBuffPtr - 1))) << 56)))
902#define OD_DOUBLE_FROM_BUFFPTR(pBuffPtr) getBeDouble(&pBuffPtr)
905#define OD_INT16_TO_BUFFPTR(pBuffPtr, val) setStrictInt16(&pBuffPtr, val)
906#define OD_INT32_TO_BUFFPTR(pBuffPtr, val) setStrictInt32(&pBuffPtr, val)
907#define OD_INT64_TO_BUFFPTR(pBuffPtr, val) setStrictInt64(&pBuffPtr, val)
909#define OD_DOUBLE_TO_BUFFPTR(pBuffPtr, val) setBeDouble(&pBuffPtr, val)
915#if defined(ODA_WINDOWS)
920#if defined(_WIN32) && !defined(WIN64) && !defined(_WINRT)
922#define ODCOLORREF COLORREF
923#define ODRGB(r,g,b) RGB(r,g,b)
924#define ODRGBA(r,g,b,a) (((ODCOLORREF)ODRGB(r,g,b))|(((DWORD)(BYTE)(a))<<24))
925#define ODGETRED(rgb) GetRValue(rgb)
926#define ODGETGREEN(rgb) GetGValue(rgb)
927#define ODGETBLUE(rgb) GetBValue(rgb)
928#define ODGETALPHA(rgba) ((BYTE)((rgba)>>24))
933#define ODCOLORREF OdUInt32
934#define ODRGB(r,g,b) ((ODCOLORREF)(((OdUInt8)(r)|((OdUInt16)((OdUInt8)(g))<<8))|(((OdUInt32)(OdUInt8)(b))<<16)))
935#define ODRGBA(r,g,b,a) (((ODCOLORREF)ODRGB(r,g,b))|(((OdUInt32)(OdUInt8)(a))<<24))
937#define ODGETRED(rgb) ((OdUInt8)(rgb))
938#define ODGETGREEN(rgb) ((OdUInt8)(((OdUInt16)(rgb)) >> 8))
939#define ODGETBLUE(rgb) ((OdUInt8)((rgb)>>16))
940#define ODGETALPHA(rgba) ((OdUInt8)((rgba)>>24))
949#if (!defined(WIN64) && !defined(ODA_WINDOWS_GCC)) || defined(_WINRT)
952#ifndef RGBQUAD_DEFINED
953#define RGBQUAD_DEFINED
976#ifndef BITMAPINFOHEADER_DEFINED
977#define BITMAPINFOHEADER_DEFINED
1050#ifndef BITMAPINFO_DEFINED
1051#define BITMAPINFO_DEFINED
1060#ifndef BITMAPFILEHEADER_DEFINED
1061#define BITMAPFILEHEADER_DEFINED
1094#define ODTOCMCOLOR(colorref) OdCmEntityColor( ODGETRED(colorref), ODGETGREEN(colorref), ODGETBLUE(colorref) )
1095#define ODTOCOLORREF(cmColor) ODRGB( cmColor.red(), cmColor.green(), cmColor.blue() )
1102#if defined(_TOOLKIT_IN_DLL_) && defined(__GNUC__) && defined(__APPLE__)
1104#include <mach-o/dyld.h>
1107# define RTLD_LAZY 0x1
1110# define RTLD_NOW 0x2
1113# define RTLD_LOCAL 0x4
1116# define RTLD_GLOBAL 0x8
1119# define RTLD_NOLOAD 0x10
1121# ifndef RTLD_NODELETE
1122# define RTLD_NODELETE 0x80
1126void* LoadSharedLibrary(
const OdString& path,
int mode = 2);
1127void *GetFunction(
void *handle,
char *symbol);
1128bool FreeSharedLibrary(
void *handle);
1132#if defined(_TOOLKIT_IN_DLL_) && defined(__GNUC__) && !defined(__APPLE__)
GLint GLint GLint GLsizei GLsizei GLenum format
BITMAPINFOHEADER bmiHeader
OdUInt32 bV4V4Compression
CIEXYZTRIPLE bV4Endpoints