[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45012] trunk/blender: Adds support for utf paths on Windows.

Alexander Kuznetsov kuzsasha at gmail.com
Tue Mar 20 03:17:43 CET 2012


Revision: 45012
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45012
Author:   alexk
Date:     2012-03-20 02:17:37 +0000 (Tue, 20 Mar 2012)
Log Message:
-----------
Adds support for utf paths on Windows.

Not all file formats/calls are supported yet. It will be expended.

Please from now on use BLI_fopen, BLI_* for file manipulations.
For non-windows systems BLI_fopen just calls fopen.
For Windows, the utf-8 string is translated to utf-16 string in order to call UTF version of the function.

Modified Paths:
--------------
    trunk/blender/build_files/scons/tools/Blender.py
    trunk/blender/intern/CMakeLists.txt
    trunk/blender/intern/SConscript
    trunk/blender/intern/ghost/CMakeLists.txt
    trunk/blender/intern/ghost/SConscript
    trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenkernel/intern/customdata_file.c
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/movieclip.c
    trunk/blender/source/blender/blenkernel/intern/packedFile.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/pointcache.c
    trunk/blender/source/blender/blenkernel/intern/text.c
    trunk/blender/source/blender/blenlib/BLI_fileops.h
    trunk/blender/source/blender/blenlib/BLI_winstuff.h
    trunk/blender/source/blender/blenlib/CMakeLists.txt
    trunk/blender/source/blender/blenlib/SConscript
    trunk/blender/source/blender/blenlib/intern/dynlib.c
    trunk/blender/source/blender/blenlib/intern/fileops.c
    trunk/blender/source/blender/blenlib/intern/path_util.c
    trunk/blender/source/blender/blenlib/intern/storage.c
    trunk/blender/source/blender/blenlib/intern/winstuff.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/runtime.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/armature/reeb.c
    trunk/blender/source/blender/editors/curve/editfont.c
    trunk/blender/source/blender/editors/physics/physics_fluid.c
    trunk/blender/source/blender/editors/space_file/fsmenu.c
    trunk/blender/source/blender/editors/space_text/text_ops.c
    trunk/blender/source/blender/imbuf/CMakeLists.txt
    trunk/blender/source/blender/imbuf/SConscript
    trunk/blender/source/blender/imbuf/intern/bmp.c
    trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
    trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c
    trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c
    trunk/blender/source/blender/imbuf/intern/indexer.c
    trunk/blender/source/blender/imbuf/intern/iris.c
    trunk/blender/source/blender/imbuf/intern/jp2.c
    trunk/blender/source/blender/imbuf/intern/jpeg.c
    trunk/blender/source/blender/imbuf/intern/png.c
    trunk/blender/source/blender/imbuf/intern/radiance_hdr.c
    trunk/blender/source/blender/imbuf/intern/readimage.c
    trunk/blender/source/blender/imbuf/intern/targa.c
    trunk/blender/source/blender/imbuf/intern/thumbs.c
    trunk/blender/source/blender/imbuf/intern/thumbs_blend.c
    trunk/blender/source/blender/imbuf/intern/util.c
    trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c
    trunk/blender/source/blender/python/intern/bpy_interface.c
    trunk/blender/source/blender/render/intern/source/voxeldata.c
    trunk/blender/source/blender/windowmanager/CMakeLists.txt
    trunk/blender/source/blender/windowmanager/SConscript
    trunk/blender/source/blender/windowmanager/intern/wm_files.c
    trunk/blender/source/creator/CMakeLists.txt
    trunk/blender/source/creator/creator.c

Added Paths:
-----------
    trunk/blender/intern/utfconv/
    trunk/blender/intern/utfconv/CMakeLists.txt
    trunk/blender/intern/utfconv/SConscript
    trunk/blender/intern/utfconv/utf_winfunc.c
    trunk/blender/intern/utfconv/utf_winfunc.h
    trunk/blender/intern/utfconv/utfconv.c
    trunk/blender/intern/utfconv/utfconv.h

