1 // dear imgui, v1.49 WIP
2 // (headers)
3 
4 // See imgui.cpp file for documentation.
5 // See ImGui::ShowTestWindow() in imgui_demo.cpp for demo code.
6 // Read 'Programmer guide' in imgui.cpp for notes on how to setup ImGui in your codebase.
7 // Get latest version at https://github.com/ocornut/imgui
8 
9 #pragma once
10 
11 #if !defined(IMGUI_DISABLE_INCLUDE_IMCONFIG_H) || defined(IMGUI_INCLUDE_IMCONFIG_H)
12 #include "imconfig.h"       // User-editable configuration file
13 #endif
14 #include <float.h>          // FLT_MAX
15 #include <stdarg.h>         // va_list
16 #include <stddef.h>         // ptrdiff_t, NULL
17 #include <string.h>         // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
18 
19 #define IMGUI_VERSION       "1.49 WIP"
20 
21 // Define attributes of all API symbols declarations, e.g. for DLL under Windows.
22 #ifndef IMGUI_API
23 #define IMGUI_API
24 #endif
25 
26 // Define assertion handler.
27 #ifndef IM_ASSERT
28 #include <assert.h>
29 #define IM_ASSERT(_EXPR)    assert(_EXPR)
30 #endif
31 
32 // Some compilers support applying printf-style warnings to user functions.
33 #if defined(__clang__) || defined(__GNUC__)
34 #define IM_PRINTFARGS(FMT) __attribute__((format(printf, FMT, (FMT+1))))
35 #else
36 #define IM_PRINTFARGS(FMT)
37 #endif
38 
39 // Forward declarations
40 struct ImDrawChannel;               // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit()
41 struct ImDrawCmd;                   // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)
42 struct ImDrawData;                  // All draw command lists required to render the frame
43 struct ImDrawList;                  // A single draw command list (generally one per window)
44 struct ImDrawVert;                  // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
45 struct ImFont;                      // Runtime data for a single font within a parent ImFontAtlas
46 struct ImFontAtlas;                 // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF font loader
47 struct ImFontConfig;                // Configuration data when adding a font or merging fonts
48 struct ImColor;                     // Helper functions to create a color that can be converted to either u32 or float4
49 struct ImGuiIO;                     // Main configuration and I/O between your application and ImGui
50 struct ImGuiOnceUponAFrame;         // Simple helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro
51 struct ImGuiStorage;                // Simple custom key value storage
52 struct ImGuiStyle;                  // Runtime data for styling/colors
53 struct ImGuiTextFilter;             // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
54 struct ImGuiTextBuffer;             // Text buffer for logging/accumulating text
55 struct ImGuiTextEditCallbackData;   // Shared state of ImGui::InputText() when using custom callbacks (advanced)
56 struct ImGuiListClipper;            // Helper to manually clip large list of items
57 
58 // Enumerations (declared as int for compatibility and to not pollute the top of this file)
59 typedef unsigned int ImU32;
60 typedef unsigned short ImWchar;     // character for keyboard input/display
61 typedef void* ImTextureID;          // user data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)
62 typedef ImU32 ImGuiID;              // unique ID used by widgets (typically hashed from a stack of string)
63 typedef int ImGuiCol;               // a color identifier for styling       // enum ImGuiCol_
64 typedef int ImGuiStyleVar;          // a variable identifier for styling    // enum ImGuiStyleVar_
65 typedef int ImGuiKey;               // a key identifier (ImGui-side enum)   // enum ImGuiKey_
66 typedef int ImGuiAlign;             // alignment                            // enum ImGuiAlign_
67 typedef int ImGuiColorEditMode;     // color edit mode for ColorEdit*()     // enum ImGuiColorEditMode_
68 typedef int ImGuiMouseCursor;       // a mouse cursor identifier            // enum ImGuiMouseCursor_
69 typedef int ImGuiWindowFlags;       // window flags for Begin*()            // enum ImGuiWindowFlags_
70 typedef int ImGuiSetCond;           // condition flags for Set*()           // enum ImGuiSetCond_
71 typedef int ImGuiInputTextFlags;    // flags for InputText*()               // enum ImGuiInputTextFlags_
72 typedef int ImGuiSelectableFlags;   // flags for Selectable()               // enum ImGuiSelectableFlags_
73 typedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);
74 
75 // Others helpers at bottom of the file:
76 // class ImVector<>                 // Lightweight std::vector like class.
77 // IMGUI_ONCE_UPON_A_FRAME          // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times)
78 
79 struct ImVec2
80 {
81     float x, y;
ImVec2ImVec282     ImVec2() { x = y = 0.0f; }
ImVec2ImVec283     ImVec2(float _x, float _y) { x = _x; y = _y; }
84 #ifdef IM_VEC2_CLASS_EXTRA          // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec2.
85     IM_VEC2_CLASS_EXTRA
86 #endif
87 };
88 
89 struct ImVec4
90 {
91     float x, y, z, w;
ImVec4ImVec492     ImVec4() { x = y = z = w = 0.0f; }
ImVec4ImVec493     ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
94 #ifdef IM_VEC4_CLASS_EXTRA          // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec4.
95     IM_VEC4_CLASS_EXTRA
96 #endif
97 };
98 
99 // ImGui end-user API
100 // In a namespace so that user can add extra functions in a separate file (e.g. Value() helpers for your vector or common types)
101 namespace ImGui
102 {
103     // Main
104     IMGUI_API ImGuiIO&      GetIO();
105     IMGUI_API ImGuiStyle&   GetStyle();
106     IMGUI_API ImDrawData*   GetDrawData();                              // same value as passed to your io.RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()
107     IMGUI_API void          NewFrame();                                 // start a new ImGui frame, you can submit any command from this point until NewFrame()/Render().
108     IMGUI_API void          Render();                                   // ends the ImGui frame, finalize rendering data, then call your io.RenderDrawListsFn() function if set.
109     IMGUI_API void          Shutdown();
110     IMGUI_API void          ShowUserGuide();                            // help block
111     IMGUI_API void          ShowStyleEditor(ImGuiStyle* ref = NULL);    // style editor block
112     IMGUI_API void          ShowTestWindow(bool* opened = NULL);        // test window demonstrating ImGui features
113     IMGUI_API void          ShowMetricsWindow(bool* opened = NULL);     // metrics window for debugging ImGui
114 
115     // Window
116     IMGUI_API bool          Begin(const char* name, bool* p_opened = NULL, ImGuiWindowFlags flags = 0);                                                   // push window to the stack and start appending to it. see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_opened' creates a widget on the upper-right to close the window (which sets your bool to false).
117     IMGUI_API bool          Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_use, float bg_alpha = -1.0f, ImGuiWindowFlags flags = 0); // OBSOLETE. this is the older/longer API. the extra parameters aren't very relevant. call SetNextWindowSize() instead if you want to set a window size. For regular windows, 'size_on_first_use' only applies to the first time EVER the window is created and probably not what you want! might obsolete this API eventually.
118     IMGUI_API void          End();                                                                                                                        // finish appending to current window, pop it off the window stack.
119     IMGUI_API bool          BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0);      // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).
120     IMGUI_API bool          BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0);              // "
121     IMGUI_API void          EndChild();
122     IMGUI_API ImVec2        GetContentRegionMax();                                              // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
123     IMGUI_API ImVec2        GetContentRegionAvail();                                            // == GetContentRegionMax() - GetCursorPos()
124     IMGUI_API float         GetContentRegionAvailWidth();                                       //
125     IMGUI_API ImVec2        GetWindowContentRegionMin();                                        // content boundaries min (roughly (0,0)-Scroll), in window coordinates
126     IMGUI_API ImVec2        GetWindowContentRegionMax();                                        // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
127     IMGUI_API float         GetWindowContentRegionWidth();                                      //
128     IMGUI_API ImDrawList*   GetWindowDrawList();                                                // get rendering command-list if you want to append your own draw primitives
129     IMGUI_API ImVec2        GetWindowPos();                                                     // get current window position in screen space (useful if you want to do your own drawing via the DrawList api)
130     IMGUI_API ImVec2        GetWindowSize();                                                    // get current window size
131     IMGUI_API float         GetWindowWidth();
132     IMGUI_API float         GetWindowHeight();
133     IMGUI_API bool          IsWindowCollapsed();
134     IMGUI_API void          SetWindowFontScale(float scale);                                    // per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows
135 
136     IMGUI_API void          SetNextWindowPos(const ImVec2& pos, ImGuiSetCond cond = 0);         // set next window position. call before Begin()
137     IMGUI_API void          SetNextWindowPosCenter(ImGuiSetCond cond = 0);                      // set next window position to be centered on screen. call before Begin()
138     IMGUI_API void          SetNextWindowSize(const ImVec2& size, ImGuiSetCond cond = 0);       // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()
139     IMGUI_API void          SetNextWindowContentSize(const ImVec2& size);                       // set next window content size (enforce the range of scrollbars). set axis to 0.0f to leave it automatic. call before Begin()
140     IMGUI_API void          SetNextWindowContentWidth(float width);                             // set next window content width (enforce the range of horizontal scrollbar). call before Begin()
141     IMGUI_API void          SetNextWindowCollapsed(bool collapsed, ImGuiSetCond cond = 0);      // set next window collapsed state. call before Begin()
142     IMGUI_API void          SetNextWindowFocus();                                               // set next window to be focused / front-most. call before Begin()
143     IMGUI_API void          SetWindowPos(const ImVec2& pos, ImGuiSetCond cond = 0);             // set current window position - call within Begin()/End(). may incur tearing
144     IMGUI_API void          SetWindowSize(const ImVec2& size, ImGuiSetCond cond = 0);           // set current window size. set to ImVec2(0,0) to force an auto-fit. may incur tearing
145     IMGUI_API void          SetWindowCollapsed(bool collapsed, ImGuiSetCond cond = 0);          // set current window collapsed state
146     IMGUI_API void          SetWindowFocus();                                                   // set current window to be focused / front-most
147     IMGUI_API void          SetWindowPos(const char* name, const ImVec2& pos, ImGuiSetCond cond = 0);      // set named window position.
148     IMGUI_API void          SetWindowSize(const char* name, const ImVec2& size, ImGuiSetCond cond = 0);    // set named window size. set axis to 0.0f to force an auto-fit on this axis.
149     IMGUI_API void          SetWindowCollapsed(const char* name, bool collapsed, ImGuiSetCond cond = 0);   // set named window collapsed state
150     IMGUI_API void          SetWindowFocus(const char* name);                                              // set named window to be focused / front-most. use NULL to remove focus.
151 
152     IMGUI_API float         GetScrollX();                                                       // get scrolling amount [0..GetScrollMaxX()]
153     IMGUI_API float         GetScrollY();                                                       // get scrolling amount [0..GetScrollMaxY()]
154     IMGUI_API float         GetScrollMaxX();                                                    // get maximum scrolling amount ~~ ContentSize.X - WindowSize.X
155     IMGUI_API float         GetScrollMaxY();                                                    // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y
156     IMGUI_API void          SetScrollX(float scroll_x);                                         // set scrolling amount [0..GetScrollMaxX()]
157     IMGUI_API void          SetScrollY(float scroll_y);                                         // set scrolling amount [0..GetScrollMaxY()]
158     IMGUI_API void          SetScrollHere(float center_y_ratio = 0.5f);                         // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom.
159     IMGUI_API void          SetScrollFromPosY(float pos_y, float center_y_ratio = 0.5f);        // adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions.
160     IMGUI_API void          SetKeyboardFocusHere(int offset = 0);                               // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget
161     IMGUI_API void          SetStateStorage(ImGuiStorage* tree);                                // replace tree state storage with our own (if you want to manipulate it yourself, typically clear subsection of it)
162     IMGUI_API ImGuiStorage* GetStateStorage();
163 
164     // Parameters stacks (shared)
165     IMGUI_API void          PushFont(ImFont* font);                                             // use NULL as a shortcut to push default font
166     IMGUI_API void          PopFont();
167     IMGUI_API void          PushStyleColor(ImGuiCol idx, const ImVec4& col);
168     IMGUI_API void          PopStyleColor(int count = 1);
169     IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, float val);
170     IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
171     IMGUI_API void          PopStyleVar(int count = 1);
172     IMGUI_API ImFont*       GetFont();                                                          // get current font
173     IMGUI_API float         GetFontSize();                                                      // get current font size (= height in pixels) of current font with current scale applied
174     IMGUI_API ImVec2        GetFontTexUvWhitePixel();                                           // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API
175     IMGUI_API ImU32         GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f);                  // retrieve given style color with style alpha applied and optional extra alpha multiplier
176     IMGUI_API ImU32         GetColorU32(const ImVec4& col);                                     // retrieve given color with style alpha applied
177 
178     // Parameters stacks (current window)
179     IMGUI_API void          PushItemWidth(float item_width);                                    // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
180     IMGUI_API void          PopItemWidth();
181     IMGUI_API float         CalcItemWidth();                                                    // width of item given pushed settings and current cursor position
182     IMGUI_API void          PushTextWrapPos(float wrap_pos_x = 0.0f);                           // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
183     IMGUI_API void          PopTextWrapPos();
184     IMGUI_API void          PushAllowKeyboardFocus(bool v);                                     // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets
185     IMGUI_API void          PopAllowKeyboardFocus();
186     IMGUI_API void          PushButtonRepeat(bool repeat);                                      // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (uses io.KeyRepeatDelay/io.KeyRepeatRate for now). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame.
187     IMGUI_API void          PopButtonRepeat();
188 
189     // Cursor / Layout
190     IMGUI_API void          BeginGroup();                                                       // lock horizontal starting position. once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc.
191     IMGUI_API void          EndGroup();
192     IMGUI_API void          Separator();                                                        // horizontal line
193     IMGUI_API void          SameLine(float pos_x = 0.0f, float spacing_w = -1.0f);              // call between widgets or groups to layout them horizontally
194     IMGUI_API void          Spacing();                                                          // add spacing
195     IMGUI_API void          Dummy(const ImVec2& size);                                          // add a dummy item of given size
196     IMGUI_API void          Indent();                                                           // move content position toward the right by style.IndentSpacing pixels
197     IMGUI_API void          Unindent();                                                         // move content position back to the left (cancel Indent)
198     IMGUI_API ImVec2        GetCursorPos();                                                     // cursor position is relative to window position
199     IMGUI_API float         GetCursorPosX();                                                    // "
200     IMGUI_API float         GetCursorPosY();                                                    // "
201     IMGUI_API void          SetCursorPos(const ImVec2& local_pos);                              // "
202     IMGUI_API void          SetCursorPosX(float x);                                             // "
203     IMGUI_API void          SetCursorPosY(float y);                                             // "
204     IMGUI_API ImVec2        GetCursorStartPos();                                                // initial cursor position
205     IMGUI_API ImVec2        GetCursorScreenPos();                                               // cursor position in absolute screen coordinates [0..io.DisplaySize]
206     IMGUI_API void          SetCursorScreenPos(const ImVec2& pos);                              // cursor position in absolute screen coordinates [0..io.DisplaySize]
207     IMGUI_API void          AlignFirstTextHeightToWidgets();                                    // call once if the first item on the line is a Text() item and you want to vertically lower it to match subsequent (bigger) widgets
208     IMGUI_API float         GetTextLineHeight();                                                // height of font == GetWindowFontSize()
209     IMGUI_API float         GetTextLineHeightWithSpacing();                                     // distance (in pixels) between 2 consecutive lines of text == GetWindowFontSize() + GetStyle().ItemSpacing.y
210     IMGUI_API float         GetItemsLineHeightWithSpacing();                                    // distance (in pixels) between 2 consecutive lines of standard height widgets == GetWindowFontSize() + GetStyle().FramePadding.y*2 + GetStyle().ItemSpacing.y
211 
212     // Columns
213     // You can also use SameLine(pos_x) for simplified columning. The columns API is still work-in-progress.
214     IMGUI_API void          Columns(int count = 1, const char* id = NULL, bool border = true);  // setup number of columns. use an identifier to distinguish multiple column sets. close with Columns(1).
215     IMGUI_API void          NextColumn();                                                       // next column
216     IMGUI_API int           GetColumnIndex();                                                   // get current column index
217     IMGUI_API float         GetColumnOffset(int column_index = -1);                             // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetcolumnsCount() inclusive. column 0 is usually 0.0f and not resizable unless you call this
218     IMGUI_API void          SetColumnOffset(int column_index, float offset_x);                  // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
219     IMGUI_API float         GetColumnWidth(int column_index = -1);                              // column width (== GetColumnOffset(GetColumnIndex()+1) - GetColumnOffset(GetColumnOffset())
220     IMGUI_API int           GetColumnsCount();                                                  // number of columns (what was passed to Columns())
221 
222     // ID scopes
223     // If you are creating widgets in a loop you most likely want to push a unique identifier so ImGui can differentiate them.
224     // You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details.
225     IMGUI_API void          PushID(const char* str_id);                                         // push identifier into the ID stack. IDs are hash of the *entire* stack!
226     IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end);
227     IMGUI_API void          PushID(const void* ptr_id);
228     IMGUI_API void          PushID(int int_id);
229     IMGUI_API void          PopID();
230     IMGUI_API ImGuiID       GetID(const char* str_id);                                          // calculate unique ID (hash of whole ID stack + given parameter). useful if you want to query into ImGuiStorage yourself. otherwise rarely needed
231     IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end);
232     IMGUI_API ImGuiID       GetID(const void* ptr_id);
233 
234     // Widgets
235     IMGUI_API void          Text(const char* fmt, ...) IM_PRINTFARGS(1);
236     IMGUI_API void          TextV(const char* fmt, va_list args);
237     IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...) IM_PRINTFARGS(2);  // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
238     IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args);
239     IMGUI_API void          TextDisabled(const char* fmt, ...) IM_PRINTFARGS(1);                    // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor();
240     IMGUI_API void          TextDisabledV(const char* fmt, va_list args);
241     IMGUI_API void          TextWrapped(const char* fmt, ...) IM_PRINTFARGS(1);                     // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize().
242     IMGUI_API void          TextWrappedV(const char* fmt, va_list args);
243     IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL);         // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, recommended for long chunks of text
244     IMGUI_API void          LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2);    // display text+label aligned the same way as value+label widgets
245     IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args);
246     IMGUI_API void          Bullet();                                                               // draw a small circle and keep the cursor on the same line. advance you by the same distance as an empty TreeNode() call.
247     IMGUI_API void          BulletText(const char* fmt, ...) IM_PRINTFARGS(1);
248     IMGUI_API void          BulletTextV(const char* fmt, va_list args);
249     IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0,0));
250     IMGUI_API bool          SmallButton(const char* label);
251     IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size);
252     IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));
253     IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding
254     IMGUI_API bool          CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false);
255     IMGUI_API bool          Checkbox(const char* label, bool* v);
256     IMGUI_API bool          CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value);
257     IMGUI_API bool          RadioButton(const char* label, bool active);
258     IMGUI_API bool          RadioButton(const char* label, int* v, int v_button);
259     IMGUI_API bool          Combo(const char* label, int* current_item, const char** items, int items_count, int height_in_items = -1);
260     IMGUI_API bool          Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items = -1);      // separate items with \0, end item-list with \0\0
261     IMGUI_API bool          Combo(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
262     IMGUI_API bool          ColorButton(const ImVec4& col, bool small_height = false, bool outline_border = true);
263     IMGUI_API bool          ColorEdit3(const char* label, float col[3]);
264     IMGUI_API bool          ColorEdit4(const char* label, float col[4], bool show_alpha = true);
265     IMGUI_API void          ColorEditMode(ImGuiColorEditMode mode);                                 // FIXME-OBSOLETE: This is inconsistent with most of the API and should be obsoleted.
266     IMGUI_API void          PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
267     IMGUI_API void          PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
268     IMGUI_API void          PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
269     IMGUI_API void          PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
270     IMGUI_API void          ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);
271 
272     // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)
273     IMGUI_API bool          DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);     // If v_min >= v_max we have no bound
274     IMGUI_API bool          DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
275     IMGUI_API bool          DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
276     IMGUI_API bool          DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
277     IMGUI_API bool          DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", const char* display_format_max = NULL, float power = 1.0f);
278     IMGUI_API bool          DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");                                       // If v_min >= v_max we have no bound
279     IMGUI_API bool          DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
280     IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
281     IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
282     IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f", const char* display_format_max = NULL);
283 
284     // Widgets: Input with Keyboard
285     IMGUI_API bool          InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
286     IMGUI_API bool          InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
287     IMGUI_API bool          InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
288     IMGUI_API bool          InputFloat2(const char* label, float v[2], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
289     IMGUI_API bool          InputFloat3(const char* label, float v[3], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
290     IMGUI_API bool          InputFloat4(const char* label, float v[4], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
291     IMGUI_API bool          InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags extra_flags = 0);
292     IMGUI_API bool          InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags = 0);
293     IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
294     IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
295 
296     // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)
297     IMGUI_API bool          SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);     // adjust display_format to decorate the value with a prefix or a suffix. Use power!=1.0 for logarithmic sliders
298     IMGUI_API bool          SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
299     IMGUI_API bool          SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
300     IMGUI_API bool          SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
301     IMGUI_API bool          SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f);
302     IMGUI_API bool          SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format = "%.0f");
303     IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* display_format = "%.0f");
304     IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* display_format = "%.0f");
305     IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* display_format = "%.0f");
306     IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
307     IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format = "%.0f");
308 
309     // Widgets: Trees
310     IMGUI_API bool          TreeNode(const char* str_label_id);                                     // if returning 'true' the node is open and the user is responsible for calling TreePop().
311     IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_PRINTFARGS(2);    // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
312     IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_PRINTFARGS(2);    // "
313     IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args);           // "
314     IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args);           // "
315     IMGUI_API void          TreePush(const char* str_id = NULL);                                    // already called by TreeNode(), but you can call Push/Pop yourself for layouting purpose
316     IMGUI_API void          TreePush(const void* ptr_id = NULL);                                    // "
317     IMGUI_API void          TreePop();
318     IMGUI_API void          SetNextTreeNodeOpened(bool opened, ImGuiSetCond cond = 0);              // set next tree node/collapsing header to be opened.
319 
320     // Widgets: Selectable / Lists
321     IMGUI_API bool          Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0));  // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
322     IMGUI_API bool          Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0));
323     IMGUI_API bool          ListBox(const char* label, int* current_item, const char** items, int items_count, int height_in_items = -1);
324     IMGUI_API bool          ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
325     IMGUI_API bool          ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0,0)); // use if you want to reimplement ListBox() will custom data or interactions. make sure to call ListBoxFooter() afterwards.
326     IMGUI_API bool          ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // "
327     IMGUI_API void          ListBoxFooter();                                                    // terminate the scrolling region
328 
329     // Widgets: Value() Helpers. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
330     IMGUI_API void          Value(const char* prefix, bool b);
331     IMGUI_API void          Value(const char* prefix, int v);
332     IMGUI_API void          Value(const char* prefix, unsigned int v);
333     IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL);
334     IMGUI_API void          ValueColor(const char* prefix, const ImVec4& v);
335     IMGUI_API void          ValueColor(const char* prefix, unsigned int v);
336 
337     // Tooltips
338     IMGUI_API void          SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1);                  // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). last call wins
339     IMGUI_API void          SetTooltipV(const char* fmt, va_list args);
340     IMGUI_API void          BeginTooltip();                                                     // use to create full-featured tooltip windows that aren't just text
341     IMGUI_API void          EndTooltip();
342 
343     // Menus
344     IMGUI_API bool          BeginMainMenuBar();                                                 // create and append to a full screen menu-bar. only call EndMainMenuBar() if this returns true!
345     IMGUI_API void          EndMainMenuBar();
346     IMGUI_API bool          BeginMenuBar();                                                     // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set). only call EndMenuBar() if this returns true!
347     IMGUI_API void          EndMenuBar();
348     IMGUI_API bool          BeginMenu(const char* label, bool enabled = true);                  // create a sub-menu entry. only call EndMenu() if this returns true!
349     IMGUI_API void          EndMenu();
350     IMGUI_API bool          MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true);  // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
351     IMGUI_API bool          MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true);              // return true when activated + toggle (*p_selected) if p_selected != NULL
352 
353     // Popups
354     IMGUI_API void          OpenPopup(const char* str_id);                                      // mark popup as open. popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
355     IMGUI_API bool          BeginPopup(const char* str_id);                                     // return true if popup if opened and start outputting to it. only call EndPopup() if BeginPopup() returned true!
356     IMGUI_API bool          BeginPopupModal(const char* name, bool* p_opened = NULL, ImGuiWindowFlags extra_flags = 0);             // modal dialog (can't close them by clicking outside)
357     IMGUI_API bool          BeginPopupContextItem(const char* str_id, int mouse_button = 1);                                        // helper to open and begin popup when clicked on last item. read comments in .cpp!
358     IMGUI_API bool          BeginPopupContextWindow(bool also_over_items = true, const char* str_id = NULL, int mouse_button = 1);  // helper to open and begin popup when clicked on current window.
359     IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked in void (no window).
360     IMGUI_API void          EndPopup();
361     IMGUI_API void          CloseCurrentPopup();                                                // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
362 
363     // Logging: all text output from interface is redirected to tty/file/clipboard. Tree nodes are automatically opened.
364     IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty
365     IMGUI_API void          LogToFile(int max_depth = -1, const char* filename = NULL);         // start logging to file
366     IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard
367     IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)
368     IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard
369     IMGUI_API void          LogText(const char* fmt, ...) IM_PRINTFARGS(1);                     // pass text data straight to log (without being displayed)
370 
371     // Utilities
372     IMGUI_API bool          IsItemHovered();                                                    // was the last item hovered by mouse?
373     IMGUI_API bool          IsItemHoveredRect();                                                // was the last item hovered by mouse? even if another item is active or window is blocked by popup while we are hovering this
374     IMGUI_API bool          IsItemActive();                                                     // was the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false)
375     IMGUI_API bool          IsItemVisible();                                                    // was the last item visible? (aka not out of sight due to clipping/scrolling.)
376     IMGUI_API bool          IsAnyItemHovered();
377     IMGUI_API bool          IsAnyItemActive();
378     IMGUI_API ImVec2        GetItemRectMin();                                                   // get bounding rect of last item in screen space
379     IMGUI_API ImVec2        GetItemRectMax();                                                   // "
380     IMGUI_API ImVec2        GetItemRectSize();                                                  // "
381     IMGUI_API void          SetItemAllowOverlap();                                              // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
382     IMGUI_API bool          IsWindowHovered();                                                  // is current window hovered and hoverable (not blocked by a popup) (differentiate child windows from each others)
383     IMGUI_API bool          IsWindowFocused();                                                  // is current window focused
384     IMGUI_API bool          IsRootWindowFocused();                                              // is current root window focused (top parent window in case of child windows)
385     IMGUI_API bool          IsRootWindowOrAnyChildFocused();                                    // is current root window or any of its child (including current window) focused
386     IMGUI_API bool          IsRectVisible(const ImVec2& size);                                  // test if rectangle of given size starting from cursor pos is visible (not clipped). to perform coarse clipping on user's side (as an optimization)
387     IMGUI_API bool          IsPosHoveringAnyWindow(const ImVec2& pos);                          // is given position hovering any active imgui window
388     IMGUI_API float         GetTime();
389     IMGUI_API int           GetFrameCount();
390     IMGUI_API const char*   GetStyleColName(ImGuiCol idx);
391     IMGUI_API ImVec2        CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = +0.0f);   // utility to find the closest point the last item bounding rectangle edge. useful to visually link items
392     IMGUI_API ImVec2        CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);
393     IMGUI_API void          CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end);    // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can.
394 
395     IMGUI_API bool          BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags = 0);	// helper to create a child window / scrolling region that looks like a normal widget frame
396     IMGUI_API void          EndChildFrame();
397 
398     IMGUI_API ImVec4        ColorConvertU32ToFloat4(ImU32 in);
399     IMGUI_API ImU32         ColorConvertFloat4ToU32(const ImVec4& in);
400     IMGUI_API void          ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);
401     IMGUI_API void          ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);
402 
403     // Inputs
404     IMGUI_API int           GetKeyIndex(ImGuiKey key);                                          // map ImGuiKey_* values into user's key index. == io.KeyMap[key]
405     IMGUI_API bool          IsKeyDown(int key_index);                                           // key_index into the keys_down[] array, imgui doesn't know the semantic of each entry, uses your own indices!
406     IMGUI_API bool          IsKeyPressed(int key_index, bool repeat = true);                    // uses user's key indices as stored in the keys_down[] array. if repeat=true. uses io.KeyRepeatDelay / KeyRepeatRate
407     IMGUI_API bool          IsKeyReleased(int key_index);                                       // "
408     IMGUI_API bool          IsMouseDown(int button);                                            // is mouse button held
409     IMGUI_API bool          IsMouseClicked(int button, bool repeat = false);                    // did mouse button clicked (went from !Down to Down)
410     IMGUI_API bool          IsMouseDoubleClicked(int button);                                   // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.
411     IMGUI_API bool          IsMouseReleased(int button);                                        // did mouse button released (went from Down to !Down)
412     IMGUI_API bool          IsMouseHoveringWindow();                                            // is mouse hovering current window ("window" in API names always refer to current window). disregarding of any consideration of being blocked by a popup. (unlike IsWindowHovered() this will return true even if the window is blocked because of a popup)
413     IMGUI_API bool          IsMouseHoveringAnyWindow();                                         // is mouse hovering any visible window
414     IMGUI_API bool          IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);  // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup.
415     IMGUI_API bool          IsMouseDragging(int button = 0, float lock_threshold = -1.0f);      // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
416     IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
417     IMGUI_API ImVec2        GetMousePosOnOpeningCurrentPopup();                                 // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into
418     IMGUI_API ImVec2        GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f);    // dragging amount since clicking. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
419     IMGUI_API void          ResetMouseDragDelta(int button = 0);                                //
420     IMGUI_API ImGuiMouseCursor GetMouseCursor();                                                // get desired cursor type, reset in ImGui::NewFrame(), this updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
421     IMGUI_API void          SetMouseCursor(ImGuiMouseCursor type);                              // set desired cursor type
422     IMGUI_API void          CaptureKeyboardFromApp(bool capture = true);                        // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application handle). e.g. force capture keyboard when your widget is being hovered.
423     IMGUI_API void          CaptureMouseFromApp(bool capture = true);                           // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application handle).
424 
425     // Helpers functions to access functions pointers in ImGui::GetIO()
426     IMGUI_API void*         MemAlloc(size_t sz);
427     IMGUI_API void          MemFree(void* ptr);
428     IMGUI_API const char*   GetClipboardText();
429     IMGUI_API void          SetClipboardText(const char* text);
430 
431     // Internal state/context access - if you want to use multiple ImGui context, or share context between modules (e.g. DLL), or allocate the memory yourself
432     IMGUI_API const char*   GetVersion();
433     IMGUI_API void*         GetInternalState();
434     IMGUI_API size_t        GetInternalStateSize();
435     IMGUI_API void          SetInternalState(void* state, bool construct = false);
436 
437     // Obsolete (will be removed)
438 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
GetWindowFont()439     static inline ImFont*   GetWindowFont() { return GetFont(); }                              // OBSOLETE 1.48+
GetWindowFontSize()440     static inline float     GetWindowFontSize() { return GetFontSize(); }                      // OBSOLETE 1.48+
OpenNextNode(bool open)441     static inline void      OpenNextNode(bool open) { ImGui::SetNextTreeNodeOpened(open, 0); } // OBSOLETE 1.34+
GetWindowIsFocused()442     static inline bool      GetWindowIsFocused() { return ImGui::IsWindowFocused(); }          // OBSOLETE 1.36+
GetWindowCollapsed()443     static inline bool      GetWindowCollapsed() { return ImGui::IsWindowCollapsed(); }        // OBSOLETE 1.39+
GetItemBoxMin()444     static inline ImVec2    GetItemBoxMin() { return GetItemRectMin(); }                       // OBSOLETE 1.36+
GetItemBoxMax()445     static inline ImVec2    GetItemBoxMax() { return GetItemRectMax(); }                       // OBSOLETE 1.36+
IsClipped(const ImVec2 & size)446     static inline bool      IsClipped(const ImVec2& size) { return !IsRectVisible(size); }     // OBSOLETE 1.38+
IsRectClipped(const ImVec2 & size)447     static inline bool      IsRectClipped(const ImVec2& size) { return !IsRectVisible(size); } // OBSOLETE 1.39+
IsMouseHoveringBox(const ImVec2 & rect_min,const ImVec2 & rect_max)448     static inline bool      IsMouseHoveringBox(const ImVec2& rect_min, const ImVec2& rect_max) { return IsMouseHoveringRect(rect_min, rect_max); }  // OBSOLETE 1.36+
SetScrollPosHere()449     static inline void      SetScrollPosHere() { SetScrollHere(); }                            // OBSOLETE 1.42+
450 #endif
451 
452 } // namespace ImGui
453 
454 // Flags for ImGui::Begin()
455 enum ImGuiWindowFlags_
456 {
457     // Default: 0
458     ImGuiWindowFlags_NoTitleBar             = 1 << 0,   // Disable title-bar
459     ImGuiWindowFlags_NoResize               = 1 << 1,   // Disable user resizing with the lower-right grip
460     ImGuiWindowFlags_NoMove                 = 1 << 2,   // Disable user moving the window
461     ImGuiWindowFlags_NoScrollbar            = 1 << 3,   // Disable scrollbars (window can still scroll with mouse or programatically)
462     ImGuiWindowFlags_NoScrollWithMouse      = 1 << 4,   // Disable user vertically scrolling with mouse wheel
463     ImGuiWindowFlags_NoCollapse             = 1 << 5,   // Disable user collapsing window by double-clicking on it
464     ImGuiWindowFlags_AlwaysAutoResize       = 1 << 6,   // Resize every window to its content every frame
465     ImGuiWindowFlags_ShowBorders            = 1 << 7,   // Show borders around windows and items
466     ImGuiWindowFlags_NoSavedSettings        = 1 << 8,   // Never load/save settings in .ini file
467     ImGuiWindowFlags_NoInputs               = 1 << 9,   // Disable catching mouse or keyboard inputs
468     ImGuiWindowFlags_MenuBar                = 1 << 10,  // Has a menu-bar
469     ImGuiWindowFlags_HorizontalScrollbar    = 1 << 11,  // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
470     ImGuiWindowFlags_NoFocusOnAppearing     = 1 << 12,  // Disable taking focus when transitioning from hidden to visible state
471     ImGuiWindowFlags_NoBringToFrontOnFocus  = 1 << 13,  // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)
472     ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14,  // Always show vertical scrollbar (even if ContentSize.y < Size.y)
473     ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15,  // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
474     ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16,  // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
475     // [Internal]
476     ImGuiWindowFlags_ChildWindow            = 1 << 20,  // Don't use! For internal use by BeginChild()
477     ImGuiWindowFlags_ChildWindowAutoFitX    = 1 << 21,  // Don't use! For internal use by BeginChild()
478     ImGuiWindowFlags_ChildWindowAutoFitY    = 1 << 22,  // Don't use! For internal use by BeginChild()
479     ImGuiWindowFlags_ComboBox               = 1 << 23,  // Don't use! For internal use by ComboBox()
480     ImGuiWindowFlags_Tooltip                = 1 << 24,  // Don't use! For internal use by BeginTooltip()
481     ImGuiWindowFlags_Popup                  = 1 << 25,  // Don't use! For internal use by BeginPopup()
482     ImGuiWindowFlags_Modal                  = 1 << 26,  // Don't use! For internal use by BeginPopupModal()
483     ImGuiWindowFlags_ChildMenu              = 1 << 27   // Don't use! For internal use by BeginMenu()
484 };
485 
486 // Flags for ImGui::InputText()
487 enum ImGuiInputTextFlags_
488 {
489     // Default: 0
490     ImGuiInputTextFlags_CharsDecimal        = 1 << 0,   // Allow 0123456789.+-*/
491     ImGuiInputTextFlags_CharsHexadecimal    = 1 << 1,   // Allow 0123456789ABCDEFabcdef
492     ImGuiInputTextFlags_CharsUppercase      = 1 << 2,   // Turn a..z into A..Z
493     ImGuiInputTextFlags_CharsNoBlank        = 1 << 3,   // Filter out spaces, tabs
494     ImGuiInputTextFlags_AutoSelectAll       = 1 << 4,   // Select entire text when first taking mouse focus
495     ImGuiInputTextFlags_EnterReturnsTrue    = 1 << 5,   // Return 'true' when Enter is pressed (as opposed to when the value was modified)
496     ImGuiInputTextFlags_CallbackCompletion  = 1 << 6,   // Call user function on pressing TAB (for completion handling)
497     ImGuiInputTextFlags_CallbackHistory     = 1 << 7,   // Call user function on pressing Up/Down arrows (for history handling)
498     ImGuiInputTextFlags_CallbackAlways      = 1 << 8,   // Call user function every time. User code may query cursor position, modify text buffer.
499     ImGuiInputTextFlags_CallbackCharFilter  = 1 << 9,   // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character.
500     ImGuiInputTextFlags_AllowTabInput       = 1 << 10,  // Pressing TAB input a '\t' character into the text field
501     ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11,  // In multi-line mode, allow exiting edition by pressing Enter. Ctrl+Enter to add new line (by default adds new lines with Enter).
502     ImGuiInputTextFlags_NoHorizontalScroll  = 1 << 12,  // Disable following the cursor horizontally
503     ImGuiInputTextFlags_AlwaysInsertMode    = 1 << 13,  // Insert mode
504     ImGuiInputTextFlags_ReadOnly            = 1 << 14,  // Read-only mode
505     ImGuiInputTextFlags_Password            = 1 << 15,  // Password mode, display all characters as '*'
506     // [Internal]
507     ImGuiInputTextFlags_Multiline           = 1 << 20   // For internal use by InputTextMultiline()
508 };
509 
510 // Flags for ImGui::Selectable()
511 enum ImGuiSelectableFlags_
512 {
513     // Default: 0
514     ImGuiSelectableFlags_DontClosePopups    = 1 << 0,   // Clicking this don't close parent popup window
515     ImGuiSelectableFlags_SpanAllColumns     = 1 << 1,   // Selectable frame can span all columns (text will still fit in current column)
516     ImGuiSelectableFlags_AllowDoubleClick   = 1 << 2    // Generate press events on double clicks too
517 };
518 
519 // User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array
520 enum ImGuiKey_
521 {
522     ImGuiKey_Tab,       // for tabbing through fields
523     ImGuiKey_LeftArrow, // for text edit
524     ImGuiKey_RightArrow,// for text edit
525     ImGuiKey_UpArrow,   // for text edit
526     ImGuiKey_DownArrow, // for text edit
527     ImGuiKey_PageUp,
528     ImGuiKey_PageDown,
529     ImGuiKey_Home,      // for text edit
530     ImGuiKey_End,       // for text edit
531     ImGuiKey_Delete,    // for text edit
532     ImGuiKey_Backspace, // for text edit
533     ImGuiKey_Enter,     // for text edit
534     ImGuiKey_Escape,    // for text edit
535     ImGuiKey_A,         // for text edit CTRL+A: select all
536     ImGuiKey_C,         // for text edit CTRL+C: copy
537     ImGuiKey_V,         // for text edit CTRL+V: paste
538     ImGuiKey_X,         // for text edit CTRL+X: cut
539     ImGuiKey_Y,         // for text edit CTRL+Y: redo
540     ImGuiKey_Z,         // for text edit CTRL+Z: undo
541     ImGuiKey_COUNT
542 };
543 
544 // Enumeration for PushStyleColor() / PopStyleColor()
545 enum ImGuiCol_
546 {
547     ImGuiCol_Text,
548     ImGuiCol_TextDisabled,
549     ImGuiCol_WindowBg,              // Background of normal windows
550     ImGuiCol_ChildWindowBg,         // Background of child windows
551     ImGuiCol_PopupBg,               // Background of popups, menus, tooltips windows
552     ImGuiCol_Border,
553     ImGuiCol_BorderShadow,
554     ImGuiCol_FrameBg,               // Background of checkbox, radio button, plot, slider, text input
555     ImGuiCol_FrameBgHovered,
556     ImGuiCol_FrameBgActive,
557     ImGuiCol_TitleBg,
558     ImGuiCol_TitleBgCollapsed,
559     ImGuiCol_TitleBgActive,
560     ImGuiCol_MenuBarBg,
561     ImGuiCol_ScrollbarBg,
562     ImGuiCol_ScrollbarGrab,
563     ImGuiCol_ScrollbarGrabHovered,
564     ImGuiCol_ScrollbarGrabActive,
565     ImGuiCol_ComboBg,
566     ImGuiCol_CheckMark,
567     ImGuiCol_SliderGrab,
568     ImGuiCol_SliderGrabActive,
569     ImGuiCol_Button,
570     ImGuiCol_ButtonHovered,
571     ImGuiCol_ButtonActive,
572     ImGuiCol_Header,
573     ImGuiCol_HeaderHovered,
574     ImGuiCol_HeaderActive,
575     ImGuiCol_Column,
576     ImGuiCol_ColumnHovered,
577     ImGuiCol_ColumnActive,
578     ImGuiCol_ResizeGrip,
579     ImGuiCol_ResizeGripHovered,
580     ImGuiCol_ResizeGripActive,
581     ImGuiCol_CloseButton,
582     ImGuiCol_CloseButtonHovered,
583     ImGuiCol_CloseButtonActive,
584     ImGuiCol_PlotLines,
585     ImGuiCol_PlotLinesHovered,
586     ImGuiCol_PlotHistogram,
587     ImGuiCol_PlotHistogramHovered,
588     ImGuiCol_TextSelectedBg,
589     ImGuiCol_ModalWindowDarkening,  // darken entire screen when a modal window is active
590     ImGuiCol_COUNT
591 };
592 
593 // Enumeration for PushStyleVar() / PopStyleVar()
594 // NB: the enum only refers to fields of ImGuiStyle() which makes sense to be pushed/poped in UI code. Feel free to add others.
595 enum ImGuiStyleVar_
596 {
597     ImGuiStyleVar_Alpha,               // float
598     ImGuiStyleVar_WindowPadding,       // ImVec2
599     ImGuiStyleVar_WindowRounding,      // float
600     ImGuiStyleVar_WindowMinSize,       // ImVec2
601     ImGuiStyleVar_ChildWindowRounding, // float
602     ImGuiStyleVar_FramePadding,        // ImVec2
603     ImGuiStyleVar_FrameRounding,       // float
604     ImGuiStyleVar_ItemSpacing,         // ImVec2
605     ImGuiStyleVar_ItemInnerSpacing,    // ImVec2
606     ImGuiStyleVar_IndentSpacing,       // float
607     ImGuiStyleVar_GrabMinSize          // float
608 };
609 
610 enum ImGuiAlign_
611 {
612     ImGuiAlign_Left     = 1 << 0,
613     ImGuiAlign_Center   = 1 << 1,
614     ImGuiAlign_Right    = 1 << 2,
615     ImGuiAlign_Top      = 1 << 3,
616     ImGuiAlign_VCenter  = 1 << 4,
617     ImGuiAlign_Default  = ImGuiAlign_Left | ImGuiAlign_Top
618 };
619 
620 // Enumeration for ColorEditMode()
621 enum ImGuiColorEditMode_
622 {
623     ImGuiColorEditMode_UserSelect = -2,
624     ImGuiColorEditMode_UserSelectShowButton = -1,
625     ImGuiColorEditMode_RGB = 0,
626     ImGuiColorEditMode_HSV = 1,
627     ImGuiColorEditMode_HEX = 2
628 };
629 
630 // Enumeration for GetMouseCursor()
631 enum ImGuiMouseCursor_
632 {
633     ImGuiMouseCursor_Arrow = 0,
634     ImGuiMouseCursor_TextInput,         // When hovering over InputText, etc.
635     ImGuiMouseCursor_Move,              // Unused
636     ImGuiMouseCursor_ResizeNS,          // Unused
637     ImGuiMouseCursor_ResizeEW,          // When hovering over a column
638     ImGuiMouseCursor_ResizeNESW,        // Unused
639     ImGuiMouseCursor_ResizeNWSE,        // When hovering over the bottom-right corner of a window
640     ImGuiMouseCursor_Count_
641 };
642 
643 // Condition flags for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions
644 // All those functions treat 0 as a shortcut to ImGuiSetCond_Always
645 enum ImGuiSetCond_
646 {
647     ImGuiSetCond_Always        = 1 << 0, // Set the variable
648     ImGuiSetCond_Once          = 1 << 1, // Only set the variable on the first call per runtime session
649     ImGuiSetCond_FirstUseEver  = 1 << 2, // Only set the variable if the window doesn't exist in the .ini file
650     ImGuiSetCond_Appearing     = 1 << 3  // Only set the variable if the window is appearing after being inactive (or the first time)
651 };
652 
653 struct ImGuiStyle
654 {
655     float       Alpha;                      // Global alpha applies to everything in ImGui
656     ImVec2      WindowPadding;              // Padding within a window
657     ImVec2      WindowMinSize;              // Minimum window size
658     float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows
659     ImGuiAlign  WindowTitleAlign;           // Alignment for title bar text
660     float       ChildWindowRounding;        // Radius of child window corners rounding. Set to 0.0f to have rectangular windows
661     ImVec2      FramePadding;               // Padding within a framed rectangle (used by most widgets)
662     float       FrameRounding;              // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets).
663     ImVec2      ItemSpacing;                // Horizontal and vertical spacing between widgets/lines
664     ImVec2      ItemInnerSpacing;           // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
665     ImVec2      TouchExtraPadding;          // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
666     float       IndentSpacing;              // Horizontal indentation when e.g. entering a tree node
667     float       ColumnsMinSpacing;          // Minimum horizontal spacing between two columns
668     float       ScrollbarSize;              // Width of the vertical scrollbar, Height of the horizontal scrollbar
669     float       ScrollbarRounding;          // Radius of grab corners for scrollbar
670     float       GrabMinSize;                // Minimum width/height of a grab box for slider/scrollbar
671     float       GrabRounding;               // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
672     ImVec2      DisplayWindowPadding;       // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.
673     ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
674     bool        AntiAliasedLines;           // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU.
675     bool        AntiAliasedShapes;          // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)
676     float       CurveTessellationTol;       // Tessellation tolerance. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
677     ImVec4      Colors[ImGuiCol_COUNT];
678 
679     IMGUI_API ImGuiStyle();
680 };
681 
682 // This is where your app communicate with ImGui. Access via ImGui::GetIO().
683 // Read 'Programmer guide' section in .cpp file for general usage.
684 struct ImGuiIO
685 {
686     //------------------------------------------------------------------
687     // Settings (fill once)                 // Default value:
688     //------------------------------------------------------------------
689 
690     ImVec2        DisplaySize;              // <unset>              // Display size, in pixels. For clamping windows positions.
691     float         DeltaTime;                // = 1.0f/60.0f         // Time elapsed since last frame, in seconds.
692     float         IniSavingRate;            // = 5.0f               // Maximum time between saving positions/sizes to .ini file, in seconds.
693     const char*   IniFilename;              // = "imgui.ini"        // Path to .ini file. NULL to disable .ini saving.
694     const char*   LogFilename;              // = "imgui_log.txt"    // Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
695     float         MouseDoubleClickTime;     // = 0.30f              // Time for a double-click, in seconds.
696     float         MouseDoubleClickMaxDist;  // = 6.0f               // Distance threshold to stay in to validate a double-click, in pixels.
697     float         MouseDragThreshold;       // = 6.0f               // Distance threshold before considering we are dragging
698     int           KeyMap[ImGuiKey_COUNT];   // <unset>              // Map of indices into the KeysDown[512] entries array
699     float         KeyRepeatDelay;           // = 0.250f             // When holding a key/button, time before it starts repeating, in seconds. (for actions where 'repeat' is active)
700     float         KeyRepeatRate;            // = 0.020f             // When holding a key/button, rate at which it repeats, in seconds.
701     void*         UserData;                 // = NULL               // Store your own data for retrieval by callbacks.
702 
703     ImFontAtlas*  Fonts;                    // <auto>               // Load and assemble one or more fonts into a single tightly packed texture. Output to Fonts array.
704     float         FontGlobalScale;          // = 1.0f               // Global scale all fonts
705     bool          FontAllowUserScaling;     // = false              // Allow user scaling text of individual window with CTRL+Wheel.
706     ImVec2        DisplayFramebufferScale;  // = (1.0f,1.0f)        // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.
707     ImVec2        DisplayVisibleMin;        // <unset> (0.0f,0.0f)  // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.
708     ImVec2        DisplayVisibleMax;        // <unset> (0.0f,0.0f)  // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize
709 
710 	// Advanced/subtle behaviors
711     bool          WordMovementUsesAltKey;   // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl
712     bool          ShortcutsUseSuperKey;     // = defined(__APPLE__) // OS X style: Shortcuts using Cmd/Super instead of Ctrl
713     bool          DoubleClickSelectsWord;   // = defined(__APPLE__) // OS X style: Double click selects by word instead of selecting whole text
714     bool          MultiSelectUsesSuperKey;  // = defined(__APPLE__) // OS X style: Multi-selection in lists uses Cmd/Super instead of Ctrl [unused yet]
715 
716     //------------------------------------------------------------------
717     // User Functions
718     //------------------------------------------------------------------
719 
720     // Rendering function, will be called in Render().
721     // Alternatively you can keep this to NULL and call GetDrawData() after Render() to get the same pointer.
722     // See example applications if you are unsure of how to implement this.
723     void        (*RenderDrawListsFn)(ImDrawData* data);
724 
725     // Optional: access OS clipboard
726     // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
727     const char* (*GetClipboardTextFn)();
728     void        (*SetClipboardTextFn)(const char* text);
729 
730     // Optional: override memory allocations. MemFreeFn() may be called with a NULL pointer.
731     // (default to posix malloc/free)
732     void*       (*MemAllocFn)(size_t sz);
733     void        (*MemFreeFn)(void* ptr);
734 
735     // Optional: notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME in Windows)
736     // (default to use native imm32 api on Windows)
737     void        (*ImeSetInputScreenPosFn)(int x, int y);
738     void*       ImeWindowHandle;            // (Windows) Set this to your HWND to get automatic IME cursor positioning.
739 
740     //------------------------------------------------------------------
741     // Input - Fill before calling NewFrame()
742     //------------------------------------------------------------------
743 
744     ImVec2      MousePos;                   // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
745     bool        MouseDown[5];               // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
746     float       MouseWheel;                 // Mouse wheel: 1 unit scrolls about 5 lines text.
747     bool        MouseDrawCursor;            // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor).
748     bool        KeyCtrl;                    // Keyboard modifier pressed: Control
749     bool        KeyShift;                   // Keyboard modifier pressed: Shift
750     bool        KeyAlt;                     // Keyboard modifier pressed: Alt
751     bool        KeySuper;                   // Keyboard modifier pressed: Cmd/Super/Windows
752     bool        KeysDown[512];              // Keyboard keys that are pressed (in whatever storage order you naturally have access to keyboard data)
753     ImWchar     InputCharacters[16+1];      // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
754 
755     // Functions
756     IMGUI_API void AddInputCharacter(ImWchar c);                        // Helper to add a new character into InputCharacters[]
757     IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars);      // Helper to add new characters into InputCharacters[] from an UTF-8 string
ClearInputCharactersImGuiIO758     IMGUI_API void ClearInputCharacters() { InputCharacters[0] = 0; }   // Helper to clear the text input buffer
759 
760     //------------------------------------------------------------------
761     // Output - Retrieve after calling NewFrame(), you can use them to discard inputs or hide them from the rest of your application
762     //------------------------------------------------------------------
763 
764     bool        WantCaptureMouse;           // Mouse is hovering a window or widget is active (= ImGui will use your mouse input)
765     bool        WantCaptureKeyboard;        // Widget is active (= ImGui will use your keyboard input)
766     bool        WantTextInput;              // Some text input widget is active, which will read input characters from the InputCharacters array.
767     float       Framerate;                  // Framerate estimation, in frame per second. Rolling average estimation based on IO.DeltaTime over 120 frames
768     int         MetricsAllocs;              // Number of active memory allocations
769     int         MetricsRenderVertices;      // Vertices output during last call to Render()
770     int         MetricsRenderIndices;       // Indices output during last call to Render() = number of triangles * 3
771     int         MetricsActiveWindows;       // Number of visible windows (exclude child windows)
772 
773     //------------------------------------------------------------------
774     // [Internal] ImGui will maintain those fields for you
775     //------------------------------------------------------------------
776 
777     ImVec2      MousePosPrev;               // Previous mouse position
778     ImVec2      MouseDelta;                 // Mouse delta. Note that this is zero if either current or previous position are negative to allow mouse enabling/disabling.
779     bool        MouseClicked[5];            // Mouse button went from !Down to Down
780     ImVec2      MouseClickedPos[5];         // Position at time of clicking
781     float       MouseClickedTime[5];        // Time of last click (used to figure out double-click)
782     bool        MouseDoubleClicked[5];      // Has mouse button been double-clicked?
783     bool        MouseReleased[5];           // Mouse button went from Down to !Down
784     bool        MouseDownOwned[5];          // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds.
785     float       MouseDownDuration[5];       // Duration the mouse button has been down (0.0f == just clicked)
786     float       MouseDownDurationPrev[5];   // Previous time the mouse button has been down
787     float       MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the click point
788     float       KeysDownDuration[512];      // Duration the keyboard key has been down (0.0f == just pressed)
789     float       KeysDownDurationPrev[512];  // Previous duration the key has been down
790 
791     IMGUI_API   ImGuiIO();
792 };
793 
794 //-----------------------------------------------------------------------------
795 // Helpers
796 //-----------------------------------------------------------------------------
797 
798 // Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
799 // Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code!
800 template<typename T>
801 class ImVector
802 {
803 public:
804     int                         Size;
805     int                         Capacity;
806     T*                          Data;
807 
808     typedef T                   value_type;
809     typedef value_type*         iterator;
810     typedef const value_type*   const_iterator;
811 
ImVector()812     ImVector()                  { Size = Capacity = 0; Data = NULL; }
~ImVector()813     ~ImVector()                 { if (Data) ImGui::MemFree(Data); }
814 
empty()815     inline bool                 empty() const                   { return Size == 0; }
size()816     inline int                  size() const                    { return Size; }
capacity()817     inline int                  capacity() const                { return Capacity; }
818 
819     inline value_type&          operator[](int i)               { IM_ASSERT(i < Size); return Data[i]; }
820     inline const value_type&    operator[](int i) const         { IM_ASSERT(i < Size); return Data[i]; }
821 
clear()822     inline void                 clear()                         { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } }
begin()823     inline iterator             begin()                         { return Data; }
begin()824     inline const_iterator       begin() const                   { return Data; }
end()825     inline iterator             end()                           { return Data + Size; }
end()826     inline const_iterator       end() const                     { return Data + Size; }
front()827     inline value_type&          front()                         { IM_ASSERT(Size > 0); return Data[0]; }
front()828     inline const value_type&    front() const                   { IM_ASSERT(Size > 0); return Data[0]; }
back()829     inline value_type&          back()                          { IM_ASSERT(Size > 0); return Data[Size-1]; }
back()830     inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return Data[Size-1]; }
swap(ImVector<T> & rhs)831     inline void                 swap(ImVector<T>& rhs)          { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }
832 
_grow_capacity(int new_size)833     inline int                  _grow_capacity(int new_size)    { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > new_size ? new_capacity : new_size; }
834 
resize(int new_size)835     inline void                 resize(int new_size)            { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
reserve(int new_capacity)836     inline void                 reserve(int new_capacity)
837     {
838         if (new_capacity <= Capacity) return;
839         T* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
840         memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
841         ImGui::MemFree(Data);
842         Data = new_data;
843         Capacity = new_capacity;
844     }
845 
push_back(const value_type & v)846     inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }
pop_back()847     inline void                 pop_back()                      { IM_ASSERT(Size > 0); Size--; }
848 
erase(const_iterator it)849     inline iterator             erase(const_iterator it)        { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
insert(const_iterator it,const value_type & v)850     inline iterator             insert(const_iterator it, const value_type& v)  { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }
851 };
852 
853 // Helper: execute a block of code at maximum once a frame
854 // Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
855 // Usage:
856 //   IMGUI_ONCE_UPON_A_FRAME
857 //   {
858 //      // code block will be executed one per frame
859 //   }
860 // Attention! the macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces.
861 #define IMGUI_ONCE_UPON_A_FRAME    static ImGuiOnceUponAFrame imgui_oaf##__LINE__; if (imgui_oaf##__LINE__)
862 struct ImGuiOnceUponAFrame
863 {
ImGuiOnceUponAFrameImGuiOnceUponAFrame864     ImGuiOnceUponAFrame() { RefFrame = -1; }
865     mutable int RefFrame;
866     operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; }
867 };
868 
869 // Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
870 struct ImGuiTextFilter
871 {
872     struct TextRange
873     {
874         const char* b;
875         const char* e;
876 
TextRangeImGuiTextFilter::TextRange877         TextRange() { b = e = NULL; }
TextRangeImGuiTextFilter::TextRange878         TextRange(const char* _b, const char* _e) { b = _b; e = _e; }
beginImGuiTextFilter::TextRange879         const char* begin() const { return b; }
endImGuiTextFilter::TextRange880         const char* end() const { return e; }
emptyImGuiTextFilter::TextRange881         bool empty() const { return b == e; }
frontImGuiTextFilter::TextRange882         char front() const { return *b; }
is_blankImGuiTextFilter::TextRange883         static bool is_blank(char c) { return c == ' ' || c == '\t'; }
trim_blanksImGuiTextFilter::TextRange884         void trim_blanks() { while (b < e && is_blank(*b)) b++; while (e > b && is_blank(*(e-1))) e--; }
885         IMGUI_API void split(char separator, ImVector<TextRange>& out);
886     };
887 
888     char                InputBuf[256];
889     ImVector<TextRange> Filters;
890     int                 CountGrep;
891 
892     ImGuiTextFilter(const char* default_filter = "");
~ImGuiTextFilterImGuiTextFilter893     ~ImGuiTextFilter() {}
ClearImGuiTextFilter894     void                Clear() { InputBuf[0] = 0; Build(); }
895     bool                Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f);    // Helper calling InputText+Build
896     bool                PassFilter(const char* text, const char* text_end = NULL) const;
IsActiveImGuiTextFilter897     bool                IsActive() const { return !Filters.empty(); }
898     IMGUI_API void      Build();
899 };
900 
901 // Helper: Text buffer for logging/accumulating text
902 struct ImGuiTextBuffer
903 {
904     ImVector<char>      Buf;
905 
ImGuiTextBufferImGuiTextBuffer906     ImGuiTextBuffer()   { Buf.push_back(0); }
907     inline char         operator[](int i) { return Buf.Data[i]; }
beginImGuiTextBuffer908     const char*         begin() const { return &Buf.front(); }
endImGuiTextBuffer909     const char*         end() const { return &Buf.back(); }      // Buf is zero-terminated, so end() will point on the zero-terminator
sizeImGuiTextBuffer910     int                 size() const { return Buf.Size - 1; }
emptyImGuiTextBuffer911     bool                empty() { return Buf.Size <= 1; }
clearImGuiTextBuffer912     void                clear() { Buf.clear(); Buf.push_back(0); }
c_strImGuiTextBuffer913     const char*         c_str() const { return Buf.Data; }
914     IMGUI_API void      append(const char* fmt, ...) IM_PRINTFARGS(2);
915     IMGUI_API void      appendv(const char* fmt, va_list args);
916 };
917 
918 // Helper: Key->value storage
919 // - Store collapse state for a tree (Int 0/1)
920 // - Store color edit options (Int using values in ImGuiColorEditMode enum).
921 // - Custom user storage for temporary values.
922 // Typically you don't have to worry about this since a storage is held within each Window.
923 // Declare your own storage if:
924 // - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state).
925 // - You want to store custom debug data easily without adding or editing structures in your code.
926 struct ImGuiStorage
927 {
928     struct Pair
929     {
930         ImGuiID key;
931         union { int val_i; float val_f; void* val_p; };
PairImGuiStorage::Pair932         Pair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; }
PairImGuiStorage::Pair933         Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
PairImGuiStorage::Pair934         Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
935     };
936     ImVector<Pair>      Data;
937 
938     // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
939     // - Set***() functions find pair, insertion on demand if missing.
940     // - Sorted insertion is costly but should amortize. A typical frame shouldn't need to insert any new pair.
941     IMGUI_API void      Clear();
942     IMGUI_API int       GetInt(ImGuiID key, int default_val = 0) const;
943     IMGUI_API void      SetInt(ImGuiID key, int val);
944     IMGUI_API float     GetFloat(ImGuiID key, float default_val = 0.0f) const;
945     IMGUI_API void      SetFloat(ImGuiID key, float val);
946     IMGUI_API void*     GetVoidPtr(ImGuiID key) const; // default_val is NULL
947     IMGUI_API void      SetVoidPtr(ImGuiID key, void* val);
948 
949     // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
950     // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
951     // - A typical use case where this is convenient:
952     //      float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
953     // - You can also use this to quickly create temporary editable values during a session of using Edit&Continue, without restarting your application.
954     IMGUI_API int*      GetIntRef(ImGuiID key, int default_val = 0);
955     IMGUI_API float*    GetFloatRef(ImGuiID key, float default_val = 0);
956     IMGUI_API void**    GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
957 
958     // Use on your own storage if you know only integer are being stored (open/close all tree nodes)
959     IMGUI_API void      SetAllInt(int val);
960 };
961 
962 // Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used and the corresponding callback is triggered.
963 struct ImGuiTextEditCallbackData
964 {
965     ImGuiInputTextFlags EventFlag;      // One of ImGuiInputTextFlags_Callback* // Read-only
966     ImGuiInputTextFlags Flags;          // What user passed to InputText()      // Read-only
967     void*               UserData;       // What user passed to InputText()      // Read-only
968     bool                ReadOnly;       // Read-only mode                       // Read-only
969 
970     // CharFilter event:
971     ImWchar             EventChar;      // Character input                      // Read-write (replace character or set to zero)
972 
973     // Completion,History,Always events:
974     // If you modify the buffer contents make sure you update 'BufTextLen' and set 'BufDirty' to true.
975     ImGuiKey            EventKey;       // Key pressed (Up/Down/TAB)            // Read-only
976     char*               Buf;            // Current text buffer                  // Read-write (pointed data only, can't replace the actual pointer)
977     int                 BufTextLen;     // Current text length in bytes         // Read-write
978     int                 BufSize;        // Maximum text length in bytes         // Read-only
979     bool                BufDirty;       // Set if you modify Buf/BufTextLen!!   // Write
980     int                 CursorPos;      //                                      // Read-write
981     int                 SelectionStart; //                                      // Read-write (== to SelectionEnd when no selection)
982     int                 SelectionEnd;   //                                      // Read-write
983 
984     // NB: Helper functions for text manipulation. Calling those function loses selection.
985     void    DeleteChars(int pos, int bytes_count);
986     void    InsertChars(int pos, const char* text, const char* text_end = NULL);
HasSelectionImGuiTextEditCallbackData987     bool    HasSelection() const { return SelectionStart != SelectionEnd; }
988 };
989 
990 // ImColor() helper to implicity converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
991 // Avoid storing ImColor! Store either u32 of ImVec4. This is not a full-featured color class.
992 // None of the ImGui API are using ImColor directly but you can use it as a convenience to pass colors in either ImU32 or ImVec4 formats.
993 struct ImColor
994 {
995     ImVec4              Value;
996 
ImColorImColor997     ImColor()                                                       { Value.x = Value.y = Value.z = Value.w = 0.0f; }
998     ImColor(int r, int g, int b, int a = 255)                       { float sc = 1.0f/255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }
ImColorImColor999     ImColor(ImU32 rgba)                                             { float sc = 1.0f/255.0f; Value.x = (float)(rgba&0xFF) * sc; Value.y = (float)((rgba>>8)&0xFF) * sc; Value.z = (float)((rgba>>16)&0xFF) * sc; Value.w = (float)(rgba >> 24) * sc; }
1000     ImColor(float r, float g, float b, float a = 1.0f)              { Value.x = r; Value.y = g; Value.z = b; Value.w = a; }
ImColorImColor1001     ImColor(const ImVec4& col)                                      { Value = col; }
ImU32ImColor1002     inline operator ImU32() const                                   { return ImGui::ColorConvertFloat4ToU32(Value); }
ImVec4ImColor1003     inline operator ImVec4() const                                  { return Value; }
1004 
1005     inline void    SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; }
1006 
1007     static ImColor HSV(float h, float s, float v, float a = 1.0f)   { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); }
1008 };
1009 
1010 // Helper: Manually clip large list of items.
1011 // If you are displaying thousands of even spaced items and you have a random access to the list, you can perform clipping yourself to save on CPU.
1012 // Usage:
1013 //    ImGuiListClipper clipper(count, ImGui::GetTextLineHeightWithSpacing());
1014 //    for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) // display only visible items
1015 //        ImGui::Text("line number %d", i);
1016 //    clipper.End();
1017 // NB: 'count' is only used to clamp the result, if you don't know your count you can use INT_MAX
1018 struct ImGuiListClipper
1019 {
1020     float   ItemsHeight;
1021     int     ItemsCount, DisplayStart, DisplayEnd;
1022 
ImGuiListClipperImGuiListClipper1023     ImGuiListClipper()                         { ItemsHeight = 0.0f; ItemsCount = DisplayStart = DisplayEnd = -1; }
ImGuiListClipperImGuiListClipper1024     ImGuiListClipper(int count, float height)  { ItemsCount = -1; Begin(count, height); }
~ImGuiListClipperImGuiListClipper1025     ~ImGuiListClipper()                        { IM_ASSERT(ItemsCount == -1); } // user forgot to call End()
1026 
BeginImGuiListClipper1027     void Begin(int count, float height)        // items_height: generally pass GetTextLineHeightWithSpacing() or GetItemsLineHeightWithSpacing()
1028     {
1029         IM_ASSERT(ItemsCount == -1);
1030         ItemsCount = count;
1031         ItemsHeight = height;
1032         ImGui::CalcListClipping(ItemsCount, ItemsHeight, &DisplayStart, &DisplayEnd); // calculate how many to clip/display
1033         ImGui::SetCursorPosY(ImGui::GetCursorPosY() + DisplayStart * ItemsHeight);    // advance cursor
1034     }
EndImGuiListClipper1035     void End()
1036     {
1037         IM_ASSERT(ItemsCount >= 0);
1038         ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ItemsCount - DisplayEnd) * ItemsHeight); // advance cursor
1039         ItemsCount = -1;
1040     }
1041 };
1042 
1043 //-----------------------------------------------------------------------------
1044 // Draw List
1045 // Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
1046 //-----------------------------------------------------------------------------
1047 
1048 // Helpers macros to generate 32-bits encoded colors
1049 #define IM_COL32(R,G,B,A)    (((ImU32)(A)<<24) | ((ImU32)(B)<<16) | ((ImU32)(G)<<8) | ((ImU32)(R)))
1050 #define IM_COL32_WHITE       (0xFFFFFFFF)
1051 #define IM_COL32_BLACK       (0xFF000000)
1052 #define IM_COL32_BLACK_TRANS (0x00000000)    // Transparent black
1053 
1054 // Draw callbacks for advanced uses.
1055 // NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)
1056 // Draw callback may be useful for example, if you want to render a complex 3D scene inside a UI element, change your GPU render state, etc.
1057 // The expected behavior from your rendering loop is:
1058 //   if (cmd.UserCallback != NULL)
1059 //       cmd.UserCallback(parent_list, cmd);
1060 //   else
1061 //       RenderTriangles()
1062 typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
1063 
1064 // Typically, 1 command = 1 gpu draw call (unless command is a callback)
1065 struct ImDrawCmd
1066 {
1067     unsigned int    ElemCount;              // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].
1068     ImVec4          ClipRect;               // Clipping rectangle (x1, y1, x2, y2)
1069     ImTextureID     TextureId;              // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
1070     ImDrawCallback  UserCallback;           // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
1071     void*           UserCallbackData;       // The draw callback code can access this.
1072 
ImDrawCmdImDrawCmd1073     ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; }
1074 };
1075 
1076 // Vertex index (override with, e.g. '#define ImDrawIdx unsigned int' in ImConfig)
1077 #ifndef ImDrawIdx
1078 typedef unsigned short ImDrawIdx;
1079 #endif
1080 
1081 // Vertex layout
1082 #ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT
1083 struct ImDrawVert
1084 {
1085     ImVec2  pos;
1086     ImVec2  uv;
1087     ImU32   col;
1088 };
1089 #else
1090 // You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h
1091 // The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.
1092 // The type has to be described within the macro (you can either declare the struct or use a typedef)
1093 IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;
1094 #endif
1095 
1096 // Draw channels are used by the Columns API to "split" the render list into different channels while building, so items of each column can be batched together.
1097 // You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered.
1098 struct ImDrawChannel
1099 {
1100     ImVector<ImDrawCmd>     CmdBuffer;
1101     ImVector<ImDrawIdx>     IdxBuffer;
1102 };
1103 
1104 // Draw command list
1105 // This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.
1106 // At the moment, each ImGui window contains its own ImDrawList but they could potentially be merged in the future.
1107 // If you want to add custom rendering within a window, you can use ImGui::GetWindowDrawList() to access the current draw list and add your own primitives.
1108 // You can interleave normal ImGui:: calls and adding primitives to the current draw list.
1109 // All positions are in screen coordinates (0,0=top-left, 1 pixel per unit). Primitives are always added to the list and not culled (culling is done at render time and at a higher-level by ImGui:: functions).
1110 struct ImDrawList
1111 {
1112     // This is what you have to render
1113     ImVector<ImDrawCmd>     CmdBuffer;          // Commands. Typically 1 command = 1 gpu draw call.
1114     ImVector<ImDrawIdx>     IdxBuffer;          // Index buffer. Each command consume ImDrawCmd::ElemCount of those
1115     ImVector<ImDrawVert>    VtxBuffer;          // Vertex buffer.
1116 
1117     // [Internal, used while building lists]
1118     const char*             _OwnerName;         // Pointer to owner window's name (if any) for debugging
1119     unsigned int            _VtxCurrentIdx;     // [Internal] == VtxBuffer.Size
1120     ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
1121     ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
1122     ImVector<ImVec4>        _ClipRectStack;     // [Internal]
1123     ImVector<ImTextureID>   _TextureIdStack;    // [Internal]
1124     ImVector<ImVec2>        _Path;              // [Internal] current path building
1125     int                     _ChannelsCurrent;   // [Internal] current channel number (0)
1126     int                     _ChannelsCount;     // [Internal] number of active channels (1+)
1127     ImVector<ImDrawChannel> _Channels;          // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size)
1128 
ImDrawListImDrawList1129     ImDrawList() { _OwnerName = NULL; Clear(); }
~ImDrawListImDrawList1130     ~ImDrawList() { ClearFreeMemory(); }
1131     IMGUI_API void  PushClipRect(const ImVec4& clip_rect);  // Scissoring. Note that the values are (x1,y1,x2,y2) and NOT (x1,y1,w,h). This is passed down to your render function but not used for CPU-side clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
1132     IMGUI_API void  PushClipRectFullScreen();
1133     IMGUI_API void  PopClipRect();
1134     IMGUI_API void  PushTextureID(const ImTextureID& texture_id);
1135     IMGUI_API void  PopTextureID();
1136 
1137     // Primitives
1138     IMGUI_API void  AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
1139     IMGUI_API void  AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F, float thickness = 1.0f);   // a: upper-left, b: lower-right
1140     IMGUI_API void  AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);                     // a: upper-left, b: lower-right
1141     IMGUI_API void  AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
1142     IMGUI_API void  AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f);
1143     IMGUI_API void  AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
1144     IMGUI_API void  AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);
1145     IMGUI_API void  AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
1146     IMGUI_API void  AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
1147     IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
1148     IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), ImU32 col = 0xFFFFFFFF);
1149     IMGUI_API void  AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness, bool anti_aliased);
1150     IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col, bool anti_aliased);
1151     IMGUI_API void  AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0);
1152 
1153     // Stateful path API, add points then finish with PathFill() or PathStroke()
PathClearImDrawList1154     inline    void  PathClear()                                                 { _Path.resize(0); }
PathLineToImDrawList1155     inline    void  PathLineTo(const ImVec2& pos)                               { _Path.push_back(pos); }
PathLineToMergeDuplicateImDrawList1156     inline    void  PathLineToMergeDuplicate(const ImVec2& pos)                 { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); }
PathFillImDrawList1157     inline    void  PathFill(ImU32 col)                                         { AddConvexPolyFilled(_Path.Data, _Path.Size, col, true); PathClear(); }
1158     inline    void  PathStroke(ImU32 col, bool closed, float thickness = 1.0f)  { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness, true); PathClear(); }
1159     IMGUI_API void  PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);
1160     IMGUI_API void  PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12);                 // Use precomputed angles for a 12 steps circle
1161     IMGUI_API void  PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0);
1162     IMGUI_API void  PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners = 0x0F);
1163 
1164     // Channels
1165     // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives)
1166     // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end)
1167     IMGUI_API void  ChannelsSplit(int channels_count);
1168     IMGUI_API void  ChannelsMerge();
1169     IMGUI_API void  ChannelsSetCurrent(int channel_index);
1170 
1171     // Advanced
1172     IMGUI_API void  AddCallback(ImDrawCallback callback, void* callback_data);  // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.
1173     IMGUI_API void  AddDrawCmd();                                               // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible
1174 
1175     // Internal helpers
1176     // NB: all primitives needs to be reserved via PrimReserve() beforehand!
1177     IMGUI_API void  Clear();
1178     IMGUI_API void  ClearFreeMemory();
1179     IMGUI_API void  PrimReserve(int idx_count, int vtx_count);
1180     IMGUI_API void  PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);      // Axis aligned rectangle (composed of two triangles)
1181     IMGUI_API void  PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
1182     IMGUI_API void  PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);
PrimVtxImDrawList1183     inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)     { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); }
PrimWriteVtxImDrawList1184     inline    void  PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }
PrimWriteIdxImDrawList1185     inline    void  PrimWriteIdx(ImDrawIdx idx)                                 { *_IdxWritePtr = idx; _IdxWritePtr++; }
1186     IMGUI_API void  UpdateClipRect();
1187     IMGUI_API void  UpdateTextureID();
1188 };
1189 
1190 // All draw data to render an ImGui frame
1191 struct ImDrawData
1192 {
1193     bool            Valid;                  // Only valid after Render() is called and before the next NewFrame() is called.
1194     ImDrawList**    CmdLists;
1195     int             CmdListsCount;
1196     int             TotalVtxCount;          // For convenience, sum of all cmd_lists vtx_buffer.Size
1197     int             TotalIdxCount;          // For convenience, sum of all cmd_lists idx_buffer.Size
1198 
1199     // Functions
ImDrawDataImDrawData1200     ImDrawData() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; }
1201     IMGUI_API void DeIndexAllBuffers();               // For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
1202     IMGUI_API void ScaleClipRects(const ImVec2& sc);  // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
1203 };
1204 
1205 struct ImFontConfig
1206 {
1207     void*           FontData;                   //          // TTF data
1208     int             FontDataSize;               //          // TTF data size
1209     bool            FontDataOwnedByAtlas;       // true     // TTF data ownership taken by the container ImFontAtlas (will delete memory itself). Set to true
1210     int             FontNo;                     // 0        // Index of font within TTF file
1211     float           SizePixels;                 //          // Size in pixels for rasterizer
1212     int             OversampleH, OversampleV;   // 3, 1     // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
1213     bool            PixelSnapH;                 // false    // Align every character to pixel boundary (if enabled, set OversampleH/V to 1)
1214     ImVec2          GlyphExtraSpacing;          // 0, 0     // Extra spacing (in pixels) between glyphs
1215     const ImWchar*  GlyphRanges;                //          // List of Unicode range (2 value per range, values are inclusive, zero-terminated list)
1216     bool            MergeMode;                  // false    // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs).
1217     bool            MergeGlyphCenterV;          // false    // When merging (multiple ImFontInput for one ImFont), vertically center new glyphs instead of aligning their baseline
1218 
1219     // [Internal]
1220     char            Name[32];                               // Name (strictly for debugging)
1221     ImFont*         DstFont;
1222 
1223     IMGUI_API ImFontConfig();
1224 };
1225 
1226 // Load and rasterize multiple TTF fonts into a same texture.
1227 // Sharing a texture for multiple fonts allows us to reduce the number of draw calls during rendering.
1228 // We also add custom graphic data into the texture that serves for ImGui.
1229 //  1. (Optional) Call AddFont*** functions. If you don't call any, the default font will be loaded for you.
1230 //  2. Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
1231 //  3. Upload the pixels data into a texture within your graphics system.
1232 //  4. Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture. This value will be passed back to you during rendering to identify the texture.
1233 //  5. Call ClearTexData() to free textures memory on the heap.
1234 struct ImFontAtlas
1235 {
1236     IMGUI_API ImFontAtlas();
1237     IMGUI_API ~ImFontAtlas();
1238     IMGUI_API ImFont*           AddFont(const ImFontConfig* font_cfg);
1239     IMGUI_API ImFont*           AddFontDefault(const ImFontConfig* font_cfg = NULL);
1240     IMGUI_API ImFont*           AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);
1241     IMGUI_API ImFont*           AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);                                        // Transfer ownership of 'ttf_data' to ImFontAtlas, will be deleted after Build()
1242     IMGUI_API ImFont*           AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);  // 'compressed_ttf_data' still owned by caller. Compress with binary_to_compressed_c.cpp
1243     IMGUI_API ImFont*           AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);              // 'compressed_ttf_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 paramaeter
1244     IMGUI_API void              ClearTexData();             // Clear the CPU-side texture data. Saves RAM once the texture has been copied to graphics memory.
1245     IMGUI_API void              ClearInputData();           // Clear the input TTF data (inc sizes, glyph ranges)
1246     IMGUI_API void              ClearFonts();               // Clear the ImGui-side font data (glyphs storage, UV coordinates)
1247     IMGUI_API void              Clear();                    // Clear all
1248 
1249     // Retrieve texture data
1250     // User is in charge of copying the pixels into graphics memory, then call SetTextureUserID()
1251     // After loading the texture into your graphic system, store your texture handle in 'TexID' (ignore if you aren't using multiple fonts nor images)
1252     // RGBA32 format is provided for convenience and high compatibility, but note that all RGB pixels are white, so 75% of the memory is wasted.
1253     // Pitch = Width * BytesPerPixels
1254     IMGUI_API void              GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 1 byte per-pixel
1255     IMGUI_API void              GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 4 bytes-per-pixel
SetTexIDImFontAtlas1256     void                        SetTexID(void* id)  { TexID = id; }
1257 
1258     // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
1259     // (Those functions could be static but aren't so most users don't have to refer to the ImFontAtlas:: name ever if in their code; just using io.Fonts->)
1260     IMGUI_API const ImWchar*    GetGlyphRangesDefault();    // Basic Latin, Extended Latin
1261     IMGUI_API const ImWchar*    GetGlyphRangesKorean();     // Default + Korean characters
1262     IMGUI_API const ImWchar*    GetGlyphRangesJapanese();   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
1263     IMGUI_API const ImWchar*    GetGlyphRangesChinese();    // Japanese + full set of about 21000 CJK Unified Ideographs
1264     IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();   // Default + about 400 Cyrillic characters
1265 
1266     // Members
1267     // (Access texture data via GetTexData*() calls which will setup a default font for you.)
1268     void*                       TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It ia passed back to you during rendering.
1269     unsigned char*              TexPixelsAlpha8;    // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight
1270     unsigned int*               TexPixelsRGBA32;    // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4
1271     int                         TexWidth;           // Texture width calculated during Build().
1272     int                         TexHeight;          // Texture height calculated during Build().
1273     int                         TexDesiredWidth;    // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
1274     ImVec2                      TexUvWhitePixel;    // Texture coordinates to a white pixel
1275     ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
1276 
1277     // Private
1278     ImVector<ImFontConfig>      ConfigData;         // Internal data
1279     IMGUI_API bool              Build();            // Build pixels data. This is automatically for you by the GetTexData*** functions.
1280     IMGUI_API void              RenderCustomTexData(int pass, void* rects);
1281 };
1282 
1283 // Font runtime data and rendering
1284 // ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32().
1285 struct ImFont
1286 {
1287     // Members: Settings
1288     float                       FontSize;           // <user set>      // Height of characters, set during loading (don't change after loading)
1289     float                       Scale;              // = 1.0f          // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale()
1290     ImVec2                      DisplayOffset;      // = (0.0f,1.0f)   // Offset font rendering by xx pixels
1291     ImWchar                     FallbackChar;       // = '?'           // Replacement glyph if one isn't found. Only set via SetFallbackChar()
1292     ImFontConfig*               ConfigData;         //                 // Pointer within ImFontAtlas->ConfigData
1293     int                         ConfigDataCount;    //
1294 
1295     // Members: Runtime data
1296     struct Glyph
1297     {
1298         ImWchar                 Codepoint;
1299         float                   XAdvance;
1300         float                   X0, Y0, X1, Y1;
1301         float                   U0, V0, U1, V1;     // Texture coordinates
1302     };
1303     float                       Ascent, Descent;    // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
1304     ImFontAtlas*                ContainerAtlas;     // What we has been loaded into
1305     ImVector<Glyph>             Glyphs;
1306     const Glyph*                FallbackGlyph;      // == FindGlyph(FontFallbackChar)
1307     float                       FallbackXAdvance;   //
1308     ImVector<float>             IndexXAdvance;      // Sparse. Glyphs->XAdvance directly indexable (more cache-friendly that reading from Glyphs, for CalcTextSize functions which are often bottleneck in large UI)
1309     ImVector<int>               IndexLookup;        // Sparse. Index glyphs by Unicode code-point.
1310 
1311     // Methods
1312     IMGUI_API ImFont();
1313     IMGUI_API ~ImFont();
1314     IMGUI_API void              Clear();
1315     IMGUI_API void              BuildLookupTable();
1316     IMGUI_API const Glyph*      FindGlyph(unsigned short c) const;
1317     IMGUI_API void              SetFallbackChar(ImWchar c);
GetCharAdvanceImFont1318     float                       GetCharAdvance(unsigned short c) const  { return ((int)c < IndexXAdvance.Size) ? IndexXAdvance[(int)c] : FallbackXAdvance; }
IsLoadedImFont1319     bool                        IsLoaded() const                        { return ContainerAtlas != NULL; }
1320 
1321     // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
1322     // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
1323     IMGUI_API ImVec2            CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8
1324     IMGUI_API const char*       CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const;
1325     IMGUI_API void              RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, ImDrawList* draw_list, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
1326 };
1327 
1328 //---- Include imgui_user.h at the end of imgui.h
1329 //---- So you can include code that extends ImGui using any of the types declared above.
1330 //---- (also convenient for user to only explicitly include vanilla imgui.h)
1331 #ifdef IMGUI_INCLUDE_IMGUI_USER_H
1332 #include "imgui_user.h"
1333 #endif
1334