@ -1326,6 +1326,64 @@ ImU32 ImHash(const void* data, int data_size, ImU32 seed)
return ~ crc ;
}
FILE * ImFileOpen ( const char * filename , const char * mode )
{
# if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__)
// We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can)
const int filename_wsize = ImTextCountCharsFromUtf8 ( filename , NULL ) + 1 ;
const int mode_wsize = ImTextCountCharsFromUtf8 ( mode , NULL ) + 1 ;
ImVector < ImWchar > buf ;
buf . resize ( filename_wsize + mode_wsize ) ;
ImTextStrFromUtf8 ( & buf [ 0 ] , filename_wsize , filename , NULL ) ;
ImTextStrFromUtf8 ( & buf [ filename_wsize ] , mode_wsize , mode , NULL ) ;
return _wfopen ( ( wchar_t * ) & buf [ 0 ] , ( wchar_t * ) & buf [ filename_wsize ] ) ;
# else
return fopen ( filename , mode ) ;
# endif
}
// Load file content into memory
// Memory allocated with ImGui::MemAlloc(), must be freed by user using ImGui::MemFree()
void * ImFileLoadToMemory ( const char * filename , const char * file_open_mode , size_t * out_file_size , int padding_bytes )
{
IM_ASSERT ( filename & & file_open_mode ) ;
if ( out_file_size )
* out_file_size = 0 ;
FILE * f ;
if ( ( f = ImFileOpen ( filename , file_open_mode ) ) = = NULL )
return NULL ;
long file_size_signed ;
if ( fseek ( f , 0 , SEEK_END ) | | ( file_size_signed = ftell ( f ) ) = = - 1 | | fseek ( f , 0 , SEEK_SET ) )
{
fclose ( f ) ;
return NULL ;
}
size_t file_size = ( size_t ) file_size_signed ;
void * file_data = ImGui : : MemAlloc ( file_size + padding_bytes ) ;
if ( file_data = = NULL )
{
fclose ( f ) ;
return NULL ;
}
if ( fread ( file_data , 1 , file_size , f ) ! = file_size )
{
fclose ( f ) ;
ImGui : : MemFree ( file_data ) ;
return NULL ;
}
if ( padding_bytes > 0 )
memset ( ( void * ) ( ( ( char * ) file_data ) + file_size ) , 0 , ( size_t ) padding_bytes ) ;
fclose ( f ) ;
if ( out_file_size )
* out_file_size = file_size ;
return file_data ;
}
//-----------------------------------------------------------------------------
// HELPERS/UTILITIES (ImText* helpers)
//-----------------------------------------------------------------------------
@ -1509,64 +1567,6 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e
return bytes_count ;
}
FILE * ImFileOpen ( const char * filename , const char * mode )
{
# if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__)
// We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can)
const int filename_wsize = ImTextCountCharsFromUtf8 ( filename , NULL ) + 1 ;
const int mode_wsize = ImTextCountCharsFromUtf8 ( mode , NULL ) + 1 ;
ImVector < ImWchar > buf ;
buf . resize ( filename_wsize + mode_wsize ) ;
ImTextStrFromUtf8 ( & buf [ 0 ] , filename_wsize , filename , NULL ) ;
ImTextStrFromUtf8 ( & buf [ filename_wsize ] , mode_wsize , mode , NULL ) ;
return _wfopen ( ( wchar_t * ) & buf [ 0 ] , ( wchar_t * ) & buf [ filename_wsize ] ) ;
# else
return fopen ( filename , mode ) ;
# endif
}
// Load file content into memory
// Memory allocated with ImGui::MemAlloc(), must be freed by user using ImGui::MemFree()
void * ImFileLoadToMemory ( const char * filename , const char * file_open_mode , size_t * out_file_size , int padding_bytes )
{
IM_ASSERT ( filename & & file_open_mode ) ;
if ( out_file_size )
* out_file_size = 0 ;
FILE * f ;
if ( ( f = ImFileOpen ( filename , file_open_mode ) ) = = NULL )
return NULL ;
long file_size_signed ;
if ( fseek ( f , 0 , SEEK_END ) | | ( file_size_signed = ftell ( f ) ) = = - 1 | | fseek ( f , 0 , SEEK_SET ) )
{
fclose ( f ) ;
return NULL ;
}
size_t file_size = ( size_t ) file_size_signed ;
void * file_data = ImGui : : MemAlloc ( file_size + padding_bytes ) ;
if ( file_data = = NULL )
{
fclose ( f ) ;
return NULL ;
}
if ( fread ( file_data , 1 , file_size , f ) ! = file_size )
{
fclose ( f ) ;
ImGui : : MemFree ( file_data ) ;
return NULL ;
}
if ( padding_bytes > 0 )
memset ( ( void * ) ( ( ( char * ) file_data ) + file_size ) , 0 , ( size_t ) padding_bytes ) ;
fclose ( f ) ;
if ( out_file_size )
* out_file_size = file_size ;
return file_data ;
}
//-----------------------------------------------------------------------------
// COLOR FUNCTIONS
//-----------------------------------------------------------------------------