123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #include "blending.h"
- #if !defined(WIN32) && !defined(LINUX)
- #error port me!
- #endif
- class BlenderInit
- {
- public:
- BlenderInit() { Blenders::init(); }
- };
- static BlenderInit blender_init;
- void Blenders::init()
- {
- if (!alphatable[127][127])
- {
- int i, j;
- for (j = 0;j < 256;j++)
- for (i = 0;i < 256;i++)
- alphatable[i][j] = (i * (j + 1)) >> 8;
- #ifndef NO_MMX
- DWORD retval1, retval2;
- #ifdef WIN32
- __try {
- _asm {
- mov eax, 1 // set up CPUID to return processor version and features
- // 0 = vendor string, 1 = version info, 2 = cache info
- _emit 0x0f // code bytes = 0fh, 0a2h
- _emit 0xa2
- mov retval1, eax
- mov retval2, edx
- }
- } __except(EXCEPTION_EXECUTE_HANDLER) { retval1 = retval2 = 0;}
- #else
- __asm__ volatile ( "movl $1, %%eax\n"
- ".byte 15, 162\n"
- "movl %%eax, %0\n"
- "movl %%edx, %1\n"
- : "=m" (retval1), "=m" (retval2)
- : // No inputs...
- : "%eax", "%edx" );
- #endif
- mmx_available = retval1 && (retval2 & 0x800000);
- #endif //ndef NO_MMX
- }
- }
- #ifndef NO_MMX
- int Blenders::mmx_available = 0;
- #endif
- unsigned char Blenders::alphatable[256][256] = {0};
|