Modified: trunk/blender/build_files/scons/tools/Blender.py
===================================================================
--- trunk/blender/build_files/scons/tools/Blender.py	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/build_files/scons/tools/Blender.py	2012-03-20 02:17:37 UTC (rev 45012)
@@ -340,6 +340,7 @@
 
     if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
         incs.append(env['BF_PTHREADS_INC'])
+        incs.append('#/intern/utfconv')
 
     env.Append(CPPDEFINES=defs)
     env.Append(CPPPATH=incs)

Modified: trunk/blender/intern/CMakeLists.txt
===================================================================
--- trunk/blender/intern/CMakeLists.txt	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/CMakeLists.txt	2012-03-20 02:17:37 UTC (rev 45012)
@@ -66,3 +66,8 @@
 	add_subdirectory(cycles)
 endif()
 
+
+#Only Windows needs utf16 converter
+if(WIN32)
+	add_subdirectory(utfconv)
+endif()
\ No newline at end of file

Modified: trunk/blender/intern/SConscript
===================================================================
--- trunk/blender/intern/SConscript	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/SConscript	2012-03-20 02:17:37 UTC (rev 45012)
@@ -3,6 +3,7 @@
 
 SConscript(['audaspace/SConscript',
             'string/SConscript',
+			'utfconv/SConscript',
             'ghost/SConscript',
             'guardedalloc/SConscript',
             'moto/SConscript',

Modified: trunk/blender/intern/ghost/CMakeLists.txt
===================================================================
--- trunk/blender/intern/ghost/CMakeLists.txt	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/CMakeLists.txt	2012-03-20 02:17:37 UTC (rev 45012)
@@ -281,6 +281,10 @@
 		${WINTAB_INC}
 	)
 
+	list(APPEND INC
+		../utfconv
+	)
+
 	list(APPEND SRC
 		intern/GHOST_DisplayManagerWin32.cpp
 		intern/GHOST_SystemWin32.cpp

Modified: trunk/blender/intern/ghost/SConscript
===================================================================
--- trunk/blender/intern/ghost/SConscript	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/SConscript	2012-03-20 02:17:37 UTC (rev 45012)
@@ -110,6 +110,7 @@
 
 if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'):
     incs = env['BF_WINTAB_INC'] + ' ' + incs
+    incs += ' ../utfconv'
 
 if window_system in ('win32-vc', 'win64-vc'):
     env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15]) #, cc_compileflags=env['CCFLAGS'].append('/WX') )

Modified: trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp	2012-03-20 02:17:37 UTC (rev 45012)
@@ -34,6 +34,9 @@
 #include "GHOST_DropTargetWin32.h"
 #include <ShellApi.h>
 
+#include "utf_winfunc.h"
+#include "utfconv.h"
+
 #ifdef GHOST_DEBUG
 // utility
 void printLastError(void);
