• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // dear imgui, v1.85
2 // (internal structures/api)
3 
4 // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
5 // Set:
6 //   #define IMGUI_DEFINE_MATH_OPERATORS
7 // To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
8 
9 /*
10 
11 Index of this file:
12 
13 // [SECTION] Header mess
14 // [SECTION] Forward declarations
15 // [SECTION] Context pointer
16 // [SECTION] STB libraries includes
17 // [SECTION] Macros
18 // [SECTION] Generic helpers
19 // [SECTION] ImDrawList support
20 // [SECTION] Widgets support: flags, enums, data structures
21 // [SECTION] Navigation support
22 // [SECTION] Columns support
23 // [SECTION] Multi-select support
24 // [SECTION] Docking support
25 // [SECTION] Viewport support
26 // [SECTION] Settings support
27 // [SECTION] Metrics, Debug tools
28 // [SECTION] Generic context hooks
29 // [SECTION] ImGuiContext (main imgui context)
30 // [SECTION] ImGuiWindowTempData, ImGuiWindow
31 // [SECTION] Tab bar, Tab item support
32 // [SECTION] Table support
33 // [SECTION] ImGui internal API
34 // [SECTION] ImFontAtlas internal API
35 // [SECTION] Test Engine specific hooks (imgui_test_engine)
36 
37 */
38 
39 #pragma once
40 #ifndef IMGUI_DISABLE
41 
42 //-----------------------------------------------------------------------------
43 // [SECTION] Header mess
44 //-----------------------------------------------------------------------------
45 
46 #ifndef IMGUI_VERSION
47 #include "imgui.h"
48 #endif
49 
50 #include <stdio.h>      // FILE*, sscanf
51 #include <stdlib.h>     // NULL, malloc, free, qsort, atoi, atof
52 #include <math.h>       // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
53 #include <limits.h>     // INT_MIN, INT_MAX
54 
55 // Enable SSE intrinsics if available
56 #if (defined __SSE__ || defined __x86_64__ || defined _M_X64) && !defined(IMGUI_DISABLE_SSE)
57 #define IMGUI_ENABLE_SSE
58 #include <immintrin.h>
59 #endif
60 
61 // Visual Studio warnings
62 #ifdef _MSC_VER
63 #pragma warning (push)
64 #pragma warning (disable: 4251)     // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)
65 #pragma warning (disable: 26812)    // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer)
66 #pragma warning (disable: 26495)    // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).
67 #if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
68 #pragma warning (disable: 5054)     // operator '|': deprecated between enumerations of different types
69 #endif
70 #endif
71 
72 // Clang/GCC warnings with -Weverything
73 #if defined(__clang__)
74 #pragma clang diagnostic push
75 #if __has_warning("-Wunknown-warning-option")
76 #pragma clang diagnostic ignored "-Wunknown-warning-option"         // warning: unknown warning group 'xxx'
77 #endif
78 #pragma clang diagnostic ignored "-Wunknown-pragmas"                // warning: unknown warning group 'xxx'
79 #pragma clang diagnostic ignored "-Wfloat-equal"                    // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned()
80 #pragma clang diagnostic ignored "-Wunused-function"                // for stb_textedit.h
81 #pragma clang diagnostic ignored "-Wmissing-prototypes"             // for stb_textedit.h
82 #pragma clang diagnostic ignored "-Wold-style-cast"
83 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
84 #pragma clang diagnostic ignored "-Wdouble-promotion"
85 #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"  // warning: implicit conversion from 'xxx' to 'float' may lose precision
86 #pragma clang diagnostic ignored "-Wmissing-noreturn"               // warning: function 'xxx' could be declared with attribute 'noreturn'
87 #elif defined(__GNUC__)
88 #pragma GCC diagnostic push
89 #pragma GCC diagnostic ignored "-Wpragmas"              // warning: unknown option after '#pragma GCC diagnostic' kind
90 #pragma GCC diagnostic ignored "-Wclass-memaccess"      // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
91 #endif
92 
93 // Legacy defines
94 #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS            // Renamed in 1.74
95 #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
96 #endif
97 #ifdef IMGUI_DISABLE_MATH_FUNCTIONS                     // Renamed in 1.74
98 #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
99 #endif
100 
101 // Enable stb_truetype by default unless FreeType is enabled.
102 // You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
103 #ifndef IMGUI_ENABLE_FREETYPE
104 #define IMGUI_ENABLE_STB_TRUETYPE
105 #endif
106 
107 //-----------------------------------------------------------------------------
108 // [SECTION] Forward declarations
109 //-----------------------------------------------------------------------------
110 
111 struct ImBitVector;                 // Store 1-bit per value
112 struct ImRect;                      // An axis-aligned rectangle (2 points)
113 struct ImDrawDataBuilder;           // Helper to build a ImDrawData instance
114 struct ImDrawListSharedData;        // Data shared between all ImDrawList instances
115 struct ImGuiColorMod;               // Stacked color modifier, backup of modified data so we can restore it
116 struct ImGuiContext;                // Main Dear ImGui context
117 struct ImGuiContextHook;            // Hook for extensions like ImGuiTestEngine
118 struct ImGuiDataTypeInfo;           // Type information associated to a ImGuiDataType enum
119 struct ImGuiGroupData;              // Stacked storage data for BeginGroup()/EndGroup()
120 struct ImGuiInputTextState;         // Internal state of the currently focused/edited text input box
121 struct ImGuiLastItemData;           // Status storage for last submitted items
122 struct ImGuiMenuColumns;            // Simple column measurement, currently used for MenuItem() only
123 struct ImGuiNavItemData;            // Result of a gamepad/keyboard directional navigation move query result
124 struct ImGuiMetricsConfig;          // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
125 struct ImGuiNextWindowData;         // Storage for SetNextWindow** functions
126 struct ImGuiNextItemData;           // Storage for SetNextItem** functions
127 struct ImGuiOldColumnData;          // Storage data for a single column for legacy Columns() api
128 struct ImGuiOldColumns;             // Storage data for a columns set for legacy Columns() api
129 struct ImGuiPopupData;              // Storage for current popup stack
130 struct ImGuiSettingsHandler;        // Storage for one type registered in the .ini file
131 struct ImGuiStackSizes;             // Storage of stack sizes for debugging/asserting
132 struct ImGuiStyleMod;               // Stacked style modifier, backup of modified data so we can restore it
133 struct ImGuiTabBar;                 // Storage for a tab bar
134 struct ImGuiTabItem;                // Storage for a tab item (within a tab bar)
135 struct ImGuiTable;                  // Storage for a table
136 struct ImGuiTableColumn;            // Storage for one column of a table
137 struct ImGuiTableTempData;          // Temporary storage for one table (one per table in the stack), shared between tables.
138 struct ImGuiTableSettings;          // Storage for a table .ini settings
139 struct ImGuiTableColumnsSettings;   // Storage for a column .ini settings
140 struct ImGuiWindow;                 // Storage for one window
141 struct ImGuiWindowTempData;         // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
142 struct ImGuiWindowSettings;         // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
143 
144 // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
145 typedef int ImGuiLayoutType;            // -> enum ImGuiLayoutType_         // Enum: Horizontal or vertical
146 typedef int ImGuiActivateFlags;         // -> enum ImGuiActivateFlags_      // Flags: for navigation/focus function (will be for ActivateItem() later)
147 typedef int ImGuiItemFlags;             // -> enum ImGuiItemFlags_          // Flags: for PushItemFlag()
148 typedef int ImGuiItemStatusFlags;       // -> enum ImGuiItemStatusFlags_    // Flags: for DC.LastItemStatusFlags
149 typedef int ImGuiOldColumnFlags;        // -> enum ImGuiOldColumnFlags_     // Flags: for BeginColumns()
150 typedef int ImGuiNavHighlightFlags;     // -> enum ImGuiNavHighlightFlags_  // Flags: for RenderNavHighlight()
151 typedef int ImGuiNavDirSourceFlags;     // -> enum ImGuiNavDirSourceFlags_  // Flags: for GetNavInputAmount2d()
152 typedef int ImGuiNavMoveFlags;          // -> enum ImGuiNavMoveFlags_       // Flags: for navigation requests
153 typedef int ImGuiNextItemDataFlags;     // -> enum ImGuiNextItemDataFlags_  // Flags: for SetNextItemXXX() functions
154 typedef int ImGuiNextWindowDataFlags;   // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
155 typedef int ImGuiScrollFlags;           // -> enum ImGuiScrollFlags_        // Flags: for ScrollToItem() and navigation requests
156 typedef int ImGuiSeparatorFlags;        // -> enum ImGuiSeparatorFlags_     // Flags: for SeparatorEx()
157 typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx()
158 typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx()
159 
160 typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
161 
162 //-----------------------------------------------------------------------------
163 // [SECTION] Context pointer
164 // See implementation of this variable in imgui.cpp for comments and details.
165 //-----------------------------------------------------------------------------
166 
167 #ifndef GImGui
168 extern IMGUI_API ImGuiContext* GImGui;  // Current implicit context pointer
169 #endif
170 
171 //-------------------------------------------------------------------------
172 // [SECTION] STB libraries includes
173 //-------------------------------------------------------------------------
174 
175 namespace ImStb
176 {
177 
178 #undef STB_TEXTEDIT_STRING
179 #undef STB_TEXTEDIT_CHARTYPE
180 #define STB_TEXTEDIT_STRING             ImGuiInputTextState
181 #define STB_TEXTEDIT_CHARTYPE           ImWchar
182 #define STB_TEXTEDIT_GETWIDTH_NEWLINE   (-1.0f)
183 #define STB_TEXTEDIT_UNDOSTATECOUNT     99
184 #define STB_TEXTEDIT_UNDOCHARCOUNT      999
185 #include "imstb_textedit.h"
186 
187 } // namespace ImStb
188 
189 //-----------------------------------------------------------------------------
190 // [SECTION] Macros
191 //-----------------------------------------------------------------------------
192 
193 // Debug Logging
194 #ifndef IMGUI_DEBUG_LOG
195 #define IMGUI_DEBUG_LOG(_FMT,...)       printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)
196 #endif
197 
198 // Debug Logging for selected systems. Remove the '((void)0) //' to enable.
199 //#define IMGUI_DEBUG_LOG_POPUP         IMGUI_DEBUG_LOG // Enable log
200 //#define IMGUI_DEBUG_LOG_NAV           IMGUI_DEBUG_LOG // Enable log
201 #define IMGUI_DEBUG_LOG_POPUP(...)      ((void)0)       // Disable log
202 #define IMGUI_DEBUG_LOG_NAV(...)        ((void)0)       // Disable log
203 
204 // Static Asserts
205 #if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100)
206 #define IM_STATIC_ASSERT(_COND)         static_assert(_COND, "")
207 #else
208 #define IM_STATIC_ASSERT(_COND)         typedef char static_assertion_##__line__[(_COND)?1:-1]
209 #endif
210 
211 // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
212 // We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code.
213 //#define IMGUI_DEBUG_PARANOID
214 #ifdef IMGUI_DEBUG_PARANOID
215 #define IM_ASSERT_PARANOID(_EXPR)       IM_ASSERT(_EXPR)
216 #else
217 #define IM_ASSERT_PARANOID(_EXPR)
218 #endif
219 
220 // Error handling
221 // Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
222 #ifndef IM_ASSERT_USER_ERROR
223 #define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG)   // Recoverable User Error
224 #endif
225 
226 // Misc Macros
227 #define IM_PI                           3.14159265358979323846f
228 #ifdef _WIN32
229 #define IM_NEWLINE                      "\r\n"   // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
230 #else
231 #define IM_NEWLINE                      "\n"
232 #endif
233 #define IM_TABSIZE                      (4)
234 #define IM_MEMALIGN(_OFF,_ALIGN)        (((_OFF) + (_ALIGN - 1)) & ~(_ALIGN - 1))               // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8
235 #define IM_F32_TO_INT8_UNBOUND(_VAL)    ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f)))   // Unsaturated, for display purpose
236 #define IM_F32_TO_INT8_SAT(_VAL)        ((int)(ImSaturate(_VAL) * 255.0f + 0.5f))               // Saturated, always output 0..255
237 #define IM_FLOOR(_VAL)                  ((float)(int)(_VAL))                                    // ImFloor() is not inlined in MSVC debug builds
238 #define IM_ROUND(_VAL)                  ((float)(int)((_VAL) + 0.5f))                           //
239 
240 // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
241 #ifdef _MSC_VER
242 #define IMGUI_CDECL __cdecl
243 #else
244 #define IMGUI_CDECL
245 #endif
246 
247 // Warnings
248 #if defined(_MSC_VER) && !defined(__clang__)
249 #define IM_MSVC_WARNING_SUPPRESS(XXXX)  __pragma(warning(suppress: XXXX))
250 #else
251 #define IM_MSVC_WARNING_SUPPRESS(XXXX)
252 #endif
253 
254 // Debug Tools
255 // Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item.
256 #ifndef IM_DEBUG_BREAK
257 #if defined(__clang__)
258 #define IM_DEBUG_BREAK()    __builtin_debugtrap()
259 #elif defined (_MSC_VER)
260 #define IM_DEBUG_BREAK()    __debugbreak()
261 #else
262 #define IM_DEBUG_BREAK()    IM_ASSERT(0)    // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
263 #endif
264 #endif // #ifndef IM_DEBUG_BREAK
265 
266 //-----------------------------------------------------------------------------
267 // [SECTION] Generic helpers
268 // Note that the ImXXX helpers functions are lower-level than ImGui functions.
269 // ImGui functions or the ImGui context are never called/used from other ImXXX functions.
270 //-----------------------------------------------------------------------------
271 // - Helpers: Hashing
272 // - Helpers: Sorting
273 // - Helpers: Bit manipulation
274 // - Helpers: String, Formatting
275 // - Helpers: UTF-8 <> wchar conversions
276 // - Helpers: ImVec2/ImVec4 operators
277 // - Helpers: Maths
278 // - Helpers: Geometry
279 // - Helper: ImVec1
280 // - Helper: ImVec2ih
281 // - Helper: ImRect
282 // - Helper: ImBitArray
283 // - Helper: ImBitVector
284 // - Helper: ImSpan<>, ImSpanAllocator<>
285 // - Helper: ImPool<>
286 // - Helper: ImChunkStream<>
287 //-----------------------------------------------------------------------------
288 
289 // Helpers: Hashing
290 IMGUI_API ImGuiID       ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
291 IMGUI_API ImGuiID       ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
292 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
293 static inline ImGuiID   ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
294 #endif
295 
296 // Helpers: Sorting
297 #define ImQsort         qsort
298 
299 // Helpers: Color Blending
300 IMGUI_API ImU32         ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
301 
302 // Helpers: Bit manipulation
ImIsPowerOfTwo(int v)303 static inline bool      ImIsPowerOfTwo(int v)           { return v != 0 && (v & (v - 1)) == 0; }
ImIsPowerOfTwo(ImU64 v)304 static inline bool      ImIsPowerOfTwo(ImU64 v)         { return v != 0 && (v & (v - 1)) == 0; }
ImUpperPowerOfTwo(int v)305 static inline int       ImUpperPowerOfTwo(int v)        { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
306 
307 // Helpers: String, Formatting
308 IMGUI_API int           ImStricmp(const char* str1, const char* str2);
309 IMGUI_API int           ImStrnicmp(const char* str1, const char* str2, size_t count);
310 IMGUI_API void          ImStrncpy(char* dst, const char* src, size_t count);
311 IMGUI_API char*         ImStrdup(const char* str);
312 IMGUI_API char*         ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);
313 IMGUI_API const char*   ImStrchrRange(const char* str_begin, const char* str_end, char c);
314 IMGUI_API int           ImStrlenW(const ImWchar* str);
315 IMGUI_API const char*   ImStreolRange(const char* str, const char* str_end);                // End end-of-line
316 IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin);   // Find beginning-of-line
317 IMGUI_API const char*   ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
318 IMGUI_API void          ImStrTrimBlanks(char* str);
319 IMGUI_API const char*   ImStrSkipBlank(const char* str);
320 IMGUI_API int           ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
321 IMGUI_API int           ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
322 IMGUI_API const char*   ImParseFormatFindStart(const char* format);
323 IMGUI_API const char*   ImParseFormatFindEnd(const char* format);
324 IMGUI_API const char*   ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
325 IMGUI_API int           ImParseFormatPrecision(const char* format, int default_value);
ImCharIsBlankA(char c)326 static inline bool      ImCharIsBlankA(char c)          { return c == ' ' || c == '\t'; }
ImCharIsBlankW(unsigned int c)327 static inline bool      ImCharIsBlankW(unsigned int c)  { return c == ' ' || c == '\t' || c == 0x3000; }
328 
329 // Helpers: UTF-8 <> wchar conversions
330 IMGUI_API const char*   ImTextCharToUtf8(char out_buf[5], unsigned int c);                                                      // return out_buf
331 IMGUI_API int           ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end);   // return output UTF-8 bytes count
332 IMGUI_API int           ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end);               // read one character. return input UTF-8 bytes count
333 IMGUI_API int           ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL);   // return input UTF-8 bytes count
334 IMGUI_API int           ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end);                                 // return number of UTF-8 code-points (NOT bytes count)
335 IMGUI_API int           ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end);                             // return number of bytes to express one char in UTF-8
336 IMGUI_API int           ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end);                        // return number of bytes to express string in UTF-8
337 
338 // Helpers: ImVec2/ImVec4 operators
339 // We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.)
340 // We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.
341 #ifdef IMGUI_DEFINE_MATH_OPERATORS
342 IM_MSVC_RUNTIME_CHECKS_OFF
343 static inline ImVec2 operator*(const ImVec2& lhs, const float rhs)              { return ImVec2(lhs.x * rhs, lhs.y * rhs); }
344 static inline ImVec2 operator/(const ImVec2& lhs, const float rhs)              { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
345 static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
346 static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
347 static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
348 static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
349 static inline ImVec2& operator*=(ImVec2& lhs, const float rhs)                  { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
350 static inline ImVec2& operator/=(ImVec2& lhs, const float rhs)                  { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
351 static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
352 static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
353 static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; }
354 static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; }
355 static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
356 static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
357 static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); }
358 IM_MSVC_RUNTIME_CHECKS_RESTORE
359 #endif
360 
361 // Helpers: File System
362 #ifdef IMGUI_DISABLE_FILE_FUNCTIONS
363 #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
364 typedef void* ImFileHandle;
ImFileOpen(const char *,const char *)365 static inline ImFileHandle  ImFileOpen(const char*, const char*)                    { return NULL; }
ImFileClose(ImFileHandle)366 static inline bool          ImFileClose(ImFileHandle)                               { return false; }
ImFileGetSize(ImFileHandle)367 static inline ImU64         ImFileGetSize(ImFileHandle)                             { return (ImU64)-1; }
ImFileRead(void *,ImU64,ImU64,ImFileHandle)368 static inline ImU64         ImFileRead(void*, ImU64, ImU64, ImFileHandle)           { return 0; }
ImFileWrite(const void *,ImU64,ImU64,ImFileHandle)369 static inline ImU64         ImFileWrite(const void*, ImU64, ImU64, ImFileHandle)    { return 0; }
370 #endif
371 #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
372 typedef FILE* ImFileHandle;
373 IMGUI_API ImFileHandle      ImFileOpen(const char* filename, const char* mode);
374 IMGUI_API bool              ImFileClose(ImFileHandle file);
375 IMGUI_API ImU64             ImFileGetSize(ImFileHandle file);
376 IMGUI_API ImU64             ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
377 IMGUI_API ImU64             ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
378 #else
379 #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
380 #endif
381 IMGUI_API void*             ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
382 
383 // Helpers: Maths
384 IM_MSVC_RUNTIME_CHECKS_OFF
385 // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
386 #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
387 #define ImFabs(X)           fabsf(X)
388 #define ImSqrt(X)           sqrtf(X)
389 #define ImFmod(X, Y)        fmodf((X), (Y))
390 #define ImCos(X)            cosf(X)
391 #define ImSin(X)            sinf(X)
392 #define ImAcos(X)           acosf(X)
393 #define ImAtan2(Y, X)       atan2f((Y), (X))
394 #define ImAtof(STR)         atof(STR)
395 //#define ImFloorStd(X)     floorf(X)           // We use our own, see ImFloor() and ImFloorSigned()
396 #define ImCeil(X)           ceilf(X)
ImPow(float x,float y)397 static inline float  ImPow(float x, float y)    { return powf(x, y); }          // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
ImPow(double x,double y)398 static inline double ImPow(double x, double y)  { return pow(x, y); }
ImLog(float x)399 static inline float  ImLog(float x)             { return logf(x); }             // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
ImLog(double x)400 static inline double ImLog(double x)            { return log(x); }
ImAbs(int x)401 static inline int    ImAbs(int x)               { return x < 0 ? -x : x; }
ImAbs(float x)402 static inline float  ImAbs(float x)             { return fabsf(x); }
ImAbs(double x)403 static inline double ImAbs(double x)            { return fabs(x); }
ImSign(float x)404 static inline float  ImSign(float x)            { return (x < 0.0f) ? -1.0f : ((x > 0.0f) ? 1.0f : 0.0f); } // Sign operator - returns -1, 0 or 1 based on sign of argument
ImSign(double x)405 static inline double ImSign(double x)           { return (x < 0.0) ? -1.0 : ((x > 0.0) ? 1.0 : 0.0); }
406 #ifdef IMGUI_ENABLE_SSE
ImRsqrt(float x)407 static inline float  ImRsqrt(float x)           { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
408 #else
ImRsqrt(float x)409 static inline float  ImRsqrt(float x)           { return 1.0f / sqrtf(x); }
410 #endif
ImRsqrt(double x)411 static inline double ImRsqrt(double x)          { return 1.0 / sqrt(x); }
412 #endif
413 // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
414 // (Exceptionally using templates here but we could also redefine them for those types)
ImMin(T lhs,T rhs)415 template<typename T> static inline T ImMin(T lhs, T rhs)                        { return lhs < rhs ? lhs : rhs; }
ImMax(T lhs,T rhs)416 template<typename T> static inline T ImMax(T lhs, T rhs)                        { return lhs >= rhs ? lhs : rhs; }
ImClamp(T v,T mn,T mx)417 template<typename T> static inline T ImClamp(T v, T mn, T mx)                   { return (v < mn) ? mn : (v > mx) ? mx : v; }
ImLerp(T a,T b,float t)418 template<typename T> static inline T ImLerp(T a, T b, float t)                  { return (T)(a + (b - a) * t); }
ImSwap(T & a,T & b)419 template<typename T> static inline void ImSwap(T& a, T& b)                      { T tmp = a; a = b; b = tmp; }
ImAddClampOverflow(T a,T b,T mn,T mx)420 template<typename T> static inline T ImAddClampOverflow(T a, T b, T mn, T mx)   { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; }
ImSubClampOverflow(T a,T b,T mn,T mx)421 template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx)   { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; }
422 // - Misc maths helpers
ImMin(const ImVec2 & lhs,const ImVec2 & rhs)423 static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
ImMax(const ImVec2 & lhs,const ImVec2 & rhs)424 static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
ImClamp(const ImVec2 & v,const ImVec2 & mn,ImVec2 mx)425 static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx)      { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
ImLerp(const ImVec2 & a,const ImVec2 & b,float t)426 static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t)          { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }
ImLerp(const ImVec2 & a,const ImVec2 & b,const ImVec2 & t)427 static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t)  { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
ImLerp(const ImVec4 & a,const ImVec4 & b,float t)428 static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t)          { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }
ImSaturate(float f)429 static inline float  ImSaturate(float f)                                        { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
ImLengthSqr(const ImVec2 & lhs)430 static inline float  ImLengthSqr(const ImVec2& lhs)                             { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
ImLengthSqr(const ImVec4 & lhs)431 static inline float  ImLengthSqr(const ImVec4& lhs)                             { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
ImInvLength(const ImVec2 & lhs,float fail_value)432 static inline float  ImInvLength(const ImVec2& lhs, float fail_value)           { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; }
ImFloor(float f)433 static inline float  ImFloor(float f)                                           { return (float)(int)(f); }
ImFloorSigned(float f)434 static inline float  ImFloorSigned(float f)                                     { return (float)((f >= 0 || (int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
ImFloor(const ImVec2 & v)435 static inline ImVec2 ImFloor(const ImVec2& v)                                   { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
ImModPositive(int a,int b)436 static inline int    ImModPositive(int a, int b)                                { return (a + b) % b; }
ImDot(const ImVec2 & a,const ImVec2 & b)437 static inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; }
ImRotate(const ImVec2 & v,float cos_a,float sin_a)438 static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a)        { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
ImLinearSweep(float current,float target,float speed)439 static inline float  ImLinearSweep(float current, float target, float speed)    { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
ImMul(const ImVec2 & lhs,const ImVec2 & rhs)440 static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
441 IM_MSVC_RUNTIME_CHECKS_RESTORE
442 
443 // Helpers: Geometry
444 IMGUI_API ImVec2     ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
445 IMGUI_API ImVec2     ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments);       // For curves with explicit number of segments
446 IMGUI_API ImVec2     ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol
447 IMGUI_API ImVec2     ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
448 IMGUI_API ImVec2     ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
449 IMGUI_API bool       ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
450 IMGUI_API ImVec2     ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
451 IMGUI_API void       ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
ImTriangleArea(const ImVec2 & a,const ImVec2 & b,const ImVec2 & c)452 inline float         ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
453 IMGUI_API ImGuiDir   ImGetDirQuadrantFromDelta(float dx, float dy);
454 
455 // Helper: ImVec1 (1D vector)
456 // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
457 IM_MSVC_RUNTIME_CHECKS_OFF
458 struct ImVec1
459 {
460     float   x;
ImVec1ImVec1461     ImVec1()         { x = 0.0f; }
ImVec1ImVec1462     ImVec1(float _x) { x = _x; }
463 };
464 
465 // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
466 struct ImVec2ih
467 {
468     short   x, y;
ImVec2ihImVec2ih469     ImVec2ih()                           { x = y = 0; }
ImVec2ihImVec2ih470     ImVec2ih(short _x, short _y)         { x = _x; y = _y; }
ImVec2ihImVec2ih471     explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; }
472 };
473 
474 // Helper: ImRect (2D axis aligned bounding-box)
475 // NB: we can't rely on ImVec2 math operators being available here!
476 struct IMGUI_API ImRect
477 {
478     ImVec2      Min;    // Upper-left
479     ImVec2      Max;    // Lower-right
480 
ImRectImRect481     ImRect()                                        : Min(0.0f, 0.0f), Max(0.0f, 0.0f)  {}
ImRectImRect482     ImRect(const ImVec2& min, const ImVec2& max)    : Min(min), Max(max)                {}
ImRectImRect483     ImRect(const ImVec4& v)                         : Min(v.x, v.y), Max(v.z, v.w)      {}
ImRectImRect484     ImRect(float x1, float y1, float x2, float y2)  : Min(x1, y1), Max(x2, y2)          {}
485 
GetCenterImRect486     ImVec2      GetCenter() const                   { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
GetSizeImRect487     ImVec2      GetSize() const                     { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
GetWidthImRect488     float       GetWidth() const                    { return Max.x - Min.x; }
GetHeightImRect489     float       GetHeight() const                   { return Max.y - Min.y; }
GetAreaImRect490     float       GetArea() const                     { return (Max.x - Min.x) * (Max.y - Min.y); }
GetTLImRect491     ImVec2      GetTL() const                       { return Min; }                   // Top-left
GetTRImRect492     ImVec2      GetTR() const                       { return ImVec2(Max.x, Min.y); }  // Top-right
GetBLImRect493     ImVec2      GetBL() const                       { return ImVec2(Min.x, Max.y); }  // Bottom-left
GetBRImRect494     ImVec2      GetBR() const                       { return Max; }                   // Bottom-right
ContainsImRect495     bool        Contains(const ImVec2& p) const     { return p.x     >= Min.x && p.y     >= Min.y && p.x     <  Max.x && p.y     <  Max.y; }
ContainsImRect496     bool        Contains(const ImRect& r) const     { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
OverlapsImRect497     bool        Overlaps(const ImRect& r) const     { return r.Min.y <  Max.y && r.Max.y >  Min.y && r.Min.x <  Max.x && r.Max.x >  Min.x; }
AddImRect498     void        Add(const ImVec2& p)                { if (Min.x > p.x)     Min.x = p.x;     if (Min.y > p.y)     Min.y = p.y;     if (Max.x < p.x)     Max.x = p.x;     if (Max.y < p.y)     Max.y = p.y; }
AddImRect499     void        Add(const ImRect& r)                { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
ExpandImRect500     void        Expand(const float amount)          { Min.x -= amount;   Min.y -= amount;   Max.x += amount;   Max.y += amount; }
ExpandImRect501     void        Expand(const ImVec2& amount)        { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
TranslateImRect502     void        Translate(const ImVec2& d)          { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
TranslateXImRect503     void        TranslateX(float dx)                { Min.x += dx; Max.x += dx; }
TranslateYImRect504     void        TranslateY(float dy)                { Min.y += dy; Max.y += dy; }
ClipWithImRect505     void        ClipWith(const ImRect& r)           { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); }                   // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
ClipWithFullImRect506     void        ClipWithFull(const ImRect& r)       { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
FloorImRect507     void        Floor()                             { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
IsInvertedImRect508     bool        IsInverted() const                  { return Min.x > Max.x || Min.y > Max.y; }
ToVec4ImRect509     ImVec4      ToVec4() const                      { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
510 };
511 IM_MSVC_RUNTIME_CHECKS_RESTORE
512 
513 // Helper: ImBitArray
ImBitArrayTestBit(const ImU32 * arr,int n)514 inline bool     ImBitArrayTestBit(const ImU32* arr, int n)      { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
ImBitArrayClearBit(ImU32 * arr,int n)515 inline void     ImBitArrayClearBit(ImU32* arr, int n)           { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
ImBitArraySetBit(ImU32 * arr,int n)516 inline void     ImBitArraySetBit(ImU32* arr, int n)             { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
ImBitArraySetBitRange(ImU32 * arr,int n,int n2)517 inline void     ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
518 {
519     n2--;
520     while (n <= n2)
521     {
522         int a_mod = (n & 31);
523         int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
524         ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
525         arr[n >> 5] |= mask;
526         n = (n + 32) & ~31;
527     }
528 }
529 
530 // Helper: ImBitArray class (wrapper over ImBitArray functions)
531 // Store 1-bit per value.
532 template<int BITCOUNT>
533 struct IMGUI_API ImBitArray
534 {
535     ImU32           Storage[(BITCOUNT + 31) >> 5];
ImBitArrayImBitArray536     ImBitArray()                                { ClearAllBits(); }
ClearAllBitsImBitArray537     void            ClearAllBits()              { memset(Storage, 0, sizeof(Storage)); }
SetAllBitsImBitArray538     void            SetAllBits()                { memset(Storage, 255, sizeof(Storage)); }
TestBitImBitArray539     bool            TestBit(int n) const        { IM_ASSERT(n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
SetBitImBitArray540     void            SetBit(int n)               { IM_ASSERT(n < BITCOUNT); ImBitArraySetBit(Storage, n); }
ClearBitImBitArray541     void            ClearBit(int n)             { IM_ASSERT(n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
SetBitRangeImBitArray542     void            SetBitRange(int n, int n2)  { ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
543 };
544 
545 // Helper: ImBitVector
546 // Store 1-bit per value.
547 struct IMGUI_API ImBitVector
548 {
549     ImVector<ImU32> Storage;
CreateImBitVector550     void            Create(int sz)              { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
ClearImBitVector551     void            Clear()                     { Storage.clear(); }
TestBitImBitVector552     bool            TestBit(int n) const        { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); }
SetBitImBitVector553     void            SetBit(int n)               { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
ClearBitImBitVector554     void            ClearBit(int n)             { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
555 };
556 
557 // Helper: ImSpan<>
558 // Pointing to a span of data we don't own.
559 template<typename T>
560 struct ImSpan
561 {
562     T*                  Data;
563     T*                  DataEnd;
564 
565     // Constructors, destructor
ImSpanImSpan566     inline ImSpan()                                 { Data = DataEnd = NULL; }
ImSpanImSpan567     inline ImSpan(T* data, int size)                { Data = data; DataEnd = data + size; }
ImSpanImSpan568     inline ImSpan(T* data, T* data_end)             { Data = data; DataEnd = data_end; }
569 
setImSpan570     inline void         set(T* data, int size)      { Data = data; DataEnd = data + size; }
setImSpan571     inline void         set(T* data, T* data_end)   { Data = data; DataEnd = data_end; }
sizeImSpan572     inline int          size() const                { return (int)(ptrdiff_t)(DataEnd - Data); }
size_in_bytesImSpan573     inline int          size_in_bytes() const       { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
574     inline T&           operator[](int i)           { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
575     inline const T&     operator[](int i) const     { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
576 
beginImSpan577     inline T*           begin()                     { return Data; }
beginImSpan578     inline const T*     begin() const               { return Data; }
endImSpan579     inline T*           end()                       { return DataEnd; }
endImSpan580     inline const T*     end() const                 { return DataEnd; }
581 
582     // Utilities
index_from_ptrImSpan583     inline int  index_from_ptr(const T* it) const   { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
584 };
585 
586 // Helper: ImSpanAllocator<>
587 // Facilitate storing multiple chunks into a single large block (the "arena")
588 // - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
589 template<int CHUNKS>
590 struct ImSpanAllocator
591 {
592     char*   BasePtr;
593     int     CurrOff;
594     int     CurrIdx;
595     int     Offsets[CHUNKS];
596     int     Sizes[CHUNKS];
597 
ImSpanAllocatorImSpanAllocator598     ImSpanAllocator()                               { memset(this, 0, sizeof(*this)); }
599     inline void  Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; }
GetArenaSizeInBytesImSpanAllocator600     inline int   GetArenaSizeInBytes()              { return CurrOff; }
SetArenaBasePtrImSpanAllocator601     inline void  SetArenaBasePtr(void* base_ptr)    { BasePtr = (char*)base_ptr; }
GetSpanPtrBeginImSpanAllocator602     inline void* GetSpanPtrBegin(int n)             { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
GetSpanPtrEndImSpanAllocator603     inline void* GetSpanPtrEnd(int n)               { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
604     template<typename T>
GetSpanImSpanAllocator605     inline void  GetSpan(int n, ImSpan<T>* span)    { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
606 };
607 
608 // Helper: ImPool<>
609 // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
610 // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
611 typedef int ImPoolIdx;
612 template<typename T>
613 struct IMGUI_API ImPool
614 {
615     ImVector<T>     Buf;        // Contiguous data
616     ImGuiStorage    Map;        // ID->Index
617     ImPoolIdx       FreeIdx;    // Next free idx to use
618     ImPoolIdx       AliveCount; // Number of active/alive items (for display purpose)
619 
ImPoolImPool620     ImPool()    { FreeIdx = AliveCount = 0; }
~ImPoolImPool621     ~ImPool()   { Clear(); }
GetByKeyImPool622     T*          GetByKey(ImGuiID key)               { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
GetByIndexImPool623     T*          GetByIndex(ImPoolIdx n)             { return &Buf[n]; }
GetIndexImPool624     ImPoolIdx   GetIndex(const T* p) const          { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
GetOrAddByKeyImPool625     T*          GetOrAddByKey(ImGuiID key)          { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
ContainsImPool626     bool        Contains(const T* p) const          { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
ClearImPool627     void        Clear()                             { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; }
AddImPool628     T*          Add()                               { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; }
RemoveImPool629     void        Remove(ImGuiID key, const T* p)     { Remove(key, GetIndex(p)); }
RemoveImPool630     void        Remove(ImGuiID key, ImPoolIdx idx)  { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }
ReserveImPool631     void        Reserve(int capacity)               { Buf.reserve(capacity); Map.Data.reserve(capacity); }
632 
633     // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }
634     // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()
GetAliveCountImPool635     int         GetAliveCount() const               { return AliveCount; }      // Number of active/alive items in the pool (for display purpose)
GetBufSizeImPool636     int         GetBufSize() const                  { return Buf.Size; }
GetMapSizeImPool637     int         GetMapSize() const                  { return Map.Data.Size; }   // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere
TryGetMapDataImPool638     T*          TryGetMapData(ImPoolIdx n)          { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
639 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
GetSizeImPool640     int         GetSize()                           { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304)
641 #endif
642 };
643 
644 // Helper: ImChunkStream<>
645 // Build and iterate a contiguous stream of variable-sized structures.
646 // This is used by Settings to store persistent data while reducing allocation count.
647 // We store the chunk size first, and align the final size on 4 bytes boundaries.
648 // The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
649 template<typename T>
650 struct IMGUI_API ImChunkStream
651 {
652     ImVector<char>  Buf;
653 
clearImChunkStream654     void    clear()                     { Buf.clear(); }
emptyImChunkStream655     bool    empty() const               { return Buf.Size == 0; }
sizeImChunkStream656     int     size() const                { return Buf.Size; }
alloc_chunkImChunkStream657     T*      alloc_chunk(size_t sz)      { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); }
beginImChunkStream658     T*      begin()                     { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
next_chunkImChunkStream659     T*      next_chunk(T* p)            { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; }
chunk_sizeImChunkStream660     int     chunk_size(const T* p)      { return ((const int*)p)[-1]; }
endImChunkStream661     T*      end()                       { return (T*)(void*)(Buf.Data + Buf.Size); }
offset_from_ptrImChunkStream662     int     offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }
ptr_from_offsetImChunkStream663     T*      ptr_from_offset(int off)    { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
swapImChunkStream664     void    swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
665 
666 };
667 
668 //-----------------------------------------------------------------------------
669 // [SECTION] ImDrawList support
670 //-----------------------------------------------------------------------------
671 
672 // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
673 // Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
674 // Number of segments (N) is calculated using equation:
675 //   N = ceil ( pi / acos(1 - error / r) )     where r > 0, error <= r
676 // Our equation is significantly simpler that one in the post thanks for choosing segment that is
677 // perpendicular to X axis. Follow steps in the article from this starting condition and you will
678 // will get this result.
679 //
680 // Rendering circles with an odd number of segments, while mathematically correct will produce
681 // asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
682 //
683 #define IM_ROUNDUP_TO_EVEN(_V)                                  ((((_V) + 1) / 2) * 2)
684 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN                     4
685 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX                     512
686 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR)    ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
687 
688 // Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
689 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR)    ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
690 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD)     ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
691 
692 // ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
693 #ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
694 #define IM_DRAWLIST_ARCFAST_TABLE_SIZE                          48 // Number of samples in lookup table.
695 #endif
696 #define IM_DRAWLIST_ARCFAST_SAMPLE_MAX                          IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
697 
698 // Data shared between all ImDrawList instances
699 // You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
700 struct IMGUI_API ImDrawListSharedData
701 {
702     ImVec2          TexUvWhitePixel;            // UV of white pixel in the atlas
703     ImFont*         Font;                       // Current/default font (optional, for simplified AddText overload)
704     float           FontSize;                   // Current/default font size (optional, for simplified AddText overload)
705     float           CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo()
706     float           CircleSegmentMaxError;      // Number of circle segments to use per pixel of radius for AddCircle() etc
707     ImVec4          ClipRectFullscreen;         // Value for PushClipRectFullscreen()
708     ImDrawListFlags InitialFlags;               // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
709 
710     // [Internal] Lookup tables
711     ImVec2          ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
712     float           ArcFastRadiusCutoff;                        // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
713     ImU8            CircleSegmentCounts[64];    // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
714     const ImVec4*   TexUvLines;                 // UV of anti-aliased lines in the atlas
715 
716     ImDrawListSharedData();
717     void SetCircleTessellationMaxError(float max_error);
718 };
719 
720 struct ImDrawDataBuilder
721 {
722     ImVector<ImDrawList*>   Layers[2];           // Global layers for: regular, tooltip
723 
ClearImDrawDataBuilder724     void Clear()                    { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
ClearFreeMemoryImDrawDataBuilder725     void ClearFreeMemory()          { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
GetDrawListCountImDrawDataBuilder726     int  GetDrawListCount() const   { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; }
727     IMGUI_API void FlattenIntoSingleLayer();
728 };
729 
730 //-----------------------------------------------------------------------------
731 // [SECTION] Widgets support: flags, enums, data structures
732 //-----------------------------------------------------------------------------
733 
734 // Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
735 // This is going to be exposed in imgui.h when stabilized enough.
736 enum ImGuiItemFlags_
737 {
738     ImGuiItemFlags_None                     = 0,
739     ImGuiItemFlags_NoTabStop                = 1 << 0,  // false     // Disable keyboard tabbing (FIXME: should merge with _NoNav)
740     ImGuiItemFlags_ButtonRepeat             = 1 << 1,  // false     // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
741     ImGuiItemFlags_Disabled                 = 1 << 2,  // false     // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211
742     ImGuiItemFlags_NoNav                    = 1 << 3,  // false     // Disable keyboard/gamepad directional navigation (FIXME: should merge with _NoTabStop)
743     ImGuiItemFlags_NoNavDefaultFocus        = 1 << 4,  // false     // Disable item being a candidate for default focus (e.g. used by title bar items)
744     ImGuiItemFlags_SelectableDontClosePopup = 1 << 5,  // false     // Disable MenuItem/Selectable() automatically closing their popup window
745     ImGuiItemFlags_MixedValue               = 1 << 6,  // false     // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
746     ImGuiItemFlags_ReadOnly                 = 1 << 7,  // false     // [ALPHA] Allow hovering interactions but underlying value is not changed.
747     ImGuiItemFlags_Inputable                = 1 << 8   // false     // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
748 };
749 
750 // Storage for LastItem data
751 enum ImGuiItemStatusFlags_
752 {
753     ImGuiItemStatusFlags_None               = 0,
754     ImGuiItemStatusFlags_HoveredRect        = 1 << 0,   // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test)
755     ImGuiItemStatusFlags_HasDisplayRect     = 1 << 1,   // g.LastItemData.DisplayRect is valid
756     ImGuiItemStatusFlags_Edited             = 1 << 2,   // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
757     ImGuiItemStatusFlags_ToggledSelection   = 1 << 3,   // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues.
758     ImGuiItemStatusFlags_ToggledOpen        = 1 << 4,   // Set when TreeNode() reports toggling their open state.
759     ImGuiItemStatusFlags_HasDeactivated     = 1 << 5,   // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
760     ImGuiItemStatusFlags_Deactivated        = 1 << 6,   // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
761     ImGuiItemStatusFlags_HoveredWindow      = 1 << 7,   // Override the HoveredWindow test to allow cross-window hover testing.
762     ImGuiItemStatusFlags_FocusedByTabbing   = 1 << 8    // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon)
763 
764 #ifdef IMGUI_ENABLE_TEST_ENGINE
765     , // [imgui_tests only]
766     ImGuiItemStatusFlags_Openable           = 1 << 20,  //
767     ImGuiItemStatusFlags_Opened             = 1 << 21,  //
768     ImGuiItemStatusFlags_Checkable          = 1 << 22,  //
769     ImGuiItemStatusFlags_Checked            = 1 << 23   //
770 #endif
771 };
772 
773 // Extend ImGuiInputTextFlags_
774 enum ImGuiInputTextFlagsPrivate_
775 {
776     // [Internal]
777     ImGuiInputTextFlags_Multiline           = 1 << 26,  // For internal use by InputTextMultiline()
778     ImGuiInputTextFlags_NoMarkEdited        = 1 << 27,  // For internal use by functions using InputText() before reformatting data
779     ImGuiInputTextFlags_MergedItem          = 1 << 28   // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
780 };
781 
782 // Extend ImGuiButtonFlags_
783 enum ImGuiButtonFlagsPrivate_
784 {
785     ImGuiButtonFlags_PressedOnClick         = 1 << 4,   // return true on click (mouse down event)
786     ImGuiButtonFlags_PressedOnClickRelease  = 1 << 5,   // [Default] return true on click + release on same item <-- this is what the majority of Button are using
787     ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
788     ImGuiButtonFlags_PressedOnRelease       = 1 << 7,   // return true on release (default requires click+release)
789     ImGuiButtonFlags_PressedOnDoubleClick   = 1 << 8,   // return true on double-click (default requires click+release)
790     ImGuiButtonFlags_PressedOnDragDropHold  = 1 << 9,   // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
791     ImGuiButtonFlags_Repeat                 = 1 << 10,  // hold to repeat
792     ImGuiButtonFlags_FlattenChildren        = 1 << 11,  // allow interactions even if a child window is overlapping
793     ImGuiButtonFlags_AllowItemOverlap       = 1 << 12,  // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
794     ImGuiButtonFlags_DontClosePopups        = 1 << 13,  // disable automatically closing parent popup on press // [UNUSED]
795     //ImGuiButtonFlags_Disabled             = 1 << 14,  // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
796     ImGuiButtonFlags_AlignTextBaseLine      = 1 << 15,  // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
797     ImGuiButtonFlags_NoKeyModifiers         = 1 << 16,  // disable mouse interaction if a key modifier is held
798     ImGuiButtonFlags_NoHoldingActiveId      = 1 << 17,  // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
799     ImGuiButtonFlags_NoNavFocus             = 1 << 18,  // don't override navigation focus when activated
800     ImGuiButtonFlags_NoHoveredOnFocus       = 1 << 19,  // don't report as hovered when nav focus is on this item
801     ImGuiButtonFlags_PressedOnMask_         = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
802     ImGuiButtonFlags_PressedOnDefault_      = ImGuiButtonFlags_PressedOnClickRelease
803 };
804 
805 // Extend ImGuiComboFlags_
806 enum ImGuiComboFlagsPrivate_
807 {
808     ImGuiComboFlags_CustomPreview           = 1 << 20   // enable BeginComboPreview()
809 };
810 
811 // Extend ImGuiSliderFlags_
812 enum ImGuiSliderFlagsPrivate_
813 {
814     ImGuiSliderFlags_Vertical               = 1 << 20,  // Should this slider be orientated vertically?
815     ImGuiSliderFlags_ReadOnly               = 1 << 21
816 };
817 
818 // Extend ImGuiSelectableFlags_
819 enum ImGuiSelectableFlagsPrivate_
820 {
821     // NB: need to be in sync with last value of ImGuiSelectableFlags_
822     ImGuiSelectableFlags_NoHoldingActiveID      = 1 << 20,
823     ImGuiSelectableFlags_SelectOnNav            = 1 << 21,  // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API.
824     ImGuiSelectableFlags_SelectOnClick          = 1 << 22,  // Override button behavior to react on Click (default is Click+Release)
825     ImGuiSelectableFlags_SelectOnRelease        = 1 << 23,  // Override button behavior to react on Release (default is Click+Release)
826     ImGuiSelectableFlags_SpanAvailWidth         = 1 << 24,  // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus)
827     ImGuiSelectableFlags_DrawHoveredWhenHeld    = 1 << 25,  // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow.
828     ImGuiSelectableFlags_SetNavIdOnHover        = 1 << 26,  // Set Nav/Focus ID on mouse hover (used by MenuItem)
829     ImGuiSelectableFlags_NoPadWithHalfSpacing   = 1 << 27   // Disable padding each side with ItemSpacing * 0.5f
830 };
831 
832 // Extend ImGuiTreeNodeFlags_
833 enum ImGuiTreeNodeFlagsPrivate_
834 {
835     ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20
836 };
837 
838 enum ImGuiSeparatorFlags_
839 {
840     ImGuiSeparatorFlags_None                = 0,
841     ImGuiSeparatorFlags_Horizontal          = 1 << 0,   // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
842     ImGuiSeparatorFlags_Vertical            = 1 << 1,
843     ImGuiSeparatorFlags_SpanAllColumns      = 1 << 2
844 };
845 
846 enum ImGuiTextFlags_
847 {
848     ImGuiTextFlags_None = 0,
849     ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0
850 };
851 
852 enum ImGuiTooltipFlags_
853 {
854     ImGuiTooltipFlags_None = 0,
855     ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0      // Override will clear/ignore previously submitted tooltip (defaults to append)
856 };
857 
858 // FIXME: this is in development, not exposed/functional as a generic feature yet.
859 // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
860 enum ImGuiLayoutType_
861 {
862     ImGuiLayoutType_Horizontal = 0,
863     ImGuiLayoutType_Vertical = 1
864 };
865 
866 enum ImGuiLogType
867 {
868     ImGuiLogType_None = 0,
869     ImGuiLogType_TTY,
870     ImGuiLogType_File,
871     ImGuiLogType_Buffer,
872     ImGuiLogType_Clipboard
873 };
874 
875 // X/Y enums are fixed to 0/1 so they may be used to index ImVec2
876 enum ImGuiAxis
877 {
878     ImGuiAxis_None = -1,
879     ImGuiAxis_X = 0,
880     ImGuiAxis_Y = 1
881 };
882 
883 enum ImGuiPlotType
884 {
885     ImGuiPlotType_Lines,
886     ImGuiPlotType_Histogram
887 };
888 
889 enum ImGuiInputSource
890 {
891     ImGuiInputSource_None = 0,
892     ImGuiInputSource_Mouse,
893     ImGuiInputSource_Keyboard,
894     ImGuiInputSource_Gamepad,
895     ImGuiInputSource_Nav,               // Stored in g.ActiveIdSource only
896     ImGuiInputSource_Clipboard,         // Currently only used by InputText()
897     ImGuiInputSource_COUNT
898 };
899 
900 // FIXME-NAV: Clarify/expose various repeat delay/rate
901 enum ImGuiInputReadMode
902 {
903     ImGuiInputReadMode_Down,
904     ImGuiInputReadMode_Pressed,
905     ImGuiInputReadMode_Released,
906     ImGuiInputReadMode_Repeat,
907     ImGuiInputReadMode_RepeatSlow,
908     ImGuiInputReadMode_RepeatFast
909 };
910 
911 enum ImGuiPopupPositionPolicy
912 {
913     ImGuiPopupPositionPolicy_Default,
914     ImGuiPopupPositionPolicy_ComboBox,
915     ImGuiPopupPositionPolicy_Tooltip
916 };
917 
918 struct ImGuiDataTypeTempStorage
919 {
920     ImU8        Data[8];        // Can fit any data up to ImGuiDataType_COUNT
921 };
922 
923 // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
924 struct ImGuiDataTypeInfo
925 {
926     size_t      Size;           // Size in bytes
927     const char* Name;           // Short descriptive name for the type, for debugging
928     const char* PrintFmt;       // Default printf format for the type
929     const char* ScanFmt;        // Default scanf format for the type
930 };
931 
932 // Extend ImGuiDataType_
933 enum ImGuiDataTypePrivate_
934 {
935     ImGuiDataType_String = ImGuiDataType_COUNT + 1,
936     ImGuiDataType_Pointer,
937     ImGuiDataType_ID
938 };
939 
940 // Stacked color modifier, backup of modified data so we can restore it
941 struct ImGuiColorMod
942 {
943     ImGuiCol    Col;
944     ImVec4      BackupValue;
945 };
946 
947 // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
948 struct ImGuiStyleMod
949 {
950     ImGuiStyleVar   VarIdx;
951     union           { int BackupInt[2]; float BackupFloat[2]; };
ImGuiStyleModImGuiStyleMod952     ImGuiStyleMod(ImGuiStyleVar idx, int v)     { VarIdx = idx; BackupInt[0] = v; }
ImGuiStyleModImGuiStyleMod953     ImGuiStyleMod(ImGuiStyleVar idx, float v)   { VarIdx = idx; BackupFloat[0] = v; }
ImGuiStyleModImGuiStyleMod954     ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v)  { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
955 };
956 
957 // Storage data for BeginComboPreview()/EndComboPreview()
958 struct IMGUI_API ImGuiComboPreviewData
959 {
960     ImRect          PreviewRect;
961     ImVec2          BackupCursorPos;
962     ImVec2          BackupCursorMaxPos;
963     ImVec2          BackupCursorPosPrevLine;
964     float           BackupPrevLineTextBaseOffset;
965     ImGuiLayoutType BackupLayout;
966 
ImGuiComboPreviewDataImGuiComboPreviewData967     ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); }
968 };
969 
970 // Stacked storage data for BeginGroup()/EndGroup()
971 struct IMGUI_API ImGuiGroupData
972 {
973     ImGuiID     WindowID;
974     ImVec2      BackupCursorPos;
975     ImVec2      BackupCursorMaxPos;
976     ImVec1      BackupIndent;
977     ImVec1      BackupGroupOffset;
978     ImVec2      BackupCurrLineSize;
979     float       BackupCurrLineTextBaseOffset;
980     ImGuiID     BackupActiveIdIsAlive;
981     bool        BackupActiveIdPreviousFrameIsAlive;
982     bool        BackupHoveredIdIsAlive;
983     bool        EmitItem;
984 };
985 
986 // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
987 struct IMGUI_API ImGuiMenuColumns
988 {
989     ImU32       TotalWidth;
990     ImU32       NextTotalWidth;
991     ImU16       Spacing;
992     ImU16       OffsetIcon;         // Always zero for now
993     ImU16       OffsetLabel;        // Offsets are locked in Update()
994     ImU16       OffsetShortcut;
995     ImU16       OffsetMark;
996     ImU16       Widths[4];          // Width of:   Icon, Label, Shortcut, Mark  (accumulators for current frame)
997 
ImGuiMenuColumnsImGuiMenuColumns998     ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
999     void        Update(float spacing, bool window_reappearing);
1000     float       DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);
1001     void        CalcNextTotalWidth(bool update_offsets);
1002 };
1003 
1004 // Internal state of the currently focused/edited text input box
1005 // For a given item ID, access with ImGui::GetInputTextState()
1006 struct IMGUI_API ImGuiInputTextState
1007 {
1008     ImGuiID                 ID;                     // widget id owning the text state
1009     int                     CurLenW, CurLenA;       // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
1010     ImVector<ImWchar>       TextW;                  // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
1011     ImVector<char>          TextA;                  // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
1012     ImVector<char>          InitialTextA;           // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
1013     bool                    TextAIsValid;           // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
1014     int                     BufCapacityA;           // end-user buffer capacity
1015     float                   ScrollX;                // horizontal scrolling/offset
1016     ImStb::STB_TexteditState Stb;                   // state for stb_textedit.h
1017     float                   CursorAnim;             // timer for cursor blink, reset on every user action so the cursor reappears immediately
1018     bool                    CursorFollow;           // set when we want scrolling to follow the current cursor position (not always!)
1019     bool                    SelectedAllMouseLock;   // after a double-click to select all, we ignore further mouse drags to update selection
1020     bool                    Edited;                 // edited this frame
1021     ImGuiInputTextFlags     Flags;                  // copy of InputText() flags
1022     ImGuiInputTextCallback  UserCallback;           // "
1023     void*                   UserCallbackData;       // "
1024 
ImGuiInputTextStateImGuiInputTextState1025     ImGuiInputTextState()                   { memset(this, 0, sizeof(*this)); }
ClearTextImGuiInputTextState1026     void        ClearText()                 { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
ClearFreeMemoryImGuiInputTextState1027     void        ClearFreeMemory()           { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
GetUndoAvailCountImGuiInputTextState1028     int         GetUndoAvailCount() const   { return Stb.undostate.undo_point; }
GetRedoAvailCountImGuiInputTextState1029     int         GetRedoAvailCount() const   { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
1030     void        OnKeyPressed(int key);      // Cannot be inline because we call in code in stb_textedit.h implementation
1031 
1032     // Cursor & Selection
CursorAnimResetImGuiInputTextState1033     void        CursorAnimReset()           { CursorAnim = -0.30f; }                                   // After a user-input the cursor stays on for a while without blinking
CursorClampImGuiInputTextState1034     void        CursorClamp()               { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
HasSelectionImGuiInputTextState1035     bool        HasSelection() const        { return Stb.select_start != Stb.select_end; }
ClearSelectionImGuiInputTextState1036     void        ClearSelection()            { Stb.select_start = Stb.select_end = Stb.cursor; }
GetCursorPosImGuiInputTextState1037     int         GetCursorPos() const        { return Stb.cursor; }
GetSelectionStartImGuiInputTextState1038     int         GetSelectionStart() const   { return Stb.select_start; }
GetSelectionEndImGuiInputTextState1039     int         GetSelectionEnd() const     { return Stb.select_end; }
SelectAllImGuiInputTextState1040     void        SelectAll()                 { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
1041 };
1042 
1043 // Storage for current popup stack
1044 struct ImGuiPopupData
1045 {
1046     ImGuiID             PopupId;        // Set on OpenPopup()
1047     ImGuiWindow*        Window;         // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1048     ImGuiWindow*        SourceWindow;   // Set on OpenPopup() copy of NavWindow at the time of opening the popup
1049     int                 OpenFrameCount; // Set on OpenPopup()
1050     ImGuiID             OpenParentId;   // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
1051     ImVec2              OpenPopupPos;   // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1052     ImVec2              OpenMousePos;   // Set on OpenPopup(), copy of mouse position at the time of opening popup
1053 
ImGuiPopupDataImGuiPopupData1054     ImGuiPopupData()    { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; }
1055 };
1056 
1057 enum ImGuiNextWindowDataFlags_
1058 {
1059     ImGuiNextWindowDataFlags_None               = 0,
1060     ImGuiNextWindowDataFlags_HasPos             = 1 << 0,
1061     ImGuiNextWindowDataFlags_HasSize            = 1 << 1,
1062     ImGuiNextWindowDataFlags_HasContentSize     = 1 << 2,
1063     ImGuiNextWindowDataFlags_HasCollapsed       = 1 << 3,
1064     ImGuiNextWindowDataFlags_HasSizeConstraint  = 1 << 4,
1065     ImGuiNextWindowDataFlags_HasFocus           = 1 << 5,
1066     ImGuiNextWindowDataFlags_HasBgAlpha         = 1 << 6,
1067     ImGuiNextWindowDataFlags_HasScroll          = 1 << 7
1068 };
1069 
1070 // Storage for SetNexWindow** functions
1071 struct ImGuiNextWindowData
1072 {
1073     ImGuiNextWindowDataFlags    Flags;
1074     ImGuiCond                   PosCond;
1075     ImGuiCond                   SizeCond;
1076     ImGuiCond                   CollapsedCond;
1077     ImVec2                      PosVal;
1078     ImVec2                      PosPivotVal;
1079     ImVec2                      SizeVal;
1080     ImVec2                      ContentSizeVal;
1081     ImVec2                      ScrollVal;
1082     bool                        CollapsedVal;
1083     ImRect                      SizeConstraintRect;
1084     ImGuiSizeCallback           SizeCallback;
1085     void*                       SizeCallbackUserData;
1086     float                       BgAlphaVal;             // Override background alpha
1087     ImVec2                      MenuBarOffsetMinVal;    // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
1088 
ImGuiNextWindowDataImGuiNextWindowData1089     ImGuiNextWindowData()       { memset(this, 0, sizeof(*this)); }
ClearFlagsImGuiNextWindowData1090     inline void ClearFlags()    { Flags = ImGuiNextWindowDataFlags_None; }
1091 };
1092 
1093 enum ImGuiNextItemDataFlags_
1094 {
1095     ImGuiNextItemDataFlags_None     = 0,
1096     ImGuiNextItemDataFlags_HasWidth = 1 << 0,
1097     ImGuiNextItemDataFlags_HasOpen  = 1 << 1
1098 };
1099 
1100 struct ImGuiNextItemData
1101 {
1102     ImGuiNextItemDataFlags      Flags;
1103     float                       Width;          // Set by SetNextItemWidth()
1104     ImGuiID                     FocusScopeId;   // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging)
1105     ImGuiCond                   OpenCond;
1106     bool                        OpenVal;        // Set by SetNextItemOpen()
1107 
ImGuiNextItemDataImGuiNextItemData1108     ImGuiNextItemData()         { memset(this, 0, sizeof(*this)); }
ClearFlagsImGuiNextItemData1109     inline void ClearFlags()    { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
1110 };
1111 
1112 // Status storage for the last submitted item
1113 struct ImGuiLastItemData
1114 {
1115     ImGuiID                 ID;
1116     ImGuiItemFlags          InFlags;            // See ImGuiItemFlags_
1117     ImGuiItemStatusFlags    StatusFlags;        // See ImGuiItemStatusFlags_
1118     ImRect                  Rect;               // Full rectangle
1119     ImRect                  NavRect;            // Navigation scoring rectangle (not displayed)
1120     ImRect                  DisplayRect;        // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set)
1121 
ImGuiLastItemDataImGuiLastItemData1122     ImGuiLastItemData()     { memset(this, 0, sizeof(*this)); }
1123 };
1124 
1125 struct IMGUI_API ImGuiStackSizes
1126 {
1127     short   SizeOfIDStack;
1128     short   SizeOfColorStack;
1129     short   SizeOfStyleVarStack;
1130     short   SizeOfFontStack;
1131     short   SizeOfFocusScopeStack;
1132     short   SizeOfGroupStack;
1133     short   SizeOfItemFlagsStack;
1134     short   SizeOfBeginPopupStack;
1135     short   SizeOfDisabledStack;
1136 
ImGuiStackSizesImGuiStackSizes1137     ImGuiStackSizes() { memset(this, 0, sizeof(*this)); }
1138     void SetToCurrentState();
1139     void CompareWithCurrentState();
1140 };
1141 
1142 // Data saved for each window pushed into the stack
1143 struct ImGuiWindowStackData
1144 {
1145     ImGuiWindow*            Window;
1146     ImGuiLastItemData       ParentLastItemDataBackup;
1147     ImGuiStackSizes         StackSizesOnBegin;      // Store size of various stacks for asserting
1148 };
1149 
1150 struct ImGuiShrinkWidthItem
1151 {
1152     int         Index;
1153     float       Width;
1154 };
1155 
1156 struct ImGuiPtrOrIndex
1157 {
1158     void*       Ptr;            // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1159     int         Index;          // Usually index in a main pool.
1160 
ImGuiPtrOrIndexImGuiPtrOrIndex1161     ImGuiPtrOrIndex(void* ptr)  { Ptr = ptr; Index = -1; }
ImGuiPtrOrIndexImGuiPtrOrIndex1162     ImGuiPtrOrIndex(int index)  { Ptr = NULL; Index = index; }
1163 };
1164 
1165 //-----------------------------------------------------------------------------
1166 // [SECTION] Navigation support
1167 //-----------------------------------------------------------------------------
1168 
1169 enum ImGuiActivateFlags_
1170 {
1171     ImGuiActivateFlags_None                 = 0,
1172     ImGuiActivateFlags_PreferInput          = 1 << 0,       // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default if keyboard is available.
1173     ImGuiActivateFlags_PreferTweak          = 1 << 1,       // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default if keyboard is not available.
1174     ImGuiActivateFlags_TryToPreserveState   = 1 << 2        // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
1175 };
1176 
1177 // Early work-in-progress API for ScrollToItem()
1178 enum ImGuiScrollFlags_
1179 {
1180     ImGuiScrollFlags_None                   = 0,
1181     ImGuiScrollFlags_KeepVisibleEdgeX       = 1 << 0,       // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis]
1182     ImGuiScrollFlags_KeepVisibleEdgeY       = 1 << 1,       // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible]
1183     ImGuiScrollFlags_KeepVisibleCenterX     = 1 << 2,       // If item is not visible: scroll to make the item centered on X axis [rarely used]
1184     ImGuiScrollFlags_KeepVisibleCenterY     = 1 << 3,       // If item is not visible: scroll to make the item centered on Y axis
1185     ImGuiScrollFlags_AlwaysCenterX          = 1 << 4,       // Always center the result item on X axis [rarely used]
1186     ImGuiScrollFlags_AlwaysCenterY          = 1 << 5,       // Always center the result item on Y axis [default for Y axis for appearing window)
1187     ImGuiScrollFlags_NoScrollParent         = 1 << 6,       // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to).
1188     ImGuiScrollFlags_MaskX_                 = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,
1189     ImGuiScrollFlags_MaskY_                 = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY
1190 };
1191 
1192 enum ImGuiNavHighlightFlags_
1193 {
1194     ImGuiNavHighlightFlags_None             = 0,
1195     ImGuiNavHighlightFlags_TypeDefault      = 1 << 0,
1196     ImGuiNavHighlightFlags_TypeThin         = 1 << 1,
1197     ImGuiNavHighlightFlags_AlwaysDraw       = 1 << 2,       // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
1198     ImGuiNavHighlightFlags_NoRounding       = 1 << 3
1199 };
1200 
1201 enum ImGuiNavDirSourceFlags_
1202 {
1203     ImGuiNavDirSourceFlags_None             = 0,
1204     ImGuiNavDirSourceFlags_Keyboard         = 1 << 0,
1205     ImGuiNavDirSourceFlags_PadDPad          = 1 << 1,
1206     ImGuiNavDirSourceFlags_PadLStick        = 1 << 2
1207 };
1208 
1209 enum ImGuiNavMoveFlags_
1210 {
1211     ImGuiNavMoveFlags_None                  = 0,
1212     ImGuiNavMoveFlags_LoopX                 = 1 << 0,   // On failed request, restart from opposite side
1213     ImGuiNavMoveFlags_LoopY                 = 1 << 1,
1214     ImGuiNavMoveFlags_WrapX                 = 1 << 2,   // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
1215     ImGuiNavMoveFlags_WrapY                 = 1 << 3,   // This is not super useful but provided for completeness
1216     ImGuiNavMoveFlags_AllowCurrentNavId     = 1 << 4,   // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place)
1217     ImGuiNavMoveFlags_AlsoScoreVisibleSet   = 1 << 5,   // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
1218     ImGuiNavMoveFlags_ScrollToEdgeY         = 1 << 6,   // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary
1219     ImGuiNavMoveFlags_Forwarded             = 1 << 7,
1220     ImGuiNavMoveFlags_DebugNoResult         = 1 << 8,   // Dummy scoring for debug purpose, don't apply result
1221     ImGuiNavMoveFlags_Tabbing               = 1 << 9,   // == Focus + Activate if item is Inputable + DontChangeNavHighlight
1222     ImGuiNavMoveFlags_Activate              = 1 << 10,
1223     ImGuiNavMoveFlags_DontSetNavHighlight   = 1 << 11   // Do not alter the visible state of keyboard vs mouse nav highlight
1224 };
1225 
1226 enum ImGuiNavLayer
1227 {
1228     ImGuiNavLayer_Main  = 0,    // Main scrolling layer
1229     ImGuiNavLayer_Menu  = 1,    // Menu layer (access with Alt/ImGuiNavInput_Menu)
1230     ImGuiNavLayer_COUNT
1231 };
1232 
1233 struct ImGuiNavItemData
1234 {
1235     ImGuiWindow*        Window;         // Init,Move    // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
1236     ImGuiID             ID;             // Init,Move    // Best candidate item ID
1237     ImGuiID             FocusScopeId;   // Init,Move    // Best candidate focus scope ID
1238     ImRect              RectRel;        // Init,Move    // Best candidate bounding box in window relative space
1239     ImGuiItemFlags      InFlags;        // ????,Move    // Best candidate item flags
1240     float               DistBox;        //      Move    // Best candidate box distance to current NavId
1241     float               DistCenter;     //      Move    // Best candidate center distance to current NavId
1242     float               DistAxial;      //      Move    // Best candidate axial distance to current NavId
1243 
ImGuiNavItemDataImGuiNavItemData1244     ImGuiNavItemData()  { Clear(); }
ClearImGuiNavItemData1245     void Clear()        { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; }
1246 };
1247 
1248 //-----------------------------------------------------------------------------
1249 // [SECTION] Columns support
1250 //-----------------------------------------------------------------------------
1251 
1252 // Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays!
1253 enum ImGuiOldColumnFlags_
1254 {
1255     ImGuiOldColumnFlags_None                    = 0,
1256     ImGuiOldColumnFlags_NoBorder                = 1 << 0,   // Disable column dividers
1257     ImGuiOldColumnFlags_NoResize                = 1 << 1,   // Disable resizing columns when clicking on the dividers
1258     ImGuiOldColumnFlags_NoPreserveWidths        = 1 << 2,   // Disable column width preservation when adjusting columns
1259     ImGuiOldColumnFlags_NoForceWithinWindow     = 1 << 3,   // Disable forcing columns to fit within window
1260     ImGuiOldColumnFlags_GrowParentContentsSize  = 1 << 4    // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
1261 
1262     // Obsolete names (will be removed)
1263 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1264     , ImGuiColumnsFlags_None                    = ImGuiOldColumnFlags_None,
1265     ImGuiColumnsFlags_NoBorder                  = ImGuiOldColumnFlags_NoBorder,
1266     ImGuiColumnsFlags_NoResize                  = ImGuiOldColumnFlags_NoResize,
1267     ImGuiColumnsFlags_NoPreserveWidths          = ImGuiOldColumnFlags_NoPreserveWidths,
1268     ImGuiColumnsFlags_NoForceWithinWindow       = ImGuiOldColumnFlags_NoForceWithinWindow,
1269     ImGuiColumnsFlags_GrowParentContentsSize    = ImGuiOldColumnFlags_GrowParentContentsSize
1270 #endif
1271 };
1272 
1273 struct ImGuiOldColumnData
1274 {
1275     float               OffsetNorm;         // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1276     float               OffsetNormBeforeResize;
1277     ImGuiOldColumnFlags Flags;              // Not exposed
1278     ImRect              ClipRect;
1279 
ImGuiOldColumnDataImGuiOldColumnData1280     ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }
1281 };
1282 
1283 struct ImGuiOldColumns
1284 {
1285     ImGuiID             ID;
1286     ImGuiOldColumnFlags Flags;
1287     bool                IsFirstFrame;
1288     bool                IsBeingResized;
1289     int                 Current;
1290     int                 Count;
1291     float               OffMinX, OffMaxX;       // Offsets from HostWorkRect.Min.x
1292     float               LineMinY, LineMaxY;
1293     float               HostCursorPosY;         // Backup of CursorPos at the time of BeginColumns()
1294     float               HostCursorMaxPosX;      // Backup of CursorMaxPos at the time of BeginColumns()
1295     ImRect              HostInitialClipRect;    // Backup of ClipRect at the time of BeginColumns()
1296     ImRect              HostBackupClipRect;     // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1297     ImRect              HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1298     ImVector<ImGuiOldColumnData> Columns;
1299     ImDrawListSplitter  Splitter;
1300 
ImGuiOldColumnsImGuiOldColumns1301     ImGuiOldColumns()   { memset(this, 0, sizeof(*this)); }
1302 };
1303 
1304 //-----------------------------------------------------------------------------
1305 // [SECTION] Multi-select support
1306 //-----------------------------------------------------------------------------
1307 
1308 #ifdef IMGUI_HAS_MULTI_SELECT
1309 // <this is filled in 'range_select' branch>
1310 #endif // #ifdef IMGUI_HAS_MULTI_SELECT
1311 
1312 //-----------------------------------------------------------------------------
1313 // [SECTION] Docking support
1314 //-----------------------------------------------------------------------------
1315 
1316 #ifdef IMGUI_HAS_DOCK
1317 // <this is filled in 'docking' branch>
1318 #endif // #ifdef IMGUI_HAS_DOCK
1319 
1320 //-----------------------------------------------------------------------------
1321 // [SECTION] Viewport support
1322 //-----------------------------------------------------------------------------
1323 
1324 // ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
1325 // Every instance of ImGuiViewport is in fact a ImGuiViewportP.
1326 struct ImGuiViewportP : public ImGuiViewport
1327 {
1328     int                 DrawListsLastFrame[2];  // Last frame number the background (0) and foreground (1) draw lists were used
1329     ImDrawList*         DrawLists[2];           // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.
1330     ImDrawData          DrawDataP;
1331     ImDrawDataBuilder   DrawDataBuilder;
1332 
1333     ImVec2              WorkOffsetMin;          // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!)
1334     ImVec2              WorkOffsetMax;          // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height).
1335     ImVec2              BuildWorkOffsetMin;     // Work Area: Offset being built during current frame. Generally >= 0.0f.
1336     ImVec2              BuildWorkOffsetMax;     // Work Area: Offset being built during current frame. Generally <= 0.0f.
1337 
ImGuiViewportPImGuiViewportP1338     ImGuiViewportP()    { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; }
~ImGuiViewportPImGuiViewportP1339     ~ImGuiViewportP()   { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); }
1340 
1341     // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect)
CalcWorkRectPosImGuiViewportP1342     ImVec2  CalcWorkRectPos(const ImVec2& off_min) const                            { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); }
CalcWorkRectSizeImGuiViewportP1343     ImVec2  CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const    { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); }
UpdateWorkRectImGuiViewportP1344     void    UpdateWorkRect()            { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields
1345 
1346     // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
GetMainRectImGuiViewportP1347     ImRect  GetMainRect() const         { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
GetWorkRectImGuiViewportP1348     ImRect  GetWorkRect() const         { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
GetBuildWorkRectImGuiViewportP1349     ImRect  GetBuildWorkRect() const    { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
1350 };
1351 
1352 //-----------------------------------------------------------------------------
1353 // [SECTION] Settings support
1354 //-----------------------------------------------------------------------------
1355 
1356 // Windows data saved in imgui.ini file
1357 // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
1358 // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
1359 struct ImGuiWindowSettings
1360 {
1361     ImGuiID     ID;
1362     ImVec2ih    Pos;
1363     ImVec2ih    Size;
1364     bool        Collapsed;
1365     bool        WantApply;      // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1366 
ImGuiWindowSettingsImGuiWindowSettings1367     ImGuiWindowSettings()       { memset(this, 0, sizeof(*this)); }
GetNameImGuiWindowSettings1368     char* GetName()             { return (char*)(this + 1); }
1369 };
1370 
1371 struct ImGuiSettingsHandler
1372 {
1373     const char* TypeName;       // Short description stored in .ini file. Disallowed characters: '[' ']'
1374     ImGuiID     TypeHash;       // == ImHashStr(TypeName)
1375     void        (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Clear all settings data
1376     void        (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Read: Called before reading (in registration order)
1377     void*       (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name);              // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
1378     void        (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
1379     void        (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler);                                // Read: Called after reading (in registration order)
1380     void        (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf);      // Write: Output every entries into 'out_buf'
1381     void*       UserData;
1382 
ImGuiSettingsHandlerImGuiSettingsHandler1383     ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
1384 };
1385 
1386 //-----------------------------------------------------------------------------
1387 // [SECTION] Metrics, Debug Tools
1388 //-----------------------------------------------------------------------------
1389 
1390 struct ImGuiMetricsConfig
1391 {
1392     bool        ShowStackTool;
1393     bool        ShowWindowsRects;
1394     bool        ShowWindowsBeginOrder;
1395     bool        ShowTablesRects;
1396     bool        ShowDrawCmdMesh;
1397     bool        ShowDrawCmdBoundingBoxes;
1398     int         ShowWindowsRectsType;
1399     int         ShowTablesRectsType;
1400 
ImGuiMetricsConfigImGuiMetricsConfig1401     ImGuiMetricsConfig()
1402     {
1403         ShowStackTool = false;
1404         ShowWindowsRects = false;
1405         ShowWindowsBeginOrder = false;
1406         ShowTablesRects = false;
1407         ShowDrawCmdMesh = true;
1408         ShowDrawCmdBoundingBoxes = true;
1409         ShowWindowsRectsType = -1;
1410         ShowTablesRectsType = -1;
1411     }
1412 };
1413 
1414 struct ImGuiStackLevelInfo
1415 {
1416     ImGuiID                 ID;
1417     ImS8                    QueryFrameCount;            // >= 1: Query in progress
1418     bool                    QuerySuccess;               // Obtained result from DebugHookIdInfo()
1419     char                    Desc[58];                   // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?)
1420 
ImGuiStackLevelInfoImGuiStackLevelInfo1421     ImGuiStackLevelInfo()   { memset(this, 0, sizeof(*this)); }
1422 };
1423 
1424 // State for Stack tool queries
1425 struct ImGuiStackTool
1426 {
1427     int                     LastActiveFrame;
1428     int                     StackLevel;                 // -1: query stack and resize Results, >= 0: individual stack level
1429     ImGuiID                 QueryId;                    // ID to query details for
1430     ImVector<ImGuiStackLevelInfo> Results;
1431 
ImGuiStackToolImGuiStackTool1432     ImGuiStackTool()        { memset(this, 0, sizeof(*this)); }
1433 };
1434 
1435 //-----------------------------------------------------------------------------
1436 // [SECTION] Generic context hooks
1437 //-----------------------------------------------------------------------------
1438 
1439 typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
1440 enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
1441 
1442 struct ImGuiContextHook
1443 {
1444     ImGuiID                     HookId;     // A unique ID assigned by AddContextHook()
1445     ImGuiContextHookType        Type;
1446     ImGuiID                     Owner;
1447     ImGuiContextHookCallback    Callback;
1448     void*                       UserData;
1449 
ImGuiContextHookImGuiContextHook1450     ImGuiContextHook()          { memset(this, 0, sizeof(*this)); }
1451 };
1452 
1453 //-----------------------------------------------------------------------------
1454 // [SECTION] ImGuiContext (main imgui context)
1455 //-----------------------------------------------------------------------------
1456 
1457 struct ImGuiContext
1458 {
1459     bool                    Initialized;
1460     bool                    FontAtlasOwnedByContext;            // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
1461     ImGuiIO                 IO;
1462     ImGuiStyle              Style;
1463     ImFont*                 Font;                               // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
1464     float                   FontSize;                           // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
1465     float                   FontBaseSize;                       // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
1466     ImDrawListSharedData    DrawListSharedData;
1467     double                  Time;
1468     int                     FrameCount;
1469     int                     FrameCountEnded;
1470     int                     FrameCountRendered;
1471     bool                    WithinFrameScope;                   // Set by NewFrame(), cleared by EndFrame()
1472     bool                    WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
1473     bool                    WithinEndChild;                     // Set within EndChild()
1474     bool                    GcCompactAll;                       // Request full GC
1475     bool                    TestEngineHookItems;                // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
1476     void*                   TestEngine;                         // Test engine user data
1477 
1478     // Windows state
1479     ImVector<ImGuiWindow*>  Windows;                            // Windows, sorted in display order, back to front
1480     ImVector<ImGuiWindow*>  WindowsFocusOrder;                  // Root windows, sorted in focus order, back to front.
1481     ImVector<ImGuiWindow*>  WindowsTempSortBuffer;              // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
1482     ImVector<ImGuiWindowStackData> CurrentWindowStack;
1483     ImGuiStorage            WindowsById;                        // Map window's ImGuiID to ImGuiWindow*
1484     int                     WindowsActiveCount;                 // Number of unique windows submitted by frame
1485     ImVec2                  WindowsHoverPadding;                // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING)
1486     ImGuiWindow*            CurrentWindow;                      // Window being drawn into
1487     ImGuiWindow*            HoveredWindow;                      // Window the mouse is hovering. Will typically catch mouse inputs.
1488     ImGuiWindow*            HoveredWindowUnderMovingWindow;     // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
1489     ImGuiWindow*            MovingWindow;                       // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
1490     ImGuiWindow*            WheelingWindow;                     // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
1491     ImVec2                  WheelingWindowRefMousePos;
1492     float                   WheelingWindowTimer;
1493 
1494     // Item/widgets state and tracking information
1495     ImGuiID                 DebugHookIdInfo;                    // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
1496     ImGuiID                 HoveredId;                          // Hovered widget, filled during the frame
1497     ImGuiID                 HoveredIdPreviousFrame;
1498     bool                    HoveredIdAllowOverlap;
1499     bool                    HoveredIdUsingMouseWheel;           // Hovered widget will use mouse wheel. Blocks scrolling the underlying window.
1500     bool                    HoveredIdPreviousFrameUsingMouseWheel;
1501     bool                    HoveredIdDisabled;                  // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
1502     float                   HoveredIdTimer;                     // Measure contiguous hovering time
1503     float                   HoveredIdNotActiveTimer;            // Measure contiguous hovering time where the item has not been active
1504     ImGuiID                 ActiveId;                           // Active widget
1505     ImGuiID                 ActiveIdIsAlive;                    // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
1506     float                   ActiveIdTimer;
1507     bool                    ActiveIdIsJustActivated;            // Set at the time of activation for one frame
1508     bool                    ActiveIdAllowOverlap;               // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
1509     bool                    ActiveIdNoClearOnFocusLoss;         // Disable losing active id if the active id window gets unfocused.
1510     bool                    ActiveIdHasBeenPressedBefore;       // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
1511     bool                    ActiveIdHasBeenEditedBefore;        // Was the value associated to the widget Edited over the course of the Active state.
1512     bool                    ActiveIdHasBeenEditedThisFrame;
1513     bool                    ActiveIdUsingMouseWheel;            // Active widget will want to read mouse wheel. Blocks scrolling the underlying window.
1514     ImU32                   ActiveIdUsingNavDirMask;            // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
1515     ImU32                   ActiveIdUsingNavInputMask;          // Active widget will want to read those nav inputs.
1516     ImU64                   ActiveIdUsingKeyInputMask;          // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array.
1517     ImVec2                  ActiveIdClickOffset;                // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
1518     ImGuiWindow*            ActiveIdWindow;
1519     ImGuiInputSource        ActiveIdSource;                     // Activating with mouse or nav (gamepad/keyboard)
1520     int                     ActiveIdMouseButton;
1521     ImGuiID                 ActiveIdPreviousFrame;
1522     bool                    ActiveIdPreviousFrameIsAlive;
1523     bool                    ActiveIdPreviousFrameHasBeenEditedBefore;
1524     ImGuiWindow*            ActiveIdPreviousFrameWindow;
1525     ImGuiID                 LastActiveId;                       // Store the last non-zero ActiveId, useful for animation.
1526     float                   LastActiveIdTimer;                  // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
1527 
1528     // Next window/item data
1529     ImGuiItemFlags          CurrentItemFlags;                      // == g.ItemFlagsStack.back()
1530     ImGuiNextItemData       NextItemData;                       // Storage for SetNextItem** functions
1531     ImGuiLastItemData       LastItemData;                       // Storage for last submitted item (setup by ItemAdd)
1532     ImGuiNextWindowData     NextWindowData;                     // Storage for SetNextWindow** functions
1533 
1534     // Shared stacks
1535     ImVector<ImGuiColorMod> ColorStack;                         // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
1536     ImVector<ImGuiStyleMod> StyleVarStack;                      // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
1537     ImVector<ImFont*>       FontStack;                          // Stack for PushFont()/PopFont() - inherited by Begin()
1538     ImVector<ImGuiID>       FocusScopeStack;                    // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window
1539     ImVector<ImGuiItemFlags>ItemFlagsStack;                     // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
1540     ImVector<ImGuiGroupData>GroupStack;                         // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
1541     ImVector<ImGuiPopupData>OpenPopupStack;                     // Which popups are open (persistent)
1542     ImVector<ImGuiPopupData>BeginPopupStack;                    // Which level of BeginPopup() we are in (reset every frame)
1543 
1544     // Viewports
1545     ImVector<ImGuiViewportP*> Viewports;                        // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
1546 
1547     // Gamepad/keyboard Navigation
1548     ImGuiWindow*            NavWindow;                          // Focused window for navigation. Could be called 'FocusWindow'
1549     ImGuiID                 NavId;                              // Focused item for navigation
1550     ImGuiID                 NavFocusScopeId;                    // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set)
1551     ImGuiID                 NavActivateId;                      // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem()
1552     ImGuiID                 NavActivateDownId;                  // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0
1553     ImGuiID                 NavActivatePressedId;               // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0
1554     ImGuiID                 NavActivateInputId;                 // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0; ImGuiActivateFlags_PreferInput will be set and NavActivateId will be 0.
1555     ImGuiActivateFlags      NavActivateFlags;
1556     ImGuiID                 NavJustTabbedId;                    // Just tabbed to this id.
1557     ImGuiID                 NavJustMovedToId;                   // Just navigated to this id (result of a successfully MoveRequest).
1558     ImGuiID                 NavJustMovedToFocusScopeId;         // Just navigated to this focus scope id (result of a successfully MoveRequest).
1559     ImGuiKeyModFlags        NavJustMovedToKeyMods;
1560     ImGuiID                 NavNextActivateId;                  // Set by ActivateItem(), queued until next frame.
1561     ImGuiActivateFlags      NavNextActivateFlags;
1562     ImGuiInputSource        NavInputSource;                     // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
1563     ImGuiNavLayer           NavLayer;                           // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
1564     int                     NavIdTabCounter;                    // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing
1565     bool                    NavIdIsAlive;                       // Nav widget has been seen this frame ~~ NavRectRel is valid
1566     bool                    NavMousePosDirty;                   // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
1567     bool                    NavDisableHighlight;                // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
1568     bool                    NavDisableMouseHover;               // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
1569 
1570     // Navigation: Init & Move Requests
1571     bool                    NavAnyRequest;                      // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
1572     bool                    NavInitRequest;                     // Init request for appearing window to select first item
1573     bool                    NavInitRequestFromMove;
1574     ImGuiID                 NavInitResultId;                    // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
1575     ImRect                  NavInitResultRectRel;               // Init request result rectangle (relative to parent window)
1576     bool                    NavMoveSubmitted;                   // Move request submitted, will process result on next NewFrame()
1577     bool                    NavMoveScoringItems;                // Move request submitted, still scoring incoming items
1578     bool                    NavMoveForwardToNextFrame;
1579     ImGuiNavMoveFlags       NavMoveFlags;
1580     ImGuiScrollFlags        NavMoveScrollFlags;
1581     ImGuiKeyModFlags        NavMoveKeyMods;
1582     ImGuiDir                NavMoveDir;                         // Direction of the move request (left/right/up/down)
1583     ImGuiDir                NavMoveDirForDebug;
1584     ImGuiDir                NavMoveClipDir;                     // FIXME-NAV: Describe the purpose of this better. Might want to rename?
1585     ImRect                  NavScoringRect;                     // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
1586     int                     NavScoringDebugCount;               // Metrics for debugging
1587     int                     NavTabbingInputableRemaining;       // >0 when counting items for tabbing
1588     ImGuiNavItemData        NavMoveResultLocal;                 // Best move request candidate within NavWindow
1589     ImGuiNavItemData        NavMoveResultLocalVisible;          // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
1590     ImGuiNavItemData        NavMoveResultOther;                 // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
1591 
1592     // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
1593     ImGuiWindow*            NavWindowingTarget;                 // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
1594     ImGuiWindow*            NavWindowingTargetAnim;             // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
1595     ImGuiWindow*            NavWindowingListWindow;             // Internal window actually listing the CTRL+Tab contents
1596     float                   NavWindowingTimer;
1597     float                   NavWindowingHighlightAlpha;
1598     bool                    NavWindowingToggleLayer;
1599 
1600     // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!)
1601     ImGuiWindow*            TabFocusRequestCurrWindow;          //
1602     ImGuiWindow*            TabFocusRequestNextWindow;          //
1603     int                     TabFocusRequestCurrCounterTabStop;  // Tab item being requested for focus, stored as an index
1604     int                     TabFocusRequestNextCounterTabStop;  // "
1605     bool                    TabFocusPressed;                    // Set in NewFrame() when user pressed Tab
1606 
1607     // Render
1608     float                   DimBgRatio;                         // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
1609     ImGuiMouseCursor        MouseCursor;
1610 
1611     // Drag and Drop
1612     bool                    DragDropActive;
1613     bool                    DragDropWithinSource;               // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
1614     bool                    DragDropWithinTarget;               // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
1615     ImGuiDragDropFlags      DragDropSourceFlags;
1616     int                     DragDropSourceFrameCount;
1617     int                     DragDropMouseButton;
1618     ImGuiPayload            DragDropPayload;
1619     ImRect                  DragDropTargetRect;                 // Store rectangle of current target candidate (we favor small targets when overlapping)
1620     ImGuiID                 DragDropTargetId;
1621     ImGuiDragDropFlags      DragDropAcceptFlags;
1622     float                   DragDropAcceptIdCurrRectSurface;    // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
1623     ImGuiID                 DragDropAcceptIdCurr;               // Target item id (set at the time of accepting the payload)
1624     ImGuiID                 DragDropAcceptIdPrev;               // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
1625     int                     DragDropAcceptFrameCount;           // Last time a target expressed a desire to accept the source
1626     ImGuiID                 DragDropHoldJustPressedId;          // Set when holding a payload just made ButtonBehavior() return a press.
1627     ImVector<unsigned char> DragDropPayloadBufHeap;             // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
1628     unsigned char           DragDropPayloadBufLocal[16];        // Local buffer for small payloads
1629 
1630     // Table
1631     ImGuiTable*                     CurrentTable;
1632     int                             CurrentTableStackIdx;
1633     ImPool<ImGuiTable>              Tables;
1634     ImVector<ImGuiTableTempData>    TablesTempDataStack;
1635     ImVector<float>                 TablesLastTimeActive;       // Last used timestamp of each tables (SOA, for efficient GC)
1636     ImVector<ImDrawChannel>         DrawChannelsTempMergeBuffer;
1637 
1638     // Tab bars
1639     ImGuiTabBar*                    CurrentTabBar;
1640     ImPool<ImGuiTabBar>             TabBars;
1641     ImVector<ImGuiPtrOrIndex>       CurrentTabBarStack;
1642     ImVector<ImGuiShrinkWidthItem>  ShrinkWidthBuffer;
1643 
1644     // Widget state
1645     ImVec2                  MouseLastValidPos;
1646     ImGuiInputTextState     InputTextState;
1647     ImFont                  InputTextPasswordFont;
1648     ImGuiID                 TempInputId;                        // Temporary text input when CTRL+clicking on a slider, etc.
1649     ImGuiColorEditFlags     ColorEditOptions;                   // Store user options for color edit widgets
1650     float                   ColorEditLastHue;                   // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
1651     float                   ColorEditLastSat;                   // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
1652     ImU32                   ColorEditLastColor;                 // RGB value with alpha set to 0.
1653     ImVec4                  ColorPickerRef;                     // Initial/reference color at the time of opening the color picker.
1654     ImGuiComboPreviewData   ComboPreviewData;
1655     float                   SliderCurrentAccum;                 // Accumulated slider delta when using navigation controls.
1656     bool                    SliderCurrentAccumDirty;            // Has the accumulated slider delta changed since last time we tried to apply it?
1657     bool                    DragCurrentAccumDirty;
1658     float                   DragCurrentAccum;                   // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
1659     float                   DragSpeedDefaultRatio;              // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
1660     float                   ScrollbarClickDeltaToGrabCenter;    // Distance between mouse and center of grab box, normalized in parent space. Use storage?
1661     float                   DisabledAlphaBackup;                // Backup for style.Alpha for BeginDisabled()
1662     short                   DisabledStackSize;
1663     short                   TooltipOverrideCount;
1664     float                   TooltipSlowDelay;                   // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work)
1665     ImVector<char>          ClipboardHandlerData;               // If no custom clipboard handler is defined
1666     ImVector<ImGuiID>       MenusIdSubmittedThisFrame;          // A list of menu IDs that were rendered at least once
1667 
1668     // Platform support
1669     ImVec2                  PlatformImePos;                     // Cursor position request & last passed to the OS Input Method Editor
1670     ImVec2                  PlatformImeLastPos;
1671     char                    PlatformLocaleDecimalPoint;         // '.' or *localeconv()->decimal_point
1672 
1673     // Settings
1674     bool                    SettingsLoaded;
1675     float                   SettingsDirtyTimer;                 // Save .ini Settings to memory when time reaches zero
1676     ImGuiTextBuffer         SettingsIniData;                    // In memory .ini settings
1677     ImVector<ImGuiSettingsHandler>      SettingsHandlers;       // List of .ini settings handlers
1678     ImChunkStream<ImGuiWindowSettings>  SettingsWindows;        // ImGuiWindow .ini settings entries
1679     ImChunkStream<ImGuiTableSettings>   SettingsTables;         // ImGuiTable .ini settings entries
1680     ImVector<ImGuiContextHook>          Hooks;                  // Hooks for extensions (e.g. test engine)
1681     ImGuiID                             HookIdNext;             // Next available HookId
1682 
1683     // Capture/Logging
1684     bool                    LogEnabled;                         // Currently capturing
1685     ImGuiLogType            LogType;                            // Capture target
1686     ImFileHandle            LogFile;                            // If != NULL log to stdout/ file
1687     ImGuiTextBuffer         LogBuffer;                          // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
1688     const char*             LogNextPrefix;
1689     const char*             LogNextSuffix;
1690     float                   LogLinePosY;
1691     bool                    LogLineFirstItem;
1692     int                     LogDepthRef;
1693     int                     LogDepthToExpand;
1694     int                     LogDepthToExpandDefault;            // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
1695 
1696     // Debug Tools
1697     bool                    DebugItemPickerActive;              // Item picker is active (started with DebugStartItemPicker())
1698     ImGuiID                 DebugItemPickerBreakId;             // Will call IM_DEBUG_BREAK() when encountering this ID
1699     ImGuiMetricsConfig      DebugMetricsConfig;
1700     ImGuiStackTool          DebugStackTool;
1701 
1702     // Misc
1703     float                   FramerateSecPerFrame[120];          // Calculate estimate of framerate for user over the last 2 seconds.
1704     int                     FramerateSecPerFrameIdx;
1705     int                     FramerateSecPerFrameCount;
1706     float                   FramerateSecPerFrameAccum;
1707     int                     WantCaptureMouseNextFrame;          // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags
1708     int                     WantCaptureKeyboardNextFrame;
1709     int                     WantTextInputNextFrame;
1710     char                    TempBuffer[1024 * 3 + 1];           // Temporary text buffer
1711 
ImGuiContextImGuiContext1712     ImGuiContext(ImFontAtlas* shared_font_atlas)
1713     {
1714         Initialized = false;
1715         FontAtlasOwnedByContext = shared_font_atlas ? false : true;
1716         Font = NULL;
1717         FontSize = FontBaseSize = 0.0f;
1718         IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
1719         Time = 0.0f;
1720         FrameCount = 0;
1721         FrameCountEnded = FrameCountRendered = -1;
1722         WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
1723         GcCompactAll = false;
1724         TestEngineHookItems = false;
1725         TestEngine = NULL;
1726 
1727         WindowsActiveCount = 0;
1728         CurrentWindow = NULL;
1729         HoveredWindow = NULL;
1730         HoveredWindowUnderMovingWindow = NULL;
1731         MovingWindow = NULL;
1732         WheelingWindow = NULL;
1733         WheelingWindowTimer = 0.0f;
1734 
1735         DebugHookIdInfo = 0;
1736         HoveredId = HoveredIdPreviousFrame = 0;
1737         HoveredIdAllowOverlap = false;
1738         HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false;
1739         HoveredIdDisabled = false;
1740         HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
1741         ActiveId = 0;
1742         ActiveIdIsAlive = 0;
1743         ActiveIdTimer = 0.0f;
1744         ActiveIdIsJustActivated = false;
1745         ActiveIdAllowOverlap = false;
1746         ActiveIdNoClearOnFocusLoss = false;
1747         ActiveIdHasBeenPressedBefore = false;
1748         ActiveIdHasBeenEditedBefore = false;
1749         ActiveIdHasBeenEditedThisFrame = false;
1750         ActiveIdUsingMouseWheel = false;
1751         ActiveIdUsingNavDirMask = 0x00;
1752         ActiveIdUsingNavInputMask = 0x00;
1753         ActiveIdUsingKeyInputMask = 0x00;
1754         ActiveIdClickOffset = ImVec2(-1, -1);
1755         ActiveIdWindow = NULL;
1756         ActiveIdSource = ImGuiInputSource_None;
1757         ActiveIdMouseButton = -1;
1758         ActiveIdPreviousFrame = 0;
1759         ActiveIdPreviousFrameIsAlive = false;
1760         ActiveIdPreviousFrameHasBeenEditedBefore = false;
1761         ActiveIdPreviousFrameWindow = NULL;
1762         LastActiveId = 0;
1763         LastActiveIdTimer = 0.0f;
1764 
1765         CurrentItemFlags = ImGuiItemFlags_None;
1766 
1767         NavWindow = NULL;
1768         NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0;
1769         NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
1770         NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None;
1771         NavJustMovedToKeyMods = ImGuiKeyModFlags_None;
1772         NavInputSource = ImGuiInputSource_None;
1773         NavLayer = ImGuiNavLayer_Main;
1774         NavIdTabCounter = INT_MAX;
1775         NavIdIsAlive = false;
1776         NavMousePosDirty = false;
1777         NavDisableHighlight = true;
1778         NavDisableMouseHover = false;
1779         NavAnyRequest = false;
1780         NavInitRequest = false;
1781         NavInitRequestFromMove = false;
1782         NavInitResultId = 0;
1783         NavMoveSubmitted = false;
1784         NavMoveScoringItems = false;
1785         NavMoveForwardToNextFrame = false;
1786         NavMoveFlags = ImGuiNavMoveFlags_None;
1787         NavMoveScrollFlags = ImGuiScrollFlags_None;
1788         NavMoveKeyMods = ImGuiKeyModFlags_None;
1789         NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None;
1790         NavScoringDebugCount = 0;
1791         NavTabbingInputableRemaining = 0;
1792 
1793         NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
1794         NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
1795         NavWindowingToggleLayer = false;
1796 
1797         TabFocusRequestCurrWindow = TabFocusRequestNextWindow = NULL;
1798         TabFocusRequestCurrCounterTabStop = INT_MAX;
1799         TabFocusRequestNextCounterTabStop = INT_MAX;
1800         TabFocusPressed = false;
1801 
1802         DimBgRatio = 0.0f;
1803         MouseCursor = ImGuiMouseCursor_Arrow;
1804 
1805         DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
1806         DragDropSourceFlags = ImGuiDragDropFlags_None;
1807         DragDropSourceFrameCount = -1;
1808         DragDropMouseButton = -1;
1809         DragDropTargetId = 0;
1810         DragDropAcceptFlags = ImGuiDragDropFlags_None;
1811         DragDropAcceptIdCurrRectSurface = 0.0f;
1812         DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
1813         DragDropAcceptFrameCount = -1;
1814         DragDropHoldJustPressedId = 0;
1815         memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
1816 
1817         CurrentTable = NULL;
1818         CurrentTableStackIdx = -1;
1819         CurrentTabBar = NULL;
1820 
1821         TempInputId = 0;
1822         ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
1823         ColorEditLastHue = ColorEditLastSat = 0.0f;
1824         ColorEditLastColor = 0;
1825         SliderCurrentAccum = 0.0f;
1826         SliderCurrentAccumDirty = false;
1827         DragCurrentAccumDirty = false;
1828         DragCurrentAccum = 0.0f;
1829         DragSpeedDefaultRatio = 1.0f / 100.0f;
1830         DisabledAlphaBackup = 0.0f;
1831         DisabledStackSize = 0;
1832         ScrollbarClickDeltaToGrabCenter = 0.0f;
1833         TooltipOverrideCount = 0;
1834         TooltipSlowDelay = 0.50f;
1835 
1836         PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX);
1837         PlatformLocaleDecimalPoint = '.';
1838 
1839         SettingsLoaded = false;
1840         SettingsDirtyTimer = 0.0f;
1841         HookIdNext = 0;
1842 
1843         LogEnabled = false;
1844         LogType = ImGuiLogType_None;
1845         LogNextPrefix = LogNextSuffix = NULL;
1846         LogFile = NULL;
1847         LogLinePosY = FLT_MAX;
1848         LogLineFirstItem = false;
1849         LogDepthRef = 0;
1850         LogDepthToExpand = LogDepthToExpandDefault = 2;
1851 
1852         DebugItemPickerActive = false;
1853         DebugItemPickerBreakId = 0;
1854 
1855         memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
1856         FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0;
1857         FramerateSecPerFrameAccum = 0.0f;
1858         WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
1859         memset(TempBuffer, 0, sizeof(TempBuffer));
1860     }
1861 };
1862 
1863 //-----------------------------------------------------------------------------
1864 // [SECTION] ImGuiWindowTempData, ImGuiWindow
1865 //-----------------------------------------------------------------------------
1866 
1867 // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
1868 // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
1869 // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
1870 struct IMGUI_API ImGuiWindowTempData
1871 {
1872     // Layout
1873     ImVec2                  CursorPos;              // Current emitting position, in absolute coordinates.
1874     ImVec2                  CursorPosPrevLine;
1875     ImVec2                  CursorStartPos;         // Initial position after Begin(), generally ~ window position + WindowPadding.
1876     ImVec2                  CursorMaxPos;           // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
1877     ImVec2                  IdealMaxPos;            // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
1878     ImVec2                  CurrLineSize;
1879     ImVec2                  PrevLineSize;
1880     float                   CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
1881     float                   PrevLineTextBaseOffset;
1882     ImVec1                  Indent;                 // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
1883     ImVec1                  ColumnsOffset;          // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
1884     ImVec1                  GroupOffset;
1885 
1886     // Keyboard/Gamepad navigation
1887     ImGuiNavLayer           NavLayerCurrent;        // Current layer, 0..31 (we currently only use 0..1)
1888     short                   NavLayersActiveMask;    // Which layers have been written to (result from previous frame)
1889     short                   NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
1890     ImGuiID                 NavFocusScopeIdCurrent; // Current focus scope ID while appending
1891     bool                    NavHideHighlightOneFrame;
1892     bool                    NavHasScroll;           // Set when scrolling can be used (ScrollMax > 0.0f)
1893 
1894     // Miscellaneous
1895     bool                    MenuBarAppending;       // FIXME: Remove this
1896     ImVec2                  MenuBarOffset;          // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs.
1897     ImGuiMenuColumns        MenuColumns;            // Simplified columns storage for menu items measurement
1898     int                     TreeDepth;              // Current tree depth.
1899     ImU32                   TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary.
1900     ImVector<ImGuiWindow*>  ChildWindows;
1901     ImGuiStorage*           StateStorage;           // Current persistent per-window storage (store e.g. tree node open/close state)
1902     ImGuiOldColumns*        CurrentColumns;         // Current columns set
1903     int                     CurrentTableIdx;        // Current table index (into g.Tables)
1904     ImGuiLayoutType         LayoutType;
1905     ImGuiLayoutType         ParentLayoutType;       // Layout type of parent window at the time of Begin()
1906     int                     FocusCounterTabStop;    // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through.
1907 
1908     // Local parameters stacks
1909     // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
1910     float                   ItemWidth;              // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
1911     float                   TextWrapPos;            // Current text wrap pos.
1912     ImVector<float>         ItemWidthStack;         // Store item widths to restore (attention: .back() is not == ItemWidth)
1913     ImVector<float>         TextWrapPosStack;       // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
1914 };
1915 
1916 // Storage for one window
1917 struct IMGUI_API ImGuiWindow
1918 {
1919     char*                   Name;                               // Window name, owned by the window.
1920     ImGuiID                 ID;                                 // == ImHashStr(Name)
1921     ImGuiWindowFlags        Flags;                              // See enum ImGuiWindowFlags_
1922     ImVec2                  Pos;                                // Position (always rounded-up to nearest pixel)
1923     ImVec2                  Size;                               // Current size (==SizeFull or collapsed title bar size)
1924     ImVec2                  SizeFull;                           // Size when non collapsed
1925     ImVec2                  ContentSize;                        // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding.
1926     ImVec2                  ContentSizeIdeal;
1927     ImVec2                  ContentSizeExplicit;                // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
1928     ImVec2                  WindowPadding;                      // Window padding at the time of Begin().
1929     float                   WindowRounding;                     // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
1930     float                   WindowBorderSize;                   // Window border size at the time of Begin().
1931     int                     NameBufLen;                         // Size of buffer storing Name. May be larger than strlen(Name)!
1932     ImGuiID                 MoveId;                             // == window->GetID("#MOVE")
1933     ImGuiID                 ChildId;                            // ID of corresponding item in parent window (for navigation to return from child window to parent window)
1934     ImVec2                  Scroll;
1935     ImVec2                  ScrollMax;
1936     ImVec2                  ScrollTarget;                       // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
1937     ImVec2                  ScrollTargetCenterRatio;            // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
1938     ImVec2                  ScrollTargetEdgeSnapDist;           // 0.0f = no snapping, >0.0f snapping threshold
1939     ImVec2                  ScrollbarSizes;                     // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.
1940     bool                    ScrollbarX, ScrollbarY;             // Are scrollbars visible?
1941     bool                    Active;                             // Set to true on Begin(), unless Collapsed
1942     bool                    WasActive;
1943     bool                    WriteAccessed;                      // Set to true when any widget access the current window
1944     bool                    Collapsed;                          // Set when collapsing window to become only title-bar
1945     bool                    WantCollapseToggle;
1946     bool                    SkipItems;                          // Set when items can safely be all clipped (e.g. window not visible or collapsed)
1947     bool                    Appearing;                          // Set during the frame where the window is appearing (or re-appearing)
1948     bool                    Hidden;                             // Do not display (== HiddenFrames*** > 0)
1949     bool                    IsFallbackWindow;                   // Set on the "Debug##Default" window.
1950     bool                    HasCloseButton;                     // Set when the window has a close button (p_open != NULL)
1951     signed char             ResizeBorderHeld;                   // Current border being held for resize (-1: none, otherwise 0-3)
1952     short                   BeginCount;                         // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
1953     short                   BeginOrderWithinParent;             // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
1954     short                   BeginOrderWithinContext;            // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
1955     short                   FocusOrder;                         // Order within WindowsFocusOrder[], altered when windows are focused.
1956     ImGuiID                 PopupId;                            // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
1957     ImS8                    AutoFitFramesX, AutoFitFramesY;
1958     ImS8                    AutoFitChildAxises;
1959     bool                    AutoFitOnlyGrows;
1960     ImGuiDir                AutoPosLastDirection;
1961     ImS8                    HiddenFramesCanSkipItems;           // Hide the window for N frames
1962     ImS8                    HiddenFramesCannotSkipItems;        // Hide the window for N frames while allowing items to be submitted so we can measure their size
1963     ImS8                    HiddenFramesForRenderOnly;          // Hide the window until frame N at Render() time only
1964     ImS8                    DisableInputsFrames;                // Disable window interactions for N frames
1965     ImGuiCond               SetWindowPosAllowFlags : 8;         // store acceptable condition flags for SetNextWindowPos() use.
1966     ImGuiCond               SetWindowSizeAllowFlags : 8;        // store acceptable condition flags for SetNextWindowSize() use.
1967     ImGuiCond               SetWindowCollapsedAllowFlags : 8;   // store acceptable condition flags for SetNextWindowCollapsed() use.
1968     ImVec2                  SetWindowPosVal;                    // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
1969     ImVec2                  SetWindowPosPivot;                  // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right.
1970 
1971     ImVector<ImGuiID>       IDStack;                            // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure)
1972     ImGuiWindowTempData     DC;                                 // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
1973 
1974     // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
1975     // The main 'OuterRect', omitted as a field, is window->Rect().
1976     ImRect                  OuterRectClipped;                   // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
1977     ImRect                  InnerRect;                          // Inner rectangle (omit title bar, menu bar, scroll bar)
1978     ImRect                  InnerClipRect;                      // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
1979     ImRect                  WorkRect;                           // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward).
1980     ImRect                  ParentWorkRect;                     // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack?
1981     ImRect                  ClipRect;                           // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
1982     ImRect                  ContentRegionRect;                  // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on.
1983     ImVec2ih                HitTestHoleSize;                    // Define an optional rectangular hole where mouse will pass-through the window.
1984     ImVec2ih                HitTestHoleOffset;
1985 
1986     int                     LastFrameActive;                    // Last frame number the window was Active.
1987     float                   LastTimeActive;                     // Last timestamp the window was Active (using float as we don't need high precision there)
1988     float                   ItemWidthDefault;
1989     ImGuiStorage            StateStorage;
1990     ImVector<ImGuiOldColumns> ColumnsStorage;
1991     float                   FontWindowScale;                    // User scale multiplier per-window, via SetWindowFontScale()
1992     int                     SettingsOffset;                     // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
1993 
1994     ImDrawList*             DrawList;                           // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
1995     ImDrawList              DrawListInst;
1996     ImGuiWindow*            ParentWindow;                       // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.
1997     ImGuiWindow*            RootWindow;                         // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.
1998     ImGuiWindow*            RootWindowPopupTree;                // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
1999     ImGuiWindow*            RootWindowForTitleBarHighlight;     // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
2000     ImGuiWindow*            RootWindowForNav;                   // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
2001 
2002     ImGuiWindow*            NavLastChildNavWindow;              // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)
2003     ImGuiID                 NavLastIds[ImGuiNavLayer_COUNT];    // Last known NavId for this window, per layer (0/1)
2004     ImRect                  NavRectRel[ImGuiNavLayer_COUNT];    // Reference rectangle, in window relative space
2005 
2006     int                     MemoryDrawListIdxCapacity;          // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
2007     int                     MemoryDrawListVtxCapacity;
2008     bool                    MemoryCompacted;                    // Set when window extraneous data have been garbage collected
2009 
2010 public:
2011     ImGuiWindow(ImGuiContext* context, const char* name);
2012     ~ImGuiWindow();
2013 
2014     ImGuiID     GetID(const char* str, const char* str_end = NULL);
2015     ImGuiID     GetID(const void* ptr);
2016     ImGuiID     GetID(int n);
2017     ImGuiID     GetIDNoKeepAlive(const char* str, const char* str_end = NULL);
2018     ImGuiID     GetIDNoKeepAlive(const void* ptr);
2019     ImGuiID     GetIDNoKeepAlive(int n);
2020     ImGuiID     GetIDFromRectangle(const ImRect& r_abs);
2021 
2022     // We don't use g.FontSize because the window may be != g.CurrentWidow.
RectImGuiWindow2023     ImRect      Rect() const            { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
CalcFontSizeImGuiWindow2024     float       CalcFontSize() const    { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
TitleBarHeightImGuiWindow2025     float       TitleBarHeight() const  { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
TitleBarRectImGuiWindow2026     ImRect      TitleBarRect() const    { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
MenuBarHeightImGuiWindow2027     float       MenuBarHeight() const   { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
MenuBarRectImGuiWindow2028     ImRect      MenuBarRect() const     { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
2029 };
2030 
2031 //-----------------------------------------------------------------------------
2032 // [SECTION] Tab bar, Tab item support
2033 //-----------------------------------------------------------------------------
2034 
2035 // Extend ImGuiTabBarFlags_
2036 enum ImGuiTabBarFlagsPrivate_
2037 {
2038     ImGuiTabBarFlags_DockNode                   = 1 << 20,  // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around]
2039     ImGuiTabBarFlags_IsFocused                  = 1 << 21,
2040     ImGuiTabBarFlags_SaveSettings               = 1 << 22   // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs
2041 };
2042 
2043 // Extend ImGuiTabItemFlags_
2044 enum ImGuiTabItemFlagsPrivate_
2045 {
2046     ImGuiTabItemFlags_SectionMask_              = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
2047     ImGuiTabItemFlags_NoCloseButton             = 1 << 20,  // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout)
2048     ImGuiTabItemFlags_Button                    = 1 << 21   // Used by TabItemButton, change the tab item behavior to mimic a button
2049 };
2050 
2051 // Storage for one active tab item (sizeof() 40 bytes)
2052 struct ImGuiTabItem
2053 {
2054     ImGuiID             ID;
2055     ImGuiTabItemFlags   Flags;
2056     int                 LastFrameVisible;
2057     int                 LastFrameSelected;      // This allows us to infer an ordered list of the last activated tabs with little maintenance
2058     float               Offset;                 // Position relative to beginning of tab
2059     float               Width;                  // Width currently displayed
2060     float               ContentWidth;           // Width of label, stored during BeginTabItem() call
2061     ImS32               NameOffset;             // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
2062     ImS16               BeginOrder;             // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
2063     ImS16               IndexDuringLayout;      // Index only used during TabBarLayout()
2064     bool                WantClose;              // Marked as closed by SetTabItemClosed()
2065 
ImGuiTabItemImGuiTabItem2066     ImGuiTabItem()      { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
2067 };
2068 
2069 // Storage for a tab bar (sizeof() 152 bytes)
2070 struct ImGuiTabBar
2071 {
2072     ImVector<ImGuiTabItem> Tabs;
2073     ImGuiTabBarFlags    Flags;
2074     ImGuiID             ID;                     // Zero for tab-bars used by docking
2075     ImGuiID             SelectedTabId;          // Selected tab/window
2076     ImGuiID             NextSelectedTabId;      // Next selected tab/window. Will also trigger a scrolling animation
2077     ImGuiID             VisibleTabId;           // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
2078     int                 CurrFrameVisible;
2079     int                 PrevFrameVisible;
2080     ImRect              BarRect;
2081     float               CurrTabsContentsHeight;
2082     float               PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
2083     float               WidthAllTabs;           // Actual width of all tabs (locked during layout)
2084     float               WidthAllTabsIdeal;      // Ideal width if all tabs were visible and not clipped
2085     float               ScrollingAnim;
2086     float               ScrollingTarget;
2087     float               ScrollingTargetDistToVisibility;
2088     float               ScrollingSpeed;
2089     float               ScrollingRectMinX;
2090     float               ScrollingRectMaxX;
2091     ImGuiID             ReorderRequestTabId;
2092     ImS16               ReorderRequestOffset;
2093     ImS8                BeginCount;
2094     bool                WantLayout;
2095     bool                VisibleTabWasSubmitted;
2096     bool                TabsAddedNew;           // Set to true when a new tab item or button has been added to the tab bar during last frame
2097     ImS16               TabsActiveCount;        // Number of tabs submitted this frame.
2098     ImS16               LastTabItemIdx;         // Index of last BeginTabItem() tab for use by EndTabItem()
2099     float               ItemSpacingY;
2100     ImVec2              FramePadding;           // style.FramePadding locked at the time of BeginTabBar()
2101     ImVec2              BackupCursorPos;
2102     ImGuiTextBuffer     TabsNames;              // For non-docking tab bar we re-append names in a contiguous buffer.
2103 
2104     ImGuiTabBar();
GetTabOrderImGuiTabBar2105     int                 GetTabOrder(const ImGuiTabItem* tab) const  { return Tabs.index_from_ptr(tab); }
GetTabNameImGuiTabBar2106     const char*         GetTabName(const ImGuiTabItem* tab) const
2107     {
2108         IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);
2109         return TabsNames.Buf.Data + tab->NameOffset;
2110     }
2111 };
2112 
2113 //-----------------------------------------------------------------------------
2114 // [SECTION] Table support
2115 //-----------------------------------------------------------------------------
2116 
2117 #define IM_COL32_DISABLE                IM_COL32(0,0,0,1)   // Special sentinel code which cannot be used as a regular color.
2118 #define IMGUI_TABLE_MAX_COLUMNS         64                  // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
2119 #define IMGUI_TABLE_MAX_DRAW_CHANNELS   (4 + 64 * 2)        // See TableSetupDrawChannels()
2120 
2121 // Our current column maximum is 64 but we may raise that in the future.
2122 typedef ImS8 ImGuiTableColumnIdx;
2123 typedef ImU8 ImGuiTableDrawChannelIdx;
2124 
2125 // [Internal] sizeof() ~ 104
2126 // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
2127 // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
2128 // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
2129 struct ImGuiTableColumn
2130 {
2131     ImGuiTableColumnFlags   Flags;                          // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
2132     float                   WidthGiven;                     // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space.
2133     float                   MinX;                           // Absolute positions
2134     float                   MaxX;
2135     float                   WidthRequest;                   // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
2136     float                   WidthAuto;                      // Automatic width
2137     float                   StretchWeight;                  // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
2138     float                   InitStretchWeightOrWidth;       // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
2139     ImRect                  ClipRect;                       // Clipping rectangle for the column
2140     ImGuiID                 UserID;                         // Optional, value passed to TableSetupColumn()
2141     float                   WorkMinX;                       // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
2142     float                   WorkMaxX;                       // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
2143     float                   ItemWidth;                      // Current item width for the column, preserved across rows
2144     float                   ContentMaxXFrozen;              // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
2145     float                   ContentMaxXUnfrozen;
2146     float                   ContentMaxXHeadersUsed;         // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
2147     float                   ContentMaxXHeadersIdeal;
2148     ImS16                   NameOffset;                     // Offset into parent ColumnsNames[]
2149     ImGuiTableColumnIdx     DisplayOrder;                   // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
2150     ImGuiTableColumnIdx     IndexWithinEnabledSet;          // Index within enabled/visible set (<= IndexToDisplayOrder)
2151     ImGuiTableColumnIdx     PrevEnabledColumn;              // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
2152     ImGuiTableColumnIdx     NextEnabledColumn;              // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
2153     ImGuiTableColumnIdx     SortOrder;                      // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort
2154     ImGuiTableDrawChannelIdx DrawChannelCurrent;            // Index within DrawSplitter.Channels[]
2155     ImGuiTableDrawChannelIdx DrawChannelFrozen;             // Draw channels for frozen rows (often headers)
2156     ImGuiTableDrawChannelIdx DrawChannelUnfrozen;           // Draw channels for unfrozen rows
2157     bool                    IsEnabled;                      // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0
2158     bool                    IsUserEnabled;                  // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).
2159     bool                    IsUserEnabledNextFrame;
2160     bool                    IsVisibleX;                     // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
2161     bool                    IsVisibleY;
2162     bool                    IsRequestOutput;                // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
2163     bool                    IsSkipItems;                    // Do we want item submissions to this column to be completely ignored (no layout will happen).
2164     bool                    IsPreserveWidthAuto;
2165     ImS8                    NavLayerCurrent;                // ImGuiNavLayer in 1 byte
2166     ImU8                    AutoFitQueue;                   // Queue of 8 values for the next 8 frames to request auto-fit
2167     ImU8                    CannotSkipItemsQueue;           // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
2168     ImU8                    SortDirection : 2;              // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
2169     ImU8                    SortDirectionsAvailCount : 2;   // Number of available sort directions (0 to 3)
2170     ImU8                    SortDirectionsAvailMask : 4;    // Mask of available sort directions (1-bit each)
2171     ImU8                    SortDirectionsAvailList;        // Ordered of available sort directions (2-bits each)
2172 
ImGuiTableColumnImGuiTableColumn2173     ImGuiTableColumn()
2174     {
2175         memset(this, 0, sizeof(*this));
2176         StretchWeight = WidthRequest = -1.0f;
2177         NameOffset = -1;
2178         DisplayOrder = IndexWithinEnabledSet = -1;
2179         PrevEnabledColumn = NextEnabledColumn = -1;
2180         SortOrder = -1;
2181         SortDirection = ImGuiSortDirection_None;
2182         DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
2183     }
2184 };
2185 
2186 // Transient cell data stored per row.
2187 // sizeof() ~ 6
2188 struct ImGuiTableCellData
2189 {
2190     ImU32                       BgColor;    // Actual color
2191     ImGuiTableColumnIdx         Column;     // Column number
2192 };
2193 
2194 // FIXME-TABLE: more transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData
2195 struct ImGuiTable
2196 {
2197     ImGuiID                     ID;
2198     ImGuiTableFlags             Flags;
2199     void*                       RawData;                    // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[]
2200     ImGuiTableTempData*         TempData;                   // Transient data while table is active. Point within g.CurrentTableStack[]
2201     ImSpan<ImGuiTableColumn>    Columns;                    // Point within RawData[]
2202     ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex;        // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
2203     ImSpan<ImGuiTableCellData>  RowCellData;                // Point within RawData[]. Store cells background requests for current row.
2204     ImU64                       EnabledMaskByDisplayOrder;  // Column DisplayOrder -> IsEnabled map
2205     ImU64                       EnabledMaskByIndex;         // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
2206     ImU64                       VisibleMaskByIndex;         // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
2207     ImU64                       RequestOutputMaskByIndex;   // Column Index -> IsVisible || AutoFit (== expect user to submit items)
2208     ImGuiTableFlags             SettingsLoadedFlags;        // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
2209     int                         SettingsOffset;             // Offset in g.SettingsTables
2210     int                         LastFrameActive;
2211     int                         ColumnsCount;               // Number of columns declared in BeginTable()
2212     int                         CurrentRow;
2213     int                         CurrentColumn;
2214     ImS16                       InstanceCurrent;            // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched.
2215     ImS16                       InstanceInteracted;         // Mark which instance (generally 0) of the same ID is being interacted with
2216     float                       RowPosY1;
2217     float                       RowPosY2;
2218     float                       RowMinHeight;               // Height submitted to TableNextRow()
2219     float                       RowTextBaseline;
2220     float                       RowIndentOffsetX;
2221     ImGuiTableRowFlags          RowFlags : 16;              // Current row flags, see ImGuiTableRowFlags_
2222     ImGuiTableRowFlags          LastRowFlags : 16;
2223     int                         RowBgColorCounter;          // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this.
2224     ImU32                       RowBgColor[2];              // Background color override for current row.
2225     ImU32                       BorderColorStrong;
2226     ImU32                       BorderColorLight;
2227     float                       BorderX1;
2228     float                       BorderX2;
2229     float                       HostIndentX;
2230     float                       MinColumnWidth;
2231     float                       OuterPaddingX;
2232     float                       CellPaddingX;               // Padding from each borders
2233     float                       CellPaddingY;
2234     float                       CellSpacingX1;              // Spacing between non-bordered cells
2235     float                       CellSpacingX2;
2236     float                       LastOuterHeight;            // Outer height from last frame
2237     float                       LastFirstRowHeight;         // Height of first row from last frame
2238     float                       InnerWidth;                 // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
2239     float                       ColumnsGivenWidth;          // Sum of current column width
2240     float                       ColumnsAutoFitWidth;        // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
2241     float                       ResizedColumnNextWidth;
2242     float                       ResizeLockMinContentsX2;    // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
2243     float                       RefScale;                   // Reference scale to be able to rescale columns on font/dpi changes.
2244     ImRect                      OuterRect;                  // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
2245     ImRect                      InnerRect;                  // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is
2246     ImRect                      WorkRect;
2247     ImRect                      InnerClipRect;
2248     ImRect                      BgClipRect;                 // We use this to cpu-clip cell background color fill
2249     ImRect                      Bg0ClipRectForDrawCmd;      // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped
2250     ImRect                      Bg2ClipRectForDrawCmd;      // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect.
2251     ImRect                      HostClipRect;               // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window.
2252     ImRect                      HostBackupInnerClipRect;    // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
2253     ImGuiWindow*                OuterWindow;                // Parent window for the table
2254     ImGuiWindow*                InnerWindow;                // Window holding the table data (== OuterWindow or a child window)
2255     ImGuiTextBuffer             ColumnsNames;               // Contiguous buffer holding columns names
2256     ImDrawListSplitter*         DrawSplitter;               // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly
2257     ImGuiTableColumnSortSpecs   SortSpecsSingle;
2258     ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti;     // FIXME-OPT: Using a small-vector pattern would be good.
2259     ImGuiTableSortSpecs         SortSpecs;                  // Public facing sorts specs, this is what we return in TableGetSortSpecs()
2260     ImGuiTableColumnIdx         SortSpecsCount;
2261     ImGuiTableColumnIdx         ColumnsEnabledCount;        // Number of enabled columns (<= ColumnsCount)
2262     ImGuiTableColumnIdx         ColumnsEnabledFixedCount;   // Number of enabled columns (<= ColumnsCount)
2263     ImGuiTableColumnIdx         DeclColumnsCount;           // Count calls to TableSetupColumn()
2264     ImGuiTableColumnIdx         HoveredColumnBody;          // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
2265     ImGuiTableColumnIdx         HoveredColumnBorder;        // Index of column whose right-border is being hovered (for resizing).
2266     ImGuiTableColumnIdx         AutoFitSingleColumn;        // Index of single column requesting auto-fit.
2267     ImGuiTableColumnIdx         ResizedColumn;              // Index of column being resized. Reset when InstanceCurrent==0.
2268     ImGuiTableColumnIdx         LastResizedColumn;          // Index of column being resized from previous frame.
2269     ImGuiTableColumnIdx         HeldHeaderColumn;           // Index of column header being held.
2270     ImGuiTableColumnIdx         ReorderColumn;              // Index of column being reordered. (not cleared)
2271     ImGuiTableColumnIdx         ReorderColumnDir;           // -1 or +1
2272     ImGuiTableColumnIdx         LeftMostEnabledColumn;      // Index of left-most non-hidden column.
2273     ImGuiTableColumnIdx         RightMostEnabledColumn;     // Index of right-most non-hidden column.
2274     ImGuiTableColumnIdx         LeftMostStretchedColumn;    // Index of left-most stretched column.
2275     ImGuiTableColumnIdx         RightMostStretchedColumn;   // Index of right-most stretched column.
2276     ImGuiTableColumnIdx         ContextPopupColumn;         // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
2277     ImGuiTableColumnIdx         FreezeRowsRequest;          // Requested frozen rows count
2278     ImGuiTableColumnIdx         FreezeRowsCount;            // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
2279     ImGuiTableColumnIdx         FreezeColumnsRequest;       // Requested frozen columns count
2280     ImGuiTableColumnIdx         FreezeColumnsCount;         // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
2281     ImGuiTableColumnIdx         RowCellDataCurrent;         // Index of current RowCellData[] entry in current row
2282     ImGuiTableDrawChannelIdx    DummyDrawChannel;           // Redirect non-visible columns here.
2283     ImGuiTableDrawChannelIdx    Bg2DrawChannelCurrent;      // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
2284     ImGuiTableDrawChannelIdx    Bg2DrawChannelUnfrozen;
2285     bool                        IsLayoutLocked;             // Set by TableUpdateLayout() which is called when beginning the first row.
2286     bool                        IsInsideRow;                // Set when inside TableBeginRow()/TableEndRow().
2287     bool                        IsInitializing;
2288     bool                        IsSortSpecsDirty;
2289     bool                        IsUsingHeaders;             // Set when the first row had the ImGuiTableRowFlags_Headers flag.
2290     bool                        IsContextPopupOpen;         // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
2291     bool                        IsSettingsRequestLoad;
2292     bool                        IsSettingsDirty;            // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
2293     bool                        IsDefaultDisplayOrder;      // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
2294     bool                        IsResetAllRequest;
2295     bool                        IsResetDisplayOrderRequest;
2296     bool                        IsUnfrozenRows;             // Set when we got past the frozen row.
2297     bool                        IsDefaultSizingPolicy;      // Set if user didn't explicitly set a sizing policy in BeginTable()
2298     bool                        MemoryCompacted;
2299     bool                        HostSkipItems;              // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
2300 
ImGuiTableImGuiTable2301     IMGUI_API ImGuiTable()      { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }
~ImGuiTableImGuiTable2302     IMGUI_API ~ImGuiTable()     { IM_FREE(RawData); }
2303 };
2304 
2305 // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
2306 // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
2307 // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
2308 struct ImGuiTableTempData
2309 {
2310     int                         TableIndex;                 // Index in g.Tables.Buf[] pool
2311     float                       LastTimeActive;             // Last timestamp this structure was used
2312 
2313     ImVec2                      UserOuterSize;              // outer_size.x passed to BeginTable()
2314     ImDrawListSplitter          DrawSplitter;
2315 
2316     ImRect                      HostBackupWorkRect;         // Backup of InnerWindow->WorkRect at the end of BeginTable()
2317     ImRect                      HostBackupParentWorkRect;   // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
2318     ImVec2                      HostBackupPrevLineSize;     // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
2319     ImVec2                      HostBackupCurrLineSize;     // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
2320     ImVec2                      HostBackupCursorMaxPos;     // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
2321     ImVec1                      HostBackupColumnsOffset;    // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
2322     float                       HostBackupItemWidth;        // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
2323     int                         HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
2324 
ImGuiTableTempDataImGuiTableTempData2325     IMGUI_API ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
2326 };
2327 
2328 // sizeof() ~ 12
2329 struct ImGuiTableColumnSettings
2330 {
2331     float                   WidthOrWeight;
2332     ImGuiID                 UserID;
2333     ImGuiTableColumnIdx     Index;
2334     ImGuiTableColumnIdx     DisplayOrder;
2335     ImGuiTableColumnIdx     SortOrder;
2336     ImU8                    SortDirection : 2;
2337     ImU8                    IsEnabled : 1; // "Visible" in ini file
2338     ImU8                    IsStretch : 1;
2339 
ImGuiTableColumnSettingsImGuiTableColumnSettings2340     ImGuiTableColumnSettings()
2341     {
2342         WidthOrWeight = 0.0f;
2343         UserID = 0;
2344         Index = -1;
2345         DisplayOrder = SortOrder = -1;
2346         SortDirection = ImGuiSortDirection_None;
2347         IsEnabled = 1;
2348         IsStretch = 0;
2349     }
2350 };
2351 
2352 // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
2353 struct ImGuiTableSettings
2354 {
2355     ImGuiID                     ID;                     // Set to 0 to invalidate/delete the setting
2356     ImGuiTableFlags             SaveFlags;              // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
2357     float                       RefScale;               // Reference scale to be able to rescale columns on font/dpi changes.
2358     ImGuiTableColumnIdx         ColumnsCount;
2359     ImGuiTableColumnIdx         ColumnsCountMax;        // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher
2360     bool                        WantApply;              // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
2361 
ImGuiTableSettingsImGuiTableSettings2362     ImGuiTableSettings()        { memset(this, 0, sizeof(*this)); }
GetColumnSettingsImGuiTableSettings2363     ImGuiTableColumnSettings*   GetColumnSettings()     { return (ImGuiTableColumnSettings*)(this + 1); }
2364 };
2365 
2366 //-----------------------------------------------------------------------------
2367 // [SECTION] ImGui internal API
2368 // No guarantee of forward compatibility here!
2369 //-----------------------------------------------------------------------------
2370 
2371 namespace ImGui
2372 {
2373     // Windows
2374     // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
2375     // If this ever crash because g.CurrentWindow is NULL it means that either
2376     // - ImGui::NewFrame() has never been called, which is illegal.
2377     // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
GetCurrentWindowRead()2378     inline    ImGuiWindow*  GetCurrentWindowRead()      { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
GetCurrentWindow()2379     inline    ImGuiWindow*  GetCurrentWindow()          { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
2380     IMGUI_API ImGuiWindow*  FindWindowByID(ImGuiID id);
2381     IMGUI_API ImGuiWindow*  FindWindowByName(const char* name);
2382     IMGUI_API void          UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
2383     IMGUI_API ImVec2        CalcWindowNextAutoFitSize(ImGuiWindow* window);
2384     IMGUI_API bool          IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy);
2385     IMGUI_API bool          IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
2386     IMGUI_API bool          IsWindowNavFocusable(ImGuiWindow* window);
2387     IMGUI_API void          SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
2388     IMGUI_API void          SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
2389     IMGUI_API void          SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
2390     IMGUI_API void          SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
2391 
2392     // Windows: Display Order and Focus Order
2393     IMGUI_API void          FocusWindow(ImGuiWindow* window);
2394     IMGUI_API void          FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
2395     IMGUI_API void          BringWindowToFocusFront(ImGuiWindow* window);
2396     IMGUI_API void          BringWindowToDisplayFront(ImGuiWindow* window);
2397     IMGUI_API void          BringWindowToDisplayBack(ImGuiWindow* window);
2398 
2399     // Fonts, drawing
2400     IMGUI_API void          SetCurrentFont(ImFont* font);
GetDefaultFont()2401     inline ImFont*          GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
GetForegroundDrawList(ImGuiWindow * window)2402     inline ImDrawList*      GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
2403     IMGUI_API ImDrawList*   GetBackgroundDrawList(ImGuiViewport* viewport);                     // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.
2404     IMGUI_API ImDrawList*   GetForegroundDrawList(ImGuiViewport* viewport);                     // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
2405 
2406     // Init
2407     IMGUI_API void          Initialize(ImGuiContext* context);
2408     IMGUI_API void          Shutdown(ImGuiContext* context);    // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
2409 
2410     // NewFrame
2411     IMGUI_API void          UpdateHoveredWindowAndCaptureFlags();
2412     IMGUI_API void          StartMouseMovingWindow(ImGuiWindow* window);
2413     IMGUI_API void          UpdateMouseMovingWindowNewFrame();
2414     IMGUI_API void          UpdateMouseMovingWindowEndFrame();
2415 
2416     // Generic context hooks
2417     IMGUI_API ImGuiID       AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook);
2418     IMGUI_API void          RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove);
2419     IMGUI_API void          CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
2420 
2421     // Settings
2422     IMGUI_API void                  MarkIniSettingsDirty();
2423     IMGUI_API void                  MarkIniSettingsDirty(ImGuiWindow* window);
2424     IMGUI_API void                  ClearIniSettings();
2425     IMGUI_API ImGuiWindowSettings*  CreateNewWindowSettings(const char* name);
2426     IMGUI_API ImGuiWindowSettings*  FindWindowSettings(ImGuiID id);
2427     IMGUI_API ImGuiWindowSettings*  FindOrCreateWindowSettings(const char* name);
2428     IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
2429 
2430     // Scrolling
2431     IMGUI_API void          SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is
2432     IMGUI_API void          SetScrollX(ImGuiWindow* window, float scroll_x);
2433     IMGUI_API void          SetScrollY(ImGuiWindow* window, float scroll_y);
2434     IMGUI_API void          SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
2435     IMGUI_API void          SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
2436 
2437     // Early work-in-progress API (ScrollToItem() will become public)
2438     IMGUI_API void          ScrollToItem(ImGuiScrollFlags flags = 0);
2439     IMGUI_API void          ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
2440     IMGUI_API ImVec2        ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
2441 //#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
ScrollToBringRectIntoView(ImGuiWindow * window,const ImRect & rect)2442     inline void             ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }
2443 //#endif
2444 
2445     // Basic Accessors
GetItemID()2446     inline ImGuiID          GetItemID()     { ImGuiContext& g = *GImGui; return g.LastItemData.ID; }   // Get ID of last item (~~ often same ImGui::GetID(label) beforehand)
GetItemStatusFlags()2447     inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
GetItemFlags()2448     inline ImGuiItemFlags   GetItemFlags()  { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; }
GetActiveID()2449     inline ImGuiID          GetActiveID()   { ImGuiContext& g = *GImGui; return g.ActiveId; }
GetFocusID()2450     inline ImGuiID          GetFocusID()    { ImGuiContext& g = *GImGui; return g.NavId; }
2451     IMGUI_API void          SetActiveID(ImGuiID id, ImGuiWindow* window);
2452     IMGUI_API void          SetFocusID(ImGuiID id, ImGuiWindow* window);
2453     IMGUI_API void          ClearActiveID();
2454     IMGUI_API ImGuiID       GetHoveredID();
2455     IMGUI_API void          SetHoveredID(ImGuiID id);
2456     IMGUI_API void          KeepAliveID(ImGuiID id);
2457     IMGUI_API void          MarkItemEdited(ImGuiID id);     // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
2458     IMGUI_API void          PushOverrideID(ImGuiID id);     // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes)
2459     IMGUI_API ImGuiID       GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
2460 
2461     // Basic Helpers for widget code
2462     IMGUI_API void          ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
2463     IMGUI_API void          ItemSize(const ImRect& bb, float text_baseline_y = -1.0f);
2464     IMGUI_API bool          ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
2465     IMGUI_API bool          ItemHoverable(const ImRect& bb, ImGuiID id);
2466     IMGUI_API void          ItemInputable(ImGuiWindow* window, ImGuiID id);
2467     IMGUI_API bool          IsClippedEx(const ImRect& bb, ImGuiID id);
2468     IMGUI_API ImVec2        CalcItemSize(ImVec2 size, float default_w, float default_h);
2469     IMGUI_API float         CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
2470     IMGUI_API void          PushMultiItemsWidths(int components, float width_full);
2471     IMGUI_API bool          IsItemToggledSelection();                                   // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly)
2472     IMGUI_API ImVec2        GetContentRegionMaxAbs();
2473     IMGUI_API void          ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
2474 
2475     // Parameter stacks
2476     IMGUI_API void          PushItemFlag(ImGuiItemFlags option, bool enabled);
2477     IMGUI_API void          PopItemFlag();
2478 
2479 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
2480     // Currently refactoring focus/nav/tabbing system
2481     // If you have old/custom copy-and-pasted widgets that used FocusableItemRegister():
2482     //  (Old) IMGUI_VERSION_NUM  < 18209: using 'ItemAdd(....)'                              and 'bool tab_focused = FocusableItemRegister(...)'
2483     //  (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)'  and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0'
2484     //  (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)'     and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || g.NavActivateInputId == id' (WIP)
2485     // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText()
FocusableItemRegister(ImGuiWindow * window,ImGuiID id)2486     inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id)  { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
FocusableItemUnregister(ImGuiWindow * window)2487     inline void FocusableItemUnregister(ImGuiWindow* window)            { IM_ASSERT(0); IM_UNUSED(window); }                              // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
2488 #endif
2489 
2490     // Logging/Capture
2491     IMGUI_API void          LogBegin(ImGuiLogType type, int auto_open_depth);           // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
2492     IMGUI_API void          LogToBuffer(int auto_open_depth = -1);                      // Start logging/capturing to internal buffer
2493     IMGUI_API void          LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
2494     IMGUI_API void          LogSetNextTextDecoration(const char* prefix, const char* suffix);
2495 
2496     // Popups, Modals, Tooltips
2497     IMGUI_API bool          BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
2498     IMGUI_API void          OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
2499     IMGUI_API void          ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
2500     IMGUI_API void          ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
2501     IMGUI_API void          ClosePopupsExceptModals();
2502     IMGUI_API bool          IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
2503     IMGUI_API bool          BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
2504     IMGUI_API void          BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags);
2505     IMGUI_API ImRect        GetPopupAllowedExtentRect(ImGuiWindow* window);
2506     IMGUI_API ImGuiWindow*  GetTopMostPopupModal();
2507     IMGUI_API ImVec2        FindBestWindowPosForPopup(ImGuiWindow* window);
2508     IMGUI_API ImVec2        FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
2509 
2510     // Menus
2511     IMGUI_API bool          BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
2512     IMGUI_API bool          BeginMenuEx(const char* label, const char* icon, bool enabled = true);
2513     IMGUI_API bool          MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);
2514 
2515     // Combos
2516     IMGUI_API bool          BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);
2517     IMGUI_API bool          BeginComboPreview();
2518     IMGUI_API void          EndComboPreview();
2519 
2520     // Gamepad/Keyboard Navigation
2521     IMGUI_API void          NavInitWindow(ImGuiWindow* window, bool force_reinit);
2522     IMGUI_API void          NavInitRequestApplyResult();
2523     IMGUI_API bool          NavMoveRequestButNoResultYet();
2524     IMGUI_API void          NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
2525     IMGUI_API void          NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
2526     IMGUI_API void          NavMoveRequestResolveWithLastItem();
2527     IMGUI_API void          NavMoveRequestCancel();
2528     IMGUI_API void          NavMoveRequestApplyResult();
2529     IMGUI_API void          NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
2530     IMGUI_API float         GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
2531     IMGUI_API ImVec2        GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f);
2532     IMGUI_API int           CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
2533     IMGUI_API void          ActivateItem(ImGuiID id);   // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
2534     IMGUI_API void          SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
2535 
2536     // Focus Scope (WIP)
2537     // This is generally used to identify a selection set (multiple of which may be in the same window), as selection
2538     // patterns generally need to react (e.g. clear selection) when landing on an item of the set.
2539     IMGUI_API void          PushFocusScope(ImGuiID id);
2540     IMGUI_API void          PopFocusScope();
GetFocusedFocusScope()2541     inline ImGuiID          GetFocusedFocusScope()          { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; }                            // Focus scope which is actually active
GetFocusScope()2542     inline ImGuiID          GetFocusScope()                 { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; }   // Focus scope we are outputting into, set by PushFocusScope()
2543 
2544     // Inputs
2545     // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
2546     IMGUI_API void          SetItemUsingMouseWheel();
2547     IMGUI_API void          SetActiveIdUsingNavAndKeys();
IsActiveIdUsingNavDir(ImGuiDir dir)2548     inline bool             IsActiveIdUsingNavDir(ImGuiDir dir)                         { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
IsActiveIdUsingNavInput(ImGuiNavInput input)2549     inline bool             IsActiveIdUsingNavInput(ImGuiNavInput input)                { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; }
IsActiveIdUsingKey(ImGuiKey key)2550     inline bool             IsActiveIdUsingKey(ImGuiKey key)                            { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; }
2551     IMGUI_API bool          IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
2552     inline bool             IsKeyPressedMap(ImGuiKey key, bool repeat = true)           { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
IsNavInputDown(ImGuiNavInput n)2553     inline bool             IsNavInputDown(ImGuiNavInput n)                             { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; }
IsNavInputTest(ImGuiNavInput n,ImGuiInputReadMode rm)2554     inline bool             IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm)      { return (GetNavInputAmount(n, rm) > 0.0f); }
2555     IMGUI_API ImGuiKeyModFlags GetMergedKeyModFlags();
2556 
2557     // Drag and Drop
2558     IMGUI_API bool          BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
2559     IMGUI_API void          ClearDragDrop();
2560     IMGUI_API bool          IsDragDropPayloadBeingAccepted();
2561 
2562     // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
2563     IMGUI_API void          SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
2564     IMGUI_API void          BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
2565     IMGUI_API void          EndColumns();                                                               // close columns
2566     IMGUI_API void          PushColumnClipRect(int column_index);
2567     IMGUI_API void          PushColumnsBackground();
2568     IMGUI_API void          PopColumnsBackground();
2569     IMGUI_API ImGuiID       GetColumnsID(const char* str_id, int count);
2570     IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
2571     IMGUI_API float         GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
2572     IMGUI_API float         GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
2573 
2574     // Tables: Candidates for public API
2575     IMGUI_API void          TableOpenContextMenu(int column_n = -1);
2576     IMGUI_API void          TableSetColumnWidth(int column_n, float width);
2577     IMGUI_API void          TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
2578     IMGUI_API int           TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
2579     IMGUI_API float         TableGetHeaderRowHeight();
2580     IMGUI_API void          TablePushBackgroundChannel();
2581     IMGUI_API void          TablePopBackgroundChannel();
2582 
2583     // Tables: Internals
GetCurrentTable()2584     inline    ImGuiTable*   GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
2585     IMGUI_API ImGuiTable*   TableFindByID(ImGuiID id);
2586     IMGUI_API bool          BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);
2587     IMGUI_API void          TableBeginInitMemory(ImGuiTable* table, int columns_count);
2588     IMGUI_API void          TableBeginApplyRequests(ImGuiTable* table);
2589     IMGUI_API void          TableSetupDrawChannels(ImGuiTable* table);
2590     IMGUI_API void          TableUpdateLayout(ImGuiTable* table);
2591     IMGUI_API void          TableUpdateBorders(ImGuiTable* table);
2592     IMGUI_API void          TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
2593     IMGUI_API void          TableDrawBorders(ImGuiTable* table);
2594     IMGUI_API void          TableDrawContextMenu(ImGuiTable* table);
2595     IMGUI_API void          TableMergeDrawChannels(ImGuiTable* table);
2596     IMGUI_API void          TableSortSpecsSanitize(ImGuiTable* table);
2597     IMGUI_API void          TableSortSpecsBuild(ImGuiTable* table);
2598     IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
2599     IMGUI_API void          TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
2600     IMGUI_API float         TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
2601     IMGUI_API void          TableBeginRow(ImGuiTable* table);
2602     IMGUI_API void          TableEndRow(ImGuiTable* table);
2603     IMGUI_API void          TableBeginCell(ImGuiTable* table, int column_n);
2604     IMGUI_API void          TableEndCell(ImGuiTable* table);
2605     IMGUI_API ImRect        TableGetCellBgRect(const ImGuiTable* table, int column_n);
2606     IMGUI_API const char*   TableGetColumnName(const ImGuiTable* table, int column_n);
2607     IMGUI_API ImGuiID       TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0);
2608     IMGUI_API float         TableGetMaxColumnWidth(const ImGuiTable* table, int column_n);
2609     IMGUI_API void          TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
2610     IMGUI_API void          TableSetColumnWidthAutoAll(ImGuiTable* table);
2611     IMGUI_API void          TableRemove(ImGuiTable* table);
2612     IMGUI_API void          TableGcCompactTransientBuffers(ImGuiTable* table);
2613     IMGUI_API void          TableGcCompactTransientBuffers(ImGuiTableTempData* table);
2614     IMGUI_API void          TableGcCompactSettings();
2615 
2616     // Tables: Settings
2617     IMGUI_API void                  TableLoadSettings(ImGuiTable* table);
2618     IMGUI_API void                  TableSaveSettings(ImGuiTable* table);
2619     IMGUI_API void                  TableResetSettings(ImGuiTable* table);
2620     IMGUI_API ImGuiTableSettings*   TableGetBoundSettings(ImGuiTable* table);
2621     IMGUI_API void                  TableSettingsInstallHandler(ImGuiContext* context);
2622     IMGUI_API ImGuiTableSettings*   TableSettingsCreate(ImGuiID id, int columns_count);
2623     IMGUI_API ImGuiTableSettings*   TableSettingsFindByID(ImGuiID id);
2624 
2625     // Tab Bars
2626     IMGUI_API bool          BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
2627     IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
2628     IMGUI_API void          TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
2629     IMGUI_API void          TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
2630     IMGUI_API void          TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset);
2631     IMGUI_API void          TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos);
2632     IMGUI_API bool          TabBarProcessReorder(ImGuiTabBar* tab_bar);
2633     IMGUI_API bool          TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags);
2634     IMGUI_API ImVec2        TabItemCalcSize(const char* label, bool has_close_button);
2635     IMGUI_API void          TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
2636     IMGUI_API void          TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped);
2637 
2638     // Render helpers
2639     // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
2640     // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
2641     IMGUI_API void          RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
2642     IMGUI_API void          RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
2643     IMGUI_API void          RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
2644     IMGUI_API void          RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
2645     IMGUI_API void          RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
2646     IMGUI_API void          RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
2647     IMGUI_API void          RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
2648     IMGUI_API void          RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
2649     IMGUI_API void          RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
2650     IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
2651 
2652     // Render helpers (those functions don't access any ImGui state!)
2653     IMGUI_API void          RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
2654     IMGUI_API void          RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
2655     IMGUI_API void          RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
2656     IMGUI_API void          RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
2657     IMGUI_API void          RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
2658     IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
2659     IMGUI_API void          RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect inner, ImU32 col, float rounding);
2660 
2661 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
2662     // [1.71: 2019/06/07: Updating prototypes of some of the internal functions. Leaving those for reference for a short while]
2663     inline void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale=1.0f) { ImGuiWindow* window = GetCurrentWindow(); RenderArrow(window->DrawList, pos, GetColorU32(ImGuiCol_Text), dir, scale); }
RenderBullet(ImVec2 pos)2664     inline void RenderBullet(ImVec2 pos)                                { ImGuiWindow* window = GetCurrentWindow(); RenderBullet(window->DrawList, pos, GetColorU32(ImGuiCol_Text)); }
2665 #endif
2666 
2667     // Widgets
2668     IMGUI_API void          TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
2669     IMGUI_API bool          ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
2670     IMGUI_API bool          CloseButton(ImGuiID id, const ImVec2& pos);
2671     IMGUI_API bool          CollapseButton(ImGuiID id, const ImVec2& pos);
2672     IMGUI_API bool          ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
2673     IMGUI_API void          Scrollbar(ImGuiAxis axis);
2674     IMGUI_API bool          ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float avail_v, float contents_v, ImDrawFlags flags);
2675     IMGUI_API bool          ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col);
2676     IMGUI_API ImRect        GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
2677     IMGUI_API ImGuiID       GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
2678     IMGUI_API ImGuiID       GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
2679     IMGUI_API ImGuiID       GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
2680     IMGUI_API void          SeparatorEx(ImGuiSeparatorFlags flags);
2681     IMGUI_API bool          CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
2682     IMGUI_API bool          CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
2683 
2684     // Widgets low-level behaviors
2685     IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
2686     IMGUI_API bool          DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags);
2687     IMGUI_API bool          SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
2688     IMGUI_API bool          SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f);
2689     IMGUI_API bool          TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
2690     IMGUI_API bool          TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0);                     // Consume previous SetNextItemOpen() data, if any. May return true when logging
2691     IMGUI_API void          TreePushOverrideID(ImGuiID id);
2692 
2693     // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
2694     // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).
2695     // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
2696     template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
2697     template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API T     ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
2698     template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API bool  DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);
2699     template<typename T, typename SIGNED_T, typename FLOAT_T>   IMGUI_API bool  SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
2700     template<typename T, typename SIGNED_T>                     IMGUI_API T     RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
2701     template<typename T>                                        IMGUI_API bool  CheckboxFlagsT(const char* label, T* flags, T flags_value);
2702 
2703     // Data type helpers
2704     IMGUI_API const ImGuiDataTypeInfo*  DataTypeGetInfo(ImGuiDataType data_type);
2705     IMGUI_API int           DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
2706     IMGUI_API void          DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
2707     IMGUI_API bool          DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format);
2708     IMGUI_API int           DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
2709     IMGUI_API bool          DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
2710 
2711     // InputText
2712     IMGUI_API bool          InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
2713     IMGUI_API bool          TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
2714     IMGUI_API bool          TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL);
TempInputIsActive(ImGuiID id)2715     inline bool             TempInputIsActive(ImGuiID id)       { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
GetInputTextState(ImGuiID id)2716     inline ImGuiInputTextState* GetInputTextState(ImGuiID id)   { ImGuiContext& g = *GImGui; return (g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
2717 
2718     // Color
2719     IMGUI_API void          ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
2720     IMGUI_API void          ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
2721     IMGUI_API void          ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
2722 
2723     // Plot
2724     IMGUI_API int           PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size);
2725 
2726     // Shade functions (write over already created vertices)
2727     IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
2728     IMGUI_API void          ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
2729 
2730     // Garbage collection
2731     IMGUI_API void          GcCompactTransientMiscBuffers();
2732     IMGUI_API void          GcCompactTransientWindowBuffers(ImGuiWindow* window);
2733     IMGUI_API void          GcAwakeTransientWindowBuffers(ImGuiWindow* window);
2734 
2735     // Debug Tools
2736     IMGUI_API void          ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
2737     IMGUI_API void          ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
2738     inline void             DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255))    { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); }
DebugStartItemPicker()2739     inline void             DebugStartItemPicker()                                  { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
2740 
2741     IMGUI_API void          ShowFontAtlas(ImFontAtlas* atlas);
2742     IMGUI_API void          DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
2743     IMGUI_API void          DebugNodeColumns(ImGuiOldColumns* columns);
2744     IMGUI_API void          DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label);
2745     IMGUI_API void          DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
2746     IMGUI_API void          DebugNodeFont(ImFont* font);
2747     IMGUI_API void          DebugNodeStorage(ImGuiStorage* storage, const char* label);
2748     IMGUI_API void          DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
2749     IMGUI_API void          DebugNodeTable(ImGuiTable* table);
2750     IMGUI_API void          DebugNodeTableSettings(ImGuiTableSettings* settings);
2751     IMGUI_API void          DebugNodeWindow(ImGuiWindow* window, const char* label);
2752     IMGUI_API void          DebugNodeWindowSettings(ImGuiWindowSettings* settings);
2753     IMGUI_API void          DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
2754     IMGUI_API void          DebugNodeViewport(ImGuiViewportP* viewport);
2755     IMGUI_API void          DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
2756 
2757 } // namespace ImGui
2758 
2759 
2760 //-----------------------------------------------------------------------------
2761 // [SECTION] ImFontAtlas internal API
2762 //-----------------------------------------------------------------------------
2763 
2764 // This structure is likely to evolve as we add support for incremental atlas updates
2765 struct ImFontBuilderIO
2766 {
2767     bool    (*FontBuilder_Build)(ImFontAtlas* atlas);
2768 };
2769 
2770 // Helper for font builder
2771 IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
2772 IMGUI_API void      ImFontAtlasBuildInit(ImFontAtlas* atlas);
2773 IMGUI_API void      ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
2774 IMGUI_API void      ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
2775 IMGUI_API void      ImFontAtlasBuildFinish(ImFontAtlas* atlas);
2776 IMGUI_API void      ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value);
2777 IMGUI_API void      ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
2778 IMGUI_API void      ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
2779 IMGUI_API void      ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
2780 
2781 //-----------------------------------------------------------------------------
2782 // [SECTION] Test Engine specific hooks (imgui_test_engine)
2783 //-----------------------------------------------------------------------------
2784 
2785 #ifdef IMGUI_ENABLE_TEST_ENGINE
2786 extern void         ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);
2787 extern void         ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
2788 extern void         ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
2789 extern const char*  ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
2790 
2791 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID)                 if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID)               // Register item bounding box
2792 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS)      if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS)   // Register item label and status flags (optional)
2793 #define IMGUI_TEST_ENGINE_LOG(_FMT,...)                     if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__)          // Custom log entry from user land into test log
2794 #else
2795 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS)      ((void)0)
2796 #endif
2797 
2798 //-----------------------------------------------------------------------------
2799 
2800 #if defined(__clang__)
2801 #pragma clang diagnostic pop
2802 #elif defined(__GNUC__)
2803 #pragma GCC diagnostic pop
2804 #endif
2805 
2806 #ifdef _MSC_VER
2807 #pragma warning (pop)
2808 #endif
2809 
2810 #endif // #ifndef IMGUI_DISABLE
2811