author | Mats Palmgren <matspal@gmail.com> |
Wed, 28 Nov 2012 19:55:36 +0100 | |
changeset 114385 | e102654a3f0fc0fcaf789593045212e2300dfe5e |
parent 114384 | 3eb1e86513761fdd9455be48deb8d81ab29638bd |
child 114386 | 9b169dfc8c38b98fd2d53b520a1da5c21a460fc8 |
push id | 23917 |
push user | emorley@mozilla.com |
push date | Thu, 29 Nov 2012 14:20:29 +0000 |
treeherder | mozilla-central@c72d38e7a212 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 815489 |
milestone | 20.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
gfx/2d/Blur.cpp | file | annotate | diff | comparison | revisions |
--- a/gfx/2d/Blur.cpp +++ b/gfx/2d/Blur.cpp @@ -492,39 +492,41 @@ AlphaBoxBlur::Blur() #endif if (cIsBigEndian || (integralImageSize.width * integralImageSize.height) > (1 << 24)) { // Fallback to old blurring code when the surface is so large it may // overflow our integral image! // No need to use CheckedInt here - we have validated it in the constructor. size_t szB = stride * size.height; - unsigned char* tmpData = new uint8_t[szB]; - + uint8_t* tmpData = new uint8_t[szB]; memset(tmpData, 0, szB); + uint8_t* a = mData; + uint8_t* b = tmpData; if (mBlurRadius.width > 0) { - BoxBlurHorizontal(mData, tmpData, horizontalLobes[0][0], horizontalLobes[0][1], stride, GetSize().height, mSkipRect); - BoxBlurHorizontal(tmpData, mData, horizontalLobes[1][0], horizontalLobes[1][1], stride, GetSize().height, mSkipRect); - BoxBlurHorizontal(mData, tmpData, horizontalLobes[2][0], horizontalLobes[2][1], stride, GetSize().height, mSkipRect); + BoxBlurHorizontal(a, b, horizontalLobes[0][0], horizontalLobes[0][1], stride, GetSize().height, mSkipRect); + BoxBlurHorizontal(b, a, horizontalLobes[1][0], horizontalLobes[1][1], stride, GetSize().height, mSkipRect); + BoxBlurHorizontal(a, b, horizontalLobes[2][0], horizontalLobes[2][1], stride, GetSize().height, mSkipRect); } else { - uint8_t *tmp = mData; - mData = tmpData; - tmpData = tmp; + a = tmpData; + b = mData; } + // The result is in 'b' here. if (mBlurRadius.height > 0) { - BoxBlurVertical(tmpData, mData, verticalLobes[0][0], verticalLobes[0][1], stride, GetSize().height, mSkipRect); - BoxBlurVertical(mData, tmpData, verticalLobes[1][0], verticalLobes[1][1], stride, GetSize().height, mSkipRect); - BoxBlurVertical(tmpData, mData, verticalLobes[2][0], verticalLobes[2][1], stride, GetSize().height, mSkipRect); + BoxBlurVertical(b, a, verticalLobes[0][0], verticalLobes[0][1], stride, GetSize().height, mSkipRect); + BoxBlurVertical(a, b, verticalLobes[1][0], verticalLobes[1][1], stride, GetSize().height, mSkipRect); + BoxBlurVertical(b, a, verticalLobes[2][0], verticalLobes[2][1], stride, GetSize().height, mSkipRect); } else { - uint8_t *tmp = mData; - mData = tmpData; - tmpData = tmp; + a = b; } - + // The result is in 'a' here. + if (a == tmpData) { + memcpy(mData, tmpData, szB); + } delete [] tmpData; } else { size_t integralImageStride = GetAlignedStride<16>(integralImageSize.width * 4); // We need to leave room for an additional 12 bytes for a maximum overrun // of 3 pixels in the blurring code. AlignedArray<uint32_t> integralImage((integralImageStride / 4) * integralImageSize.height + 12);