mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Moved IM_MALLOC/IM_FREE/etc. to IO structure members one can set at runtime.
This commit is contained in:
		
							
								
								
									
										10
									
								
								imconfig.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								imconfig.h
									
									
									
									
									
								
							| @@ -1,14 +1,11 @@ | |||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| // USER IMPLEMENTATION | // USER IMPLEMENTATION | ||||||
|  | // This file contains compile-time options for ImGui. | ||||||
|  | // Other options (memory allocation overrides, callbacks, etc.) can be set at runtime via the ImGuiIO structure - ImGui::GetIO(). | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| //---- Define your own malloc/free/realloc functions if you want to override internal memory allocations for ImGui |  | ||||||
| //#define IM_MALLOC(_SIZE)			MyMalloc(_SIZE)			// void* MyMalloc(size_t size); |  | ||||||
| //#define IM_FREE(_PTR)				MyFree(_PTR)			// void MyFree(void *ptr); |  | ||||||
| //#define IM_REALLOC(_PTR, _SIZE)	MyRealloc(_PTR, _SIZE)	// void* MyRealloc(void *ptr, size_t size); |  | ||||||
|  |  | ||||||
| //---- Define your own ImVector<> type if you don't want to use the provided implementation defined in imgui.h | //---- Define your own ImVector<> type if you don't want to use the provided implementation defined in imgui.h | ||||||
| //#include <vector> | //#include <vector> | ||||||
| //#define ImVector  std::vector | //#define ImVector  std::vector | ||||||
| @@ -17,7 +14,7 @@ | |||||||
| //---- Define assertion handler. Defaults to calling assert(). | //---- Define assertion handler. Defaults to calling assert(). | ||||||
| //#define IM_ASSERT(_EXPR)  MyAssert(_EXPR) | //#define IM_ASSERT(_EXPR)  MyAssert(_EXPR) | ||||||
|  |  | ||||||
| //---- Don't implement default clipboard handlers for Windows (so as not to link with OpenClipboard(), etc.) | //---- Don't implement default clipboard handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions) | ||||||
| //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS | //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS | ||||||
|  |  | ||||||
| //---- Include imgui_user.cpp at the end of imgui.cpp so you can include code that extends ImGui using its private data/functions. | //---- Include imgui_user.cpp at the end of imgui.cpp so you can include code that extends ImGui using its private data/functions. | ||||||
| @@ -35,6 +32,7 @@ | |||||||
| */ | */ | ||||||
|  |  | ||||||
| //---- Freely implement extra functions within the ImGui:: namespace. | //---- Freely implement extra functions within the ImGui:: namespace. | ||||||
|  | //---- Declare helpers or widgets implemented in imgui_user.cpp or elsewhere, so end-user doesn't need to include multiple files. | ||||||
| //---- e.g. you can create variants of the ImGui::Value() helper for your low-level math types. | //---- e.g. you can create variants of the ImGui::Value() helper for your low-level math types. | ||||||
| /* | /* | ||||||
| namespace ImGui | namespace ImGui | ||||||
|   | |||||||
							
								
								
									
										77
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -139,7 +139,8 @@ | |||||||
|  API CHANGES |  API CHANGES | ||||||
|  =========== |  =========== | ||||||
|  |  | ||||||
|   - 2014/09/24 (1.12) renamed SetFontScale() to SetWindowFontScale(). |   - 2014/09/24 (1.12) renamed SetFontScale() to SetWindowFontScale() | ||||||
|  |   - 2014/09/24 (1.12) moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn | ||||||
|   - 2014/08/30 (1.09) removed IO.FontHeight (now computed automatically) |   - 2014/08/30 (1.09) removed IO.FontHeight (now computed automatically) | ||||||
|   - 2014/08/30 (1.09) moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite |   - 2014/08/30 (1.09) moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite | ||||||
|   - 2014/08/28 (1.09) changed the behaviour of IO.PixelCenterOffset following various rendering fixes |   - 2014/08/28 (1.09) changed the behaviour of IO.PixelCenterOffset following various rendering fixes | ||||||
| @@ -324,7 +325,12 @@ ImGuiIO::ImGuiIO() | |||||||
|     MouseDoubleClickTime = 0.30f; |     MouseDoubleClickTime = 0.30f; | ||||||
|     MouseDoubleClickMaxDist = 6.0f; |     MouseDoubleClickMaxDist = 6.0f; | ||||||
|  |  | ||||||
|     // Platform dependant default implementations | 	// Memory management functions, default to posix | ||||||
|  | 	MemAllocFn = malloc; | ||||||
|  | 	MemReallocFn = realloc; | ||||||
|  | 	MemFreeFn = free; | ||||||
|  |  | ||||||
|  | 	// Platform dependant default implementations | ||||||
|     GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; |     GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; | ||||||
|     SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; |     SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; | ||||||
| } | } | ||||||
| @@ -393,7 +399,7 @@ static int ImStricmp(const char* str1, const char* str2) | |||||||
|  |  | ||||||
| static char* ImStrdup(const char *str) | static char* ImStrdup(const char *str) | ||||||
| { | { | ||||||
|     char *buff = (char*)IM_MALLOC(strlen(str) + 1); |     char *buff = (char*)ImGui::MemAlloc(strlen(str) + 1); | ||||||
|     IM_ASSERT(buff); |     IM_ASSERT(buff); | ||||||
|     strcpy(buff, str); |     strcpy(buff, str); | ||||||
|     return buff; |     return buff; | ||||||
| @@ -641,7 +647,7 @@ struct ImGuiIniData | |||||||
|     bool    Collapsed; |     bool    Collapsed; | ||||||
|  |  | ||||||
|     ImGuiIniData() { memset(this, 0, sizeof(*this)); } |     ImGuiIniData() { memset(this, 0, sizeof(*this)); } | ||||||
|     ~ImGuiIniData() { if (Name) { IM_FREE(Name); Name = NULL; } } |     ~ImGuiIniData() { if (Name) { ImGui::MemFree(Name); Name = NULL; } } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct ImGuiState | struct ImGuiState | ||||||
| @@ -998,16 +1004,16 @@ ImGuiWindow::ImGuiWindow(const char* name, ImVec2 default_pos, ImVec2 default_si | |||||||
|     FocusIdxRequestCurrent = IM_INT_MAX; |     FocusIdxRequestCurrent = IM_INT_MAX; | ||||||
|     FocusIdxRequestNext = IM_INT_MAX; |     FocusIdxRequestNext = IM_INT_MAX; | ||||||
|  |  | ||||||
|     DrawList = (ImDrawList*)IM_MALLOC(sizeof(ImDrawList)); |     DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList)); | ||||||
|     new(DrawList) ImDrawList(); |     new(DrawList) ImDrawList(); | ||||||
| } | } | ||||||
|  |  | ||||||
| ImGuiWindow::~ImGuiWindow() | ImGuiWindow::~ImGuiWindow() | ||||||
| { | { | ||||||
|     DrawList->~ImDrawList(); |     DrawList->~ImDrawList(); | ||||||
|     IM_FREE(DrawList); |     ImGui::MemFree(DrawList); | ||||||
|     DrawList = NULL; |     DrawList = NULL; | ||||||
|     IM_FREE(Name); |     ImGui::MemFree(Name); | ||||||
|     Name = NULL; |     Name = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1077,6 +1083,21 @@ void ImGuiWindow::AddToRenderList() | |||||||
| namespace ImGui | namespace ImGui | ||||||
| { | { | ||||||
|  |  | ||||||
|  | void*   MemAlloc(size_t sz) | ||||||
|  | { | ||||||
|  | 	return GImGui.IO.MemAllocFn(sz); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void    MemFree(void* ptr) | ||||||
|  | { | ||||||
|  | 	return GImGui.IO.MemFreeFn(ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void*   MemRealloc(void* ptr, size_t sz) | ||||||
|  | { | ||||||
|  | 	return GImGui.IO.MemReallocFn(ptr, sz); | ||||||
|  | } | ||||||
|  | 	 | ||||||
| static ImGuiIniData* FindWindowSettings(const char* name) | static ImGuiIniData* FindWindowSettings(const char* name) | ||||||
| { | { | ||||||
|     ImGuiState& g = GImGui; |     ImGuiState& g = GImGui; | ||||||
| @@ -1087,7 +1108,7 @@ static ImGuiIniData* FindWindowSettings(const char* name) | |||||||
|         if (ImStricmp(ini->Name, name) == 0) |         if (ImStricmp(ini->Name, name) == 0) | ||||||
|             return ini; |             return ini; | ||||||
|     } |     } | ||||||
|     ImGuiIniData* ini = (ImGuiIniData*)IM_MALLOC(sizeof(ImGuiIniData)); |     ImGuiIniData* ini = (ImGuiIniData*)ImGui::MemAlloc(sizeof(ImGuiIniData)); | ||||||
|     new(ini) ImGuiIniData(); |     new(ini) ImGuiIniData(); | ||||||
|     ini->Name = ImStrdup(name); |     ini->Name = ImStrdup(name); | ||||||
|     ini->Collapsed = false; |     ini->Collapsed = false; | ||||||
| @@ -1127,12 +1148,12 @@ static void LoadSettings() | |||||||
|        fclose(f);  |        fclose(f);  | ||||||
|        return;  |        return;  | ||||||
|     } |     } | ||||||
|     char* f_data = (char*)IM_MALLOC(f_size+1); |     char* f_data = (char*)ImGui::MemAlloc(f_size+1); | ||||||
|     f_size = fread(f_data, 1, f_size, f); // Text conversion alter read size so let's not be fussy about return value |     f_size = fread(f_data, 1, f_size, f); // Text conversion alter read size so let's not be fussy about return value | ||||||
|     fclose(f); |     fclose(f); | ||||||
|     if (f_size == 0) |     if (f_size == 0) | ||||||
|     { |     { | ||||||
|         IM_FREE(f_data); |         ImGui::MemFree(f_data); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     f_data[f_size] = 0; |     f_data[f_size] = 0; | ||||||
| @@ -1166,7 +1187,7 @@ static void LoadSettings() | |||||||
|         line_start = line_end+1; |         line_start = line_end+1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     IM_FREE(f_data); |     ImGui::MemFree(f_data); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void SaveSettings() | static void SaveSettings() | ||||||
| @@ -1239,7 +1260,7 @@ void NewFrame() | |||||||
|     if (!g.Initialized) |     if (!g.Initialized) | ||||||
|     { |     { | ||||||
|         // Initialize on first frame |         // Initialize on first frame | ||||||
|         g.LogClipboard = (ImGuiTextBuffer*)IM_MALLOC(sizeof(ImGuiTextBuffer)); |         g.LogClipboard = (ImGuiTextBuffer*)ImGui::MemAlloc(sizeof(ImGuiTextBuffer)); | ||||||
|         new(g.LogClipboard) ImGuiTextBuffer(); |         new(g.LogClipboard) ImGuiTextBuffer(); | ||||||
|  |  | ||||||
|         IM_ASSERT(g.Settings.empty()); |         IM_ASSERT(g.Settings.empty()); | ||||||
| @@ -1250,7 +1271,7 @@ void NewFrame() | |||||||
|             const void* fnt_data; |             const void* fnt_data; | ||||||
|             unsigned int fnt_size; |             unsigned int fnt_size; | ||||||
|             ImGui::GetDefaultFontData(&fnt_data, &fnt_size, NULL, NULL); |             ImGui::GetDefaultFontData(&fnt_data, &fnt_size, NULL, NULL); | ||||||
|             g.IO.Font = (ImBitmapFont*)IM_MALLOC(sizeof(ImBitmapFont)); |             g.IO.Font = (ImBitmapFont*)ImGui::MemAlloc(sizeof(ImBitmapFont)); | ||||||
|             new(g.IO.Font) ImBitmapFont(); |             new(g.IO.Font) ImBitmapFont(); | ||||||
|             g.IO.Font->LoadFromMemory(fnt_data, fnt_size); |             g.IO.Font->LoadFromMemory(fnt_data, fnt_size); | ||||||
| 			g.IO.FontYOffset = +1; | 			g.IO.FontYOffset = +1; | ||||||
| @@ -1380,7 +1401,7 @@ void Shutdown() | |||||||
|     for (size_t i = 0; i < g.Windows.size(); i++) |     for (size_t i = 0; i < g.Windows.size(); i++) | ||||||
|     { |     { | ||||||
|         g.Windows[i]->~ImGuiWindow(); |         g.Windows[i]->~ImGuiWindow(); | ||||||
|         IM_FREE(g.Windows[i]); |         ImGui::MemFree(g.Windows[i]); | ||||||
|     } |     } | ||||||
|     g.Windows.clear(); |     g.Windows.clear(); | ||||||
|     g.CurrentWindowStack.clear(); |     g.CurrentWindowStack.clear(); | ||||||
| @@ -1391,7 +1412,7 @@ void Shutdown() | |||||||
|     for (size_t i = 0; i < g.Settings.size(); i++) |     for (size_t i = 0; i < g.Settings.size(); i++) | ||||||
|     { |     { | ||||||
|         g.Settings[i]->~ImGuiIniData(); |         g.Settings[i]->~ImGuiIniData(); | ||||||
|         IM_FREE(g.Settings[i]); |         ImGui::MemFree(g.Settings[i]); | ||||||
|     } |     } | ||||||
|     g.Settings.clear(); |     g.Settings.clear(); | ||||||
|     g.ColorEditModeStorage.Clear(); |     g.ColorEditModeStorage.Clear(); | ||||||
| @@ -1403,20 +1424,20 @@ void Shutdown() | |||||||
|     if (g.IO.Font) |     if (g.IO.Font) | ||||||
|     { |     { | ||||||
|         g.IO.Font->~ImBitmapFont(); |         g.IO.Font->~ImBitmapFont(); | ||||||
|         IM_FREE(g.IO.Font); |         ImGui::MemFree(g.IO.Font); | ||||||
|         g.IO.Font = NULL; |         g.IO.Font = NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (g.PrivateClipboard) |     if (g.PrivateClipboard) | ||||||
|     { |     { | ||||||
|         IM_FREE(g.PrivateClipboard); |         ImGui::MemFree(g.PrivateClipboard); | ||||||
|         g.PrivateClipboard = NULL; |         g.PrivateClipboard = NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (g.LogClipboard) |     if (g.LogClipboard) | ||||||
|     { |     { | ||||||
|         g.LogClipboard->~ImGuiTextBuffer(); |         g.LogClipboard->~ImGuiTextBuffer(); | ||||||
|         IM_FREE(g.LogClipboard); |         ImGui::MemFree(g.LogClipboard); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     g.Initialized = false; |     g.Initialized = false; | ||||||
| @@ -1938,7 +1959,7 @@ bool Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, ImGuiWin | |||||||
|         if (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) |         if (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) | ||||||
|         { |         { | ||||||
| 			// Tooltip and child windows don't store settings | 			// Tooltip and child windows don't store settings | ||||||
|             window = (ImGuiWindow*)IM_MALLOC(sizeof(ImGuiWindow)); |             window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow)); | ||||||
|             new(window) ImGuiWindow(name, ImVec2(0,0), size); |             new(window) ImGuiWindow(name, ImVec2(0,0), size); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
| @@ -1947,7 +1968,7 @@ bool Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, ImGuiWin | |||||||
|             if (settings && ImLength(settings->Size) > 0.0f && !(flags & ImGuiWindowFlags_NoResize))// && ImLengthsize) == 0.0f) |             if (settings && ImLength(settings->Size) > 0.0f && !(flags & ImGuiWindowFlags_NoResize))// && ImLengthsize) == 0.0f) | ||||||
|                 size = settings->Size; |                 size = settings->Size; | ||||||
|  |  | ||||||
|             window = (ImGuiWindow*)IM_MALLOC(sizeof(ImGuiWindow)); |             window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow)); | ||||||
|             new(window) ImGuiWindow(name, g.NewWindowDefaultPos, size); |             new(window) ImGuiWindow(name, g.NewWindowDefaultPos, size); | ||||||
|  |  | ||||||
|             if (settings->Pos.x != FLT_MAX) |             if (settings->Pos.x != FLT_MAX) | ||||||
| @@ -4068,7 +4089,7 @@ bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlag | |||||||
|                 { |                 { | ||||||
|                     // Remove new-line from pasted buffer |                     // Remove new-line from pasted buffer | ||||||
|                     size_t clipboard_len = strlen(clipboard); |                     size_t clipboard_len = strlen(clipboard); | ||||||
|                     char* clipboard_filtered = (char*)IM_MALLOC(clipboard_len+1); |                     char* clipboard_filtered = (char*)ImGui::MemAlloc(clipboard_len+1); | ||||||
|                     int clipboard_filtered_len = 0; |                     int clipboard_filtered_len = 0; | ||||||
|                     for (int i = 0; clipboard[i]; i++) |                     for (int i = 0; clipboard[i]; i++) | ||||||
|                     { |                     { | ||||||
| @@ -4079,7 +4100,7 @@ bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlag | |||||||
|                     } |                     } | ||||||
|                     clipboard_filtered[clipboard_filtered_len] = 0; |                     clipboard_filtered[clipboard_filtered_len] = 0; | ||||||
|                     stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len); |                     stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len); | ||||||
|                     IM_FREE(clipboard_filtered); |                     ImGui::MemFree(clipboard_filtered); | ||||||
|                 } |                 } | ||||||
|         } |         } | ||||||
|         else if (g.IO.InputCharacters[0]) |         else if (g.IO.InputCharacters[0]) | ||||||
| @@ -5206,7 +5227,7 @@ ImBitmapFont::ImBitmapFont() | |||||||
| void    ImBitmapFont::Clear() | void    ImBitmapFont::Clear() | ||||||
| { | { | ||||||
|     if (Data && DataOwned) |     if (Data && DataOwned) | ||||||
|         IM_FREE(Data); |         ImGui::MemFree(Data); | ||||||
|     Data = NULL; |     Data = NULL; | ||||||
|     DataOwned = false; |     DataOwned = false; | ||||||
|     Info = NULL; |     Info = NULL; | ||||||
| @@ -5242,7 +5263,7 @@ bool    ImBitmapFont::LoadFromFile(const char* filename) | |||||||
| 		fclose(f); | 		fclose(f); | ||||||
|         return false; |         return false; | ||||||
| 	} | 	} | ||||||
|     if ((Data = (unsigned char*)IM_MALLOC(DataSize)) == NULL) |     if ((Data = (unsigned char*)ImGui::MemAlloc(DataSize)) == NULL) | ||||||
|     { |     { | ||||||
|         fclose(f); |         fclose(f); | ||||||
|         return false; |         return false; | ||||||
| @@ -5250,7 +5271,7 @@ bool    ImBitmapFont::LoadFromFile(const char* filename) | |||||||
|     if (fread(Data, 1, DataSize, f) != DataSize) |     if (fread(Data, 1, DataSize, f) != DataSize) | ||||||
|     { |     { | ||||||
|         fclose(f); |         fclose(f); | ||||||
|         IM_FREE(Data); |         ImGui::MemFree(Data); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     fclose(f); |     fclose(f); | ||||||
| @@ -5493,7 +5514,7 @@ static const char*  GetClipboardTextFn_DefaultImpl() | |||||||
|     static char* buf_local = NULL; |     static char* buf_local = NULL; | ||||||
|     if (buf_local) |     if (buf_local) | ||||||
|     { |     { | ||||||
|         IM_FREE(buf_local); |         ImGui::MemFree(buf_local); | ||||||
|         buf_local = NULL; |         buf_local = NULL; | ||||||
|     } |     } | ||||||
|     if (!OpenClipboard(NULL))  |     if (!OpenClipboard(NULL))  | ||||||
| @@ -5541,12 +5562,12 @@ static void SetClipboardTextFn_DefaultImpl(const char* text, const char* text_en | |||||||
| { | { | ||||||
|     if (GImGui.PrivateClipboard) |     if (GImGui.PrivateClipboard) | ||||||
|     { |     { | ||||||
|         IM_FREE(GImGui.PrivateClipboard); |         ImGui::MemFree(GImGui.PrivateClipboard); | ||||||
|         GImGui.PrivateClipboard = NULL; |         GImGui.PrivateClipboard = NULL; | ||||||
|     } |     } | ||||||
|     if (!text_end) |     if (!text_end) | ||||||
|         text_end = text + strlen(text); |         text_end = text + strlen(text); | ||||||
|     GImGui.PrivateClipboard = (char*)IM_MALLOC((size_t)(text_end - text) + 1); |     GImGui.PrivateClipboard = (char*)ImGui::MemAlloc((size_t)(text_end - text) + 1); | ||||||
|     memcpy(GImGui.PrivateClipboard, text, (size_t)(text_end - text)); |     memcpy(GImGui.PrivateClipboard, text, (size_t)(text_end - text)); | ||||||
|     GImGui.PrivateClipboard[(size_t)(text_end - text)] = 0; |     GImGui.PrivateClipboard[(size_t)(text_end - text)] = 0; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| // ImGui library v1.11 | // ImGui library v1.11+ | ||||||
| // See .cpp file for commentary. | // See .cpp file for commentary. | ||||||
| // See ImGui::ShowTestWindow() for sample code. | // See ImGui::ShowTestWindow() for sample code. | ||||||
| // Read 'Programmer guide' in .cpp for notes on how to setup ImGui in your codebase. | // Read 'Programmer guide' in .cpp for notes on how to setup ImGui in your codebase. | ||||||
| @@ -19,18 +19,6 @@ struct ImGuiWindow; | |||||||
| #include <stdarg.h>         // va_list | #include <stdarg.h>         // va_list | ||||||
| #include <stdlib.h>         // NULL, malloc | #include <stdlib.h>         // NULL, malloc | ||||||
|  |  | ||||||
| #ifndef IM_MALLOC |  | ||||||
| #define IM_MALLOC(_SIZE) malloc((_SIZE)) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef IM_FREE |  | ||||||
| #define IM_FREE(_PTR) free((_PTR)) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef IM_REALLOC |  | ||||||
| #define IM_REALLOC(_PTR, _SIZE) realloc((_PTR), (_SIZE)) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef IM_ASSERT | #ifndef IM_ASSERT | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #define IM_ASSERT(_EXPR)    assert(_EXPR) | #define IM_ASSERT(_EXPR)    assert(_EXPR) | ||||||
| @@ -67,8 +55,17 @@ struct ImVec4 | |||||||
| #endif | #endif | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | namespace ImGui | ||||||
|  | { | ||||||
|  | 	// Proxy functions to access the MemAllocFn/MemFreeFn/MemReallocFn pointers in ImGui::GetIO(). The only reason they exist here is to allow ImVector<> to compile inline. | ||||||
|  |     void*       MemAlloc(size_t sz); | ||||||
|  | 	void        MemFree(void* ptr); | ||||||
|  | 	void*       MemRealloc(void* ptr, size_t sz); | ||||||
|  | }; | ||||||
|  |  | ||||||
| // std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).  | // std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).  | ||||||
| // this implementation does NOT call c++ constructors! we don't need them! also only provide the minimum functionalities we need. | // Use '#define ImVector std::vector' if you want to use the STL type or your own type. | ||||||
|  | // Our implementation does NOT call c++ constructors! because the data types we use don't need them (but that could be added as well). Only provide the minimum functionalities we need. | ||||||
| #ifndef ImVector | #ifndef ImVector | ||||||
| template<typename T> | template<typename T> | ||||||
| class ImVector | class ImVector | ||||||
| @@ -84,7 +81,7 @@ public: | |||||||
|     typedef const value_type*   const_iterator; |     typedef const value_type*   const_iterator; | ||||||
|  |  | ||||||
|     ImVector()                  { Size = Capacity = 0; Data = NULL; } |     ImVector()                  { Size = Capacity = 0; Data = NULL; } | ||||||
|     ~ImVector()                 { if (Data) IM_FREE(Data); } |     ~ImVector()                 { if (Data) ImGui::MemFree(Data); } | ||||||
|  |  | ||||||
|     inline bool                 empty() const                   { return Size == 0; } |     inline bool                 empty() const                   { return Size == 0; } | ||||||
|     inline size_t               size() const                    { return Size; } |     inline size_t               size() const                    { return Size; } | ||||||
| @@ -95,7 +92,7 @@ public: | |||||||
|     inline value_type&          operator[](size_t i)            { IM_ASSERT(i < Size); return Data[i]; } |     inline value_type&          operator[](size_t i)            { IM_ASSERT(i < Size); return Data[i]; } | ||||||
|     inline const value_type&    operator[](size_t i) const      { IM_ASSERT(i < Size); return Data[i]; } |     inline const value_type&    operator[](size_t i) const      { IM_ASSERT(i < Size); return Data[i]; } | ||||||
|  |  | ||||||
|     inline void                 clear()                         { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } } |     inline void                 clear()                         { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } } | ||||||
|     inline iterator             begin()                         { return Data; } |     inline iterator             begin()                         { return Data; } | ||||||
|     inline const_iterator       begin() const                   { return Data; } |     inline const_iterator       begin() const                   { return Data; } | ||||||
|     inline iterator             end()                           { return Data + Size; } |     inline iterator             end()                           { return Data + Size; } | ||||||
| @@ -106,7 +103,7 @@ public: | |||||||
|     inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return at(Size-1); } |     inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return at(Size-1); } | ||||||
|     inline void                 swap(ImVector<T>& rhs)          { const size_t rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; const size_t rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } |     inline void                 swap(ImVector<T>& rhs)          { const size_t rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; const size_t rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } | ||||||
|  |  | ||||||
|     inline void                 reserve(size_t new_capacity)    { Data = (value_type*)IM_REALLOC(Data, new_capacity * sizeof(value_type)); Capacity = new_capacity; } |     inline void                 reserve(size_t new_capacity)    { Data = (value_type*)ImGui::MemRealloc(Data, new_capacity * sizeof(value_type)); Capacity = new_capacity; } | ||||||
|     inline void                 resize(size_t new_size)         { if (new_size > Capacity) reserve(new_size); Size = new_size; } |     inline void                 resize(size_t new_size)         { if (new_size > Capacity) reserve(new_size); Size = new_size; } | ||||||
|  |  | ||||||
|     inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); Data[Size++] = v; } |     inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); Data[Size++] = v; } | ||||||
| @@ -423,6 +420,12 @@ struct ImGuiIO | |||||||
|     // NB- for SetClipboardTextFn, the string is *NOT* zero-terminated at 'text_end' |     // NB- for SetClipboardTextFn, the string is *NOT* zero-terminated at 'text_end' | ||||||
|     const char* (*GetClipboardTextFn)();                                         |     const char* (*GetClipboardTextFn)();                                         | ||||||
|     void        (*SetClipboardTextFn)(const char* text, const char* text_end); |     void        (*SetClipboardTextFn)(const char* text, const char* text_end); | ||||||
|  | 	 | ||||||
|  | 	// Settings - Memory allocation | ||||||
|  | 	// Default to posix malloc/realloc/free functions. | ||||||
|  | 	void*       (*MemAllocFn)(size_t sz); | ||||||
|  | 	void*       (*MemReallocFn)(void* ptr, size_t sz); | ||||||
|  | 	void        (*MemFreeFn)(void* ptr); | ||||||
|  |  | ||||||
|     // Input - Fill before calling NewFrame() |     // Input - Fill before calling NewFrame() | ||||||
|     ImVec2      MousePos;                   // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) |     ImVec2      MousePos;                   // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user