
Michael, Here is a version of the algorithm that makes use of view transformations: template <typename View> void reflect_quadrants(const View& src) { typedef typename View::point_t point_t; point_t q_dims = ifloor(src.dimensions()/2); point_t mid = iceil (src.dimensions()/2); View q1 = subimage_view(src,point_t(0,0),q_dims); View q2 = subimage_view(src,point_t(mid.x,0),q_dims); View q3 = subimage_view(src,point_t(0,mid.y),q_dims); View q4 = subimage_view(src,mid,q_dims); copy_pixels(flipped_left_right_view(q1), q2); copy_pixels(flipped_up_down_view(q1), q3); copy_pixels(flipped_up_down_view(flipped_left_right_view(q1)), q4); } std::vector<float> buffer( 1024 * 1024 ); GenerateNoise( pBuffer, 1024, 1024 ) gray32f_view_t src = interleaved_view( 1024, 1024 , (gray32f_pixel_t*) &buffer.front() , 1024 * 4 // bytes per scanline ); reflect_quadrants(src); ______ reflect_quadrants should work for images of any number of channels, dimensions, interleaved/planar, non-byte-aligned, synthetic, etc. Lubomir