Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
ImDrawListSplitter Struct Reference

#include <src/imgui/imgui.h>

+ Collaboration diagram for ImDrawListSplitter:

Public Member Functions

 ImDrawListSplitter ()
 
 ~ImDrawListSplitter ()
 
void Clear ()
 
IMGUI_API void ClearFreeMemory ()
 
IMGUI_API void Split (ImDrawList *draw_list, int count)
 
IMGUI_API void Merge (ImDrawList *draw_list)
 
IMGUI_API void SetCurrentChannel (ImDrawList *draw_list, int channel_idx)
 

Public Attributes

int _Current
 
int _Count
 
ImVector< ImDrawChannel_Channels
 

Detailed Description

Constructor & Destructor Documentation

◆ ImDrawListSplitter()

ImDrawListSplitter::ImDrawListSplitter ( )
inline
2298{ memset(this, 0, sizeof(*this)); }

◆ ~ImDrawListSplitter()

ImDrawListSplitter::~ImDrawListSplitter ( )
inline
2299{ ClearFreeMemory(); }
IMGUI_API void ClearFreeMemory()
Definition imgui_draw.cpp:1663

Member Function Documentation

◆ Clear()

void ImDrawListSplitter::Clear ( )
inline
2300{ _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame
int _Current
Definition imgui.h:2294
int _Count
Definition imgui.h:2295

Referenced by ImDrawList::_ResetForNewFrame(), and ImGui::BeginTableEx().

+ Here is the caller graph for this function:

◆ ClearFreeMemory()

void ImDrawListSplitter::ClearFreeMemory ( )
1664{
1665 for (int i = 0; i < _Channels.Size; i++)
1666 {
1667 if (i == _Current)
1668 memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again
1669 _Channels[i]._CmdBuffer.clear();
1670 _Channels[i]._IdxBuffer.clear();
1671 }
1672 _Current = 0;
1673 _Count = 1;
1674 _Channels.clear();
1675}
ImVector< ImDrawChannel > _Channels
Definition imgui.h:2296
int Size
Definition imgui.h:1655
void clear()
Definition imgui.h:1678

References _Channels, _Count, _Current, ImVector< T >::clear(), and ImVector< T >::Size.

Referenced by ImDrawList::_ClearFreeMemory(), and ImGui::TableGcCompactTransientBuffers().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Merge()

void ImDrawListSplitter::Merge ( ImDrawList draw_list)
1708{
1709 // Note that we never use or rely on _Channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use.
1710 if (_Count <= 1)
1711 return;
1712
1713 SetCurrentChannel(draw_list, 0);
1714 draw_list->_PopUnusedDrawCmd();
1715
1716 // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command.
1717 int new_cmd_buffer_count = 0;
1718 int new_idx_buffer_count = 0;
1719 ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL;
1720 int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0;
1721 for (int i = 1; i < _Count; i++)
1722 {
1723 ImDrawChannel& ch = _Channels[i];
1724
1725 // Equivalent of PopUnusedDrawCmd() for this channel's cmdbuffer and except we don't need to test for UserCallback.
1726 if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0)
1727 ch._CmdBuffer.pop_back();
1728
1729 if (ch._CmdBuffer.Size > 0 && last_cmd != NULL)
1730 {
1731 ImDrawCmd* next_cmd = &ch._CmdBuffer[0];
1732 if (ImDrawCmd_HeaderCompare(last_cmd, next_cmd) == 0 && last_cmd->UserCallback == NULL && next_cmd->UserCallback == NULL)
1733 {
1734 // Merge previous channel last draw command with current channel first draw command if matching.
1735 last_cmd->ElemCount += next_cmd->ElemCount;
1736 idx_offset += next_cmd->ElemCount;
1737 ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges.
1738 }
1739 }
1740 if (ch._CmdBuffer.Size > 0)
1741 last_cmd = &ch._CmdBuffer.back();
1742 new_cmd_buffer_count += ch._CmdBuffer.Size;
1743 new_idx_buffer_count += ch._IdxBuffer.Size;
1744 for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++)
1745 {
1746 ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset;
1747 idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount;
1748 }
1749 }
1750 draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count);
1751 draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count);
1752
1753 // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices)
1754 ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count;
1755 ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count;
1756 for (int i = 1; i < _Count; i++)
1757 {
1758 ImDrawChannel& ch = _Channels[i];
1759 if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }
1760 if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; }
1761 }
1762 draw_list->_IdxWritePtr = idx_write;
1763
1764 // Ensure there's always a non-callback draw command trailing the command-buffer
1765 if (draw_list->CmdBuffer.Size == 0 || draw_list->CmdBuffer.back().UserCallback != NULL)
1766 draw_list->AddDrawCmd();
1767
1768 // If current command is used with different settings we need to add a new command
1769 ImDrawCmd* curr_cmd = &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1];
1770 if (curr_cmd->ElemCount == 0)
1771 ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset
1772 else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0)
1773 draw_list->AddDrawCmd();
1774
1775 _Count = 1;
1776}
ImVector< ImDrawCmd > _CmdBuffer
Definition imgui.h:2285
ImVector< ImDrawIdx > _IdxBuffer
Definition imgui.h:2286
unsigned short ImDrawIdx
Definition imgui.h:2255
Definition imgui.h:2284
#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC)
Definition imgui_draw.cpp:494
#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS)
Definition imgui_draw.cpp:493
Definition imgui.h:2236
unsigned int ElemCount
Definition imgui.h:2241
ImDrawCallback UserCallback
Definition imgui.h:2242
unsigned int IdxOffset
Definition imgui.h:2240
IMGUI_API void _PopUnusedDrawCmd()
Definition imgui_draw.cpp:467
ImVector< ImDrawCmd > CmdBuffer
Definition imgui.h:2350
ImDrawIdx * _IdxWritePtr
Definition imgui.h:2360
IMGUI_API void AddDrawCmd()
Definition imgui_draw.cpp:453
ImDrawCmdHeader _CmdHeader
Definition imgui.h:2364
ImVector< ImDrawIdx > IdxBuffer
Definition imgui.h:2351
IMGUI_API void SetCurrentChannel(ImDrawList *draw_list, int channel_idx)
Definition imgui_draw.cpp:1778
T & back()
Definition imgui.h:1685
T * erase(const T *it)
Definition imgui.h:1699
void pop_back()
Definition imgui.h:1697
T * Data
Definition imgui.h:1657
void resize(int new_size)
Definition imgui.h:1690
static int cmd_write(PROGRAMMER *pgm, struct avrpart *p, int argc, char *argv[])
Definition term.c:330

