diff --git a/modules/contrib/src/inputoutput.cpp b/modules/contrib/src/inputoutput.cpp index a711f242ad7cd93dc7a586c463345ba2e9926dd5..0c8175352c1218eca083a6b9c265e965bfdc1172 100644 --- a/modules/contrib/src/inputoutput.cpp +++ b/modules/contrib/src/inputoutput.cpp @@ -16,10 +16,23 @@ namespace cv list.clear(); std::string path_f = path + "/" + exten; #ifdef WIN32 + #if HAVE_WINRT + WIN32_FIND_DATAW FindFileData; + #else WIN32_FIND_DATA FindFileData; - HANDLE hFind; - - hFind = FindFirstFile((LPCSTR)path_f.c_str(), &FindFileData); + #endif + HANDLE hFind; + + #ifdef HAVE_WINRT + size_t size = mbstowcs(NULL, path_f.c_str(), path_f.size()); + wchar_t* wpath = (wchar_t*)malloc((size+1)*sizeof(wchar_t)); + wpath[size] = 0; + mbstowcs(wpath, path_f.c_str(), path_f.size()); + hFind = FindFirstFileW(wpath, &FindFileData); + free(wpath); + #else + hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData); + #endif if (hFind == INVALID_HANDLE_VALUE) { return list; @@ -34,13 +47,29 @@ namespace cv FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM || FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY) { + char* fname; + #ifdef HAVE_WINRT + size_t asize = wcstombs(NULL, FindFileData.cFileName, 0); + char* fname = (char*)malloc((asize+1)*sizeof(char)); + fname[asize] = 0; + wcstombs(fname, FindFileData.cFileName, asize); + #else + fname = FindFileData.cFileName; + #endif if (addPath) - list.push_back(path + "/" + FindFileData.cFileName); + list.push_back(path + "/" + fname); else - list.push_back(FindFileData.cFileName); + list.push_back(fname); + #ifdef HAVE_WINRT + free(fname); + #endif } } - while(FindNextFile(hFind, &FindFileData)); + #ifdef HAVE_WINRT + while(FindNextFileW(hFind, &FindFileData)); + #else + while(FindNextFileA(hFind, &FindFileData)); + #endif FindClose(hFind); } #else @@ -75,10 +104,23 @@ namespace cv std::string path_f = path + "/" + exten; list.clear(); #ifdef WIN32 + #if HAVE_WINRT + WIN32_FIND_DATAW FindFileData; + #else WIN32_FIND_DATA FindFileData; + #endif HANDLE hFind; - hFind = FindFirstFile((LPCSTR)path_f.c_str(), &FindFileData); + #ifdef HAVE_WINRT + size_t size = mbstowcs(NULL, path_f.c_str(), path_f.size()); + wchar_t* wpath = (wchar_t*)malloc((size+1)*sizeof(wchar_t)); + wpath[size] = 0; + mbstowcs(wpath, path_f.c_str(), path_f.size()); + hFind = FindFirstFileW(wpath, &FindFileData); + free(wpath); + #else + hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData); + #endif if (hFind == INVALID_HANDLE_VALUE) { return list; @@ -91,13 +133,27 @@ namespace cv strcmp(FindFileData.cFileName, ".") != 0 && strcmp(FindFileData.cFileName, "..") != 0) { + char* fname; + #ifdef HAVE_WINRT + size_t asize = wcstombs(NULL, FindFileData.cFileName, 0); + char* fname = (char*)malloc((asize+1)*sizeof(char)); + fname[asize] = 0; + wcstombs(fname, FindFileData.cFileName, asize); + #else + fname = FindFileData.cFileName; + #endif + if (addPath) - list.push_back(path + "/" + FindFileData.cFileName); + list.push_back(path + "/" + fname); else - list.push_back(FindFileData.cFileName); + list.push_back(fname); } } - while(FindNextFile(hFind, &FindFileData)); + #ifdef HAVE_WINRT + while(FindNextFileW(hFind, &FindFileData)); + #else + while(FindNextFileA(hFind, &FindFileData)); + #endif FindClose(hFind); } diff --git a/modules/core/src/alloc.cpp b/modules/core/src/alloc.cpp index da89673f0249fd28596e2e214484833e0528e088..37b1e0db94704d62aaef77a8bd466317678fbb4e 100644 --- a/modules/core/src/alloc.cpp +++ b/modules/core/src/alloc.cpp @@ -42,10 +42,6 @@ #include "precomp.hpp" -#if (_WIN32_WINNT >= 0x0602) -#include -#endif - #define CV_USE_SYSTEM_MALLOC 1 namespace cv @@ -98,6 +94,10 @@ void fastFree(void* ptr) #define STAT(stmt) #ifdef WIN32 +#if (_WIN32_WINNT >= 0x0602) +#include +#endif + struct CriticalSection { CriticalSection() diff --git a/modules/core/src/rand.cpp b/modules/core/src/rand.cpp index 2cdbe3916d8b044687cf5715d77cee7782e84ade..54bb753a150b0ea4fa5bb652686622d066576de9 100644 --- a/modules/core/src/rand.cpp +++ b/modules/core/src/rand.cpp @@ -726,33 +726,54 @@ void RNG::fill( InputOutputArray _mat, int disttype, } #ifdef WIN32 + + +#ifdef HAVE_WINRT +// using C++11 thread attribute for local thread data +__declspec( thread ) RNG* rng = NULL; + + void deleteThreadRNGData() + { + if (rng) + delete rng; +} + +RNG& theRNG() +{ + if (!rng) + { + rng = new RNG; + } + return *rng; +} +#else #ifdef WINCE # define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) #endif static DWORD tlsRNGKey = TLS_OUT_OF_INDEXES; -void deleteThreadRNGData() -{ - if( tlsRNGKey != TLS_OUT_OF_INDEXES ) - delete (RNG*)TlsGetValue( tlsRNGKey ); + void deleteThreadRNGData() + { + if( tlsRNGKey != TLS_OUT_OF_INDEXES ) + delete (RNG*)TlsGetValue( tlsRNGKey ); } RNG& theRNG() { if( tlsRNGKey == TLS_OUT_OF_INDEXES ) { - tlsRNGKey = TlsAlloc(); - CV_Assert(tlsRNGKey != TLS_OUT_OF_INDEXES); + tlsRNGKey = TlsAlloc(); + CV_Assert(tlsRNGKey != TLS_OUT_OF_INDEXES); } RNG* rng = (RNG*)TlsGetValue( tlsRNGKey ); if( !rng ) { - rng = new RNG; - TlsSetValue( tlsRNGKey, rng ); + rng = new RNG; + TlsSetValue( tlsRNGKey, rng ); } return *rng; } - +#endif //HAVE_WINRT #else static pthread_key_t tlsRNGKey = 0; diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index da697af2edd203257dbdf2ea8633f59e35435bab..a90fb8b588693d77043141a1aeebd1b4b329b933 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -48,7 +48,7 @@ #endif #include #if (_WIN32_WINNT >= 0x0602) -#include + #include #endif #undef small #undef min @@ -80,8 +80,8 @@ #endif #ifdef HAVE_WINRT -#pragma comment(lib, "MinCore_Downlevel") #include +#pragma comment(lib, "MinCore_Downlevel") std::wstring GetTempPathWinRT() {