29#ifndef PGF_PGFPLATFORM_H
30#define PGF_PGFPLATFORM_H
40#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
41#define PGF_USE_BIG_ENDIAN 1
44#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(__sparc) || defined(__sparc__)
45#define PGF_USE_BIG_ENDIAN 1
48#if defined(__ppc__) || defined(__s390__) || defined(__s390x__)
49#define PGF_USE_BIG_ENDIAN 1
53#define PGF_USE_BIG_ENDIAN 1
60#define __PGFROISUPPORT__
67#define __PGF32SUPPORT__
75#define WordMask 0xFFFFFFE0
77#define WordBytesMask 0xFFFFFFFC
83#define DWWIDTHBITS(bits) (((bits) + WordWidth - 1) & WordMask)
84#define DWWIDTH(bytes) (((bytes) + WordBytes - 1) & WordBytesMask)
85#define DWWIDTHREST(bytes) ((WordBytes - (bytes)%WordBytes)%WordBytes)
91 #define __min(x, y) ((x) <= (y) ? (x) : (y))
92 #define __max(x, y) ((x) >= (y) ? (x) : (y))
98#define ImageModeBitmap 0
99#define ImageModeGrayScale 1
100#define ImageModeIndexedColor 2
101#define ImageModeRGBColor 3
102#define ImageModeCMYKColor 4
103#define ImageModeHSLColor 5
104#define ImageModeHSBColor 6
105#define ImageModeMultichannel 7
106#define ImageModeDuotone 8
107#define ImageModeLabColor 9
108#define ImageModeGray16 10
109#define ImageModeRGB48 11
110#define ImageModeLab48 12
111#define ImageModeCMYK64 13
112#define ImageModeDeepMultichannel 14
113#define ImageModeDuotone16 15
115#define ImageModeRGBA 17
116#define ImageModeGray32 18
117#define ImageModeRGB12 19
118#define ImageModeRGB16 20
119#define ImageModeUnknown 255
125#if defined(WIN32) || defined(WINCE) || defined(WIN64)
133#define _WIN32_WINNT 0x0600
139#ifndef _AFX_NO_AFXCMN_SUPPORT
151#define DllExport __declspec( dllexport )
156typedef unsigned char UINT8;
157typedef unsigned char BYTE;
158typedef unsigned short UINT16;
159typedef unsigned short WORD;
160typedef unsigned int UINT32;
161typedef unsigned long DWORD;
162typedef unsigned long ULONG;
163typedef unsigned __int64 UINT64;
164typedef unsigned __int64 ULONGLONG;
169typedef signed char INT8;
170typedef signed short INT16;
171typedef signed int INT32;
172typedef signed int BOOL;
173typedef signed long LONG;
174typedef signed __int64 INT64;
175typedef signed __int64 LONGLONG;
181typedef bool (__cdecl *CallbackPtr)(
double percent,
bool escapeAllowed,
void *data);
192 #define ASSERT(x) assert(x)
194 #if defined(__GNUC__)
195 #define ASSERT(ignore)((void) 0)
196 #elif _MSC_VER >= 1300
197 #define ASSERT __noop
199 #define ASSERT ((void)0)
208 extern OSError _PGF_Error_;
209 extern OSError GetLastPGFError();
211 #define ReturnWithError(err) { _PGF_Error_ = err; return; }
212 #define ReturnWithError2(err, ret) { _PGF_Error_ = err; return ret; }
214 #define ReturnWithError(err) throw IOException(err)
215 #define ReturnWithError2(err, ret) throw IOException(err)
221#define FSFromStart FILE_BEGIN
222#define FSFromCurrent FILE_CURRENT
223#define FSFromEnd FILE_END
225#define INVALID_SET_FILE_POINTER ((DWORD)-1)
230#define NoError ERROR_SUCCESS
231#define AppError 0x20000000
232#define InsufficientMemory 0x20000001
233#define InvalidStreamPos 0x20000002
234#define EscapePressed 0x20000003
235#define WrongVersion 0x20000004
236#define FormatCannotRead 0x20000005
237#define ImageTooSmall 0x20000006
238#define ZlibError 0x20000007
239#define ColorTableError 0x20000008
240#define PNGError 0x20000009
241#define MissingData 0x2000000A
246inline OSError FileRead(HANDLE hFile,
int *count,
void *buffPtr) {
247 if (ReadFile(hFile, buffPtr, *count, (ULONG *)count,
nullptr)) {
250 return GetLastError();
254inline OSError FileWrite(HANDLE hFile,
int *count,
void *buffPtr) {
255 if (WriteFile(hFile, buffPtr, *count, (ULONG *)count,
nullptr)) {
258 return GetLastError();
262inline OSError GetFPos(HANDLE hFile, UINT64 *pos) {
267 li.LowPart = SetFilePointer (hFile, li.LowPart, &li.HighPart, FILE_CURRENT);
268 if (li.LowPart == INVALID_SET_FILE_POINTER) {
269 OSError err = GetLastError();
270 if (err != NoError) {
279 if (SetFilePointerEx(hFile, li, (PLARGE_INTEGER)pos, FILE_CURRENT)) {
282 return GetLastError();
287inline OSError SetFPos(HANDLE hFile,
int posMode, INT64 posOff) {
290 li.QuadPart = posOff;
292 if (SetFilePointer (hFile, li.LowPart, &li.HighPart, posMode) == INVALID_SET_FILE_POINTER) {
293 OSError err = GetLastError();
294 if (err != NoError) {
301 li.QuadPart = posOff;
302 if (SetFilePointerEx(hFile, li,
nullptr, posMode)) {
305 return GetLastError();
323#if defined(__linux__) || defined(__GLIBC__)
339#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
371typedef unsigned char UINT8;
372typedef unsigned char BYTE;
373typedef unsigned short UINT16;
374typedef unsigned short WORD;
375typedef unsigned int UINT32;
376typedef unsigned int DWORD;
377typedef unsigned long ULONG;
378typedef unsigned long long __Uint64;
379typedef __Uint64 UINT64;
380typedef __Uint64 ULONGLONG;
385typedef signed char INT8;
386typedef signed short INT16;
387typedef signed int INT32;
388typedef signed int BOOL;
389typedef signed long LONG;
390typedef int64_t INT64;
391typedef int64_t LONGLONG;
398typedef unsigned long ULONG_PTR;
401typedef bool (*CallbackPtr)(
double percent,
bool escapeAllowed,
void *data);
406typedef struct tagRGBTRIPLE {
412typedef struct tagRGBQUAD {
419typedef union _LARGE_INTEGER {
425} LARGE_INTEGER, *PLARGE_INTEGER;
429#if defined(__POSIX__) || defined(WINCE)
431#define GetKValue(cmyk) ((BYTE)(cmyk))
432#define GetYValue(cmyk) ((BYTE)((cmyk)>> 8))
433#define GetMValue(cmyk) ((BYTE)((cmyk)>>16))
434#define GetCValue(cmyk) ((BYTE)((cmyk)>>24))
435#define CMYK(c,m,y,k) ((COLORREF)((((BYTE)(k)|((WORD)((BYTE)(y))<<8))|(((DWORD)(BYTE)(m))<<16))|(((DWORD)(BYTE)(c))<<24)))
445__inline
int MulDiv(
int nNumber,
int nNumerator,
int nDenominator) {
446 INT64 multRes = nNumber*nNumerator;
447 INT32 divRes = INT32(multRes/nDenominator);
459 #define ASSERT(x) assert(x)
469 extern OSError _PGF_Error_;
470 extern OSError GetLastPGFError();
472 #define ReturnWithError(err) { _PGF_Error_ = err; return; }
473 #define ReturnWithError2(err, ret) { _PGF_Error_ = err; return ret; }
475 #define ReturnWithError(err) throw IOException(err)
476 #define ReturnWithError2(err, ret) throw IOException(err)
479#define THROW_ throw(IOException)
485#define FSFromStart SEEK_SET
486#define FSFromCurrent SEEK_CUR
487#define FSFromEnd SEEK_END
488#if defined(__cplusplus) && __cplusplus < 201103L
495#define NoError 0x0000
496#define AppError 0x2000
497#define InsufficientMemory 0x2001
498#define InvalidStreamPos 0x2002
499#define EscapePressed 0x2003
500#define WrongVersion 0x2004
501#define FormatCannotRead 0x2005
502#define ImageTooSmall 0x2006
503#define ZlibError 0x2007
504#define ColorTableError 0x2008
505#define PNGError 0x2009
506#define MissingData 0x200A
511__inline OSError FileRead(HANDLE hFile,
int *count,
void *buffPtr) {
512 *count = (int)read(hFile, buffPtr, *count);
520__inline OSError FileWrite(HANDLE hFile,
int *count,
void *buffPtr) {
521 *count = (int)write(hFile, buffPtr, (
size_t)*count);
529__inline OSError GetFPos(HANDLE hFile, UINT64 *pos) {
532 if ((ret = lseek(hFile, 0, SEEK_CUR)) == -1) {
540 if ((ret = lseek64(hFile, 0, SEEK_CUR)) == -1) {
549__inline OSError SetFPos(HANDLE hFile,
int posMode, INT64 posOff) {
551 if ((lseek(hFile, (off_t)posOff, posMode)) == -1) {
557 if ((lseek64(hFile, (off64_t)posOff, posMode)) == -1) {
572#ifdef PGF_USE_BIG_ENDIAN
575 #define _lrotl(x,n) (((x) << ((UINT32)(n))) | ((x) >> (32 - (UINT32)(n))))
578__inline UINT16 ByteSwap(UINT16 wX) {
579 return ((wX & 0xFF00) >> 8) | ((wX & 0x00FF) << 8);
582__inline UINT32 ByteSwap(UINT32 dwX) {
589 return _lrotl(((dwX & 0xFF00FF00) >> 8) | ((dwX & 0x00FF00FF) << 8), 16);
593#if defined(WIN32) || defined(WIN64)
594__inline UINT64 ByteSwap(UINT64 ui64) {
595 return _byteswap_uint64(ui64);
599#define __VAL(x) ByteSwap(x)
609#ifndef LIBPGF_DISABLE_OPENMP
610# if defined (_OPENMP)
611# if defined (WIN32) || defined(WIN64)
612# if defined (_MSC_VER) && (_MSC_VER >= 1500)
614# define LIBPGF_USE_OPENMP
615# elif defined (__INTEL_COMPILER) && (__INTEL_COMPILER >=910)
617# define LIBPGF_USE_OPENMP
619# undef LIBPGF_USE_OPENMP
622# elif (defined(__APPLE__) || defined(__MACOSX__)) && defined(_REENTRANT)
623# undef LIBPGF_USE_OPENMP
625# define LIBPGF_USE_OPENMP
629#ifdef LIBPGF_USE_OPENMP