From be0d0fedf936869e554b1335ac423a71c9750fe9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 26 Apr 2011 22:57:05 +0000 Subject: [PATCH] Optimize alpha handling in wxImage::Rotate90() too. The changes of r66309 optimized the rotation of the pixel data by doing it in entire strips instead of pixel by pixel, apply the same technique now to the rotation of alpha data as well. Closes #12739. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67613 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/image.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/common/image.cpp b/src/common/image.cpp index 1d82b39ca5..4e4860d9c2 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -1099,7 +1099,7 @@ wxImage wxImage::Rotate90( bool clockwise ) const // we rotate the image in 21-pixel (63-byte) wide strips // to make better use of cpu cache - memory transfers // (note: while much better than single-pixel "strips", - // our vertical strips will still generally straddle cachelines) + // our vertical strips will still generally straddle 64-byte cachelines) for (long ii = 0; ii < width; ) { long next_ii = wxMin(ii + 21, width); @@ -1113,11 +1113,11 @@ wxImage wxImage::Rotate90( bool clockwise ) const { if ( clockwise ) { - target_data = data + (((i+1)*height) - j - 1)*3; + target_data = data + ((i + 1)*height - j - 1)*3; } else { - target_data = data + ((height*(width - 1 - i)) + j)*3; + target_data = data + (height*(width - 1 - i) + j)*3; } memcpy( target_data, source_data, 3 ); source_data += 3; @@ -1134,21 +1134,30 @@ wxImage wxImage::Rotate90( bool clockwise ) const unsigned char *alpha_data = image.GetAlpha(); unsigned char *target_alpha = 0 ; - for (long j = 0; j < height; j++) + for (long ii = 0; ii < width; ) { - for (long i = 0; i < width; i++) + long next_ii = wxMin(ii + 64, width); + + for (long j = 0; j < height; j++) { - if ( clockwise ) - { - target_alpha = alpha_data + (((i+1)*height) - j - 1); - } - else + source_alpha = M_IMGDATA->m_alpha + j*width + ii; + + for (long i = ii; i < next_ii; i++) { - target_alpha = alpha_data + ((height*(width-1)) + j - (i*height)); - } + if ( clockwise ) + { + target_alpha = alpha_data + (i+1)*height - j - 1; + } + else + { + target_alpha = alpha_data + height*(width - i - 1) + j; + } - *target_alpha = *source_alpha++; + *target_alpha = *source_alpha++; + } } + + ii = next_ii; } } -- 2.45.2