X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33e3914780120847db58ef7a3ce14e31e2f8681f..3324d5f50feca6c2ee15e7715c774859aad795ab:/demos/life/life.cpp diff --git a/demos/life/life.cpp b/demos/life/life.cpp index 448b059fbc..4dba59107b 100644 --- a/demos/life/life.cpp +++ b/demos/life/life.cpp @@ -17,6 +17,17 @@ #pragma implementation "life.h" #endif +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + #include "wx/statline.h" #include "life.h" @@ -459,7 +470,7 @@ void LifeCanvas::SetCellSize(int cellsize) wxInt32 cy = m_viewportY + m_viewportH / 2; // get current canvas size and adjust viewport accordingly - wxCoord w, h; + int w, h; GetClientSize(&w, &h); m_viewportW = (w + m_cellsize - 1) / m_cellsize; m_viewportH = (h + m_cellsize - 1) / m_cellsize; @@ -532,12 +543,10 @@ void LifeCanvas::DrawChanged() if (m_cellsize == 1) { - // drawn using DrawPoint dc.SetPen(*wxBLACK_PEN); } else { - // drawn using DrawRectangle dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(*wxBLACK_BRUSH); } @@ -655,6 +664,14 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) } 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 wxInt32 d, ii, jj, di, ai, si, dj, aj, sj; di = i - m_mi; @@ -674,8 +691,8 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) while (ii != i) { - m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING); - DrawCell(ii, jj, m_status == MOUSE_DRAWING); + m_life->SetCell(ii, jj, alive); + DrawCell(ii, jj, dc); if (d >= 0) { jj += sj; @@ -692,8 +709,8 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) while (jj != j) { - m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING); - DrawCell(ii, jj, m_status == MOUSE_DRAWING); + m_life->SetCell(ii, jj, alive); + DrawCell(ii, jj, dc); if (d >= 0) { ii += si; @@ -705,10 +722,12 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) } // last cell - m_life->SetCell(ii, jj, m_status == MOUSE_DRAWING); - DrawCell(ii, jj, m_status == MOUSE_DRAWING); + m_life->SetCell(ii, jj, alive); + DrawCell(ii, jj, dc); m_mi = ii; m_mj = jj; + + dc.EndDrawing(); } GET_FRAME()->UpdateInfoText();