imgui

FORK: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
git clone https://git.neptards.moe/neptards/imgui.git
Log | Files | Refs

imgui_internal.h (192731B)


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