X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fcommon.h;h=624eb68dc65bcedae59af15d2c254e0a7703e434;hb=825bf2ca6d1fdd3b866e72eaf7e6db32a4a704c4;hp=1684307de9dd03c7ec09bb43956e70e2f76deeac;hpb=95c6ceadafcdcc4c02dd234712858c3b2973446f;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/common.h b/source/src/common.h index 1684307de..624eb68dc 100644 --- a/source/src/common.h +++ b/source/src/common.h @@ -10,212 +10,143 @@ #ifndef _COMMON_H_ #define _COMMON_H_ -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -#define SUPPORT_TCHAR_TYPE -#endif -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#define SUPPORT_SECURE_FUNCTIONS -#endif -#ifdef SUPPORT_TCHAR_TYPE - #include -#endif -#include - - - -#if defined(_USE_AGAR) || defined(_USE_SDL) -#include -#include -#include -#elif defined(_USE_QT) -#include -#include -#include -#include -#endif - -#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT) - -#ifndef uint8 - typedef uint8_t uint8; -# endif -# ifndef int8 - typedef int8_t int8; -# endif -# ifndef uint16 - typedef uint16_t uint16; -# endif -# ifndef int16 - typedef int16_t int16; -# endif -# ifndef uint32 - typedef uint32_t uint32; -# endif -# ifndef int32 - typedef int32_t int32; -# endif -# ifndef uint64 - typedef uint64_t uint64; -# endif -# ifndef int64 - typedef int64_t int64; -# endif -# ifndef BOOL - typedef int BOOL; -# endif -# ifndef BYTE - typedef uint8_t BYTE; -# endif -# ifndef WORD - typedef uint16_t WORD; -# endif -# ifndef DWORD - typedef uint32_t DWORD; -# endif -# ifndef QWORD - typedef uint64_t QWORD; -# endif - -# ifndef UINT8 - typedef uint8_t UINT8; -# endif -# ifndef UINT16 - typedef uint16_t UINT16; -# endif -# ifndef UINT32 - typedef uint32_t UINT32; -# endif -# ifndef UINT64 - typedef uint64_t UINT64; -# endif - -# ifndef INT8 - typedef int8_t INT8; -# endif -# ifndef INT16 - typedef int16_t INT16; -# endif -# ifndef INT32 - typedef int32_t INT32; -# endif -# ifndef INT64 - typedef int64_t INT64; -# endif - -static inline void _stprintf(char *s, const char *fmt, ...) { - va_list args; - - va_start(args, fmt); - sprintf(s, fmt, args); - va_end(args); -} -#define stricmp(a,b) strcmp(a,b) -#define strnicmp(a,b,n) strncmp(a,b,n) - - -// tchar.h -//# ifdef _UNICODE -//# define __T(x) L ## x -//# else -# define __T(x) x -//# endif - -# define _T(x) __T(x) -# define _TEXT(x) __T(x) - -//# ifdef _UNICODE -// typedef wchar_t _TCHAR; -//# else - typedef char _TCHAR; -//# endif - -# ifndef LPCTSTR - typedef _TCHAR* LPCTSTR; -# endif - - -static inline char *_tcsncpy(_TCHAR *d, _TCHAR *s, int n) { - return strncpy((char *)d, (char *)s, n); -} - -static inline char *_tcsncat(_TCHAR *d, _TCHAR *s, int n) { - return strncat((char *)d, (char *)s, n); -} - +// move shared codes to DLL??? +//#ifdef _USE_QT +// #define USE_SHARED_DLL +//#endif -static inline int DeleteFile(_TCHAR *path) -{ #ifdef _USE_QT - QString fpath = (char *)path; - QFile tfp(fpath); - if(tfp.remove(fpath)) return (int)true; - return 0; -#else - return AG_FileDelete((const char *)path); +#include #endif -} -#include - -# ifdef USE_GETTEXT -# include -# define _N(x) gettext(x) -# else -# define _N(x) _T(x) -# endif - -#if (SDL_BYTEORDER == SDL_LIL_ENDIAN) -static inline DWORD EndianToLittle_DWORD(DWORD x) -{ - return x; -} -static inline WORD EndianToLittle_WORD(WORD x) -{ - return x; -} -#else // BIG_ENDIAN -static inline DWORD EndianToLittle_DWORD(DWORD x) -{ - DWORD y; - y = ((x & 0x000000ff) << 24) | ((x & 0x0000ff00) << 8) | - ((x & 0x00ff0000) >> 8) | ((x & 0xff000000) >> 24); - return y; -} - -static inline WORD EndianToLittle_WORD(WORD x) -{ - WORD y; - y = ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8); - return y; -} +// use zlib to decompress gzip file??? +#ifdef _WIN32 + #if defined(_MSC_VER) && (_MSC_VER >= 1500) + #ifndef _ANY2D88 + #define USE_ZLIB + #endif + #endif +#endif +// check environemnt/language +#ifdef _WIN32 + #ifdef _MSC_VER + // Microsoft Visual C++ + #if _MSC_VER == 1200 + // variable scope of 'for' loop for Microsoft Visual C++ 6.0 + #define for if(0);else for + #endif + #if _MSC_VER >= 1200 + // Microsoft Visual C++ 6.0 or later + #define SUPPORT_TCHAR_TYPE + #endif + #if _MSC_VER >= 1400 + // Microsoft Visual C++ 8.0 (2005) or later + #define SUPPORT_SECURE_FUNCTIONS + #pragma warning( disable : 4819 ) + //#pragma warning( disable : 4995 ) + #pragma warning( disable : 4996 ) + #endif + #if _MSC_VER >= 1800 + // Microsoft Visual C++ 12.0 (2013) or later + #define SUPPORT_CPLUSPLUS_11 + #endif + #define CSP_OS_WINDOWS + #else + // Win32, but not Microsoft Visual C++ + #define SUPPORT_TCHAR_TYPE +// #define SUPPORT_SECURE_FUNCTIONS + #endif +#endif +#ifdef __GNUC__ + #if defined(Q_OS_CYGWIN) + #define CSP_OS_GCC_CYGWIN + #define CSP_OS_WINDOWS + #elif defined(Q_OS_WIN) || defined(__WIN32) || defined(__WIN64) + #define CSP_OS_GCC_WINDOWS + #define CSP_OS_WINDOWS + #ifdef USE_SHARED_DLL + #define DLL_PREFIX __declspec(dllexport) + #define DLL_PREFIX_I __declspec(dllimport) + #endif + #else + #define CSP_OS_GCC_GENERIC + #define CSP_OS_GENERIC + #define DLL_PREFIX + #define DLL_PREFIX_I + #endif + #if defined(__clang__) + #define __CSP_COMPILER_CLANG + #else + #define __CSP_COMPILER_GCC + #endif + #define SUPPORT_CPLUSPLUS_11 +#else + #define DLL_PREFIX + #define DLL_PREFIX_I #endif -#define ZeroMemory(p,s) memset(p,0x00,s) -#define CopyMemory(t,f,s) memcpy(t,f,s) -#ifdef __cplusplus -extern "C" -{ +#ifndef SUPPORT_CPLUSPLUS_11 + #if defined(__cplusplus) && (__cplusplus > 199711L) + #define SUPPORT_CPLUSPLUS_11 + #endif #endif -//extern void Sleep(uint32_t tick); -//extern uint32_t timeGetTime(void); -#ifdef __cplusplus -} +#ifndef SUPPORT_TCHAR_TYPE + // secure functions need tchar type + #undef SUPPORT_SECURE_FUNCTIONS +#endif +#ifndef DLL_PREFIX + #define DLL_PREFIX +#endif +#ifndef DLL_PREFIX_I + #define DLL_PREFIX_I #endif +// include common header files +#ifdef SUPPORT_TCHAR_TYPE + #include +#endif +#ifdef SUPPORT_CPLUSPLUS_11 + #include +#endif +#include +#include +#include +#ifdef _MSC_VER +#include #else -#include - -// variable scope of 'for' loop for Microsoft Visual C++ 6.0 - -#if defined(_MSC_VER) && (_MSC_VER == 1200) -#define for if(0);else for +#include #endif +#include +#include -// disable warnings for microsoft visual c++ 2005 or later -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#pragma warning( disable : 4819 ) -//#pragma warning( disable : 4995 ) -#pragma warning( disable : 4996 ) +// include environment/language dependent header files +#ifdef _WIN32 + #include + #include + #include + #include + #include +#endif +#ifdef __GNUC__ + #include +#endif +#ifdef _USE_QT + #ifdef _USE_QT5 + #include + #include + #include + #if defined(__MINGW32__) || (__MINGW64__) + #include + #include + #endif + #else + #include + #include + #endif + #include +#endif +#ifndef _MAX_PATH + #define _MAX_PATH 2048 #endif // endian @@ -226,6 +157,12 @@ extern "C" #elif __BYTE_ORDER == __BIG_ENDIAN #define __BIG_ENDIAN__ #endif + #elif defined(SDL_BYTEORDER) && (defined(SDL_LIL_ENDIAN) || defined(SDL_BIG_ENDIAN)) + #if SDL_BYTEORDER == SDL_LIL_ENDIAN + #define __LITTLE_ENDIAN__ + #elif SDL_BYTEORDER == SDL_BIG_ENDIAN + #define __BIG_ENDIAN__ + #endif #elif defined(WORDS_LITTLEENDIAN) #define __LITTLE_ENDIAN__ #elif defined(WORDS_BIGENDIAN) @@ -233,237 +170,1188 @@ extern "C" #endif #endif #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) - // Microsoft Visual C++ + // may be Microsoft Visual C++ #define __LITTLE_ENDIAN__ - #endif - +#endif // type definition -#ifndef uint8 -typedef unsigned char uint8; +#ifndef SUPPORT_TCHAR_TYPE + #ifndef _TCHAR + typedef char _TCHAR; + #endif #endif -#ifndef uint16 -typedef unsigned short uint16; + +#ifndef SUPPORT_CPLUSPLUS_11 + #ifndef int8_t + typedef signed char int8_t; + #endif + #ifndef int16_t + typedef signed short int16_t; + #endif + #ifndef int32_t + typedef signed int int32_t; + #endif + #ifndef int64_t + typedef signed long long int64_t; + #endif + #ifndef uint8_t + typedef unsigned char uint8_t; + #endif + #ifndef uint16_t + typedef unsigned short uint16_t; + #endif + #ifndef uint32_t + typedef unsigned int uint32_t; + #endif + #ifndef uint64_t + typedef unsigned long long uint64_t; + #endif #endif -#ifndef uint32 -typedef unsigned int uint32; + +#ifndef _WIN32 + #ifndef LPTSTR + typedef _TCHAR* LPTSTR; + #endif + #ifndef LPCTSTR + typedef const _TCHAR* LPCTSTR; + #endif + #ifndef BOOL + typedef int BOOL; + #endif + #ifndef TRUE + #define TRUE 1 + #endif + #ifndef FALSE + #define FALSE 0 + #endif + #ifndef BYTE + typedef uint8_t BYTE; + #endif + #ifndef WORD + typedef uint16_t WORD; + #endif + #ifndef DWORD + typedef uint32_t DWORD; + #endif + #ifndef QWORD + typedef uint64_t QWORD; + #endif + #ifndef INT8 + typedef int8_t INT8; + #endif + #ifndef INT16 + typedef int16_t INT16; + #endif + #ifndef INT32 + typedef int32_t INT32; + #endif + #ifndef INT64 + typedef int64_t INT64; + #endif + #ifndef UINT8 + typedef uint8_t UINT8; + #endif + #ifndef UINT16 + typedef uint16_t UINT16; + #endif + #ifndef UINT32 + typedef uint32_t UINT32; + #endif + #ifndef UINT64 + typedef uint64_t UINT64; + #endif + #ifndef INT + typedef int INT; + #endif + #ifndef UINT + typedef unsigned int UINT; + #endif #endif -#ifndef uint64 -#ifdef _MSC_VER -typedef unsigned __int64 uint64; + +typedef union { + struct { +#ifdef __BIG_ENDIAN__ + uint8_t h, l; #else -typedef unsigned long long uint64; + uint8_t l, h; #endif + } b; + struct { +#ifdef __BIG_ENDIAN__ + int8_t h, l; +#else + int8_t l, h; #endif + } sb; + uint16_t u16; // ToDo: Remove + int16_t s16; // ToDo: Remove + uint16_t w; + int16_t sw; -#ifndef int8 -typedef signed char int8; + inline void read_2bytes_le_from(uint8_t *t) + { + b.l = t[0]; b.h = t[1]; + } + inline void write_2bytes_le_to(uint8_t *t) + { + t[0] = b.l; t[1] = b.h; + } + inline void read_2bytes_be_from(uint8_t *t) + { + b.h = t[0]; b.l = t[1]; + } + inline void write_2bytes_be_to(uint8_t *t) + { + t[0] = b.h; t[1] = b.l; + } + + inline void set_2bytes_be_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.w = n; + b.l = bigv.b.l; b.h = bigv.b.h; + } + inline void set_2bytes_le_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.w = n; + b.l = littlev.b.l; b.h = littlev.b.h; + } + inline uint16_t get_2bytes_be_to() + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; + return bigv.w; + } + inline uint16_t get_2bytes_le_to() + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; + return littlev.w; + } + +} pair16_t; + +typedef union { + struct { +#ifdef __BIG_ENDIAN__ + uint8_t h3, h2, h, l; +#else + uint8_t l, h, h2, h3; #endif -#ifndef int16 -typedef signed short int16; + } b; + struct { +#ifdef __BIG_ENDIAN__ + int8_t h3, h2, h, l; +#else + int8_t l, h, h2, h3; #endif -#ifndef int32 -typedef signed int int32; + } sb; + struct { +#ifdef __BIG_ENDIAN__ + uint16_t h, l; +#else + uint16_t l, h; #endif -#ifndef int64 -#ifdef _MSC_VER -typedef signed __int64 int64; + } w; + struct { +#ifdef __BIG_ENDIAN__ + int16_t h, l; #else -typedef signed long long int64; + int16_t l, h; #endif + } sw; + struct { +#ifdef __BIG_ENDIAN__ + pair16_t h, l; +#else + pair16_t l, h; #endif + } p16; + uint32_t d; + int32_t sd; + float f; // single float + + inline void read_2bytes_le_from(uint8_t *t) + { + b.l = t[0]; b.h = t[1]; b.h2 = b.h3 = 0; + } + inline void write_2bytes_le_to(uint8_t *t) + { + t[0] = b.l; t[1] = b.h; + } + inline void read_2bytes_be_from(uint8_t *t) + { + b.h3 = b.h2 = 0; b.h = t[0]; b.l = t[1]; + } + inline void write_2bytes_be_to(uint8_t *t) + { + t[0] = b.h; t[1] = b.l; + } + inline void read_4bytes_le_from(uint8_t *t) + { + b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3]; + } + inline void write_4bytes_le_to(uint8_t *t) + { + t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3; + } + inline void read_4bytes_be_from(uint8_t *t) + { + b.h3 = t[0]; b.h2 = t[1]; b.h = t[2]; b.l = t[3]; + } + inline void write_4bytes_be_to(uint8_t *t) + { + t[0] = b.h3; t[1] = b.h2; t[2] = b.h; t[3] = b.l; + } -static inline DWORD EndianToLittle_DWORD(DWORD x) -{ - return x; -} - -static inline WORD EndianToLittle_WORD(WORD x) -{ - return x; -} - - -#endif + inline void set_2bytes_be_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.w = n; + b.l = bigv.b.l; b.h = bigv.b.h; + b.h2 = 0; b.h3 = 0; + } + inline void set_2bytes_le_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.w = n; + b.l = littlev.b.l; b.h = littlev.b.h; + b.h2 = 0; b.h3 = 0; + } + inline uint16_t get_2bytes_be_to() + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; + return bigv.w; + } + inline uint16_t get_2bytes_le_to() + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; + return littlev.w; + } + + inline void set_4bytes_be_from(uint32_t n) + { + union { + uint32_t dw; + struct { + uint8_t h3, h2, h, l; + }b; + } bigv; + bigv.dw = n; + b.l = bigv.b.l; b.h = bigv.b.h; b.h2 = bigv.b.h2; b.h3 = bigv.b.h3; + } + inline void set_4bytes_le_from(uint32_t n) + { + union { + uint32_t dw; + struct { + uint8_t l, h, h2, h3; + }b; + } littlev; + littlev.dw = n; + b.l = littlev.b.l; b.h = littlev.b.h; b.h2 = littlev.b.h2; b.h3 = littlev.b.h3; + } + inline uint32_t get_4bytes_be_to() + { + union { + uint32_t dw; + struct { + uint8_t h3, h2, h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; bigv.b.h2 = b.h2; bigv.b.h3 = b.h3; + return bigv.dw; + } + inline uint32_t get_4bytes_le_to() + { + union { + uint32_t dw; + struct { + uint8_t l, h, h2, h3; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; littlev.b.h2 = b.h2; littlev.b.h3 = b.h3; + return littlev.dw; + } +} pair32_t; typedef union { struct { #ifdef __BIG_ENDIAN__ - uint8 h3, h2, h, l; + uint8_t h7, h6, h5, h4, h3, h2, h, l; #else - uint8 l, h, h2, h3; + uint8_t l, h, h2, h3, h4, h5, h6, h7; #endif } b; struct { #ifdef __BIG_ENDIAN__ - int8 h3, h2, h, l; + int8_t h7, h6, h5, h4, h3, h2, h, l; #else - int8 l, h, h2, h3; + int8_t l, h, h2, h3, h4, h5, h6, h7; #endif } sb; struct { #ifdef __BIG_ENDIAN__ - uint16 h, l; + uint16_t h3, h2, h, l; #else - uint16 l, h; + uint16_t l, h, h2, h3; #endif } w; struct { #ifdef __BIG_ENDIAN__ - int16 h, l; + int16_t h3, h2, h, l; #else - int16 l, h; + int16_t l, h, h2, h3; #endif } sw; - uint32 d; - int32 sd; - inline void read_2bytes_le_from(uint8 *t) + struct { +#ifdef __BIG_ENDIAN__ + pair16_t h3, h2, h, l; +#else + pair16_t l, h, h2, h3; +#endif + } p16; + struct { +#ifdef __BIG_ENDIAN__ + uint32_t h, l; +#else + uint32_t l, h; +#endif + } d; + struct { +#ifdef __BIG_ENDIAN__ + int32_t h, l; +#else + int32_t l, h; +#endif + } sd; + struct { +#ifdef __BIG_ENDIAN__ + pair32_t h, l; +#else + pair32_t l, h; +#endif + } p32; + struct { +#ifdef __BIG_ENDIAN__ + float h, l; +#else + float l, h; +#endif + } f32; + uint64_t q; + int64_t sq; + double df; // double float + inline void read_2bytes_le_from(uint8_t *t) { b.l = t[0]; b.h = t[1]; b.h2 = b.h3 = 0; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; } - inline void write_2bytes_le_to(uint8 *t) + inline void write_2bytes_le_to(uint8_t *t) { t[0] = b.l; t[1] = b.h; } - inline void read_2bytes_be_from(uint8 *t) + inline void read_2bytes_be_from(uint8_t *t) { b.h3 = b.h2 = 0; b.h = t[0]; b.l = t[1]; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; } - inline void write_2bytes_be_to(uint8 *t) + inline void write_2bytes_be_to(uint8_t *t) { t[0] = b.h; t[1] = b.l; } - inline void read_4bytes_le_from(uint8 *t) + inline void read_4bytes_le_from(uint8_t *t) { b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3]; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; } - inline void write_4bytes_le_to(uint8 *t) + inline void write_4bytes_le_to(uint8_t *t) { t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3; } - inline void read_4bytes_be_from(uint8 *t) + inline void read_4bytes_be_from(uint8_t *t) { b.h3 = t[0]; b.h2 = t[1]; b.h = t[2]; b.l = t[3]; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; } - inline void write_4bytes_be_to(uint8 *t) + inline void write_4bytes_be_to(uint8_t *t) { t[0] = b.h3; t[1] = b.h2; t[2] = b.h; t[3] = b.l; } + + inline void read_8bytes_le_from(uint8_t *t) + { + b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3]; + b.h4 = t[4]; b.h5 = t[5]; b.h6 = t[6]; b.h7 = t[7]; + } + inline void write_8bytes_le_to(uint8_t *t) + { + t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3; + t[4] = b.h4; t[5] = b.h5; t[6] = b.h6; t[7] = b.h7; + } + inline void read_8bytes_be_from(uint8_t *t) + { + b.h7 = t[0]; b.h6 = t[1]; b.h5 = t[2]; b.h4 = t[3]; + b.h3 = t[4]; b.h2 = t[5]; b.h = t[6]; b.l = t[7]; + } + inline void write_8bytes_be_to(uint8_t *t) + { + t[0] = b.h7; t[1] = b.h6; t[2] = b.h5; t[3] = b.h4; + t[4] = b.h3; t[5] = b.h2; t[6] = b.h; t[7] = b.l; + } -} pair; + inline void set_2bytes_be_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.w = n; + b.l = bigv.b.l; b.h = bigv.b.h; + b.h2 = 0; b.h3 = 0; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; + } + inline void set_2bytes_le_from(uint16_t n) + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.w = n; + b.l = littlev.b.l; b.h = littlev.b.h; + b.h2 = 0; b.h3 = 0; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; + } + inline uint16_t get_2bytes_be_to() + { + union { + uint16_t w; + struct { + uint8_t h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; + return bigv.w; + } + inline uint16_t get_2bytes_le_to() + { + union { + uint16_t w; + struct { + uint8_t l, h; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; + return littlev.w; + } + + inline void set_4bytes_be_from(uint32_t n) + { + union { + uint32_t dw; + struct { + uint8_t h3, h2, h, l; + }b; + } bigv; + bigv.dw = n; + b.l = bigv.b.l; b.h = bigv.b.h; b.h2 = bigv.b.h2; b.h3 = bigv.b.h3; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; + } + inline void set_4bytes_le_from(uint32_t n) + { + union { + uint32_t dw; + struct { + uint8_t l, h, h2, h3; + }b; + } littlev; + littlev.dw = n; + b.l = littlev.b.l; b.h = littlev.b.h; b.h2 = littlev.b.h2; b.h3 = littlev.b.h3; + b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0; + } + inline uint32_t get_4bytes_be_to() + { + union { + uint32_t dw; + struct { + uint8_t h3, h2, h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; bigv.b.h2 = b.h2; bigv.b.h3 = b.h3; + return bigv.dw; + } + inline uint32_t get_4bytes_le_to() + { + union { + uint32_t dw; + struct { + uint8_t l, h, h2, h3; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; littlev.b.h2 = b.h2; littlev.b.h3 = b.h3; + return littlev.dw; + } -// max/min from WinDef.h -//#ifndef max -//#define max(a,b) (((a) > (b)) ? (a) : (b)) -//#endif -//#ifndef min -//#define min(a,b) (((a) < (b)) ? (a) : (b)) -//#endif + inline void set_8bytes_be_from(uint64_t n) + { + union { + uint64_t qw; + struct { + uint8_t h7, h6, h5, h4, h3, h2, h, l; + }b; + } bigv; + bigv.qw = n; + b.l = bigv.b.l; b.h = bigv.b.h; b.h2 = bigv.b.h2; b.h3 = bigv.b.h3; + b.h4 = bigv.b.h4; b.h5 = bigv.b.h5; b.h6 = bigv.b.h6; b.h7 = bigv.b.h7; + } + inline void set_8bytes_le_from(uint64_t n) + { + union { + uint64_t qw; + struct { + uint8_t l, h, h2, h3, h4, h5, h6, h7; + }b; + } littlev; + littlev.qw = n; + b.l = littlev.b.l; b.h = littlev.b.h; b.h2 = littlev.b.h2; b.h3 = littlev.b.h3; + b.h4 = littlev.b.h4; b.h5 = littlev.b.h5; b.h6 = littlev.b.h6; b.h7 = littlev.b.h7; + } + inline uint64_t get_8bytes_be_to() + { + union { + uint64_t qw; + struct { + uint8_t h7, h6, h5, h4, h3, h2, h, l; + }b; + } bigv; + bigv.b.l = b.l; bigv.b.h = b.h; bigv.b.h2 = b.h2; bigv.b.h3 = b.h3; + bigv.b.h4 = b.h4; bigv.b.h5 = b.h5; bigv.b.h6 = b.h6; bigv.b.h7 = b.h7; + return bigv.qw; + } + inline uint64_t get_8bytes_le_to() + { + union { + uint64_t qw; + struct { + uint8_t l, h, h2, h3, h4, h5, h6, h7; + }b; + } littlev; + littlev.b.l = b.l; littlev.b.h = b.h; littlev.b.h2 = b.h2; littlev.b.h3 = b.h3; + littlev.b.h4 = b.h4; littlev.b.h5 = b.h5; littlev.b.h6 = b.h6; littlev.b.h7 = b.h7; + return littlev.qw; + } -// rgb color -//#define _RGB888 -#define _RGBA888 - -#if defined(_USE_AGAR) - -# if AG_BYTEORDER == AG_BIG_ENDIAN -# if defined(_RGB555) -//#define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) << 7) | (uint16)(((uint16)(g) & 0xf8) << 2) | (uint16)(((uint16)(r) & 0xf8) >> 3)) -# define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) >>4) | (uint16)(((uint16)(g) & 0xf8) << 2) | (uint16)(((uint16)(r) & 0xf8) << 8)) -typedef uint16 scrntype; -# elif defined(_RGB565) -//#define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) << 8) | (uint16)(((uint16)(g) & 0xfc) << 3) | (uint16)(((uint16)(r) & 0xf8) >> 3)) -# define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) >>3) | (uint16)(((uint16)(g) & 0xfc) << 2) | (uint16)(((uint16)(r) & 0xf8) << 8)) -typedef uint16 scrntype; -# elif defined(_RGB888) -# define RGB_COLOR(r, g, b) (((uint32)(r) << 24) | ((uint32)(g) << 16) | ((uint32)(b) << 8)) -typedef uint32 scrntype; -# elif defined(_RGBA888) -# define RGB_COLOR(r, g, b) (((uint32)(r) << 24) | ((uint32)(g) << 16) | ((uint32)(b) << 8)) | ((uint32)0xff << 0) -typedef uint32 scrntype; -# endif - -#else // LITTLE ENDIAN - -# if defined(_RGB555) -# define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) << 7) | (uint16)(((uint16)(g) & 0xf8) << 2) | (uint16)(((uint16)(r) & 0xf8) >> 3)) -typedef uint16 scrntype; -# elif defined(_RGB565) -# define RGB_COLOR(r, g, b) ((uint16)(((uint16)(b) & 0xf8) << 8) | (uint16)(((uint16)(g) & 0xfc) << 3) | (uint16)(((uint16)(r) & 0xf8) >> 3)) -typedef uint16 scrntype; -# elif defined(_RGB888) -# define RGB_COLOR(r, g, b) (((uint32)(r) << 0) | ((uint32)(g) << 8) | ((uint32)(b) << 16)) -typedef uint32 scrntype; -# elif defined(_RGBA888) -# define RGB_COLOR(r, g, b) (((uint32)(r) << 0) | ((uint32)(g) << 8) | ((uint32)(b) << 16)) | ((uint32)0xff << 24) -typedef uint32 scrntype; -# endif - -#endif // ENDIAN - -#else // NOT USE AGAR - -# if defined(_RGB555) -#define RGB_COLOR(r, g, b) ((uint16)(((uint16)(r) & 0xf8) << 7) | (uint16)(((uint16)(g) & 0xf8) << 2) | (uint16)(((uint16)(b) & 0xf8) >> 3)) -typedef uint16 scrntype; -#elif defined(_RGB565) -#define RGB_COLOR(r, g, b) ((uint16)(((uint16)(r) & 0xf8) << 8) | (uint16)(((uint16)(g) & 0xfc) << 3) | (uint16)(((uint16)(b) & 0xf8) >> 3)) -typedef uint16 scrntype; -#elif defined(_RGB888) -#define RGB_COLOR(r, g, b) (((uint32)(r) << 16) | ((uint32)(g) << 8) | ((uint32)(b) << 0)) -typedef uint32 scrntype; -#elif defined(_RGBA888) -#define RGB_COLOR(r, g, b) (((uint32)(r) << 16) | ((uint32)(g) << 8) | ((uint32)(b) << 0)) | ((uint32)0xff << 24) -typedef uint32 scrntype; +} pair64_t; + +uint32_t DLL_PREFIX EndianToLittle_DWORD(uint32_t x); +uint16_t DLL_PREFIX EndianToLittle_WORD(uint16_t x); +uint32_t DLL_PREFIX EndianFromLittle_DWORD(uint32_t x); +uint16_t DLL_PREFIX EndianFromLittle_WORD(uint16_t x); + +uint32_t DLL_PREFIX EndianToBig_DWORD(uint32_t x); +uint16_t DLL_PREFIX EndianToBig_WORD(uint16_t x); +uint32_t DLL_PREFIX EndianFromBig_DWORD(uint32_t x); +uint16_t DLL_PREFIX EndianFromBig_WORD(uint16_t x); +// max/min +#ifndef _MSC_VER + #undef max + #undef min + int DLL_PREFIX max(int a, int b); + unsigned int DLL_PREFIX max(int a, unsigned int b); + unsigned int DLL_PREFIX max(unsigned int a, int b); + unsigned int DLL_PREFIX max(unsigned int a, unsigned int b); + int DLL_PREFIX min(int a, int b); + int DLL_PREFIX min(unsigned int a, int b); + int DLL_PREFIX min(int a, unsigned int b); + unsigned int DLL_PREFIX min(unsigned int a, unsigned int b); #endif +// string +#if defined(__GNUC__) || defined(__CYGWIN__) || defined(Q_OS_CYGWIN) + #define stricmp(a,b) strcasecmp(a,b) + #define strnicmp(a,b,n) strncasecmp(a,b,n) #endif -// _TCHAR #ifndef SUPPORT_TCHAR_TYPE -typedef char _TCHAR; -//#define _T(s) (s) -#define _tfopen fopen -#define _tcscmp strcmp -#define _tcscpy strcpy -#define _tcsicmp stricmp -#define _tcslen strlen -#define _tcsncat strncat -#define _tcsncpy strncpy -#define _tcsncicmp strnicmp -#define _tcsstr strstr -#define _tcstok strtok -#define _tcstol strtol -#define _tcstoul strtoul -#define _stprintf sprintf -#define _vstprintf vsprintf -#endif - -#if !defined(_MSC_VER) -#include -typedef int errno_t; + #ifndef _fgetts + #define _fgetts fgets + #endif + #ifndef _ftprintf + #define _ftprintf printf + #endif + #ifndef _tfopen + #define _tfopen fopen + #endif + #ifndef _tcscmp + #define _tcscmp strcmp + #endif + #ifndef _tcscpy + #define _tcscpy strcpy + #endif + #ifndef _tcsicmp + #define _tcsicmp stricmp + #endif + #ifndef _tcslen + #define _tcslen strlen + #endif + #ifndef _tcscat + #define _tcscat strcat + #endif + #ifndef _tcsncat + #define _tcsncat strncat + #endif + #ifndef _tcsncpy + #define _tcsncpy strncpy + #endif + #ifndef _tcsncicmp + #define _tcsncicmp strnicmp + #endif + #ifndef _tcschr + #define _tcschr strchr + #endif + #ifndef _tcsrchr + #define _tcsrchr strrchr + #endif + #ifndef _tcsstr + #define _tcsstr strstr + #endif + #ifndef _tcstok + #define _tcstok strtok + #endif + #ifndef _tstoi + #define _tstoi atoi + #endif + #ifndef _tcstol + #define _tcstol strtol + #endif + #ifndef _tcstoul + #define _tcstoul strtoul + #endif + #ifndef _stprintf + #define _stprintf sprintf + #endif + #ifndef _vstprintf + #define _vstprintf vsprintf + #endif + #ifndef _taccess + #define _taccess access + #endif + #ifndef _tremove + #define _tremove remove + #endif + #ifndef _trename + #define _trename rename + #endif + #define __T(x) x + #define _T(x) __T(x) + #define _TEXT(x) __T(x) #endif -// secture functions + #ifndef SUPPORT_SECURE_FUNCTIONS -#ifndef errno_t -typedef int errno_t; -#endif -//errno_t _tfopen_s(FILE** pFile, const _TCHAR *filename, const _TCHAR *mode); -errno_t _strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource); -errno_t _tcscpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource); -_TCHAR *_tcstok_s(_TCHAR *strToken, const char *strDelimit, _TCHAR **context); -int _stprintf_s(_TCHAR *buffer, size_t sizeOfBuffer, const _TCHAR *format, ...); -int _vstprintf_s(_TCHAR *buffer, size_t numberOfElements, const _TCHAR *format, va_list argptr); + #ifndef errno_t + typedef int errno_t; + #endif +// errno_t DLL_PREFIX my_tfopen_s(FILE** pFile, const _TCHAR *filename, const _TCHAR *mode); + errno_t DLL_PREFIX my_tcscat_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource); + errno_t DLL_PREFIX my_strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource); + errno_t DLL_PREFIX my_tcscpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource); + errno_t DLL_PREFIX my_strncpy_s(char *strDestination, size_t numberOfElements, const char *strSource, size_t count); + errno_t DLL_PREFIX my_tcsncpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource, size_t count); + char * DLL_PREFIX my_strtok_s(char *strToken, const char *strDelimit, char **context); + _TCHAR *DLL_PREFIX my_tcstok_s(_TCHAR *strToken, const char *strDelimit, _TCHAR **context); + #define my_fprintf_s fprintf + #define my_ftprintf_s fprintf + int DLL_PREFIX my_sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ...); + int DLL_PREFIX my_swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, ...); + int DLL_PREFIX my_stprintf_s(_TCHAR *buffer, size_t sizeOfBuffer, const _TCHAR *format, ...); + int DLL_PREFIX my_vsprintf_s(char *buffer, size_t numberOfElements, const char *format, va_list argptr); + int DLL_PREFIX my_vstprintf_s(_TCHAR *buffer, size_t numberOfElements, const _TCHAR *format, va_list argptr); +#else +// #define my_tfopen_s _tfopen_s + #define my_tcscat_s _tcscat_s + #define my_strcpy_s strcpy_s + #define my_tcscpy_s _tcscpy_s + #define my_strncpy_s strncpy_s + #define my_tcsncpy_s _tcsncpy_s + #define my_strtok_s strtok_s + #define my_tcstok_s _tcstok_s + #define my_fprintf_s fprintf_s + #define my_ftprintf_s _ftprintf_s + #define my_sprintf_s sprintf_s + #define my_swprintf_s swprintf_s + #define my_stprintf_s _stprintf_s + #define my_vsprintf_s vsprintf_s + #define my_vstprintf_s _vstprintf_s +#endif + +// memory +#ifndef _MSC_VER + void *DLL_PREFIX my_memcpy(void *dst, void *src, size_t len); +#else + #define my_memcpy memcpy +#endif + +// hint for SIMD +#if defined(__clang__) + #define __DECL_VECTORIZED_LOOP _Pragma("clang loop vectorize(enable) distribute(enable)") +#elif defined(__GNUC__) + #define __DECL_VECTORIZED_LOOP _Pragma("GCC ivdep") +#else + #define __DECL_VECTORIZED_LOOP +#endif + +// C99 math functions +#ifdef _MSC_VER + #define my_isfinite _finite + #define my_log2(v) (log((double)(v)) / log(2.0)) +#else + #include + #define my_isfinite std::isfinite + #define my_log2 log2 +#endif + +// win32 api +#ifndef _WIN32 + BOOL MyWritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName); + DWORD MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName); + UINT MyGetPrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName); + // used only in winmain and win32 osd class +// #define ZeroMemory(p,s) memset(p,0x00,s) +// #define CopyMemory(t,f,s) memcpy(t,f,s) +#else + #define MyWritePrivateProfileString WritePrivateProfileString + #define MyGetPrivateProfileString GetPrivateProfileString + #define MyGetPrivateProfileInt GetPrivateProfileInt +#endif + +// rgb color +#if !defined(_RGB555) && !defined(_RGB565) && !defined(_RGB888) + #define _RGB888 +#endif + +#if defined(_RGB555) || defined(_RGB565) + typedef uint16_t scrntype_t; + scrntype_t DLL_PREFIX RGB_COLOR(uint32_t r, uint32_t g, uint32_t b); + scrntype_t DLL_PREFIX RGBA_COLOR(uint32_t r, uint32_t g, uint32_t b, uint32_t a); + uint8_t DLL_PREFIX R_OF_COLOR(scrntype_t c); + uint8_t DLL_PREFIX G_OF_COLOR(scrntype_t c); + uint8_t DLL_PREFIX B_OF_COLOR(scrntype_t c); + uint8_t DLL_PREFIX A_OF_COLOR(scrntype_t c); +#elif defined(_RGB888) + typedef uint32_t scrntype_t; +#if defined(__LITTLE_ENDIAN__) + #define RGB_COLOR(r, g, b) (((uint32_t)(b) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(r) << 0) | (0xff << 24)) + #define RGBA_COLOR(r, g, b, a) (((uint32_t)(b) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(r) << 0) | ((uint32_t)(a) << 24)) + #define R_OF_COLOR(c) (((c) ) & 0xff) + #define G_OF_COLOR(c) (((c) >> 8) & 0xff) + #define B_OF_COLOR(c) (((c) >> 16) & 0xff) + #define A_OF_COLOR(c) (((c) >> 24) & 0xff) +#else + #define RGB_COLOR(r, g, b) (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0) | (0xff << 24)) + #define RGBA_COLOR(r, g, b, a) (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0) | ((uint32_t)(a) << 24)) + #define R_OF_COLOR(c) (((c) >> 16) & 0xff) + #define G_OF_COLOR(c) (((c) >> 8) & 0xff) + #define B_OF_COLOR(c) (((c) ) & 0xff) + #define A_OF_COLOR(c) (((c) >> 24) & 0xff) +#endif +#endif + +// 20181104 K.O: +// Below routines aims to render common routine. + +#ifdef _MSC_VER + #define __DECL_ALIGNED(foo) __declspec(align(foo)) + #ifndef __builtin_assume_aligned + #define __builtin_assume_aligned(foo, a) foo + #endif +#elif defined(__GNUC__) + #define __DECL_ALIGNED(foo) __attribute__((aligned(foo))) #else -#define _strcpy_s strcpy_s + // ToDo + #define __builtin_assume_aligned(foo, a) foo + #define __DECL_ALIGNED(foo) #endif +// ToDo: for MSVC +#if defined(_RGB555) || defined(_RGBA565) +typedef __DECL_ALIGNED(16) union { + scrntype_t w[8]; + __v8hi v; +} scrntype_vec8_t; +typedef __DECL_ALIGNED(16) union { + scrntype_t w[16]; + __v8hi v[2]; +} scrntype_vec16_t; +#else +typedef __DECL_ALIGNED(32) union { + scrntype_t w[8]; + __v16hi v; +} scrntype_vec8_t; +typedef __DECL_ALIGNED(32) union { + scrntype_t w[16]; + __v16hi v[2]; +} scrntype_vec16_t; +#endif + +typedef __DECL_ALIGNED(16) union { + __v4hi v; + uint8_t w[8]; +} uint8_vec8_t; + +typedef __DECL_ALIGNED(16) union { + __v8hi v; + uint16_t w[8]; +} uint16_vec8_t; + +typedef __DECL_ALIGNED(16) union { + __v16hi v; + uint32_t w[8]; +} uint32_vec8_t; + +typedef __DECL_ALIGNED(16) struct { + uint16_vec8_t plane_table[256]; +} _bit_trans_table_t; + +typedef __DECL_ALIGNED(sizeof(scrntype_vec8_t)) struct { + scrntype_vec8_t plane_table[256]; +} _bit_trans_table_scrn_t; + +typedef struct { + scrntype_t* palette; // Must be 2^planes entries. If NULL, assume RGB. + _bit_trans_table_t* bit_trans_table[16]; // Must be exist >= planes. Must be aligned with sizeof(uint16_vec8_t). + int xzoom; // 1 - 4? + bool is_render[16]; + int shift; + uint8_t* data[16]; + uint32_t baseaddress[16]; + uint32_t voffset[16]; + uint32_t addrmask; // For global increment. + uint32_t addrmask2; // For local increment. + uint32_t begin_pos; + uint32_t render_width; +} _render_command_data_t; + + +inline scrntype_vec8_t ConvertByteToMonochromePackedPixel(uint8_t src, _bit_trans_table_t *tbl,scrntype_t on_val, scrntype_t off_val) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + __DECL_ALIGNED(32) scrntype_vec8_t tmpdd; + _bit_trans_table_t* vt = (_bit_trans_table_t*)__builtin_assume_aligned(tbl, sizeof(uint16_vec8_t)); + + tmpd.v = vt->plane_table[src].v; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 8; i++) { + tmpdd.w[i] = (tmpd.w[i] == 0) ? off_val: on_val; + } + return tmpdd; +} + +// Note: Pls. read Note(s) of common.cpp -- 20181105 K.Ohta. +// Tables for below functions must be aligned by 16 (_bit_trans_table_t) or 32(_bit_trans_table_scrn_t). +void DLL_PREFIX ConvertByteToPackedPixelByColorTable(uint8_t *src, scrntype_t* dst, int bytes, _bit_trans_table_t *tbl, scrntype_t *on_color_table, scrntype_t* off_color_table); +void DLL_PREFIX ConvertByteToPackedPixelByColorTable2(uint8_t *src, scrntype_t* dst, int bytes, _bit_trans_table_scrn_t *tbl, scrntype_t *on_color_table, scrntype_t* off_color_table); +void DLL_PREFIX ConvertByteToSparceUint16(uint8_t *src, uint16_t* dst, int bytes, _bit_trans_table_t *tbl, uint16_t mask); +void DLL_PREFIX ConvertByteToSparceUint8(uint8_t *src, uint16_t* dst, int bytes, _bit_trans_table_t *tbl, uint16_t mask); + +// Table must be (ON_VAL_COLOR : OFF_VAL_COLOR)[256]. +inline scrntype_vec8_t ConvertByteToPackedPixel_PixelTbl(uint8_t src, _bit_trans_table_scrn_t *tbl) +{ + __DECL_ALIGNED(32) scrntype_vec8_t tmpdd; + _bit_trans_table_scrn_t* vt = (_bit_trans_table_scrn_t*)__builtin_assume_aligned(tbl, sizeof(uint16_vec8_t)); + + tmpdd.v = vt->plane_table[src].v; + return tmpdd; +} + +// Table must be (ON_VAL_COLOR : OFF_VAL_COLOR)[256]. +inline scrntype_vec16_t ConvertByteToDoublePackedPixel_PixelTbl(uint8_t src, _bit_trans_table_scrn_t *tbl) +{ + __DECL_ALIGNED(32) scrntype_vec16_t tmpdd; + __DECL_ALIGNED(32) scrntype_vec8_t tmpd; + _bit_trans_table_scrn_t* vt = (_bit_trans_table_scrn_t*)__builtin_assume_aligned(tbl, sizeof(uint16_vec8_t)); + tmpd.v = vt->plane_table[src].v; + int j = 0; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 16; i += 2) { + tmpdd.w[i] = tmpd.w[j]; + tmpdd.w[i + 1] = tmpd.w[j]; + j++; + } + return tmpdd; +} + +// Table must be initialize ON_COLOR : OFF_COLOR +inline void ConvertByteToDoubleMonochromeUint8(uint8_t src, uint8_t* dst, _bit_trans_table_t* tbl) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* vt = (uint16_vec8_t*)__builtin_assume_aligned(&(tbl->plane_table[0]), sizeof(uint16_vec8_t)); + + __DECL_ALIGNED(16) uint8_t d[16]; + tmpd = vt[src]; + int j = 0; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 16; i += 2) { + d[i] = (uint8_t)(tmpd.w[j]); + d[i + 1] = (uint8_t)(tmpd.w[j]); + j++; + } +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 16; i++) { + dst[i] = d[i]; + } +} + +inline void ConvertByteToMonochromeUint8(uint8_t src, uint8_t* dst, _bit_trans_table_t* tbl) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* vt = (uint16_vec8_t*)__builtin_assume_aligned(&(tbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd = vt[src]; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 8; i++) { + dst[i] = (uint8_t)(tmpd.w[i]); + } +} + +inline void ConvertRGBTo8ColorsUint8(uint8_t r, uint8_t g, uint8_t b, uint8_t* dst, _bit_trans_table_t* rtbl, _bit_trans_table_t* gtbl, _bit_trans_table_t* btbl, int shift) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* rvt = (uint16_vec8_t*)__builtin_assume_aligned(&(rtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* gvt = (uint16_vec8_t*)__builtin_assume_aligned(&(gtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* bvt = (uint16_vec8_t*)__builtin_assume_aligned(&(btbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd.v = rvt[r].v; + tmpd.v = tmpd.v | gvt[g].v; + tmpd.v = tmpd.v | bvt[b].v; + tmpd.v = tmpd.v >> shift; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 8; i++) { + dst[i] = (uint8_t)(tmpd.w[i]); + } +} + +inline void ConvertRGBTo8ColorsUint8_Zoom2Left(uint8_t r, uint8_t g, uint8_t b, uint8_t* dst, _bit_trans_table_t* rtbl, _bit_trans_table_t* gtbl, _bit_trans_table_t* btbl, int shift) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* rvt = (uint16_vec8_t*)__builtin_assume_aligned(&(rtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* gvt = (uint16_vec8_t*)__builtin_assume_aligned(&(gtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* bvt = (uint16_vec8_t*)__builtin_assume_aligned(&(btbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd.v = rvt[r].v; + tmpd.v = tmpd.v | gvt[g].v; + tmpd.v = tmpd.v | bvt[b].v; + tmpd.v = tmpd.v >> shift; +__DECL_VECTORIZED_LOOP + for(int i = 0, j = 0; i < 8; i += 2, j++) { + dst[i] = (uint8_t)(tmpd.w[j]); + dst[i + 1] = (uint8_t)(tmpd.w[j]); + } +} + +inline void ConvertRGBTo8ColorsUint8_Zoom2Right(uint8_t r, uint8_t g, uint8_t b, uint8_t* dst, _bit_trans_table_t* rtbl, _bit_trans_table_t* gtbl, _bit_trans_table_t* btbl, int shift) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* rvt = (uint16_vec8_t*)__builtin_assume_aligned(&(rtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* gvt = (uint16_vec8_t*)__builtin_assume_aligned(&(gtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* bvt = (uint16_vec8_t*)__builtin_assume_aligned(&(btbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd.v = rvt[r].v; + tmpd.v = tmpd.v | gvt[g].v; + tmpd.v = tmpd.v | bvt[b].v; + tmpd.v = tmpd.v >> shift; +__DECL_VECTORIZED_LOOP + for(int i = 0, j = 4; i < 8; i += 2, j++) { + dst[i] = (uint8_t)(tmpd.w[j]); + dst[i + 1] = (uint8_t)(tmpd.w[j]); + } +} + +inline void ConvertRGBTo8ColorsUint8_Zoom2Double(uint8_t r, uint8_t g, uint8_t b, uint8_t* dst, _bit_trans_table_t* rtbl, _bit_trans_table_t* gtbl, _bit_trans_table_t* btbl, int shift) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* rvt = (uint16_vec8_t*)__builtin_assume_aligned(&(rtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* gvt = (uint16_vec8_t*)__builtin_assume_aligned(&(gtbl->plane_table[0]), sizeof(uint16_vec8_t)); + uint16_vec8_t* bvt = (uint16_vec8_t*)__builtin_assume_aligned(&(btbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd.v = rvt[r].v; + tmpd.v = tmpd.v | gvt[g].v; + tmpd.v = tmpd.v | bvt[b].v; + tmpd.v = tmpd.v >> shift; +__DECL_VECTORIZED_LOOP + for(int i = 0, j = 0; i < 16; i += 2, j++) { + dst[i] = (uint8_t)(tmpd.w[j]); + dst[i + 1] = (uint8_t)(tmpd.w[j]); + } +} + +inline void ConvertByteToMonochromeUint8Cond_Zoom2(uint8_t src, uint8_t* dst, _bit_trans_table_t* tbl, uint8_t on_color, uint8_t off_color) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* vt = (uint16_vec8_t*)__builtin_assume_aligned(&(tbl->plane_table[0]), sizeof(uint16_vec8_t)); + + __DECL_ALIGNED(16) uint8_t d[16]; + tmpd = vt[src]; + int j = 0; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 16; i += 2) { + d[i] = (tmpd.w[j] == 0) ? off_color : on_color; + d[i + 1] = (tmpd.w[j] == 0) ? off_color : on_color; + j++; + } +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 16; i++) { + dst[i] = d[i]; + } +} + +inline void ConvertByteToMonochromeUint8Cond(uint8_t src, uint8_t* dst, _bit_trans_table_t* tbl, uint8_t on_color, uint8_t off_color) +{ + __DECL_ALIGNED(16) uint16_vec8_t tmpd; + uint16_vec8_t* vt = (uint16_vec8_t*)__builtin_assume_aligned(&(tbl->plane_table[0]), sizeof(uint16_vec8_t)); + + tmpd = vt[src]; +__DECL_VECTORIZED_LOOP + for(int i = 0; i < 8; i++) { + dst[i] = (tmpd.w[i] == 0) ? off_color : on_color; + } +} + +void DLL_PREFIX PrepareBitTransTableUint16(_bit_trans_table_t *tbl, uint16_t on_val, uint16_t off_val); +void DLL_PREFIX PrepareBitTransTableScrnType(_bit_trans_table_scrn_t *tbl, scrntype_t on_val, scrntype_t off_val); +void DLL_PREFIX PrepareReverseBitTransTableUint16(_bit_trans_table_t *tbl, uint16_t on_val, uint16_t off_val); +void DLL_PREFIX PrepareReverseBitTransTableScrnType(_bit_trans_table_scrn_t *tbl, scrntype_t on_val, scrntype_t off_val); + +void DLL_PREFIX Render8Colors_Line(_render_command_data_t *src, scrntype_t *dst, scrntype_t *dst2, bool scan_line); + +void DLL_PREFIX Render16Colors_Line(_render_command_data_t *src, scrntype_t *dst, scrntype_t *dst2, bool scan_line); +void DLL_PREFIX Render2NColors_Line(_render_command_data_t *src, scrntype_t *dst, scrntype_t* dst2, bool scan_line, int planes); + +void DLL_PREFIX Convert8ColorsToByte_Line(_render_command_data_t *src, uint8_t *dst); +void DLL_PREFIX Convert2NColorsToByte_Line(_render_command_data_t *src, uint8_t *dst, int planes); +void DLL_PREFIX Convert2NColorsToByte_LineZoom2(_render_command_data_t *src, uint8_t *dst, int planes); + +inline uint64_t ExchangeEndianU64(uint64_t __in) +{ + pair64_t __i, __o; + __i.q = __in; + __o.b.h7 = __i.b.l; + __o.b.h6 = __i.b.h; + __o.b.h5 = __i.b.h2; + __o.b.h4 = __i.b.h3; + __o.b.h3 = __i.b.h4; + __o.b.h2 = __i.b.h5; + __o.b.h = __i.b.h6; + __o.b.l = __i.b.h7; + return __o.q; +} + +inline int64_t ExchangeEndianS64(uint64_t __in) +{ + pair64_t __i, __o; + __i.q = __in; + __o.b.h7 = __i.b.l; + __o.b.h6 = __i.b.h; + __o.b.h5 = __i.b.h2; + __o.b.h4 = __i.b.h3; + __o.b.h3 = __i.b.h4; + __o.b.h2 = __i.b.h5; + __o.b.h = __i.b.h6; + __o.b.l = __i.b.h7; + return __o.sq; +} +inline uint32_t ExchangeEndianU32(uint32_t __in) +{ + pair32_t __i, __o; + __i.d = __in; + __o.b.h3 = __i.b.l; + __o.b.h2 = __i.b.h; + __o.b.h = __i.b.h2; + __o.b.l = __i.b.h3; + return __o.d; +} + +inline int32_t ExchangeEndianS32(uint32_t __in) +{ + pair32_t __i, __o; + __i.d = __in; + __o.b.h3 = __i.b.l; + __o.b.h2 = __i.b.h; + __o.b.h = __i.b.h2; + __o.b.l = __i.b.h3; + return __o.sd; +} + +inline uint16_t ExchangeEndianU16(uint16_t __in) +{ + pair16_t __i, __o; + __i.u16 = __in; + __o.b.h = __i.b.l; + __o.b.l = __i.b.h; + return __o.u16; +} + +inline int16_t ExchangeEndianS16(uint16_t __in) +{ + pair16_t __i, __o; + __i.u16 = __in; + __o.b.h = __i.b.l; + __o.b.l = __i.b.h; + return __o.s16; +} + // wav file header #pragma pack(1) typedef struct { char id[4]; - uint32 size; + uint32_t size; } wav_chunk_t; #pragma pack() @@ -472,23 +1360,77 @@ typedef struct { wav_chunk_t riff_chunk; char wave[4]; wav_chunk_t fmt_chunk; - uint16 format_id; - uint16 channels; - uint32 sample_rate; - uint32 data_speed; - uint16 block_size; - uint16 sample_bits; + uint16_t format_id; + uint16_t channels; + uint32_t sample_rate; + uint32_t data_speed; + uint16_t block_size; + uint16_t sample_bits; } wav_header_t; #pragma pack() +// See http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html. +#pragma pack(1) +typedef struct { + wav_chunk_t riff_chunk; + char wave[4]; + wav_chunk_t fmt_chunk; + uint16_t format_id; + uint16_t channels; + uint32_t sample_rate; + uint32_t data_speed; + uint16_t block_size; + uint16_t sample_bits; + uint16_t cbsize; // Extension size.Normaly set to 0. + wav_chunk_t fact_chunk; // "fact", 4. +} wav_header_float_t; +#pragma pack() + +// Use this before writing wav_data. +bool DLL_PREFIX write_dummy_wav_header(void *__fio); +// Use this after writng wav_data. +bool DLL_PREFIX set_wav_header(wav_header_t *header, wav_chunk_t *first_chunk, uint16_t channels, uint32_t rate, + uint16_t bits, size_t file_length); +bool DLL_PREFIX load_wav_to_stereo(void *__fio, int16_t **left_buf, int16_t **right_buf, uint32_t *rate, int *got_samples); +bool DLL_PREFIX load_wav_to_monoral(void *__fio, int16_t **buffer, uint32_t *rate, int *got_samples); + +// file path +const _TCHAR *DLL_PREFIX get_application_path(); +const _TCHAR *DLL_PREFIX get_initial_current_path(); +const _TCHAR *DLL_PREFIX create_local_path(const _TCHAR *format, ...); +void DLL_PREFIX create_local_path(_TCHAR *file_path, int length, const _TCHAR *format, ...); +const _TCHAR *DLL_PREFIX create_date_file_path(const _TCHAR *extension); +bool DLL_PREFIX is_absolute_path(const _TCHAR *file_path); +void DLL_PREFIX create_date_file_path(_TCHAR *file_path, int length, const _TCHAR *extension); +const _TCHAR *DLL_PREFIX create_date_file_name(const _TCHAR *extension); +void DLL_PREFIX create_date_file_name(_TCHAR *file_path, int length, const _TCHAR *extension); +bool DLL_PREFIX check_file_extension(const _TCHAR *file_path, const _TCHAR *ext); +const _TCHAR *DLL_PREFIX get_file_path_without_extensiton(const _TCHAR *file_path); +void DLL_PREFIX get_long_full_path_name(const _TCHAR* src, _TCHAR* dst, size_t dst_len); +const _TCHAR* DLL_PREFIX get_parent_dir(const _TCHAR* file); + +// string +const _TCHAR *DLL_PREFIX create_string(const _TCHAR* format, ...); +const wchar_t *DLL_PREFIX char_to_wchar(const char *cs); +const char *DLL_PREFIX wchar_to_char(const wchar_t *ws); +const _TCHAR *DLL_PREFIX char_to_tchar(const char *cs); +const char *DLL_PREFIX tchar_to_char(const _TCHAR *ts); +const _TCHAR *DLL_PREFIX wchar_to_tchar(const wchar_t *ws); +const wchar_t *DLL_PREFIX tchar_to_wchar(const _TCHAR *ts); + -#if defined(_USE_SDL) || defined(_USE_AGAR) || defined(_USE_QT) // misc -#ifdef __cplusplus -bool check_file_extension(_TCHAR* file_path, _TCHAR* ext); -_TCHAR *get_file_path_without_extensiton(_TCHAR* file_path); -uint32 getcrc32(uint8 data[], int size); +void DLL_PREFIX common_initialize(); + +int32_t DLL_PREFIX muldiv_s32(int32_t nNumber, int32_t nNumerator, int32_t nDenominator); +uint32_t DLL_PREFIX muldiv_u32(uint32_t nNumber, uint32_t nNumerator, uint32_t nDenominator); + +uint32_t DLL_PREFIX get_crc32(uint8_t data[], int size); +uint32_t DLL_PREFIX calc_crc32(uint32_t seed, uint8_t data[], int size); +uint16_t DLL_PREFIX jis_to_sjis(uint16_t jis); +int DLL_PREFIX decibel_to_volume(int decibel); +int32_t DLL_PREFIX apply_volume(int32_t sample, int volume); #define array_length(array) (sizeof(array) / sizeof(array[0])) @@ -497,9 +1439,12 @@ uint32 getcrc32(uint8 data[], int size); #define TO_BCD_LO(v) ((v) % 10) #define TO_BCD_HI(v) (int)(((v) % 100) / 10) -#define LEAP_YEAR(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) +// time +#define LEAP_YEAR(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) -typedef struct cur_time_s { +#define dll_cur_time_t DLL_PREFIX_I struct cur_time_s + +typedef DLL_PREFIX struct cur_time_s { int year, month, day, day_of_week, hour, minute, second; bool initialized; cur_time_s() @@ -509,11 +1454,21 @@ typedef struct cur_time_s { void increment(); void update_year(); void update_day_of_week(); - void save_state(void *f); - bool load_state(void *f); + bool process_state(void *f, bool loading); } cur_time_t; -#endif -#endif +void DLL_PREFIX get_host_time(cur_time_t* cur_time); +const _TCHAR DLL_PREFIX *get_lib_common_version(); -#endif \ No newline at end of file +// symbol +typedef struct symbol_s { + uint32_t addr; + _TCHAR *name; + struct symbol_s *next_symbol; +} symbol_t; + +const _TCHAR* DLL_PREFIX get_symbol(symbol_t *first_symbol, uint32_t addr); +const _TCHAR* DLL_PREFIX get_value_or_symbol(symbol_t *first_symbol, const _TCHAR *format, uint32_t addr); +const _TCHAR* DLL_PREFIX get_value_and_symbol(symbol_t *first_symbol, const _TCHAR *format, uint32_t addr); + +#endif