+ LifeCellBox *c;
+ for (c = m_head; c; c = c->m_next)
+ if (!c->m_dead && ((first) || (c->m_y > y)))
+ {
+ x = c->m_x;
+ y = c->m_y;
+ first = false;
+ }
+
+ LifeCell cell;
+ cell.i = first? 0 : x + CELLBOX / 2;
+ cell.j = first? 0 : y + CELLBOX / 2;
+ return cell;
+}
+
+LifeCell Life::FindWest()
+{
+ wxInt32 x = 0, y = 0;
+ bool first = true;
+
+ LifeCellBox *c;
+ for (c = m_head; c; c = c->m_next)
+ if (!c->m_dead && ((first) || (c->m_x < x)))
+ {
+ x = c->m_x;
+ y = c->m_y;
+ first = false;
+ }
+
+ LifeCell cell;
+ cell.i = first? 0 : x + CELLBOX / 2;
+ cell.j = first? 0 : y + CELLBOX / 2;
+ return cell;
+}
+
+LifeCell Life::FindEast()
+{
+ wxInt32 x = 0, y = 0;
+ bool first = true;
+
+ LifeCellBox *c;
+ for (c = m_head; c; c = c->m_next)
+ if (!c->m_dead && ((first) || (c->m_x > x)))
+ {
+ x = c->m_x;
+ y = c->m_y;
+ first = false;
+ }
+
+ LifeCell cell;
+ cell.i = first? 0 : x + CELLBOX / 2;
+ cell.j = first? 0 : y + CELLBOX / 2;
+ return cell;
+}
+
+// --------------------------------------------------------------------------
+// FindMore & co.
+// --------------------------------------------------------------------------
+
+// DoLine:
+// Post eight cells to the cell arrays - leave out the fourth
+// argument (or pass 0, the default value) to post alive cells
+// only, else it will post cells which have changed.
+//
+void Life::DoLine(wxInt32 x, wxInt32 y, wxUint32 live, wxUint32 old)
+{
+ wxUint32 diff = (live ^ old) & 0xff;
+
+ if (!diff) return;
+
+ for (wxInt32 k = 8; k; k--, x++)