/** * 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; }
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; }
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; }
/* 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; }
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; }
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; }
/* 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; }
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; }
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; }
/* 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; }
/* 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; }