@@ -267,20 +270,12 @@
 			{
 				if ( ::DragQueryFileW ( hdrop, nfile, fpath, MAX_PATH ) > 0 )
 				{
-					if ( !WideCharToANSI(fpath, temp_path) )
+					if ( !(temp_path = alloc_utf_8_from_16(fpath, 0)) )
 					{
 						continue;
 					} 
 					// Just ignore paths that could not be converted verbatim.
-					if (strpbrk(temp_path, "?"))
-					{
-#ifdef GHOST_DEBUG
-						::printf("\ndiscarding path that contains illegal characters: %s", temp_path);
-#endif // GHOST_DEBUG
-						::free(temp_path);
-						temp_path = NULL;
-						continue;
-					}
+
 					strArray->strings[nvalid] = (GHOST_TUns8*) temp_path;
 					strArray->count = nvalid+1;
 					nvalid++;
@@ -309,7 +304,7 @@
 		if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
 		{
 			LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal);
-			if ( !WideCharToANSI(wstr, tmp_string) )
+			if ( !(tmp_string = alloc_utf_8_from_16((wchar_t*)wstr, 0)) )
 			{
 				::GlobalUnlock(stgmed.hGlobal);
 				return NULL;

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp	2012-03-20 02:17:37 UTC (rev 45012)
@@ -35,6 +35,7 @@
 #define _WIN32_IE 0x0501
 #endif
 #include <shlobj.h>
+#include "utfconv.h"
 
 #if defined(__MINGW32__) || defined(__CYGWIN__)
 
@@ -70,11 +71,14 @@
 
 const GHOST_TUns8* GHOST_SystemPathsWin32::getSystemDir() const
 {
-	static char knownpath[MAX_PATH];
-	HRESULT hResult = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath);
+	static char knownpath[MAX_PATH*3] = {0}; /* 1 utf-16 might translante into 3 utf-8. 2 utf-16 translates into 4 utf-8*/
+	wchar_t knownpath_16[MAX_PATH];
 
+	HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16);
+
 	if (hResult == S_OK)
 	{
+		conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3);
 		return (GHOST_TUns8*)knownpath;
 	}
 
@@ -83,11 +87,14 @@
 
 const GHOST_TUns8* GHOST_SystemPathsWin32::getUserDir() const
 {
-	static char knownpath[MAX_PATH];
-	HRESULT hResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath);
+	static char knownpath[MAX_PATH*3] = {0};
+	wchar_t  knownpath_16[MAX_PATH];
 
+	HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16);
+
 	if (hResult == S_OK)
 	{
+		conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3);
 		return (GHOST_TUns8*)knownpath;
 	}
 
@@ -96,8 +103,11 @@
 
 const GHOST_TUns8* GHOST_SystemPathsWin32::getBinaryDir() const
 {
-	static char fullname[MAX_PATH];
-	if(GetModuleFileName(0, fullname, MAX_PATH)) {
+	static char fullname[MAX_PATH*3] = {0};
+	wchar_t  fullname_16[MAX_PATH*3];
+
+	if(GetModuleFileNameW(0, fullname_16, MAX_PATH)) {
+		conv_utf_16_to_8(fullname_16,fullname,MAX_PATH*3);
 		return (GHOST_TUns8*)fullname;
 	}
 
@@ -107,5 +117,7 @@
 void GHOST_SystemPathsWin32::addToSystemRecentFiles(const char* filename) const
 {
 	/* SHARD_PATH resolves to SHARD_PATHA for non-UNICODE build */
-	SHAddToRecentDocs(SHARD_PATH,filename);
+	UTF16_ENCODE(filename)
+	SHAddToRecentDocs(SHARD_PATHW,filename_16);
+	UTF16_UN_ENCODE(filename)
 }

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2012-03-20 02:17:37 UTC (rev 45012)
@@ -60,6 +60,8 @@
 #endif
 #endif
 
+#include "utfconv.h"
+
 #include "GHOST_DisplayManagerWin32.h"
 #include "GHOST_EventButton.h"
 #include "GHOST_EventCursor.h"
@@ -292,8 +294,8 @@
 		}
 
 		// Process all the events waiting for us
-		while (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE) != 0) {
-			::DispatchMessage(&msg);
+		while (::PeekMessageW(&msg, 0, 0, 0, PM_REMOVE) != 0) {
+			::DispatchMessageW(&msg);
 			anyProcessed = true;
 		}
 	} while (waitForEvent && !anyProcessed);
