对于版本1,在分配2个缓冲区后(只需使用 buffer 和 bufT ),创建指向当前行和上一行的2个指针,如下所示:
buffer
bufT
uint16_t *currentRow = buffer; uint16_t *prevRow = bufT;
在行循环内,写入 currentRow 代替 buffer :
currentRow
pixel16 pix(newPixel[0], newPixel[1], newPixel[2]); currentRow[X] = packColour(pix).packed565;
由于Sobel过滤器从上一行读取,因此在完成计算后面行的过滤值之前,不能覆盖行。所以在循环结束时,你正在调用的地方 paintRow() ,绘制前一行(如果存在),然后交换缓冲区以使当前变为前一行,而前一行成为新的当前行(在下一次循环中将被覆盖)。在最后一行也绘制当前行,否则它将不会是因为外循环即将终止。
paintRow()
if(Y > 0) // draw the previous row if this is not the first row: this->paintRow(Point(0, Y-1), prevRow, _gl->getWidth()); if(Y == _gl->getHeight()-1) // draw the current row if it is the last: this->paintRow(Point(0, Y), currentRow, _gl->getWidth()); // swap row pointers: uint16_t *temp = prevRow; prevRow = currentRow; currentRow = temp;
同样的策略应该适用于其他版本。