Skip to content

Commit 51537d8

Browse files
committed
Canvas: Ensure SentinelDrawCallback cleanup (#255)
1 parent 01fa1b9 commit 51537d8

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

docs/CHANGELOG.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ v0.10.0 (WIP):
66

77
BUGFIX: Examples: Call ed::EndCreate() and ed::EndDelete() only when ed::BeginCreate() and ed::BeginDelete() returned true
88

9+
BUGFIX: Canvas: Ensure SentinelDrawCallback cleanup (#255)
10+
911

1012
v0.9.2 (2023-09-01):
1113

imgui_canvas.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,15 @@ void ImGuiEx::Canvas::EnterLocalSpace()
421421
auto clipped_clip_rect = m_DrawList->_ClipRectStack.back();
422422
ImGui::PopClipRect();
423423

424+
# if IMGUI_EX_CANVAS_DEFERED()
425+
m_Ranges.resize(m_Ranges.Size + 1);
426+
m_CurrentRange = &m_Ranges.back();
427+
m_CurrentRange->BeginComandIndex = ImMax(m_DrawList->CmdBuffer.Size, 0);
428+
m_CurrentRange->BeginVertexIndex = m_DrawList->_VtxCurrentIdx + ImVtxOffsetRef(m_DrawList);
429+
# endif
430+
m_DrawListCommadBufferSize = ImMax(m_DrawList->CmdBuffer.Size, 0);
431+
m_DrawListStartVertexIndex = m_DrawList->_VtxCurrentIdx + ImVtxOffsetRef(m_DrawList);
432+
424433
// Make sure we do not share draw command with anyone. We don't want to mess
425434
// with someones clip rectangle.
426435

@@ -437,15 +446,6 @@ void ImGuiEx::Canvas::EnterLocalSpace()
437446
if ((!m_DrawList->CmdBuffer.empty() && m_DrawList->CmdBuffer.back().ElemCount > 0) || m_DrawList->_Splitter._Count > 1)
438447
m_DrawList->AddCallback(&ImCanvasDetails::SentinelDrawCallback, nullptr);
439448

440-
# if IMGUI_EX_CANVAS_DEFERED()
441-
m_Ranges.resize(m_Ranges.Size + 1);
442-
m_CurrentRange = &m_Ranges.back();
443-
m_CurrentRange->BeginComandIndex = ImMax(m_DrawList->CmdBuffer.Size - 1, 0);
444-
m_CurrentRange->BeginVertexIndex = m_DrawList->_VtxCurrentIdx + ImVtxOffsetRef(m_DrawList);
445-
# endif
446-
m_DrawListCommadBufferSize = ImMax(m_DrawList->CmdBuffer.Size - 1, 0);
447-
m_DrawListStartVertexIndex = m_DrawList->_VtxCurrentIdx + ImVtxOffsetRef(m_DrawList);
448-
449449
# if defined(IMGUI_HAS_VIEWPORT)
450450
auto window = ImGui::GetCurrentWindow();
451451
window->Pos = ImVec2(0.0f, 0.0f);
@@ -554,8 +554,13 @@ void ImGuiEx::Canvas::LeaveLocalSpace()
554554
}
555555

556556
// Remove sentinel draw command if present
557-
if (m_DrawListCommadBufferSize > 0 && m_DrawList->CmdBuffer.size() >= m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize - 1].UserCallback == &ImCanvasDetails::SentinelDrawCallback)
558-
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize - 1);
557+
if (m_DrawListCommadBufferSize > 0)
558+
{
559+
if (m_DrawList->CmdBuffer.size() > m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize].UserCallback == &ImCanvasDetails::SentinelDrawCallback)
560+
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize);
561+
else if (m_DrawList->CmdBuffer.size() >= m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize - 1].UserCallback == &ImCanvasDetails::SentinelDrawCallback)
562+
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize - 1);
563+
}
559564

560565
auto& fringeScale = ImFringeScaleRef(m_DrawList);
561566
fringeScale = m_LastFringeScale;

0 commit comments

Comments
 (0)