@ -1072,7 +1072,7 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)
}
//-----------------------------------------------------------------------------
// HELPERS
// HELPERS /UTILITIES
//-----------------------------------------------------------------------------
ImVec2 ImLineClosestPoint ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & p )
@ -1473,6 +1473,68 @@ 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__)
// 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
//-----------------------------------------------------------------------------
ImVec4 ImGui : : ColorConvertU32ToFloat4 ( ImU32 in )
{
float s = 1.0f / 255.0f ;
@ -1493,38 +1555,6 @@ ImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in)
return out ;
}
ImU32 ImGui : : GetColorU32 ( ImGuiCol idx , float alpha_mul )
{
ImGuiStyle & style = GImGui - > Style ;
ImVec4 c = style . Colors [ idx ] ;
c . w * = style . Alpha * alpha_mul ;
return ColorConvertFloat4ToU32 ( c ) ;
}
ImU32 ImGui : : GetColorU32 ( const ImVec4 & col )
{
ImGuiStyle & style = GImGui - > Style ;
ImVec4 c = col ;
c . w * = style . Alpha ;
return ColorConvertFloat4ToU32 ( c ) ;
}
const ImVec4 & ImGui : : GetStyleColorVec4 ( ImGuiCol idx )
{
ImGuiStyle & style = GImGui - > Style ;
return style . Colors [ idx ] ;
}
ImU32 ImGui : : GetColorU32 ( ImU32 col )
{
float style_alpha = GImGui - > Style . Alpha ;
if ( style_alpha > = 1.0f )
return col ;
ImU32 a = ( col & IM_COL32_A_MASK ) > > IM_COL32_A_SHIFT ;
a = ( ImU32 ) ( a * style_alpha ) ; // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.
return ( col & ~ IM_COL32_A_MASK ) | ( a < < IM_COL32_A_SHIFT ) ;
}
// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592
// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv
void ImGui : : ColorConvertRGBtoHSV ( float r , float g , float b , float & out_h , float & out_s , float & out_v )
@ -1576,62 +1606,36 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float&
}
}
FILE* ImFileOpen ( const char * filename , const char * mode )
ImU32 ImGui : : GetColorU32 ( ImGuiCol idx , float alpha_mul )
{
# if defined(_WIN32) && !defined(__CYGWIN__)
// 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
ImGuiStyle & style = GImGui - > Style ;
ImVec4 c = style . Colors [ idx ] ;
c . w * = style . Alpha * alpha_mul ;
return ColorConvertFloat4ToU32 ( c ) ;
}
// 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 )
ImU32 ImGui : : GetColorU32 ( const ImVec4 & col )
{
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 ) ;
ImGuiStyle & style = GImGui - > Style ;
ImVec4 c = col ;
c . w * = style . Alpha ;
return ColorConvertFloat4ToU32 ( c ) ;
}
fclose ( f ) ;
if ( out_file_size )
* out_file_size = file_size ;
const ImVec4 & ImGui : : GetStyleColorVec4 ( ImGuiCol idx )
{
ImGuiStyle & style = GImGui - > Style ;
return style . Colors [ idx ] ;
}
return file_data ;
ImU32 ImGui : : GetColorU32 ( ImU32 col )
{
float style_alpha = GImGui - > Style . Alpha ;
if ( style_alpha > = 1.0f )
return col ;
ImU32 a = ( col & IM_COL32_A_MASK ) > > IM_COL32_A_SHIFT ;
a = ( ImU32 ) ( a * style_alpha ) ; // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.
return ( col & ~ IM_COL32_A_MASK ) | ( a < < IM_COL32_A_SHIFT ) ;
}
//-----------------------------------------------------------------------------
@ -8209,6 +8213,26 @@ void ImGui::NewLine()
window - > DC . LayoutType = backup_layout_type ;
}
void ImGui : : Indent ( float indent_w )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . Indent . x + = ( indent_w ! = 0.0f ) ? indent_w : g . Style . IndentSpacing ;
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
void ImGui : : Unindent ( float indent_w )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . Indent . x - = ( indent_w ! = 0.0f ) ? indent_w : g . Style . IndentSpacing ;
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
//-----------------------------------------------------------------------------
// COLUMNS
//-----------------------------------------------------------------------------
void ImGui : : NextColumn ( )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -8527,22 +8551,6 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
BeginColumns ( id , columns_count , flags ) ;
}
void ImGui : : Indent ( float indent_w )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . Indent . x + = ( indent_w ! = 0.0f ) ? indent_w : g . Style . IndentSpacing ;
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
void ImGui : : Unindent ( float indent_w )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . Indent . x - = ( indent_w ! = 0.0f ) ? indent_w : g . Style . IndentSpacing ;
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
//-----------------------------------------------------------------------------
// DRAG AND DROP
//-----------------------------------------------------------------------------