DLLEXPORT int reverseString(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) { mint i = 0, len = 0, n; if (string) libData->UTF8String_disown(string); string = MArgument_getUTF8String(Args[0]); while (string[len]) { /* Error for non ASCII string */ if (string[len] & 128) return LIBRARY_FUNCTION_ERROR; len++; } n = len/2; len--; /* For index origin 0 */ for (i = 0; i < n; i++) { char ci = string[i]; string[i] = string[len - i]; string[len - i] = ci; } MArgument_setUTF8String(Res, string); return 0; }
DLLEXPORT int encodeString(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) { mint i = 0, shift; if (string) libData->UTF8String_disown(string); string = MArgument_getUTF8String(Args[0]); shift = MArgument_getInteger(Args[1]); /* Find shift mod 127 so we only deal with positive numbers below */ shift = shift % 127; if (shift < 0) shift += 127; shift -= 1; while (string[i]) { mint c = (mint) string[i]; /* Error for non ASCII string */ if (c & 128) return LIBRARY_FUNCTION_ERROR; c = ((c + shift) % 127) + 1; string[i++] = (char) c; } MArgument_setUTF8String(Res, string); return 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; }
EXTERN_C DLLEXPORT int InitSourceReader(WolframLibraryData libData, mint Argc, MArgument * Args, MArgument Res) { // Get the arguments from MArgument char *videofile = MArgument_getUTF8String(Args[0]); // convert UTF8 filename to wide chars int size = MultiByteToWideChar(CP_ACP, 0, videofile, -1, NULL, 0); WCHAR* videofileW = new WCHAR[size]; size = MultiByteToWideChar(CP_ACP, 0, videofile, -1, videofileW, size); // Open the file hr = VR.initSourceReader(videofileW); // finished with the filename now delete videofileW; if (FAILED(hr)) { libData->Message("initsourcefail"); return LIBRARY_FUNCTION_ERROR; } // Return the duration and frame rate MTensor T0; mint dims[1] = {4}; mint pos[1]; libData->MTensor_new(MType_Real, 1, dims, &T0); pos[0] = 1; libData->MTensor_setReal(T0, pos, VR.m_duration); pos[0] = 2; libData->MTensor_setReal(T0, pos, VR.m_framerate); pos[0] = 3; libData->MTensor_setReal(T0, pos, VR.m_imagewidth); pos[0] = 4; libData->MTensor_setReal(T0, pos, VR.m_imageheight); MArgument_setMTensor(Res, T0); return LIBRARY_NO_ERROR; }
EXTERN_C DLLEXPORT int read_raw_image(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument res) { int err; int check; MImage out; char * file; libraw_data_t *iprc = libraw_init(0); libraw_processed_image_t * img; WolframImageLibrary_Functions imgFuns = libData->imageLibraryFunctions; err = LIBRARY_FUNCTION_ERROR; file = MArgument_getUTF8String(Args[0]); libraw_open_file(iprc, file); libraw_unpack(iprc); iprc->params.output_bps = 8; check = libraw_dcraw_process(iprc); if (check != LIBRAW_SUCCESS) goto cleanup; img = libraw_dcraw_make_mem_image(iprc, &check); if (img == NULL) goto cleanup; if (img->type != LIBRAW_IMAGE_BITMAP || img->colors != 3) goto cleanup; if (img->bits == 16) { raw_t_ubit16 * raw_data = (raw_t_ubit16*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit16, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getBit16Data(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit16)); } else if (img->bits == 8) { raw_t_ubit8 * raw_data = (raw_t_ubit8*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit8, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getByteData(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit8)); } else { goto cleanup; } MArgument_setMImage(res, out); err = LIBRARY_NO_ERROR; cleanup: libData->UTF8String_disown(file); libraw_dcraw_clear_mem(img); return err; }
EXTERN_C DLLEXPORT int InitSinkWriter(WolframLibraryData libData, mint Argc, MArgument * Args, MArgument Res) { // Get the arguments from MArgument char *videofile = MArgument_getUTF8String(Args[0]); // convert UTF8 filename to wide chars int size = MultiByteToWideChar(CP_ACP, 0, videofile, -1, NULL, 0); WCHAR* videofileW = new WCHAR[size]; size = MultiByteToWideChar(CP_ACP, 0, videofile, -1, videofileW, size); // extract the sink parameters mint encoder = MArgument_getInteger(Args[1]); mint width = MArgument_getInteger(Args[2]); mint height = MArgument_getInteger(Args[3]); mreal framerate = MArgument_getReal(Args[4]); mint kbps = MArgument_getInteger(Args[5]); hr = VW.setParams(encoder, width, height, framerate, kbps); if (FAILED(hr)) { libData->Message("setsinkparamsfail"); return LIBRARY_FUNCTION_ERROR; } // Initialise the sink writer hr = VW.initSinkWriter(videofileW); // finished with the filename now delete videofileW; if (FAILED(hr)) { libData->Message("initsinkfail"); return LIBRARY_FUNCTION_ERROR; } return LIBRARY_NO_ERROR; }