@@ -394,7 +396,7 @@
 	}
 
 	if (success) {
-		WNDCLASS wc;
+		WNDCLASSW wc;
 		wc.style= CS_HREDRAW | CS_VREDRAW;
 		wc.lpfnWndProc= s_wndProc;
 		wc.cbClsExtra= 0;
@@ -408,10 +410,10 @@
 		wc.hCursor = ::LoadCursor(0, IDC_ARROW);
 		wc.hbrBackground= (HBRUSH)::GetStockObject(BLACK_BRUSH);
 		wc.lpszMenuName = 0;
-		wc.lpszClassName= GHOST_WindowWin32::getWindowClassName();
+		wc.lpszClassName= L"GHOST_WindowClass";
 
 		// Use RegisterClassEx for setting small icon
-		if (::RegisterClass(&wc) == 0) {
+		if (::RegisterClassW(&wc) == 0) {
 			success = GHOST_kFailure;
 		}
 	}
@@ -719,16 +721,18 @@
 		char utf8_char[6] = {0};
 		char ascii = 0;
 
-		wchar_t utf16[2]={0};
+		wchar_t utf16[3]={0};
 		BYTE state[256] ={0};
-		GetKeyboardState(state);  
+		int r;
+		GetKeyboardState((PBYTE)state);  
 
-		if(ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout))
-			WideCharToMultiByte(CP_UTF8, 0, 
-									(wchar_t*)utf16, 1,
-									(LPSTR) utf8_char, 5,
-									NULL,NULL); else *utf8_char = 0;
+		if(r = ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout))
 
+									if((r>0 && r<3)){utf16[r]=0;
+										
+										conv_utf_16_to_8(utf16,utf8_char,6);}
+									else if (r==-1)  utf8_char[0] = '\0';
+
 		
 
 		if(!keyDown) {utf8_char[0] = '\0'; ascii='\0';}
@@ -1189,8 +1193,7 @@
 					 * DefWindowProc returns. 
 					 */
 					break;
-					
-				////////////////////////////////////////////////////////////////////////
+									////////////////////////////////////////////////////////////////////////
 				// Other events
 				////////////////////////////////////////////////////////////////////////
 				case WM_GETTEXT:
@@ -1239,17 +1242,17 @@
 	}
 
 	if (!eventHandled)
-		lResult = ::DefWindowProc(hwnd, msg, wParam, lParam);
+		lResult = ::DefWindowProcW(hwnd, msg, wParam, lParam);
 
 	return lResult;
 }
 
 GHOST_TUns8* GHOST_SystemWin32::getClipboard(bool selection) const 
 {
-	wchar_t *buffer;
 	char *temp_buff;
 	
 	if ( IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL) ) {
+		wchar_t *buffer;
 		size_t len = 0;
 		HANDLE hData = GetClipboardData( CF_UNICODETEXT );
 		if (hData == NULL) {
@@ -1262,9 +1265,7 @@
 			return NULL;
 		}
 		
-		len = WideCharToMultiByte(CP_UTF8, 0, buffer, -1, NULL, 0, NULL, NULL);
-		temp_buff = (char*) malloc(len);
-		WideCharToMultiByte(CP_UTF8, 0, buffer, -1, temp_buff, len, NULL, NULL);
+		temp_buff = alloc_utf_8_from_16(buffer,0);
 		
 		/* Buffer mustn't be accessed after CloseClipboard
 		   it would like accessing free-d memory */
@@ -1272,6 +1273,31 @@
 		CloseClipboard();
 		
 		return (GHOST_TUns8*)temp_buff;
+	} else if ( IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL) ) {
+		char *buffer;
+		size_t len = 0;
+		HANDLE hData = GetClipboardData( CF_TEXT );
+		if (hData == NULL) {
+			CloseClipboard();
+			return NULL;
+		}
+		buffer = (char*)GlobalLock( hData );
+		if (!buffer) {
+			CloseClipboard();
+			return NULL;
+		}
+		
+		len = strlen(buffer);
+		temp_buff = (char*) malloc(len+1);
+		strncpy(temp_buff, buffer, len);
+		temp_buff[len] = '\0';
+		
+		/* Buffer mustn't be accessed after CloseClipboard
+		   it would like accessing free-d memory */
+		GlobalUnlock( hData );
+		CloseClipboard();
+		
+		return (GHOST_TUns8*)temp_buff;
 	} else {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list