/*! \file yof_types.h \brief 汎用的な typedef やマクロの定義 \author Kenta Yoshimura $Id$ YOF_NO_FLOAT_T..define すると float_t を定義しません */ /* Copyright (C) 2003-2005 Kenta Yoshimura. All Rights Reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY AUTHOR PROJECT ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YOF_TYPES #define YOF_TYPES #if !defined(_MSC_VER) || _MSC_VER > 1000 #pragma once #endif #ifdef _MSC_VER # pragma warning( push ) # pragma warning( disable : 4068 ) // warning C4068: 不明なプラグマがありました。 #endif #ifdef _MSC_VER # define yof_TOSTRING(x) #x # define yof_THRU(x) yof_TOSTRING(x) # define yof_MSG(x) message( __FILE__ "(" yof_THRU(__LINE__) ") : " x ) #else # define yof_MSG(x) message( __FILE__ " : " x ) #endif #include #include #pragma mark - #pragma mark typedef #pragma mark - //! ビット数を求める #define yof_bitsof(n) (sizeof(n) * 8) //! 配列の要素数を求める #define yof_array_count(a) (sizeof(a) / sizeof(a[0])) /*! \def yof_BITS_OF_TARGET \brief ターゲット環境のビット数 */ #ifndef yof_BITS_OF_TARGET # if defined(_M_IA64) || defined(_WIN64) # define yof_BITS_OF_TARGET 64 # else # define yof_BITS_OF_TARGET 32 # endif #endif /*! \def yof_X86 \brief X86 系の CPU なら 0 以外 */ #if defined(_M_IX86) || defined(__i386__) || defined(i386) || (defined(__GNUC__) && defined(__MINGW32__)) || ((__MWERKS__ >= 0x0900) && __INTEL__) # define yof_X86 1 #else # define yof_X86 0 #endif /*! \def yof_PPC \brief PowerPC 系の CPU なら 0 以外 */ #if defined(powerpc) || defined(_M_MPPC) || defined(__ppc__) # define yof_PPC 1 #else # define yof_PPC 0 #endif /*! \def yof_RT_LITTLE_ENDIAN \brief リトルエンディアンなら 0 以外 */ /*! \def yof_RT_BIG_ENDIAN \brief ビッグエンディアンなら 0 以外 */ #if yof_X86 || defined(_M_ALPHA) || defined(intel) #define yof_RT_LITTLE_ENDIAN 1 #define yof_RT_BIG_ENDIAN 0 #else #define yof_RT_LITTLE_ENDIAN 0 #define yof_RT_BIG_ENDIAN 1 #endif /* yof_WIN が 0x0100 未満の場合は Win16 か Win9x のバージョン */ #ifdef __MACH__ # define yof_MAC 0x1000 # define yof_MACH 1 # define yof_CARBON 1 # define yof_WIN 0 # define yof_LINUX 0 #elif defined(TARGET_API_MAC_CARBON) || defined(CARBON) # define yof_MAC 0x0800 # define yof_MACH 0 # define yof_CARBON 1 # define yof_WIN 0 # define yof_LINUX 0 #elif defined(macintosh) # define yof_MAC 70 # define yof_MACH 0 # define yof_CARBON 0 # define yof_WIN 0 # define yof_LINUX 0 #elif defined(WIN16) # define yof_MAC 0 # define yof_MACH 0 # define yof_CARBON 0 # define yof_WIN 0x0031 # define yof_LINUX 0 #elif defined(WIN32) # define yof_MAC 0 # define yof_MACH 0 # define yof_CARBON 0 # ifdef _WIN32_WINNT # define yof_WIN _WIN32_WINNT # else # define yof_WIN 0x0040 # endif # define yof_LINUX 0 #endif #if __STDC_VERSION__ >= 199901L || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) # define yof_HAS_STDINT 1 #else # define yof_HAS_STDINT 0 #endif #if yof_HAS_STDINT # include # include # if yof_MAC # if yof_MAC < 10 # include // uint_t # else # include // uint_t # endif # else typedef unsigned int uint_t; # endif // yof_MAC #else // !yof_HAS_STDINT # if !defined(__cplusplus) // bool を int にしないのは VC++ に合わせて typedef char bool; # if yof_MAC # if yof_MAC < 10 # include # include # else # include # endif # else enum { false, true }; # endif // yof_MAC # endif // !defined(__cplusplus) # if !defined(_STDINT_H) && !defined(_MSL_STDINT_H) && !defined(_STDINT_H_) # ifndef YOF_TYPES_HPP # define _STDINT_H_ //#pragma message( "yof_types.h defined _STDINT_H_.\n" ) # endif // #ifndef YOF_TYPES_HPP # if !yof_MAC typedef unsigned int uint_t; //!< unsigned int の省略系 # endif // 厳格に bit 数を定義した型 typedef signed char int8_t; typedef signed short int16_t; # if !defined(__CGBASE__) typedef signed long int32_t; # endif // !defined(__CGBASE__) # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 int64_t; # else // #if _MSC_VER typedef signed long long int64_t; # endif // #if _MSC_VER # endif // #ifndef __SC__ # if !defined(_MACHTYPES_H_) && !defined(__CGBASE__) typedef unsigned char u_int8_t; typedef unsigned short u_int16_t; typedef unsigned long u_int32_t; # endif // #if !defined(_MACHTYPES_H_) && !defined(__CGBASE__) # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 u_int64_t; # else // #if _MSC_VER typedef unsigned long long u_int64_t; # endif // #if _MSC_VER # endif // #ifndef __SC__ typedef u_int8_t uint8_t; typedef u_int16_t uint16_t; typedef u_int32_t uint32_t; # ifndef __SC__ typedef u_int64_t uint64_t; # endif // #ifndef __SC__ // bit 数を包括した一番計算の速い型 # if yof_BITS_OF_TARGET < 8 // 8 bit 未満 # error 8 bit or more of int are required. # elif yof_BITS_OF_TARGET < 16 // 8 bit 〜 15 bit 環境 typedef signed int_fast8_t; typedef signed short int_fast16_t; typedef signed long int_fast32_t; typedef signed long long int_fast64_t; typedef unsigned uint_fast8_t; typedef unsigned short uint_fast16_t; typedef unsigned long uint_fast32_t; typedef unsigned long long uint_fast64_t; typedef float float_fast32_t; typedef double float_fast64_t; typedef long double float_fast96_t; # elif yof_BITS_OF_TARGET < 32 // 16 bit 〜 31 bit 環境 typedef signed int_fast8_t; typedef signed int_fast16_t; typedef signed long int_fast32_t; typedef signed long long int_fast64_t; typedef unsigned uint_fast8_t; typedef unsigned uint_fast16_t; typedef unsigned long uint_fast32_t; typedef unsigned long long uint_fast64_t; # elif yof_BITS_OF_TARGET < 64 // 32 bit 〜 63 bit 環境 typedef signed int_fast8_t; typedef signed int_fast16_t; typedef signed int_fast32_t; # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef signed __int64 int_fast64_t; # else typedef signed long long int_fast64_t; # endif # endif // #ifndef __SC__ typedef unsigned uint_fast8_t; typedef unsigned uint_fast16_t; typedef unsigned uint_fast32_t; # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 uint_fast64_t; # else typedef unsigned long long uint_fast64_t; # endif # endif // #ifndef __SC__ # else // 64 bit 以上 typedef signed int_fast8_t; typedef signed int_fast16_t; typedef signed int_fast32_t; typedef signed int_fast64_t; typedef unsigned uint_fast8_t; typedef unsigned uint_fast16_t; typedef unsigned uint_fast32_t; typedef unsigned uint_fast64_t; # endif // yof_BITS_OF_TARGET # endif // #if !defined(_STDINT_H) && !defined(_MSL_STDINT_H) && !defined(_STDINT_H_) #endif // #if __STDC_VERSION__ >= 199901L || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) typedef float float32_t; typedef double float64_t; #ifdef _MSC_VER # if _MSC_VER <= 1100 typedef long double float80_t; # endif #else // !defined(_MSC_VER) typedef long double float96_t; #endif #if yof_BITS_OF_TARGET < 8 // 8 bit 未満 # error 8 bit or more of int are required. #elif yof_BITS_OF_TARGET < 16 // 8 bit 〜 15 bit 環境 typedef float float_fast32_t; typedef double float_fast64_t; typedef long double float_fast96_t; #elif yof_BITS_OF_TARGET < 32 // 16 bit 〜 31 bit 環境 typedef float float_fast32_t; typedef double float_fast64_t; typedef long double float_fast96_t; #elif yof_BITS_OF_TARGET < 64 // 32 bit 〜 63 bit 環境 typedef float float_fast32_t; typedef double float_fast64_t; # ifdef _MSC_VER # if _MSC_VER <= 1100 typedef long double float_fast80_t; # endif // _MSC_VER <= 1100 # else // !defined(_MSC_VER) typedef long double float_fast96_t; # endif // _MSC_VER #else // 64 bit 以上 typedef float float_fast32_t; typedef double float_fast64_t; # ifdef _MSC_VER # if _MSC_VER <= 1100 typedef long double float_fast80_t; # endif // _MSC_VER <= 1100 # else // !defined(_MSC_VER) typedef long double float_fast96_t; # endif // _MSC_VER #endif // yof_BITS_OF_TARGET // bit 数を包括した一番汎用レジスタに近い型。 // gcc を始めとする環境で fastN_t が汎用レジスタのサイズから遠い為に独自に追加した。 // stdint.h が存在しない場合は fastN_t と同等になる。 #if yof_BITS_OF_TARGET < 8 // 8 bit 未満 # error 8 bit or more of int are required. #elif yof_BITS_OF_TARGET < 16 // 8 bit 〜 15 bit 環境 typedef signed int_gen8_t; typedef signed short int_gen16_t; typedef signed long int_gen32_t; typedef signed long long int_gen64_t; typedef unsigned uint_gen8_t; typedef unsigned short uint_gen16_t; typedef unsigned long uint_gen32_t; typedef unsigned long long uint_gen64_t; # if !defined(YOF_NO_FLOAT_T) typedef float float_t; # endif typedef float float_gen32_t; typedef double float_gen64_t; #elif yof_BITS_OF_TARGET < 32 // 16 bit 〜 31 bit 環境 typedef signed int_gen8_t; typedef signed int_gen16_t; typedef signed long int_gen32_t; typedef signed long long int_gen64_t; typedef unsigned uint_gen8_t; typedef unsigned uint_gen16_t; typedef unsigned long uint_gen32_t; typedef unsigned long long uint_gen64_t; # if yof_X86 typedef double float_gen32_t; typedef double float_gen64_t; # ifdef _MSC_VER # if _MSC_VER <= 1100 # if !defined(YOF_NO_FLOAT_T) typedef long double float_t; # endif typedef long double float_gen80_t; # else // _MSC_VER > 1100 # if !defined(YOF_NO_FLOAT_T) typedef double float_t; # endif # endif // _MSC_VER <= 1100 # else // !defined(_MSC_VER) # if !defined(YOF_NO_FLOAT_T) typedef double float_t; # endif typedef long double float_gen96_t; # endif // _MSC_VER # else // !yof_X86 # if !defined(YOF_NO_FLOAT_T) typedef float float_t; # endif typedef float float_gen32_t; typedef double float_gen64_t; typedef long double float_gen96_t; # endif // yof_X86 #elif yof_BITS_OF_TARGET < 64 // 32 bit 〜 63 bit 環境 typedef signed int_gen8_t; typedef signed int_gen16_t; typedef signed int_gen32_t; # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef signed __int64 int_gen64_t; # else typedef signed long long int_gen64_t; # endif # endif // #ifndef __SC__ typedef unsigned uint_gen8_t; typedef unsigned uint_gen16_t; typedef unsigned uint_gen32_t; # ifndef __SC__ # if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 uint_gen64_t; # else typedef unsigned long long uint_gen64_t; # endif # endif // #ifndef __SC__ # if yof_X86 typedef double float_gen32_t; typedef double float_gen64_t; # ifdef _MSC_VER # if _MSC_VER <= 1100 # if !defined(YOF_NO_FLOAT_T) typedef long double float_t; # endif typedef long double float_gen80_t; # else // _MSC_VER > 1100 # if !defined(YOF_NO_FLOAT_T) typedef double float_t; # endif # endif // _MSC_VER <= 1100 # else // !defined(_MSC_VER) # if !defined(YOF_NO_FLOAT_T) typedef double float_t; # endif typedef long double float_gen96_t; # endif // _MSC_VER # else // !yof_X86 # if !defined(YOF_NO_FLOAT_T) typedef float float_t; # endif typedef float float_gen32_t; typedef double float_gen64_t; typedef long double float_gen96_t; # endif // yof_X86 #else // 64 bit 以上 typedef signed int_gen8_t; typedef signed int_gen16_t; typedef signed int_gen32_t; typedef signed int_gen64_t; typedef unsigned uint_gen8_t; typedef unsigned uint_gen16_t; typedef unsigned uint_gen32_t; typedef unsigned uint_gen64_t; # if !defined(YOF_NO_FLOAT_T) typedef double float_t; # endif typedef double float_gen32_t; typedef double float_gen64_t; # ifndef _MSC_VER typedef long double float_gen96_t; # endif // !defined(_MSC_VER) #endif // yof_BITS_OF_TARGET #ifdef __VEC__ typedef vector bool char vec_bool8_t; typedef vector bool short vec_bool16_t; typedef vector bool int vec_bool32_t; typedef vector unsigned char vec_uint8_t; typedef vector unsigned short vec_uint16_t; typedef vector unsigned int vec_uint32_t; typedef vector signed char vec_int8_t; typedef vector signed short vec_int16_t; typedef vector signed int vec_int32_t; typedef vector float vec_float_t; typedef vector pixel vec_pixel_t; # if defined(MPW_C) || defined(MPW_CPLUS) typedef vec_int32_t __m128; union m128 { int8_t m128i_i8[ 16 ]; int16_t m128i_i16[ 8 ]; int32_t m128i_i32[ 4 ]; uint8_t m128i_u8[ 16 ]; uint16_t m128i_u16[ 8 ]; uint32_t m128i_u32[ 4 ]; float m128_f32[ 4 ]; __m128 vec; }; # endif // MPW_C || MPW_CPLUS #endif #if defined(_MSC_VER) && _MSC_VER <= 1200 //! for で宣言した変数のスコープが漏れない for #define for if (false) {} else for #endif #if _MSC_VER >= 1200 //! アラインに沿った型定義 ( Visual C++ 版 ) #define yof_aligned( n ) __declspec( align( n ) ) #elif __GNUC__ //! アラインに沿った型定義 ( g++ 版 ) #define yof_aligned( n ) __attribute__( (aligned( n )) ) #else // #if _MSC_VER #define yof_aligned( n ) #endif // #if _MSC_VER #ifdef __GNUC__ # define yof_INT_AS_LONG #endif #if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) # ifdef _MSC_VER # define yof_SUPPORT_INLINE 1 # define inline __inline # elif __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define yof_SUPPORT_INLINE 1 # define inline __inline__ # else # define yof_SUPPORT_INLINE 0 # define inline # endif #else # define yof_SUPPORT_INLINE 1 #endif #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L # define yof_SUPPORT_RESTRICT 1 #else # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define yof_SUPPORT_RESTRICT 1 # define restrict __restrict__ # else # define yof_SUPPORT_RESTRICT 0 # define restrict # endif #endif #if yof_SUPPORT_INLINE # define yof_headerfunc #else // !yof_SUPPORT_INLINE # define yof_headerfunc static #endif #if _MSC_VER >= 1200 //! 強制力を持ったインライン宣言 ( Visual C++ 版 ) # define yof_forceinline __forceinline #elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) //! 強制力を持ったインライン宣言 ( g++ 版 ) # define yof_forceinline __attribute__( (always_inline) ) #else // #if _MSC_VER # define yof_forceinline inline #endif // #if _MSC_VER #ifdef _MSC_VER //! インラインアセンブリ構文 # define yof_asm __asm //! インラインアセンブラ用 this ポインタ # define yof_asm_this this //! インラインアセンブラ用 this ポインタ宣言 # define yof_asm_using_this() #else //! インラインアセンブリ構文 # define yof_asm asm //! インラインアセンブラ用 this ポインタ # define yof_asm_this _yof_asm_this //! インラインアセンブラ用 this ポインタ宣言 # define yof_asm_using_this() void * yof_asm_this = (void *)this #endif #ifndef yof_OPTIMIZE_IF # if defined(_MSC_VER) && _M_IX86 >= 600 //! 極力分岐を排除をするかどうか # define yof_OPTIMIZE_IF 1 # endif //# if _MSC_VER <= 1200 #endif // #ifndef yof_OPTIMIZE_IF #if __GNUC__ >= 3 //! 引数が同じであれば戻り値が同じ関数 # define yof_arithmetic_const const #else //! 引数が同じであれば戻り値が同じ関数 # define yof_arithmetic_const #endif #pragma mark - #pragma mark macro / inline #pragma mark - /*! \def AND \brief 論理値同士の and */ /*! \def OR \brief 論理値同士の or */ #if yof_OPTIMIZE_IF #define AND & #define OR | #else // #if yof_OPTIMIZE_IF #define AND && #define OR || #endif // #if yof_OPTIMIZE_IF //! dst が ge 以上 le 以下か #define yof_isbetween(dst, ge, le) ( (unsigned)((dst) - (ge)) <= (unsigned)((le) - (ge)) ) /*! \def yof_max(a, b) \brief 大きい方を返す */ /*! \def yof_min(a, b) \brief 小さい方を返す */ #if yof_OPTIMIZE_IF #define yof_max(a, b) ( (-((a) > (b)) & (a)) | (-((a) <= (b)) & (b)) ) #define yof_min(a, b) ( (-((a) < (b)) & (a)) | (-((a) >= (b)) & (b)) ) #else #define yof_max(a, b) ( ( (a) > (b) ) ? (a) : (b) ) #define yof_min(a, b) ( ( (a) < (b) ) ? (a) : (b) ) #endif //! 2 byte の値をスワップする #define yof_swap2(x) ( (((uint_fast16_t) ((x) & 0x00ff)) << 8) | \ (((uint_fast16_t) ((x) & 0xff00)) >> 8) ) //! 4 byte の値をスワップする #define yof_swap4(x) ( (((uint_fast32_t) ((x) & 0x000000ff)) << 24) | \ (((uint_fast32_t) ((x) & 0x0000ff00)) << 8) | \ (((uint_fast32_t) ((x) & 0x00ff0000)) >> 8) | \ (((uint_fast32_t) ((x) & 0xff000000)) >> 24) ) /*! \def yof_bigchar2(unsigned short x) \brief 2 byte 値がビッグエンディアンであるとする つまり *(uint16_t *)ptr = yof_bigchar2( 0xXXYY ) としたとき XX YY のバイトの並びを保証する。 */ #if yof_RT_LITTLE_ENDIAN # define yof_bigchar2(x) yof_swap2(x) #else // #if yof_RT_BIG_ENDIAN # define yof_bigchar2(x) (x) #endif // #if yof_RT_LITTLE_ENDIAN /*! \def yof_littlechar2(unsigned short x) \brief 2byte 値がリトルエンディアンであるとする つまり *(uint16_t *)ptr = yof_littlechar2( 0xXXYY ) としたとき YY XX のバイトの並びを保証する。 */ #if yof_RT_LITTLE_ENDIAN # define yof_littlechar2(x) (x) #else // #if yof_RT_BIG_ENDIAN # define yof_littlechar2(x) yof_swap2(x) #endif // #if yof_RT_LITTLE_ENDIAN /*! \def yof_bigchar4(unsigned long x) \brief 4 byte 値がビッグエンディアンであるとする つまり yof_bigchar4( 0xWWXXYYZZ ) としたとき WW XX YY ZZ のバイトの並びを保証する。 */ #if yof_RT_LITTLE_ENDIAN # define yof_bigchar4(x) yof_swap4(x) #else // #if yof_RT_BIG_ENDIAN # define yof_bigchar4(x) (x) #endif // #if yof_RT_LITTLE_ENDIAN /*! \def yof_littlechar4(unsigned long x) \brief 4byte 値がリトルエンディアンであるとする つまり *(uint16_t *)ptr = yof_littlechar4( 0xWWXXYYZZ ) としたとき ZZ YY XX WW のバイトの並びを保証する。 */ #if yof_RT_LITTLE_ENDIAN # define yof_littlechar4(x) (x) #else // #if yof_RT_BIG_ENDIAN # define yof_littlechar4(x) yof_swap4(x) #endif // #if yof_RT_LITTLE_ENDIAN #ifdef __cplusplus namespace yoffy { #endif #ifdef __TCHAR_DEFINED # ifdef WIN32 # ifdef __cplusplus typedef _TCHAR _TCHAR; // typedef ::_TCHAR ::yoffy::_TCHAR # endif # else # ifdef _UNICODE # include typedef wchar_t _TCHAR; # define _T(x) L ## x # else typedef char _TCHAR; # define _T(x) x # endif # endif #else // ifndef __TCHAR_DEFINED # ifdef WIN32 # include # ifdef __cplusplus typedef _TCHAR _TCHAR; // typedef ::_TCHAR ::yoffy::_TCHAR # endif # else # define __TCHAR_DEFINED # ifdef _UNICODE # include typedef wchar_t _TCHAR; # define _T(x) L ## x # else typedef char _TCHAR; # define _T(x) x # endif # endif #endif #ifndef WIN32 # define _tmain main #endif #ifdef _MSC_VER # pragma pack( push, __YOF_COLOR_STRUCTURE__, 1 ) #endif union rgba; struct rgb { #if yof_RT_BIG_ENDIAN uint8_t red; uint8_t green; uint8_t blue; #elif yof_RT_LITTLE_ENDIAN uint8_t blue; uint8_t green; uint8_t red; #endif #ifdef __cplusplus rgb() {} rgb( uint8_t r, uint8_t g, uint8_t b ) : red( r ), green( g ), blue( b ) {} rgb( rgba v ); rgb( rgba v, rgb base ); rgb( uint_gen32_t colref ) : red( (colref >> 16) & 0xff ) , green( (colref >> 8) & 0xff ) , blue( colref & 0xff ) {} uint32_t ref() const { return red << 16 | green << 8 | blue; } #endif }; typedef struct rgb rgb; union rgba { struct { #if yof_RT_BIG_ENDIAN uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; #elif yof_RT_LITTLE_ENDIAN uint8_t blue; uint8_t green; uint8_t red; uint8_t alpha; #endif }; uint32_t ref; #ifdef __cplusplus rgba() {} rgba( uint8_t r, uint8_t g, uint8_t b ) : red( r ), green( g ), blue( b ), alpha( 255 ) {} rgba( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : red( r ), green( g ), blue( b ), alpha( a ) {} rgba( rgb v ) : red( v.red ), green( v.green ), blue( v.blue ), alpha( 255 ) {} rgba( uint_gen32_t colref ) : ref( colref ) {} #endif }; typedef union rgba rgba; #ifdef __cplusplus inline rgb::rgb( rgba v ) : red( v.red ), green( v.green ), blue( v.blue ) {} inline rgb::rgb( rgba v, rgb base ) : red ( (unsigned(v.red) * v.alpha + unsigned(base.red) * (255 - v.alpha)) / 255 ) , green( (unsigned(v.green) * v.alpha + unsigned(base.green) * (255 - v.alpha)) / 255 ) , blue ( (unsigned(v.blue) * v.alpha + unsigned(base.blue) * (255 - v.alpha)) / 255 ) {} #endif union cmyk { struct { #if yof_RT_BIG_ENDIAN uint8_t cyan; uint8_t magenta; uint8_t yellow; uint8_t black; #elif yof_RT_LITTLE_ENDIAN uint8_t black; uint8_t yellow; uint8_t magenta; uint8_t cyan; #endif }; uint32_t ref; }; typedef union cmyk cmyk; struct hls { uint16_t hue; //!< 色相 (0-65534) uint8_t light; //!< 明度 (0-255) uint8_t saturation; //!< 彩度 (0-255) }; typedef struct hls hls; struct hsv { uint16_t hue; //!< 色相 (0-65534) uint8_t saturation; //!< 彩度 (0-255) uint8_t value; //!< 強度 (0-255) }; typedef struct hsv hsv; #ifdef _MSC_VER # pragma pack( pop, __YOF_COLOR_STRUCTURE__ ) #endif #ifdef __cplusplus } // namespace yoffy #endif #ifndef yof_BLOCK_BEGIN_TRACE /*! \brief yof_BLOCK_BEGIN_TRACE は定義されていません。 yof_BLOCK_BEGIN_TRACE は定義されていません。
yof_BLOCK_BEGIN の実行時には yof_BLOCK_BEGIN_TRACE(name) が呼ばれます。
デバッグ時などに yof_BLOCK_BEGIN_TRACE(name) を定義しておくことで yof_BLOCK_BEGIN の動作を追跡/フックすることが可能です。 */ # define yof_BLOCK_BEGIN_TRACE(name) #endif #ifndef yof_BLOCK_END_TRACE /*! \brief yof_BLOCK_END_TRACE は定義されていません。 yof_BLOCK_END_TRACE は定義されていません。
yof_BLOCK_END の実行時には yof_BLOCK_END_TRACE(name) が呼ばれます。
デバッグ時などに yof_BLOCK_END_TRACE(name) を定義しておくことで yof_BLOCK_END の動作を追跡/フックすることが可能です。 */ # define yof_BLOCK_END_TRACE(name) #endif #ifndef yof_BLOCK_BREAK_TRACE /*! \brief yof_BLOCK_BREAK_TRACE は定義されていません。 yof_BLOCK_BREAK_TRACE は定義されていません。
yof_BLOCK_BREAK の実行時には yof_BLOCK_BREAK_TRACE(name) が呼ばれます。
デバッグ時などに yof_BLOCK_BREAK_TRACE(name) を定義しておくことで yof_BLOCK_BREAK の動作を追跡/フックすることが可能です。 */ # define yof_BLOCK_BREAK_TRACE(name) #endif /*! \brief ブロックの開始 \param name ブロック名 C 言語のブロック構文「{」と同等です。
しかし読みづらくなるため、yof_BLOCK_BEGIN の前または後に「{」の記述をお勧めします。 \par 例1: yof_BLOCK_BEGIN( block1 ) { break; } yof_BLOCK_END( block1 ); \par 例2: yof_BLOCK_BEGIN( block1 ) { yof_BLOCK_BEGIN( block2 ) { yof_BLOCK_BREAK( block1 ); } yof_BLOCK_END( block2 ); printf( "never print" ); } yof_BLOCK_END( block1 ); */ #define yof_BLOCK_BEGIN(name) do { yof_BLOCK_BEGIN_TRACE(name); /*! \brief ブロックの終了 \param name ブロック名 C 言語のブロック構文「}」と同等です。
しかし読みづらくなるため、yof_BLOCK_END の前または後に「}」の記述をお勧めします。 */ #define yof_BLOCK_END(name) } while ( 0 ); name: yof_BLOCK_END_TRACE(name); /*! \brief ブロックの脱出 \param name ブロック名 ループや switch の構文で使われる break に似た働きをします。
break と違うところは、name で脱出するブロックを指定するため、 複数のブロックを一度に抜ける事ができます。
また、yof_BLOCK_BEGIN で記述されたブロックが一番内側のブロックの場合は break を使用することも可能です。 */ #define yof_BLOCK_BREAK(name) { yof_BLOCK_BREAK_TRACE(name); goto name; } /*! \def assert(flag) \brief MPW のバグにより NDEBUG 時に assert を使用すると、 最適化の行程で必要なコードまで削除されるので、それを防止する。 */ #ifdef NDEBUG # if defined(MPW_C) || defined(MPW_CPLUS) # ifdef assert # undef assert # define assert(flag) # endif # endif #endif /*! \def YOF_TRACE(string) \brief デバッガ出力への出力。標準出力への出力に使う puts() と似ている。 */ #ifndef NDEBUG # if yof_MAC # if yof_MAC < 10 # include # else # include # endif // yof_MAC < 10 # define YOF_TRACE(string) DebugAssert( COMPONENT_SIGNATURE, DEBUG_NO_OPTIONS, string, NULL, NULL, __FILE__, __LINE__, 0 ) # elif yof_WIN # define YOF_TRACE(string) OutputDebugString(string) # else # include # define YOF_TRACE(string) perror(string) # endif # define YOF_DEBUG_DO #else # define YOF_TRACE(string) # define YOF_DEBUG_DO if ( 0 ) #endif #ifdef _MSC_VER # pragma warning( pop ) #endif #endif // #ifndef YOF_TYPES