#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};