References _Channels, ImDrawChannel::_CmdBuffer, ImDrawList::_CmdHeader, _Count, ImDrawChannel::_IdxBuffer, ImDrawList::_IdxWritePtr, ImDrawList::_PopUnusedDrawCmd(), ImDrawList::AddDrawCmd(), ImVector< T >::back(), cmd_write(), ImDrawList::CmdBuffer, ImVector< T >::Data, ImDrawCmd::ElemCount, ImVector< T >::erase(), ImDrawList::IdxBuffer, ImDrawCmd::IdxOffset, ImDrawCmd_HeaderCompare, ImDrawCmd_HeaderCopy, ImVector< T >::pop_back(), ImVector< T >::resize(), SetCurrentChannel(), ImVector< T >::Size, and ImDrawCmd::UserCallback.

Referenced by ImDrawList::ChannelsMerge(), ImGui::EndColumns(), and ImGui::EndTable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ SetCurrentChannel()

void ImDrawListSplitter::SetCurrentChannel ( ImDrawList draw_list,
int  channel_idx 
)
1779{
1780 IM_ASSERT(idx >= 0 && idx < _Count);
1781 if (_Current == idx)
1782 return;
1783
1784 // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap()
1785 memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer));
1786 memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer));
1787 _Current = idx;
1788 memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer));
1789 memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer));
1790 draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size;
1791
1792 // If current command is used with different settings we need to add a new command
1793 ImDrawCmd* curr_cmd = (draw_list->CmdBuffer.Size == 0) ? NULL : &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1];
1794 if (curr_cmd == NULL)
1795 draw_list->AddDrawCmd();
1796 else if (curr_cmd->ElemCount == 0)
1797 ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset
1798 else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0)
1799 draw_list->AddDrawCmd();
1800}
#define IM_ASSERT(_EXPR)
Definition imgui.h:81

References _Channels, ImDrawChannel::_CmdBuffer, ImDrawList::_CmdHeader, _Count, _Current, ImDrawChannel::_IdxBuffer, ImDrawList::_IdxWritePtr, ImDrawList::AddDrawCmd(), ImDrawList::CmdBuffer, ImVector< T >::Data, ImDrawCmd::ElemCount, ImDrawList::IdxBuffer, IM_ASSERT, ImDrawCmd_HeaderCompare, ImDrawCmd_HeaderCopy, and ImVector< T >::Size.

Referenced by ImGui::BeginColumns(), ImDrawList::ChannelsSetCurrent(), ImGui::EndTable(), Merge(), ImGui::NextColumn(), ImGui::PopColumnsBackground(), ImGui::PushColumnsBackground(), ImGui::TableBeginCell(), ImGui::TableDrawBorders(), ImGui::TableEndRow(), ImGui::TablePopBackgroundChannel(), ImGui::TablePushBackgroundChannel(), and ImGui::TableUpdateLayout().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Split()

void ImDrawListSplitter::Split ( ImDrawList draw_list,
int  count 
)
1678{
1679 IM_UNUSED(draw_list);
1680 IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter.");
1681 int old_channels_count = _Channels.Size;
1682 if (old_channels_count < channels_count)
1683 {
1684 _Channels.reserve(channels_count); // Avoid over reserving since this is likely to stay stable
1685 _Channels.resize(channels_count);
1686 }
1687 _Count = channels_count;
1688
1689 // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer
1690 // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to.
1691 // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer
1692 memset(&_Channels[0], 0, sizeof(ImDrawChannel));
1693 for (int i = 1; i < channels_count; i++)
1694 {
1695 if (i >= old_channels_count)
1696 {
1698 }
1699 else
1700 {
1701 _Channels[i]._CmdBuffer.resize(0);
1702 _Channels[i]._IdxBuffer.resize(0);
1703 }
1704 }
1705}
#define IM_UNUSED(_VAR)
Definition imgui.h:84
#define IM_PLACEMENT_NEW(_PTR)
Definition imgui.h:1636
void reserve(int new_capacity)
Definition imgui.h:1693

References _Channels, _Count, _Current, IM_ASSERT, IM_PLACEMENT_NEW, IM_UNUSED, ImVector< T >::reserve(), ImVector< T >::resize(), and ImVector< T >::Size.

Referenced by ImGui::BeginColumns(), ImDrawList::ChannelsSplit(), and ImGui::TableSetupDrawChannels().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ _Channels

◆ _Count

int ImDrawListSplitter::_Count

◆ _Current

int ImDrawListSplitter::_Current

The documentation for this struct was generated from the following files: