Esempio n. 1
0
/**
 * http://en.wikipedia.org/wiki/Mandelbrot_set
 * @param _Real x
 * @param _Real y
 * @param _Integer maximum iterations
 * @return _Integer iterations until escape, 0 if it never escapes
 */
DLLEXPORT int mandelbrot(WolframLibraryData libData, mint Argc,
    MArgument *Args, MArgument Res)
{
	mreal re = MArgument_getReal(Args[0]);
	mreal im = MArgument_getReal(Args[1]);		
	mint  max_iters = MArgument_getInteger(Args[2]);
	
	mreal Z_im = 0.;
	mreal Z_re = 0.;
	mreal Z_im2 = 0.;
	mreal Z_re2 = 0.;
	
    mint iter = 0;
    for (; (iter < max_iters) && (Z_re2 + Z_im2 < 4); iter++) {
        Z_im = 2. * Z_im * Z_re + im;
        Z_re = Z_re2 - Z_im2 + re;
        
        Z_im2 = Z_im * Z_im;
        Z_re2 = Z_re * Z_re;
    }

    if (iter == max_iters) 
        iter = 0;

    MArgument_setInteger(Res, iter);
    return LIBRARY_NO_ERROR;
}
Esempio n. 2
0
DLLEXPORT int incrementInteger(WolframLibraryData libData, mint Argc, MArgument * Args, MArgument Res) {
   mint I0;
   mint I1;
   I0 = MArgument_getInteger(Args[0]);
   I1 = I0 + 1;
   MArgument_setInteger(Res, I1);
   return LIBRARY_NO_ERROR;
}
Esempio n. 3
0
DLLEXPORT int demo_MintSize(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
	mint res;
	int err = LIBRARY_NO_ERROR;

	res = sizeof(res);
	MArgument_setInteger(Res, res);
	return err;
}
Esempio n. 4
0
/* Gets the I0th element of T0, returning that value */
DLLEXPORT int demo_T_I(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
	MTensor T0;
	mint I0, res;
	int err = LIBRARY_NO_ERROR;

	T0 = MArgument_getMTensor(Args[0]);
	I0 = MArgument_getInteger(Args[1]);
	err = libData->MTensor_getInteger(T0, &I0, &res);
	MArgument_setInteger(Res, res);
	return err;
}
DLLEXPORT int start_secondary_int_background_task(WolframLibraryData libData,
	mint Argc, MArgument *Args, MArgument Res) 
{
	mint asyncObjID;
	WolframIOLibrary_Functions ioLibrary = libData->ioLibraryFunctions;
	if(Argc != 1)
		return LIBRARY_FUNCTION_ERROR;
	s_secondaryAsyncObjEventData = MArgument_getInteger(Args[1]);
	asyncObjID = ioLibrary->createAsynchronousTaskWithoutThread();
	s_secondaryAsyncObjID = asyncObjID;
	MArgument_setInteger(Res, asyncObjID);
	return LIBRARY_NO_ERROR;
}
Esempio n. 6
0
EXTERN_C DLLEXPORT int SendFrame(WolframLibraryData libData, mint Argc, MArgument * Args, MArgument Res) {

	MTensor T0 = MArgument_getMTensor(Args[0]);
    mint len = libData->MTensor_getFlattenedLength(T0);

	// check that we have the right amount of data
	UINT32 expectedlength = VW.m_height * VW.m_width * 3;

	if (len != (mint) expectedlength)
	{
		libData->Message("dimensionsfail");
		return LIBRARY_FUNCTION_ERROR;
	}

	// get a buffer
	BYTE *pData = NULL;
	hr = VW.getWriteBuffer(&pData);
	if (FAILED(hr))
	{
		libData->Message("getwritebufferfail");
		return LIBRARY_FUNCTION_ERROR;
	}

	// fill the buffer
	mint *mtdata;
    int npixels = len / 3;
    mtdata = libData->MTensor_getIntegerData(T0);
               
    for (int i = 0; i < npixels; i++) {
		// we read R, G, B bytes and put B, G, R, A into the pixel buffer
		pData[4 * i + 2] = (BYTE) mtdata[3 * i    ]; // R
        pData[4 * i + 1] = (BYTE) mtdata[3 * i + 1]; // G
        pData[4 * i    ] = (BYTE) mtdata[3 * i + 2]; // B
        pData[4 * i + 3] = 0;						 // A
	}             
	
	// write the sample
	hr = VW.writeFrame(pData);
	if (FAILED(hr))
	{
		libData->Message("writeFramefail");
		return LIBRARY_FUNCTION_ERROR;
	}

	// return the timestamp to Mathematica
	MArgument_setInteger(Res, VW.m_rtStart);

	return LIBRARY_NO_ERROR;
} 
Esempio n. 7
0
DLLEXPORT int start_real_background_task(WolframLibraryData libData,
	mint Argc, MArgument *Args, MArgument Res) 
{
	mint asyncObjID;
	WolframIOLibrary_Functions ioLibrary = libData->ioLibraryFunctions;
	RealBackgroundArgs threadArg = (RealBackgroundArgs)malloc(sizeof *threadArg);
	if(Argc != 2)
		return LIBRARY_FUNCTION_ERROR;
	threadArg->ioLibrary = ioLibrary;
	threadArg->pausemillis = MArgument_getInteger(Args[0]);
	threadArg->eventdata = MArgument_getReal(Args[1]);
	asyncObjID = ioLibrary->createAsynchronousTaskWithThread(RealBackgroundTask, threadArg);
	MArgument_setInteger(Res, asyncObjID);
	return LIBRARY_NO_ERROR;
}
Esempio n. 8
0
/* Gets the I0,I1 th integer element of T0 returning that value */
DLLEXPORT int demo_TII_I(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
	MTensor T0;
	mint I0, I1, res;
	mint dims[2];
	int err = LIBRARY_NO_ERROR;

	T0 = MArgument_getMTensor(Args[0]);
	I0 = MArgument_getInteger(Args[1]);
	I1 = MArgument_getInteger(Args[2]);
	dims[0] = I0;
	dims[1] = I1;
	err = libData->MTensor_getInteger(T0, dims, &res);
	MArgument_setInteger(Res, res);
	return err;
}
Esempio n. 9
0
DLLEXPORT int mandelbrot(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
	mint n = 0;
	mcomplex z = {0.,0.};
	mcomplex c = MArgument_getComplex(Args[0]);
	mreal rr = mcreal(z)*mcreal(z);
	mreal ii = mcimag(z)*mcimag(z);
	while ((n < mandelbrot_max_iterations) && (rr + ii < 4)) {
		mcimag(z) = 2.*mcreal(z)*mcimag(z) + mcimag(c);
		mcreal(z) = rr - ii + mcreal(c);
		rr = mcreal(z)*mcreal(z);
		ii = mcimag(z)*mcimag(z);
		n++;
	}

	if (n == mandelbrot_max_iterations) 
		n = 0;

	MArgument_setInteger(Res, n);
	return LIBRARY_NO_ERROR;
}
Esempio n. 10
0
DLLEXPORT int countSubstring(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
	char *instring = MArgument_getUTF8String(Args[0]);
	char *substring = MArgument_getUTF8String(Args[1]);
	mint i, n = strlen(instring);
	mint slen = strlen(substring);
	mint c = 0;

	if (n > slen) {
		n -= slen;
		for (i = 0; i <= n; i++) {
			if (!strncmp(instring + i, substring, slen)) {
				c++;
			}
		}
	}

	MArgument_setInteger(Res, c);

	libData->UTF8String_disown(instring);
	libData->UTF8String_disown(substring);
	
	return 0;
}
Esempio n. 11
0
/* Sets the output to the number of arguments passed in to the function */
DLLEXPORT int demoNoInput(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
	MArgument_setInteger(Res, Argc);
	return LIBRARY_NO_ERROR;
}
Esempio n. 12
0
/* Accepts no inputs, but returns a result */
DLLEXPORT int demoNoArguments(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res)
{
	mint b = Argc;
	MArgument_setInteger(Res, b);
	return LIBRARY_NO_ERROR;
}