Optimizated calculation of the next step
for (int y=0; y<320; y++) {
for (int x=0; x<240; x++) {
int n = x+y*240;
byte nOriginal = m_pData[n];
if ( (x>0) && (x<239) && (y>0) && (y<319) ) {
//top left
if ( ( 1 + m_pData[n-241] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n-241];
}
//top
if ( ( 1 + m_pData[n-240] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n-240];
}
//top right
if ( ( 1 + m_pData[n-239] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n-239];
}
//left
if ( ( 1 + m_pData[n-1] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n-1];
}
//right
if ( ( 1 + m_pData[n+1] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n+1];
}
//bottom left
if ( ( 1 + m_pData[n+239] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n+239];
}
//bottom
if ( ( 1 + m_pData[n+240] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n+240];
}
//bottom right
if ( ( 1 + m_pData[n+241] )%MAX_INDEX == nOriginal) {
m_pData2[n] = m_pData[n+241];
}
} else {
for (int dx=-1; dx<=1; dx++) {
for (int dy=-1; dy<=1; dy++) {
int newX = (x+dx+240)%240;
int newY = (y+dy+320)%320;
byte nNeigh = m_pData[newX+240*newY];
if ((1+nNeigh)%MAX_INDEX == nOriginal) {
m_pData2[n] = nNeigh;
}
}
}
}
}
}