Path: blob/21.2-virgl/src/imgui/imgui_internal.h
4558 views
// dear imgui, v1.68 WIP1// (internal structures/api)23// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!4// Set:5// #define IMGUI_DEFINE_MATH_OPERATORS6// 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)78/*910Index of this file:11// Header mess12// Forward declarations13// STB libraries includes14// Context pointer15// Generic helpers16// Misc data structures17// Main imgui context18// Tab bar, tab item19// Internal API2021*/2223#pragma once2425//-----------------------------------------------------------------------------26// Header mess27//-----------------------------------------------------------------------------2829#ifndef IMGUI_VERSION30#error Must include imgui.h before imgui_internal.h31#endif3233#include <stdio.h> // FILE*34#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof35#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf36#include <limits.h> // INT_MIN, INT_MAX3738#ifdef _MSC_VER39#pragma warning (push)40#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)41#endif4243#ifdef __clang__44#pragma clang diagnostic push45#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h46#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h47#pragma clang diagnostic ignored "-Wold-style-cast"48#if __has_warning("-Wzero-as-null-pointer-constant")49#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"50#endif51#if __has_warning("-Wdouble-promotion")52#pragma clang diagnostic ignored "-Wdouble-promotion"53#endif54#endif5556//-----------------------------------------------------------------------------57// Forward declarations58//-----------------------------------------------------------------------------5960struct ImRect; // An axis-aligned rectangle (2 points)61struct ImDrawDataBuilder; // Helper to build a ImDrawData instance62struct ImDrawListSharedData; // Data shared between all ImDrawList instances63struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it64struct ImGuiColumnData; // Storage data for a single column65struct ImGuiColumnsSet; // Storage data for a columns set66struct ImGuiContext; // Main imgui context67struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()68struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box69struct ImGuiItemHoveredDataBackup; // Backup and restore IsItemHovered() internal data70struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only71struct ImGuiNavMoveResult; // Result of a directional navigation move query result72struct ImGuiNextWindowData; // Storage for SetNexWindow** functions73struct ImGuiPopupRef; // Storage for current popup stack74struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file75struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it76struct ImGuiTabBar; // Storage for a tab bar77struct ImGuiTabItem; // Storage for a tab item (within a tab bar)78struct ImGuiWindow; // Storage for one window79struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame)80struct ImGuiWindowSettings; // Storage for window settings stored in .ini file (we keep one of those even if the actual window wasn't instanced during this session)8182// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.83typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical84typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for ButtonEx(), ButtonBehavior()85typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag()86typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags87typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()88typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d()89typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests90typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for Separator() - internal91typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for SliderBehavior()92typedef int ImGuiDragFlags; // -> enum ImGuiDragFlags_ // Flags: for DragBehavior()9394//-------------------------------------------------------------------------95// STB libraries includes96//-------------------------------------------------------------------------9798namespace ImGuiStb99{100101#undef STB_TEXTEDIT_STRING102#undef STB_TEXTEDIT_CHARTYPE103#define STB_TEXTEDIT_STRING ImGuiInputTextState104#define STB_TEXTEDIT_CHARTYPE ImWchar105#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f106#include "imstb_textedit.h"107108} // namespace ImGuiStb109110//-----------------------------------------------------------------------------111// Context pointer112//-----------------------------------------------------------------------------113114#ifndef GImGui115extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer116#endif117118//-----------------------------------------------------------------------------119// Generic helpers120//-----------------------------------------------------------------------------121122#define IM_PI 3.14159265358979323846f123#ifdef _WIN32124#define IM_NEWLINE "\r\n" // Play it nice with Windows users (2018/05 news: Microsoft announced that Notepad will finally display Unix-style carriage returns!)125#else126#define IM_NEWLINE "\n"127#endif128129#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)130#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]131#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose132#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255133134// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall135#ifdef _MSC_VER136#define IMGUI_CDECL __cdecl137#else138#define IMGUI_CDECL139#endif140141// Helpers: UTF-8 <> wchar142IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count143IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count144IMGUI_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 count145IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)146IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8147IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8148149// Helpers: Misc150IMGUI_API ImU32 ImHashData(const void* data, size_t data_size, ImU32 seed = 0);151IMGUI_API ImU32 ImHashStr(const char* data, size_t data_size, ImU32 seed = 0);152IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size = NULL, int padding_bytes = 0);153IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode);154static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }155static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }156static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }157static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }158#define ImQsort qsort159#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS160static inline ImU32 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]161#endif162163// Helpers: Geometry164IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);165IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);166IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);167IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);168IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);169170// Helpers: String171IMGUI_API int ImStricmp(const char* str1, const char* str2);172IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);173IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);174IMGUI_API char* ImStrdup(const char* str);175IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);176IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);177IMGUI_API int ImStrlenW(const ImWchar* str);178IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line179IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line180IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);181IMGUI_API void ImStrTrimBlanks(char* str);182IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);183IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);184IMGUI_API const char* ImParseFormatFindStart(const char* format);185IMGUI_API const char* ImParseFormatFindEnd(const char* format);186IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);187IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);188189// Helpers: ImVec2/ImVec4 operators190// 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.)191// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.192#ifdef IMGUI_DEFINE_MATH_OPERATORS193static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); }194static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x/rhs, lhs.y/rhs); }195static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); }196static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); }197static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); }198static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); }199static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }200static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }201static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }202static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }203static 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); }204static 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); }205static 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); }206#endif207208// Helpers: Maths209// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)210#ifndef IMGUI_DISABLE_MATH_FUNCTIONS211static inline float ImFabs(float x) { return fabsf(x); }212static inline float ImSqrt(float x) { return sqrtf(x); }213static inline float ImPow(float x, float y) { return powf(x, y); }214static inline double ImPow(double x, double y) { return pow(x, y); }215static inline float ImFmod(float x, float y) { return fmodf(x, y); }216static inline double ImFmod(double x, double y) { return fmod(x, y); }217static inline float ImCos(float x) { return cosf(x); }218static inline float ImSin(float x) { return sinf(x); }219static inline float ImAcos(float x) { return acosf(x); }220static inline float ImAtan2(float y, float x) { return atan2f(y, x); }221static inline double ImAtof(const char* s) { return atof(s); }222static inline float ImFloorStd(float x) { return floorf(x); } // we already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by stb_truetype)223static inline float ImCeil(float x) { return ceilf(x); }224#endif225// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support for variety of types: signed/unsigned int/long long float/double, using templates here but we could also redefine them 6 times226template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }227template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }228template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }229template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }230template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }231// - Misc maths helpers232static 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); }233static 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); }234static 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); }235static 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); }236static 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); }237static 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); }238static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }239static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; }240static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; }241static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; }242static inline float ImFloor(float f) { return (float)(int)f; }243static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }244static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }245static 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); }246static 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; }247static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }248249// Helper: ImBoolVector. Store 1-bit per value.250// Note that Resize() currently clears the whole vector.251struct ImBoolVector252{253ImVector<int> Storage;254ImBoolVector() { }255void Resize(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }256void Clear() { Storage.clear(); }257bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (Storage[off] & mask) != 0; }258void SetBit(int n, bool v) { int off = (n >> 5); int mask = 1 << (n & 31); if (v) Storage[off] |= mask; else Storage[off] &= ~mask; }259};260261// Helper: ImPool<>. Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,262// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.263typedef int ImPoolIdx;264template<typename T>265struct IMGUI_API ImPool266{267ImVector<T> Data; // Contiguous data268ImGuiStorage Map; // ID->Index269ImPoolIdx FreeIdx; // Next free idx to use270271ImPool() { FreeIdx = 0; }272~ImPool() { Clear(); }273T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Data[idx] : NULL; }274T* GetByIndex(ImPoolIdx n) { return &Data[n]; }275ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Data.Data && p < Data.Data + Data.Size); return (ImPoolIdx)(p - Data.Data); }276T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Data[*p_idx]; *p_idx = FreeIdx; return Add(); }277void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Data[idx].~T(); } Map.Clear(); Data.clear(); FreeIdx = 0; }278T* Add() { int idx = FreeIdx; if (idx == Data.Size) { Data.resize(Data.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Data[idx]; } IM_PLACEMENT_NEW(&Data[idx]) T(); return &Data[idx]; }279void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }280void Remove(ImGuiID key, ImPoolIdx idx) { Data[idx].~T(); *(int*)&Data[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); }281void Reserve(int capacity) { Data.reserve(capacity); Map.Data.reserve(capacity); }282int GetSize() const { return Data.Size; }283};284285//-----------------------------------------------------------------------------286// Misc data structures287//-----------------------------------------------------------------------------288289enum ImGuiButtonFlags_290{291ImGuiButtonFlags_None = 0,292ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat293ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]294ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release)295ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release)296ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release)297ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping298ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()299ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED]300ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions301ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine302ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held303ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)304ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12, // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)305ImGuiButtonFlags_NoNavFocus = 1 << 13 // don't override navigation focus when activated306};307308enum ImGuiSliderFlags_309{310ImGuiSliderFlags_None = 0,311ImGuiSliderFlags_Vertical = 1 << 0312};313314enum ImGuiDragFlags_315{316ImGuiDragFlags_None = 0,317ImGuiDragFlags_Vertical = 1 << 0318};319320enum ImGuiColumnsFlags_321{322// Default: 0323ImGuiColumnsFlags_None = 0,324ImGuiColumnsFlags_NoBorder = 1 << 0, // Disable column dividers325ImGuiColumnsFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers326ImGuiColumnsFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns327ImGuiColumnsFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window328ImGuiColumnsFlags_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.329};330331enum ImGuiSelectableFlagsPrivate_332{333// NB: need to be in sync with last value of ImGuiSelectableFlags_334ImGuiSelectableFlags_NoHoldingActiveID = 1 << 10,335ImGuiSelectableFlags_PressedOnClick = 1 << 11,336ImGuiSelectableFlags_PressedOnRelease = 1 << 12,337ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 13338};339340enum ImGuiSeparatorFlags_341{342ImGuiSeparatorFlags_None = 0,343ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar344ImGuiSeparatorFlags_Vertical = 1 << 1345};346347// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().348// This is going to be exposed in imgui.h when stabilized enough.349enum ImGuiItemFlags_350{351ImGuiItemFlags_NoTabStop = 1 << 0, // false352ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.353ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211354ImGuiItemFlags_NoNav = 1 << 3, // false355ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false356ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window357ImGuiItemFlags_Default_ = 0358};359360// Storage for LastItem data361enum ImGuiItemStatusFlags_362{363ImGuiItemStatusFlags_None = 0,364ImGuiItemStatusFlags_HoveredRect = 1 << 0,365ImGuiItemStatusFlags_HasDisplayRect = 1 << 1,366ImGuiItemStatusFlags_Edited = 1 << 2 // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)367368#ifdef IMGUI_ENABLE_TEST_ENGINE369, // [imgui-test only]370ImGuiItemStatusFlags_Openable = 1 << 10, //371ImGuiItemStatusFlags_Opened = 1 << 11, //372ImGuiItemStatusFlags_Checkable = 1 << 12, //373ImGuiItemStatusFlags_Checked = 1 << 13 //374#endif375};376377// FIXME: this is in development, not exposed/functional as a generic feature yet.378// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2379enum ImGuiLayoutType_380{381ImGuiLayoutType_Horizontal = 0,382ImGuiLayoutType_Vertical = 1383};384385// X/Y enums are fixed to 0/1 so they may be used to index ImVec2386enum ImGuiAxis387{388ImGuiAxis_None = -1,389ImGuiAxis_X = 0,390ImGuiAxis_Y = 1391};392393enum ImGuiPlotType394{395ImGuiPlotType_Lines,396ImGuiPlotType_Histogram397};398399enum ImGuiInputSource400{401ImGuiInputSource_None = 0,402ImGuiInputSource_Mouse,403ImGuiInputSource_Nav,404ImGuiInputSource_NavKeyboard, // Only used occasionally for storage, not tested/handled by most code405ImGuiInputSource_NavGamepad, // "406ImGuiInputSource_COUNT407};408409// FIXME-NAV: Clarify/expose various repeat delay/rate410enum ImGuiInputReadMode411{412ImGuiInputReadMode_Down,413ImGuiInputReadMode_Pressed,414ImGuiInputReadMode_Released,415ImGuiInputReadMode_Repeat,416ImGuiInputReadMode_RepeatSlow,417ImGuiInputReadMode_RepeatFast418};419420enum ImGuiNavHighlightFlags_421{422ImGuiNavHighlightFlags_None = 0,423ImGuiNavHighlightFlags_TypeDefault = 1 << 0,424ImGuiNavHighlightFlags_TypeThin = 1 << 1,425ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.426ImGuiNavHighlightFlags_NoRounding = 1 << 3427};428429enum ImGuiNavDirSourceFlags_430{431ImGuiNavDirSourceFlags_None = 0,432ImGuiNavDirSourceFlags_Keyboard = 1 << 0,433ImGuiNavDirSourceFlags_PadDPad = 1 << 1,434ImGuiNavDirSourceFlags_PadLStick = 1 << 2435};436437enum ImGuiNavMoveFlags_438{439ImGuiNavMoveFlags_None = 0,440ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side441ImGuiNavMoveFlags_LoopY = 1 << 1,442ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)443ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness444ImGuiNavMoveFlags_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)445ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5 // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible.446};447448enum ImGuiNavForward449{450ImGuiNavForward_None,451ImGuiNavForward_ForwardQueued,452ImGuiNavForward_ForwardActive453};454455enum ImGuiNavLayer456{457ImGuiNavLayer_Main = 0, // Main scrolling layer458ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu)459ImGuiNavLayer_COUNT460};461462enum ImGuiPopupPositionPolicy463{464ImGuiPopupPositionPolicy_Default,465ImGuiPopupPositionPolicy_ComboBox466};467468// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)469struct ImVec1470{471float x;472ImVec1() { x = 0.0f; }473ImVec1(float _x) { x = _x; }474};475476477// 2D axis aligned bounding-box478// NB: we can't rely on ImVec2 math operators being available here479struct IMGUI_API ImRect480{481ImVec2 Min; // Upper-left482ImVec2 Max; // Lower-right483484ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {}485ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}486ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}487ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}488489ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }490ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }491float GetWidth() const { return Max.x - Min.x; }492float GetHeight() const { return Max.y - Min.y; }493ImVec2 GetTL() const { return Min; } // Top-left494ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right495ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left496ImVec2 GetBR() const { return Max; } // Bottom-right497bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }498bool 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; }499bool 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; }500void 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; }501void 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; }502void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }503void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }504void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }505void TranslateX(float dx) { Min.x += dx; Max.x += dx; }506void TranslateY(float dy) { Min.y += dy; Max.y += dy; }507void 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.508void 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.509void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }510bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }511};512513// Stacked color modifier, backup of modified data so we can restore it514struct ImGuiColorMod515{516ImGuiCol Col;517ImVec4 BackupValue;518};519520// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.521struct ImGuiStyleMod522{523ImGuiStyleVar VarIdx;524union { int BackupInt[2]; float BackupFloat[2]; };525ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }526ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }527ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }528};529530// Stacked storage data for BeginGroup()/EndGroup()531struct ImGuiGroupData532{533ImVec2 BackupCursorPos;534ImVec2 BackupCursorMaxPos;535ImVec1 BackupIndent;536ImVec1 BackupGroupOffset;537ImVec2 BackupCurrentLineSize;538float BackupCurrentLineTextBaseOffset;539float BackupLogLinePosY;540ImGuiID BackupActiveIdIsAlive;541bool BackupActiveIdPreviousFrameIsAlive;542bool AdvanceCursor;543};544545// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.546struct IMGUI_API ImGuiMenuColumns547{548int Count;549float Spacing;550float Width, NextWidth;551float Pos[4], NextWidths[4];552553ImGuiMenuColumns();554void Update(int count, float spacing, bool clear);555float DeclColumns(float w0, float w1, float w2);556float CalcExtraSpace(float avail_w);557};558559// Internal state of the currently focused/edited text input box560struct IMGUI_API ImGuiInputTextState561{562ImGuiID ID; // widget id owning the text state563ImVector<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.564ImVector<char> InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)565ImVector<char> TempBuffer; // temporary buffer for callback and other other operations. size=capacity.566int CurLenA, CurLenW; // we need to maintain our buffer length in both UTF-8 and wchar format.567int BufCapacityA; // end-user buffer capacity568float ScrollX;569ImGuiStb::STB_TexteditState StbState;570float CursorAnim;571bool CursorFollow;572bool SelectedAllMouseLock;573574// Temporarily set when active575ImGuiInputTextFlags UserFlags;576ImGuiInputTextCallback UserCallback;577void* UserCallbackData;578579ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }580void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking581void CursorClamp() { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); }582bool HasSelection() const { return StbState.select_start != StbState.select_end; }583void ClearSelection() { StbState.select_start = StbState.select_end = StbState.cursor; }584void SelectAll() { StbState.select_start = 0; StbState.cursor = StbState.select_end = CurLenW; StbState.has_preferred_x = 0; }585void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation586};587588// Windows data saved in imgui.ini file589struct ImGuiWindowSettings590{591char* Name;592ImGuiID ID;593ImVec2 Pos;594ImVec2 Size;595bool Collapsed;596597ImGuiWindowSettings() { Name = NULL; ID = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }598};599600struct ImGuiSettingsHandler601{602const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'603ImGuiID TypeHash; // == ImHashStr(TypeName, 0, 0)604void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"605void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry606void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'607void* UserData;608609ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }610};611612// Storage for current popup stack613struct ImGuiPopupRef614{615ImGuiID PopupId; // Set on OpenPopup()616ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()617ImGuiWindow* ParentWindow; // Set on OpenPopup()618int OpenFrameCount; // Set on OpenPopup()619ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differenciate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)620ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)621ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup622};623624struct ImGuiColumnData625{626float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)627float OffsetNormBeforeResize;628ImGuiColumnsFlags Flags; // Not exposed629ImRect ClipRect;630631ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; }632};633634struct ImGuiColumnsSet635{636ImGuiID ID;637ImGuiColumnsFlags Flags;638bool IsFirstFrame;639bool IsBeingResized;640int Current;641int Count;642float MinX, MaxX;643float LineMinY, LineMaxY;644float StartPosY; // Copy of CursorPos645float StartMaxPosX; // Copy of CursorMaxPos646ImVector<ImGuiColumnData> Columns;647648ImGuiColumnsSet() { Clear(); }649void Clear()650{651ID = 0;652Flags = 0;653IsFirstFrame = false;654IsBeingResized = false;655Current = 0;656Count = 1;657MinX = MaxX = 0.0f;658LineMinY = LineMaxY = 0.0f;659StartPosY = 0.0f;660StartMaxPosX = 0.0f;661Columns.clear();662}663};664665// Data shared between all ImDrawList instances666struct IMGUI_API ImDrawListSharedData667{668ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas669ImFont* Font; // Current/default font (optional, for simplified AddText overload)670float FontSize; // Current/default font size (optional, for simplified AddText overload)671float CurveTessellationTol;672ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()673674// Const data675// FIXME: Bake rounded corners fill/borders in atlas676ImVec2 CircleVtx12[12];677678ImDrawListSharedData();679};680681struct ImDrawDataBuilder682{683ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip684685void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }686void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }687IMGUI_API void FlattenIntoSingleLayer();688};689690struct ImGuiNavMoveResult691{692ImGuiID ID; // Best candidate693ImGuiID SelectScopeId;// Best candidate window current selectable group ID694ImGuiWindow* Window; // Best candidate window695float DistBox; // Best candidate box distance to current NavId696float DistCenter; // Best candidate center distance to current NavId697float DistAxial;698ImRect RectRel; // Best candidate bounding box in window relative space699700ImGuiNavMoveResult() { Clear(); }701void Clear() { ID = SelectScopeId = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); }702};703704// Storage for SetNexWindow** functions705struct ImGuiNextWindowData706{707ImGuiCond PosCond;708ImGuiCond SizeCond;709ImGuiCond ContentSizeCond;710ImGuiCond CollapsedCond;711ImGuiCond SizeConstraintCond;712ImGuiCond FocusCond;713ImGuiCond BgAlphaCond;714ImVec2 PosVal;715ImVec2 PosPivotVal;716ImVec2 SizeVal;717ImVec2 ContentSizeVal;718bool CollapsedVal;719ImRect SizeConstraintRect;720ImGuiSizeCallback SizeCallback;721void* SizeCallbackUserData;722float BgAlphaVal;723ImVec2 MenuBarOffsetMinVal; // This is not exposed publicly, so we don't clear it.724725ImGuiNextWindowData()726{727PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;728PosVal = PosPivotVal = SizeVal = ImVec2(0.0f, 0.0f);729ContentSizeVal = ImVec2(0.0f, 0.0f);730CollapsedVal = false;731SizeConstraintRect = ImRect();732SizeCallback = NULL;733SizeCallbackUserData = NULL;734BgAlphaVal = FLT_MAX;735MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);736}737738void Clear()739{740PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;741}742};743744//-----------------------------------------------------------------------------745// Tabs746//-----------------------------------------------------------------------------747748struct ImGuiTabBarSortItem749{750int Index;751float Width;752};753754//-----------------------------------------------------------------------------755// Main imgui context756//-----------------------------------------------------------------------------757758struct ImGuiContext759{760bool Initialized;761bool FrameScopeActive; // Set by NewFrame(), cleared by EndFrame()762bool FrameScopePushedImplicitWindow; // Set by NewFrame(), cleared by EndFrame()763bool FontAtlasOwnedByContext; // Io.Fonts-> is owned by the ImGuiContext and will be destructed along with it.764ImGuiIO IO;765ImGuiStyle Style;766ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()767float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.768float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.769ImDrawListSharedData DrawListSharedData;770771double Time;772int FrameCount;773int FrameCountEnded;774int FrameCountRendered;775ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front776ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front777ImVector<ImGuiWindow*> WindowsSortBuffer;778ImVector<ImGuiWindow*> CurrentWindowStack;779ImGuiStorage WindowsById;780int WindowsActiveCount;781ImGuiWindow* CurrentWindow; // Being drawn into782ImGuiWindow* HoveredWindow; // Will catch mouse inputs783ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)784ImGuiID HoveredId; // Hovered widget785bool HoveredIdAllowOverlap;786ImGuiID HoveredIdPreviousFrame;787float HoveredIdTimer; // Measure contiguous hovering time788float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active789ImGuiID ActiveId; // Active widget790ImGuiID ActiveIdPreviousFrame;791ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)792float ActiveIdTimer;793bool ActiveIdIsJustActivated; // Set at the time of activation for one frame794bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)795bool ActiveIdHasBeenPressed; // 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.796bool ActiveIdHasBeenEdited; // Was the value associated to the widget Edited over the course of the Active state.797bool ActiveIdPreviousFrameIsAlive;798bool ActiveIdPreviousFrameHasBeenEdited;799int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)800int ActiveIdBlockNavInputFlags;801ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)802ImGuiWindow* ActiveIdWindow;803ImGuiWindow* ActiveIdPreviousFrameWindow;804ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)805ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.806float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.807ImVec2 LastValidMousePos;808ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.809ImVector<ImGuiColorMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()810ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()811ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()812ImVector<ImGuiPopupRef> OpenPopupStack; // Which popups are open (persistent)813ImVector<ImGuiPopupRef> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)814ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions815bool NextTreeNodeOpenVal; // Storage for SetNextTreeNode** functions816ImGuiCond NextTreeNodeOpenCond;817818// Navigation data (for gamepad/keyboard)819ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'820ImGuiID NavId; // Focused item for navigation821ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem()822ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0823ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0824ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0825ImGuiID NavJustTabbedId; // Just tabbed to this id.826ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).827ImGuiID NavJustMovedToSelectScopeId; // Just navigated to this select scope id (result of a successfully MoveRequest).828ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.829ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.830ImRect NavScoringRectScreen; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring.831int NavScoringCount; // Metrics for debugging832ImGuiWindow* NavWindowingTarget; // When selecting a window (holding Menu+FocusPrev/Next, or equivalent of CTRL-TAB) this window is temporarily displayed front-most.833ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f834ImGuiWindow* NavWindowingList;835float NavWindowingTimer;836float NavWindowingHighlightAlpha;837bool NavWindowingToggleLayer;838ImGuiNavLayer 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.839int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing840bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRefRectRel is valid841bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)842bool 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)843bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.844bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest845bool NavInitRequest; // Init request for appearing window to select first item846bool NavInitRequestFromMove;847ImGuiID NavInitResultId;848ImRect NavInitResultRectRel;849bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items850bool NavMoveRequest; // Move request for this frame851ImGuiNavMoveFlags NavMoveRequestFlags;852ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)853ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request854ImGuiDir NavMoveClipDir;855ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow856ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)857ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)858859// Render860ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user861ImDrawDataBuilder DrawDataBuilder;862float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)863ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays864ImGuiMouseCursor MouseCursor;865866// Drag and Drop867bool DragDropActive;868bool DragDropWithinSourceOrTarget;869ImGuiDragDropFlags DragDropSourceFlags;870int DragDropSourceFrameCount;871int DragDropMouseButton;872ImGuiPayload DragDropPayload;873ImRect DragDropTargetRect;874ImGuiID DragDropTargetId;875ImGuiDragDropFlags DragDropAcceptFlags;876float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)877ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)878ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)879int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source880ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly881unsigned char DragDropPayloadBufLocal[8]; // Local buffer for small payloads882883// Tab bars884ImPool<ImGuiTabBar> TabBars;885ImVector<ImGuiTabBar*> CurrentTabBar;886ImVector<ImGuiTabBarSortItem> TabSortByWidthBuffer;887888// Widget state889ImGuiInputTextState InputTextState;890ImFont InputTextPasswordFont;891ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.892ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets893ImVec4 ColorPickerRef;894bool DragCurrentAccumDirty;895float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings896float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio897ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?898int TooltipOverrideCount;899ImVector<char> PrivateClipboard; // If no custom clipboard handler is defined900901// Range-Select/Multi-Select902// [This is unused in this branch, but left here to facilitate merging/syncing multiple branches]903ImGuiID MultiSelectScopeId;904905// Platform support906ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor907ImVec2 PlatformImeLastPos;908909// Settings910bool SettingsLoaded;911float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero912ImGuiTextBuffer SettingsIniData; // In memory .ini settings913ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers914ImVector<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries (parsed from the last loaded .ini file and maintained on saving)915916// Logging917bool LogEnabled;918FILE* LogFile; // If != NULL log to stdout/ file919ImGuiTextBuffer LogClipboard; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.920int LogStartDepth;921int LogAutoExpandMaxDepth;922923// Misc924float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds.925int FramerateSecPerFrameIdx;926float FramerateSecPerFrameAccum;927int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags928int WantCaptureKeyboardNextFrame;929int WantTextInputNextFrame;930char TempBuffer[1024*3+1]; // Temporary text buffer931932ImGuiContext(ImFontAtlas* shared_font_atlas) : OverlayDrawList(NULL)933{934Initialized = false;935FrameScopeActive = FrameScopePushedImplicitWindow = false;936Font = NULL;937FontSize = FontBaseSize = 0.0f;938FontAtlasOwnedByContext = shared_font_atlas ? false : true;939IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();940941Time = 0.0f;942FrameCount = 0;943FrameCountEnded = FrameCountRendered = -1;944WindowsActiveCount = 0;945CurrentWindow = NULL;946HoveredWindow = NULL;947HoveredRootWindow = NULL;948HoveredId = 0;949HoveredIdAllowOverlap = false;950HoveredIdPreviousFrame = 0;951HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;952ActiveId = 0;953ActiveIdPreviousFrame = 0;954ActiveIdIsAlive = 0;955ActiveIdTimer = 0.0f;956ActiveIdIsJustActivated = false;957ActiveIdAllowOverlap = false;958ActiveIdHasBeenPressed = false;959ActiveIdHasBeenEdited = false;960ActiveIdPreviousFrameIsAlive = false;961ActiveIdPreviousFrameHasBeenEdited = false;962ActiveIdAllowNavDirFlags = 0x00;963ActiveIdBlockNavInputFlags = 0x00;964ActiveIdClickOffset = ImVec2(-1,-1);965ActiveIdWindow = ActiveIdPreviousFrameWindow = NULL;966ActiveIdSource = ImGuiInputSource_None;967LastActiveId = 0;968LastActiveIdTimer = 0.0f;969LastValidMousePos = ImVec2(0.0f, 0.0f);970MovingWindow = NULL;971NextTreeNodeOpenVal = false;972NextTreeNodeOpenCond = 0;973974NavWindow = NULL;975NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;976NavJustTabbedId = NavJustMovedToId = NavJustMovedToSelectScopeId = NavNextActivateId = 0;977NavInputSource = ImGuiInputSource_None;978NavScoringRectScreen = ImRect();979NavScoringCount = 0;980NavWindowingTarget = NavWindowingTargetAnim = NavWindowingList = NULL;981NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;982NavWindowingToggleLayer = false;983NavLayer = ImGuiNavLayer_Main;984NavIdTabCounter = INT_MAX;985NavIdIsAlive = false;986NavMousePosDirty = false;987NavDisableHighlight = true;988NavDisableMouseHover = false;989NavAnyRequest = false;990NavInitRequest = false;991NavInitRequestFromMove = false;992NavInitResultId = 0;993NavMoveFromClampedRefRect = false;994NavMoveRequest = false;995NavMoveRequestFlags = 0;996NavMoveRequestForward = ImGuiNavForward_None;997NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None;998999DimBgRatio = 0.0f;1000OverlayDrawList._Data = &DrawListSharedData;1001OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging1002MouseCursor = ImGuiMouseCursor_Arrow;10031004DragDropActive = DragDropWithinSourceOrTarget = false;1005DragDropSourceFlags = 0;1006DragDropSourceFrameCount = -1;1007DragDropMouseButton = -1;1008DragDropTargetId = 0;1009DragDropAcceptFlags = 0;1010DragDropAcceptIdCurrRectSurface = 0.0f;1011DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;1012DragDropAcceptFrameCount = -1;1013memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));10141015ScalarAsInputTextId = 0;1016ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;1017DragCurrentAccumDirty = false;1018DragCurrentAccum = 0.0f;1019DragSpeedDefaultRatio = 1.0f / 100.0f;1020ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);1021TooltipOverrideCount = 0;10221023MultiSelectScopeId = 0;10241025PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX);10261027SettingsLoaded = false;1028SettingsDirtyTimer = 0.0f;10291030LogEnabled = false;1031LogFile = NULL;1032LogStartDepth = 0;1033LogAutoExpandMaxDepth = 2;10341035memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));1036FramerateSecPerFrameIdx = 0;1037FramerateSecPerFrameAccum = 0.0f;1038WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;1039memset(TempBuffer, 0, sizeof(TempBuffer));1040}1041};10421043//-----------------------------------------------------------------------------1044// ImGuiWindow1045//-----------------------------------------------------------------------------10461047// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.1048// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered.1049struct IMGUI_API ImGuiWindowTempData1050{1051ImVec2 CursorPos;1052ImVec2 CursorPosPrevLine;1053ImVec2 CursorStartPos; // Initial position in client area with padding1054ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame1055ImVec2 CurrentLineSize;1056float CurrentLineTextBaseOffset;1057ImVec2 PrevLineSize;1058float PrevLineTextBaseOffset;1059float LogLinePosY;1060int TreeDepth;1061ImU32 TreeDepthMayJumpToParentOnPop; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..311062ImGuiID LastItemId;1063ImGuiItemStatusFlags LastItemStatusFlags;1064ImRect LastItemRect; // Interaction rect1065ImRect LastItemDisplayRect; // End-user display rect (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect)1066ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)1067int NavLayerCurrentMask; // = (1 << NavLayerCurrent) used by ItemAdd prior to clipping.1068int NavLayerActiveMask; // Which layer have been written to (result from previous frame)1069int NavLayerActiveMaskNext; // Which layer have been written to (buffer for current frame)1070bool NavHideHighlightOneFrame;1071bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)1072bool MenuBarAppending; // FIXME: Remove this1073ImVec2 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.1074ImVector<ImGuiWindow*> ChildWindows;1075ImGuiStorage* StateStorage;1076ImGuiLayoutType LayoutType;1077ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()10781079// 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.1080ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]1081float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window1082float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f]1083ImVector<ImGuiItemFlags>ItemFlagsStack;1084ImVector<float> ItemWidthStack;1085ImVector<float> TextWrapPosStack;1086ImVector<ImGuiGroupData>GroupStack;1087short StackSizesBackup[6]; // Store size of various stacks for asserting10881089ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)1090ImVec1 GroupOffset;1091ImVec1 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.1092ImGuiColumnsSet* ColumnsSet; // Current columns set10931094ImGuiWindowTempData()1095{1096CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);1097CurrentLineSize = PrevLineSize = ImVec2(0.0f, 0.0f);1098CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;1099LogLinePosY = -1.0f;1100TreeDepth = 0;1101TreeDepthMayJumpToParentOnPop = 0x00;1102LastItemId = 0;1103LastItemStatusFlags = 0;1104LastItemRect = LastItemDisplayRect = ImRect();1105NavLayerActiveMask = NavLayerActiveMaskNext = 0x00;1106NavLayerCurrent = ImGuiNavLayer_Main;1107NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);1108NavHideHighlightOneFrame = false;1109NavHasScroll = false;1110MenuBarAppending = false;1111MenuBarOffset = ImVec2(0.0f, 0.0f);1112StateStorage = NULL;1113LayoutType = ParentLayoutType = ImGuiLayoutType_Vertical;1114ItemWidth = 0.0f;1115ItemFlags = ImGuiItemFlags_Default_;1116TextWrapPos = -1.0f;1117memset(StackSizesBackup, 0, sizeof(StackSizesBackup));11181119Indent = ImVec1(0.0f);1120GroupOffset = ImVec1(0.0f);1121ColumnsOffset = ImVec1(0.0f);1122ColumnsSet = NULL;1123}1124};11251126// Storage for one window1127struct IMGUI_API ImGuiWindow1128{1129char* Name;1130ImGuiID ID; // == ImHash(Name)1131ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_1132ImVec2 Pos; // Position (always rounded-up to nearest pixel)1133ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)1134ImVec2 SizeFull; // Size when non collapsed1135ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars.1136ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc.1137ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize()1138ImVec2 WindowPadding; // Window padding at the time of begin.1139float WindowRounding; // Window rounding at the time of begin.1140float WindowBorderSize; // Window border size at the time of begin.1141int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!1142ImGuiID MoveId; // == window->GetID("#MOVE")1143ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)1144ImVec2 Scroll;1145ImVec2 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)1146ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered1147ImVec2 ScrollbarSizes; // Size taken by scrollbars on each axis1148bool ScrollbarX, ScrollbarY;1149bool Active; // Set to true on Begin(), unless Collapsed1150bool WasActive;1151bool WriteAccessed; // Set to true when any widget access the current window1152bool Collapsed; // Set when collapsing window to become only title-bar1153bool WantCollapseToggle;1154bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)1155bool Appearing; // Set during the frame where the window is appearing (or re-appearing)1156bool Hidden; // Do not display (== (HiddenFramesForResize > 0) ||1157bool HasCloseButton; // Set when the window has a close button (p_open != NULL)1158signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)1159short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)1160short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.1161short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.1162ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)1163int AutoFitFramesX, AutoFitFramesY;1164bool AutoFitOnlyGrows;1165int AutoFitChildAxises;1166ImGuiDir AutoPosLastDirection;1167int HiddenFramesRegular; // Hide the window for N frames1168int HiddenFramesForResize; // Hide the window for N frames while allowing items to be submitted so we can measure their size1169ImGuiCond SetWindowPosAllowFlags; // store acceptable condition flags for SetNextWindowPos() use.1170ImGuiCond SetWindowSizeAllowFlags; // store acceptable condition flags for SetNextWindowSize() use.1171ImGuiCond SetWindowCollapsedAllowFlags; // store acceptable condition flags for SetNextWindowCollapsed() use.1172ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)1173ImVec2 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.11741175ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.1176ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack1177ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.1178ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.1179ImRect InnerMainRect, InnerClipRect;1180ImRect ContentsRegionRect; // FIXME: This is currently confusing/misleading. Maximum visible content position ~~ Pos + (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis1181int LastFrameActive; // Last frame number the window was Active.1182float ItemWidthDefault;1183ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items1184ImGuiStorage StateStorage;1185ImVector<ImGuiColumnsSet> ColumnsStorage;1186float FontWindowScale; // User scale multiplier per-window1187int SettingsIdx; // Index into SettingsWindow[] (indices are always valid as we only grow the array from the back)11881189ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)1190ImDrawList DrawListInst;1191ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL.1192ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window.1193ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.1194ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.11951196ImGuiWindow* 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.)1197ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)1198ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space11991200// Navigation / Focus1201// FIXME-NAV: Merge all this with the new Nav system, at least the request variables should be moved to ImGuiContext1202int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister()1203int FocusIdxTabCounter; // (same, but only count widgets which you can Tab through)1204int FocusIdxAllRequestCurrent; // Item being requested for focus1205int FocusIdxTabRequestCurrent; // Tab-able item being requested for focus1206int FocusIdxAllRequestNext; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)1207int FocusIdxTabRequestNext; // "12081209public:1210ImGuiWindow(ImGuiContext* context, const char* name);1211~ImGuiWindow();12121213ImGuiID GetID(const char* str, const char* str_end = NULL);1214ImGuiID GetID(const void* ptr);1215ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL);1216ImGuiID GetIDNoKeepAlive(const void* ptr);1217ImGuiID GetIDFromRectangle(const ImRect& r_abs);12181219// We don't use g.FontSize because the window may be != g.CurrentWidow.1220ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }1221float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; }1222float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }1223ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }1224float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }1225ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }1226};12271228// 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.1229struct ImGuiItemHoveredDataBackup1230{1231ImGuiID LastItemId;1232ImGuiItemStatusFlags LastItemStatusFlags;1233ImRect LastItemRect;1234ImRect LastItemDisplayRect;12351236ImGuiItemHoveredDataBackup() { Backup(); }1237void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; }1238void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; }1239};12401241//-----------------------------------------------------------------------------1242// Tab bar, tab item1243//-----------------------------------------------------------------------------12441245enum ImGuiTabBarFlagsPrivate_1246{1247ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node1248ImGuiTabBarFlags_IsFocused = 1 << 21,1249ImGuiTabBarFlags_SaveSettings = 1 << 22 // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs1250};12511252enum ImGuiTabItemFlagsPrivate_1253{1254ImGuiTabItemFlags_NoCloseButton = 1 << 20 // Store whether p_open is set or not, which we need to recompute WidthContents during layout.1255};12561257// Storage for one active tab item (sizeof() 26~32 bytes)1258struct ImGuiTabItem1259{1260ImGuiID ID;1261ImGuiTabItemFlags Flags;1262int LastFrameVisible;1263int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance1264int NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames1265float Offset; // Position relative to beginning of tab1266float Width; // Width currently displayed1267float WidthContents; // Width of actual contents, stored during BeginTabItem() call12681269ImGuiTabItem() { ID = Flags = 0; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; }1270};12711272// Storage for a tab bar (sizeof() 92~96 bytes)1273struct ImGuiTabBar1274{1275ImVector<ImGuiTabItem> Tabs;1276ImGuiID ID; // Zero for tab-bars used by docking1277ImGuiID SelectedTabId; // Selected tab1278ImGuiID NextSelectedTabId;1279ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)1280int CurrFrameVisible;1281int PrevFrameVisible;1282ImRect BarRect;1283float ContentsHeight;1284float OffsetMax; // Distance from BarRect.Min.x, locked during layout1285float OffsetNextTab; // Distance from BarRect.Min.x, incremented with each BeginTabItem() call, not used if ImGuiTabBarFlags_Reorderable if set.1286float ScrollingAnim;1287float ScrollingTarget;1288ImGuiTabBarFlags Flags;1289ImGuiID ReorderRequestTabId;1290int ReorderRequestDir;1291bool WantLayout;1292bool VisibleTabWasSubmitted;1293short LastTabItemIdx; // For BeginTabItem()/EndTabItem()1294ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()1295ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.12961297ImGuiTabBar();1298int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); }1299const char* GetTabName(const ImGuiTabItem* tab) const1300{1301IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);1302return TabsNames.Buf.Data + tab->NameOffset;1303}1304};13051306//-----------------------------------------------------------------------------1307// Internal API1308// No guarantee of forward compatibility here.1309//-----------------------------------------------------------------------------13101311namespace ImGui1312{1313// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)1314// If this ever crash because g.CurrentWindow is NULL it means that either1315// - ImGui::NewFrame() has never been called, which is illegal.1316// - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.1317inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }1318inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }1319IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);1320IMGUI_API ImGuiWindow* FindWindowByName(const char* name);1321IMGUI_API void FocusWindow(ImGuiWindow* window);1322IMGUI_API void FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window);1323IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);1324IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);1325IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);1326IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);1327IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window);1328IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);1329IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);1330IMGUI_API void SetWindowScrollX(ImGuiWindow* window, float new_scroll_x);1331IMGUI_API void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y);1332IMGUI_API float GetWindowScrollMaxX(ImGuiWindow* window);1333IMGUI_API float GetWindowScrollMaxY(ImGuiWindow* window);1334IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window);1335IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond);1336IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond);1337IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond);13381339IMGUI_API void SetCurrentFont(ImFont* font);1340inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }13411342// Init1343IMGUI_API void Initialize(ImGuiContext* context);1344IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().13451346// NewFrame1347IMGUI_API void UpdateHoveredWindowAndCaptureFlags();1348IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);1349IMGUI_API void UpdateMouseMovingWindowNewFrame();1350IMGUI_API void UpdateMouseMovingWindowEndFrame();13511352// Settings1353IMGUI_API void MarkIniSettingsDirty();1354IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);1355IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);1356IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);1357IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name);1358IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);13591360// Basic Accessors1361inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }1362inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }1363inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }1364IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);1365IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);1366IMGUI_API void ClearActiveID();1367IMGUI_API ImGuiID GetHoveredID();1368IMGUI_API void SetHoveredID(ImGuiID id);1369IMGUI_API void KeepAliveID(ImGuiID id);1370IMGUI_API void MarkItemEdited(ImGuiID id);13711372// Basic Helpers for widget code1373IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);1374IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);1375IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL);1376IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);1377IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);1378IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true); // Return true if focus is requested1379IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);1380IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);1381IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);1382IMGUI_API void PushMultiItemsWidths(int components, float width_full = 0.0f);1383IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);1384IMGUI_API void PopItemFlag();13851386// Popups, Modals, Tooltips1387IMGUI_API void OpenPopupEx(ImGuiID id);1388IMGUI_API void ClosePopupToLevel(int remaining, bool apply_focus_to_window_under);1389IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window);1390IMGUI_API bool IsPopupOpen(ImGuiID id); // Test for id within current popup stack level (currently begin-ed into); this doesn't scan the whole popup stack!1391IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);1392IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);1393IMGUI_API ImGuiWindow* GetFrontMostPopupModal();1394IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);1395IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default);13961397// Navigation1398IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);1399IMGUI_API bool NavMoveRequestButNoResultYet();1400IMGUI_API void NavMoveRequestCancel();1401IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags);1402IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);1403IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);1404IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f);1405IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate);1406IMGUI_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.1407IMGUI_API void SetNavID(ImGuiID id, int nav_layer);1408IMGUI_API void SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel);14091410// Inputs1411inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { const int key_index = GImGui->IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }1412inline bool IsNavInputDown(ImGuiNavInput n) { return GImGui->IO.NavInputs[n] > 0.0f; }1413inline bool IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; }1414inline bool IsNavInputPressedAnyOfTwo(ImGuiNavInput n1, ImGuiNavInput n2, ImGuiInputReadMode mode) { return (GetNavInputAmount(n1, mode) + GetNavInputAmount(n2, mode)) > 0.0f; }14151416// Drag and Drop1417IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);1418IMGUI_API void ClearDragDrop();1419IMGUI_API bool IsDragDropPayloadBeingAccepted();14201421// New Columns API (FIXME-WIP)1422IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().1423IMGUI_API void EndColumns(); // close columns1424IMGUI_API void PushColumnClipRect(int column_index = -1);14251426// Tab Bars1427IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);1428IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);1429IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);1430IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);1431IMGUI_API void TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir);1432IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags);1433IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button);1434IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);1435IMGUI_API bool TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id);14361437// Render helpers1438// 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.1439// NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)1440IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);1441IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);1442IMGUI_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);1443IMGUI_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);1444IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);1445IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);1446IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0);1447IMGUI_API void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale = 1.0f);1448IMGUI_API void RenderBullet(ImVec2 pos);1449IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz);1450IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight1451IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.1452IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);14531454// Render helpers (those functions don't access any ImGui state!)1455IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor = ImGuiMouseCursor_Arrow);1456IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);1457IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);1458IMGUI_API void RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col);14591460// Widgets1461IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0);1462IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius);1463IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);1464IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags);1465IMGUI_API void Scrollbar(ImGuiLayoutType direction);1466IMGUI_API ImGuiID GetScrollbarID(ImGuiLayoutType direction);1467IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.14681469// Widgets low-level behaviors1470IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);1471IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags);1472IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);1473IMGUI_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);1474IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);1475IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging1476IMGUI_API void TreePushRawID(ImGuiID id);14771478// Template functions are instantiated in imgui_widgets.cpp for a finite number of types.1479// 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).1480// e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "1481template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, const T v_min, const T v_max, const char* format, float power, ImGuiDragFlags flags);1482template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, const T v_min, const T v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);1483template<typename T, typename FLOAT_T> IMGUI_API float SliderCalcRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, float power, float linear_zero_pos);1484template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);14851486// InputText1487IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);1488IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format);14891490// Color1491IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);1492IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);1493IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);14941495// Plot1496IMGUI_API void 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);14971498// Shade functions (write over already created vertices)1499IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);1500IMGUI_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);15011502} // namespace ImGui15031504// ImFontAtlas internals1505IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas);1506IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);1507IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);1508IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);1509IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);1510IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);1511IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);15121513// Test engine hooks (imgui-test)1514//#define IMGUI_ENABLE_TEST_ENGINE1515#ifdef IMGUI_ENABLE_TEST_ENGINE1516extern void ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx);1517extern void ImGuiTestEngineHook_PostNewFrame(ImGuiContext* ctx);1518extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);1519extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);1520#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register status flags1521#else1522#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) do { } while (0)1523#endif15241525#ifdef __clang__1526#pragma clang diagnostic pop1527#endif15281529#ifdef _MSC_VER1530#pragma warning (pop)1531#endif153215331534