Commit d434670
committed
LeaveLocalSpace(): Search for ImDrawCallback_ImCanvas after m_DrawListFirstCommandIndex (proposed fix for thedmd#282)
Analysis of the bug thedmd#282
when using this repro: https://github.com/pthom/node_window_clipping_issue/tree/suspend_resume_issue2
At the 4th call of LeaveLocalSpace(), we have:
this = {ImGuiEx::Canvas *}
m_DrawList = {ImDrawList *} mDrawList is of size 4
CmdBuffer = {ImVector<ImDrawCmd>} its elements at index 2
Size = {int} 4 has UserCallback == {ImDrawCallback_ImCanvas}
Capacity = {int} 8
Data = {ImDrawCmd *}
m_ExpectedChannel = {int} 0
m_DrawListFirstCommandIndex = {int} 2
m_DrawListCommadBufferSize = {int} 1
m_DrawListStartVertexIndex = {int} 8
We have m_DrawListFirstCommandIndex = 2, however, the tests in the original code will test only at index 0 and 1!
if (m_DrawList->CmdBuffer.size() > m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize].UserCallback == ImDrawCallback_ImCanvas)
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize);
else if (m_DrawList->CmdBuffer.size() >= m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize - 1].UserCallback == ImDrawCallback_ImCanvas)
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize - 1);
// Proposed solution: test all commands from index >= m_DrawListFirstCommandIndex
// and remove the one with UserCallback == ImDrawCallback_ImCanvas
// (based on the original code, it seems there can be only one)
int idxCommand_ImDrawCallback_ImCanvas = -1;
for (int i = m_DrawListFirstCommandIndex; i < m_DrawList->CmdBuffer.size(); ++i)
{
auto & command = m_DrawList->CmdBuffer[i];
if (command.UserCallback == ImDrawCallback_ImCanvas)
{
idxCommand_ImDrawCallback_ImCanvas = i;
break;
}
}
if (idxCommand_ImDrawCallback_ImCanvas >= 0)
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + idxCommand_ImDrawCallback_ImCanvas);1 parent 06892b1 commit d434670
1 file changed
+43
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
537 | 537 | | |
538 | 538 | | |
539 | 539 | | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
540 | 567 | | |
541 | 568 | | |
542 | 569 | | |
543 | 570 | | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
544 | 587 | | |
545 | 588 | | |
546 | 589 | | |
| |||
0 commit comments