On windows, stbi__fopen opens a path containing non-English characters or symbols...
authorxspeed1989 <xspeed1989@gmail.com>
Wed, 24 Mar 2021 06:39:11 +0000 (14:39 +0800)
committerHermet Park <chuneon.park@samsung.com>
Mon, 29 Mar 2021 02:22:57 +0000 (11:22 +0900)
src/vector/stb/stb_image.h

index ae0c1e5..9ffa8c4 100644 (file)
@@ -1149,14 +1149,38 @@ static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, in
 
 static FILE *stbi__fopen(char const *filename, char const *mode)
 {
-   FILE *f;
-#if defined(_MSC_VER) && _MSC_VER >= 1400
-   if (0 != fopen_s(&f, filename, mode))
-      f=0;
-#else
-   f = fopen(filename, mode);
-#endif
-   return f;
+    FILE *f;
+#if defined(_MSC_VER)
+    DWORD cch =
+        MultiByteToWideChar(CP_UTF8, 0, filename, -1, nullptr, 0);
+    wchar_t *filenameU = new wchar_t[cch];
+    if(!filenameU)
+    {
+       return 0;
+    }
+    MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameU, cch);
+    cch = MultiByteToWideChar(CP_UTF8, 0, mode, -1, nullptr, 0);
+    wchar_t *modeU = new wchar_t[cch];
+    if(!modeU)
+    {
+       delete[] filenameU;
+       return 0;
+    }
+    MultiByteToWideChar(CP_UTF8, 0, mode, -1, modeU, cch);
+#if _MSC_VER >= 1400
+    if(0 != _wfopen_s(&f, filenameU, modeU))
+      f = 0;
+    delete[] filenameU;
+    delete[] modeU;
+#else // _MSC_VER >= 1400
+    f = _wfopen(filenameU, modeU);
+    delete[] filenameU;
+    delete[] modeU;
+#endif // _MSC_VER >= 1400
+#else // _MSC_VER
+    f = fopen(filename, mode);
+#endif //_MSC_VER
+    return f;
 }