Optimized drawing code in OnMouse() for freehand drawing.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -543,12 +543,10 @@ void LifeCanvas::DrawChanged()
|
|||||||
|
|
||||||
if (m_cellsize == 1)
|
if (m_cellsize == 1)
|
||||||
{
|
{
|
||||||
// drawn using DrawPoint
|
|
||||||
dc.SetPen(*wxBLACK_PEN);
|
dc.SetPen(*wxBLACK_PEN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// drawn using DrawRectangle
|
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
dc.SetBrush(*wxBLACK_BRUSH);
|
dc.SetBrush(*wxBLACK_BRUSH);
|
||||||
}
|
}
|
||||||
@@ -666,6 +664,14 @@ void LifeCanvas::OnMouse(wxMouseEvent& event)
|
|||||||
}
|
}
|
||||||
else if ((m_mi != i) || (m_mj != j))
|
else if ((m_mi != i) || (m_mj != j))
|
||||||
{
|
{
|
||||||
|
bool alive = (m_status == MOUSE_DRAWING);
|
||||||
|
|
||||||
|
// prepare DC and pen + brush to optimize drawing
|
||||||
|
wxClientDC dc(this);
|
||||||
|
dc.SetPen(alive? *wxBLACK_PEN : *wxWHITE_PEN);
|
||||||
|
dc.SetBrush(alive? *wxBLACK_BRUSH : *wxWHITE_BRUSH);
|
||||||
|
dc.BeginDrawing();
|
||||||
|
|
||||||
// draw a line of cells using Bresenham's algorithm
|
// draw a line of cells using Bresenham's algorithm
|
||||||
wxInt32 d, ii, jj, di, ai, si, dj, aj, sj;
|
wxInt32 d, ii, jj, di, ai, si, dj, aj, sj;
|
||||||
di = i - m_mi;
|
di = i - m_mi;
|
||||||
@@ -685,8 +691,8 @@ void LifeCanvas::OnMouse(wxMouseEvent& event)
|
|||||||
|
|
||||||
while (ii != i)
|
while (ii != i)
|
||||||
{
|
{
|
||||||
m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING);
|
m_life->SetCell(ii, jj, alive);
|
||||||
DrawCell(ii, jj, m_status == MOUSE_DRAWING);
|
DrawCell(ii, jj, dc);
|
||||||
if (d >= 0)
|
if (d >= 0)
|
||||||
{
|
{
|
||||||
jj += sj;
|
jj += sj;
|
||||||
@@ -703,8 +709,8 @@ void LifeCanvas::OnMouse(wxMouseEvent& event)
|
|||||||
|
|
||||||
while (jj != j)
|
while (jj != j)
|
||||||
{
|
{
|
||||||
m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING);
|
m_life->SetCell(ii, jj, alive);
|
||||||
DrawCell(ii, jj, m_status == MOUSE_DRAWING);
|
DrawCell(ii, jj, dc);
|
||||||
if (d >= 0)
|
if (d >= 0)
|
||||||
{
|
{
|
||||||
ii += si;
|
ii += si;
|
||||||
@@ -716,10 +722,12 @@ void LifeCanvas::OnMouse(wxMouseEvent& event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// last cell
|
// last cell
|
||||||
m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING);
|
m_life->SetCell(ii, jj, alive);
|
||||||
DrawCell(ii, jj, m_status == MOUSE_DRAWING);
|
DrawCell(ii, jj, dc);
|
||||||
m_mi = ii;
|
m_mi = ii;
|
||||||
m_mj = jj;
|
m_mj = jj;
|
||||||
|
|
||||||
|
dc.EndDrawing();
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_FRAME()->UpdateInfoText();
|
GET_FRAME()->UpdateInfoText();
|
||||||
|
Reference in New Issue
Block a user