[Libreoffice-commits] core.git: include/vcl vcl/CppunitTest_vcl_bitmap_test.mk vcl/Library_vcl.mk vcl/qa vcl/source
Stephan Bergmann
sbergman at redhat.com
Mon Jan 11 01:43:29 PST 2016
include/vcl/BitmapFilterStackBlur.hxx | 32 -
vcl/CppunitTest_vcl_bitmap_test.mk | 1
vcl/Library_vcl.mk | 1
vcl/qa/cppunit/BitmapFilterTest.cxx | 175 --------
vcl/source/bitmap/BitmapFilterStackBlur.cxx | 581 ----------------------------
5 files changed, 790 deletions(-)
New commits:
commit da40d2558e3de30914f4c181cceb66937c6f1124
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Mon Jan 11 10:42:23 2016 +0100
Remove BitmapFilterStackBlur, which is unused...
...ever since it got introduced with 28c61871e876e6a2cac47439f768504b1a4c94a0
"vcl: stack blur implementation + basic test & performance test"
Change-Id: I78672cf74c24930df92121baecb9886df4382036
diff --git a/include/vcl/BitmapFilterStackBlur.hxx b/include/vcl/BitmapFilterStackBlur.hxx
deleted file mode 100644
index 5b2b002..0000000
--- a/include/vcl/BitmapFilterStackBlur.hxx
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#ifndef INCLUDED_VCL_BITMAPFILTERSTACKBLUR_HXX
-#define INCLUDED_VCL_BITMAPFILTERSTACKBLUR_HXX
-
-#include <vcl/bitmap.hxx>
-#include <vcl/bitmapex.hxx>
-#include <vcl/bitmapfilter.hxx>
-
-class VCL_DLLPUBLIC BitmapFilterStackBlur : BitmapFilter
-{
- sal_Int32 mnRadius;
- bool mbExtend;
-
-public:
- BitmapFilterStackBlur(sal_Int32 nRadius, bool bExtend = true);
- virtual ~BitmapFilterStackBlur();
-
- bool filter(Bitmap& rBitmap) override;
-};
-
-#endif // INCLUDED_VCL_BITMAPFILTERSTACKBLUR_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/CppunitTest_vcl_bitmap_test.mk b/vcl/CppunitTest_vcl_bitmap_test.mk
index 290d167..a65ddb3 100644
--- a/vcl/CppunitTest_vcl_bitmap_test.mk
+++ b/vcl/CppunitTest_vcl_bitmap_test.mk
@@ -11,7 +11,6 @@ $(eval $(call gb_CppunitTest_CppunitTest,vcl_bitmap_test))
$(eval $(call gb_CppunitTest_add_exception_objects,vcl_bitmap_test, \
vcl/qa/cppunit/BitmapTest \
- vcl/qa/cppunit/BitmapFilterTest \
))
$(eval $(call gb_CppunitTest_use_externals,vcl_bitmap_test,\
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index f757232..961bb05 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -317,7 +317,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/bitmap/bitmapscalesuper \
vcl/source/bitmap/BitmapScaleConvolution \
vcl/source/bitmap/BitmapSymmetryCheck \
- vcl/source/bitmap/BitmapFilterStackBlur \
vcl/source/bitmap/BitmapProcessor \
vcl/source/bitmap/BitmapTools \
vcl/source/bitmap/checksum \
diff --git a/vcl/qa/cppunit/BitmapFilterTest.cxx b/vcl/qa/cppunit/BitmapFilterTest.cxx
deleted file mode 100644
index ade5acb..0000000
--- a/vcl/qa/cppunit/BitmapFilterTest.cxx
+++ /dev/null
@@ -1,175 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include <cppunit/TestAssert.h>
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/plugin/TestPlugIn.h>
-
-#include <vcl/bitmap.hxx>
-#include <vcl/bmpacc.hxx>
-
-#include <tools/stream.hxx>
-#include <vcl/graphicfilter.hxx>
-
-#include <vcl/BitmapFilterStackBlur.hxx>
-#include "BitmapSymmetryCheck.hxx"
-
-#include <chrono>
-
-namespace
-{
-
-const bool constWriteResultBitmap(false);
-const bool constEnablePerformanceTest(false);
-
-class BitmapFilterTest : public CppUnit::TestFixture
-{
-
- void testBlurCorrectness();
- void testPerformance();
-
- CPPUNIT_TEST_SUITE(BitmapFilterTest);
- CPPUNIT_TEST(testBlurCorrectness);
- CPPUNIT_TEST(testPerformance);
- CPPUNIT_TEST_SUITE_END();
-};
-
-void BitmapFilterTest::testBlurCorrectness()
-{
- // Setup test bitmap
- Size aSize(41, 31);
- Bitmap aBitmap24Bit(aSize, 24);
-
- sal_uLong nScanlineFormat = 0;
- sal_uInt16 nBPP = aBitmap24Bit.GetBitCount();
-
- {
- long aMargin1 = 1;
- long aMargin2 = 3;
- Bitmap::ScopedWriteAccess aWriteAccess(aBitmap24Bit);
- nScanlineFormat = aWriteAccess->GetScanlineFormat();
- aWriteAccess->Erase(COL_WHITE);
- aWriteAccess->SetLineColor(COL_BLACK);
-
- Rectangle aRectangle1(
- aMargin1,
- aMargin1,
- aSize.Width() - 1 - aMargin1,
- aSize.Height() - 1 - aMargin1);
-
- Rectangle aRectangle2(
- aMargin2,
- aMargin2,
- aSize.Width() - 1 - aMargin2,
- aSize.Height() - 1 - aMargin2);
-
- Rectangle aRectangle3(
- aSize.Width() / 2,
- aSize.Height() / 2,
- aSize.Width() / 2,
- aSize.Height() / 2);
-
- aWriteAccess->DrawRect(aRectangle1);
- aWriteAccess->DrawRect(aRectangle2);
- aWriteAccess->DrawRect(aRectangle3);
- }
-
- if (constWriteResultBitmap)
- {
- SvFileStream aStream(OUString("~/blurBefore.png"), StreamMode::WRITE | StreamMode::TRUNC);
- GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
- rFilter.compressAsPNG(aBitmap24Bit, aStream, 1);
- }
-
- // Perform blur
- BitmapFilterStackBlur aBlurFilter(2);
- aBlurFilter.filter(aBitmap24Bit);
-
- // Check the result
-
- if (constWriteResultBitmap)
- {
- SvFileStream aStream(OUString("~/blurAfter.png"), StreamMode::WRITE | StreamMode::TRUNC);
- GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
- rFilter.compressAsPNG(aBitmap24Bit, aStream, 1);
- }
-
- // Check blurred bitmap parameters
- CPPUNIT_ASSERT_EQUAL(static_cast<long>(45), aBitmap24Bit.GetSizePixel().Width());
- CPPUNIT_ASSERT_EQUAL(static_cast<long>(35), aBitmap24Bit.GetSizePixel().Height());
-
- CPPUNIT_ASSERT_EQUAL(nBPP, aBitmap24Bit.GetBitCount());
-
- // Check that the bitmap is horizontally and vertically symmetrical
- BitmapSymmetryCheck symmetryCheck;
- CPPUNIT_ASSERT(BitmapSymmetryCheck::check(aBitmap24Bit));
-
- {
- Bitmap::ScopedReadAccess aReadAccess(aBitmap24Bit);
- CPPUNIT_ASSERT_EQUAL(nScanlineFormat, aReadAccess->GetScanlineFormat());
- }
-}
-
-void BitmapFilterTest::testPerformance()
-{
- if (!constEnablePerformanceTest)
- return;
-
- Size aSize(4000, 3000); // A rather common picture size
-
- // Prepare bitmap
- Bitmap aBigBitmap(aSize, 24);
- {
- long aMargin = 500;
- Bitmap::ScopedWriteAccess aWriteAccess(aBigBitmap);
- aWriteAccess->Erase(COL_WHITE);
- aWriteAccess->SetLineColor(COL_BLACK);
- aWriteAccess->SetFillColor(COL_BLACK);
- Rectangle aRectangle(
- aMargin,
- aMargin,
- aSize.Width() - 1 - aMargin,
- aSize.Height() - 1 - aMargin);
-
- aWriteAccess->DrawRect(aRectangle);
- }
-
- int nIterations = 10;
- auto start = std::chrono::high_resolution_clock::now();
- for (int i = 0; i < nIterations; i++)
- {
- {
- BitmapFilterStackBlur aBlurFilter(250, false); // don't extend the image
- aBlurFilter.filter(aBigBitmap);
- }
- }
- auto end = std::chrono::high_resolution_clock::now();
- auto elapsed = (end - start) / nIterations;
-
- if (constWriteResultBitmap)
- {
- std::unique_ptr<SvFileStream> pStream(
- new SvFileStream(OUString("~/BlurBigPerformance.png"), StreamMode::WRITE | StreamMode::TRUNC));
- GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
- rFilter.compressAsPNG(aBigBitmap, *pStream, 1);
-
- pStream.reset(
- new SvFileStream(OUString("~/BlurBigPerformance.txt"), StreamMode::WRITE));
- pStream->WriteOString(OString("Blur average time: "));
- pStream->WriteOString(OString::number(std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count()));
- pStream->WriteOString(OString("\n"));
- }
-}
-
-} // namespace
-
-CPPUNIT_TEST_SUITE_REGISTRATION(BitmapFilterTest);
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/bitmap/BitmapFilterStackBlur.cxx b/vcl/source/bitmap/BitmapFilterStackBlur.cxx
deleted file mode 100644
index a2664b7..0000000
--- a/vcl/source/bitmap/BitmapFilterStackBlur.cxx
+++ /dev/null
@@ -1,581 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#include <vcl/BitmapFilterStackBlur.hxx>
-#include <vcl/bmpacc.hxx>
-
-namespace
-{
-
-static const sal_Int16 constMultiplyTable[255] =
-{
- 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,
- 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,
- 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,
- 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,
- 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,
- 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,
- 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,
- 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,
- 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,
- 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,
- 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,
- 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,
- 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,
- 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,
- 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,
- 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259
-};
-
-static const sal_Int16 constShiftTable[255] =
-{
- 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
- 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
-};
-
-class BlurSharedData
-{
-public:
- long mnRadius;
- long mnComponentWidth;
- long mnColorChannels;
- long mnDiv;
- std::vector<sal_uInt8> maStackBuffer;
- std::vector<long> maPositionTable;
- std::vector<long> maWeightTable;
-
- std::vector<long> mnSumVector;
- std::vector<long> mnInSumVector;
- std::vector<long> mnOutSumVector;
-
- BlurSharedData(long aRadius, long nComponentWidth, long nColorChannels)
- : mnRadius(aRadius)
- , mnComponentWidth(nComponentWidth)
- , mnColorChannels(nColorChannels)
- , mnDiv(aRadius + aRadius + 1)
- , maStackBuffer(mnDiv * mnComponentWidth)
- , maPositionTable(mnDiv)
- , maWeightTable(mnDiv)
- , mnSumVector(mnColorChannels)
- , mnInSumVector(mnColorChannels)
- , mnOutSumVector(mnColorChannels)
- {
- }
-
- void calculateWeightAndPositions(long nLastIndex)
- {
- for (long i = 0; i < mnDiv; i++)
- {
- maPositionTable[i] = std::min(nLastIndex, std::max(0L, i - mnRadius));
- maWeightTable[i] = mnRadius + 1 - std::abs(i - mnRadius);
- }
- }
-
- long getMultiplyValue()
- {
- return static_cast<long>(constMultiplyTable[mnRadius]);
- }
-
- long getShiftValue()
- {
- return static_cast<long>(constShiftTable[mnRadius]);
- }
-};
-
-struct SumFunction24
-{
- static inline void add(long*& pValue1, long nConstant)
- {
- pValue1[0] += nConstant;
- pValue1[1] += nConstant;
- pValue1[2] += nConstant;
- }
-
- static inline void set(long*& pValue1, long nConstant)
- {
- pValue1[0] = nConstant;
- pValue1[1] = nConstant;
- pValue1[2] = nConstant;
- }
-
- static inline void add(long*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] += pValue2[0];
- pValue1[1] += pValue2[1];
- pValue1[2] += pValue2[2];
- }
-
- static inline void add(long*& pValue1, long*& pValue2)
- {
- pValue1[0] += pValue2[0];
- pValue1[1] += pValue2[1];
- pValue1[2] += pValue2[2];
- }
-
- static inline void sub(long*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] -= pValue2[0];
- pValue1[1] -= pValue2[1];
- pValue1[2] -= pValue2[2];
- }
-
- static inline void sub(long*& pValue1, long*& pValue2)
- {
- pValue1[0] -= pValue2[0];
- pValue1[1] -= pValue2[1];
- pValue1[2] -= pValue2[2];
- }
-
- static inline void assignPtr(sal_uInt8*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] = pValue2[0];
- pValue1[1] = pValue2[1];
- pValue1[2] = pValue2[2];
- }
-
- static inline void assignMulAndShr(sal_uInt8*& result, long*& sum, long multiply, long shift)
- {
- result[0] = (multiply * sum[0]) >> shift;
- result[1] = (multiply * sum[1]) >> shift;
- result[2] = (multiply * sum[2]) >> shift;
- }
-};
-
-struct SumFunction8
-{
- static inline void add(long*& pValue1, long nConstant)
- {
- pValue1[0] += nConstant;
- }
-
- static inline void set(long*& pValue1, long nConstant)
- {
- pValue1[0] = nConstant;
- }
-
- static inline void add(long*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] += pValue2[0];
- }
-
- static inline void add(long*& pValue1, long*& pValue2)
- {
- pValue1[0] += pValue2[0];
- }
-
- static inline void sub(long*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] -= pValue2[0];
- }
-
- static inline void sub(long*& pValue1, long*& pValue2)
- {
- pValue1[0] -= pValue2[0];
- }
-
- static inline void assignPtr(sal_uInt8*& pValue1, sal_uInt8*& pValue2)
- {
- pValue1[0] = pValue2[0];
- }
-
- static inline void assignMulAndShr(sal_uInt8*& result, long*& sum, long multiply, long shift)
- {
- result[0] = (multiply * sum[0]) >> shift;
- }
-};
-
-template<typename SumFunction>
-void stackBlurHorizontal(
- BitmapReadAccess* pReadAccess,
- BitmapWriteAccess* pWriteAccess,
- BlurSharedData& rShared)
-{
- long nWidth = pReadAccess->Width();
- long nHeight = pReadAccess->Height();
-
- sal_uInt8* pStack = rShared.maStackBuffer.data();
- sal_uInt8* pStackPtr;
-
- long nLastIndexX = nWidth - 1;
-
- long nMultiplyValue = rShared.getMultiplyValue();
- long nShiftValue = rShared.getShiftValue();
-
- long nRadius = rShared.mnRadius;
- long nComponentWidth = rShared.mnComponentWidth;
- long nDiv = rShared.mnDiv;
-
- Scanline pSourcePointer;
- Scanline pDestinationPointer;
-
- long nXPosition;
- long nStackIndex;
- long nStackIndexStart;
- long nWeight;
-
- long* nSum = rShared.mnSumVector.data();
- long* nInSum = rShared.mnInSumVector.data();
- long* nOutSum = rShared.mnOutSumVector.data();
-
- rShared.calculateWeightAndPositions(nLastIndexX);
- long* pPositionPointer = rShared.maPositionTable.data();
- long* pWeightPointer = rShared.maWeightTable.data();
-
- for (long y = 0; y < nHeight; y++)
- {
- SumFunction::set(nSum, 0L);
- SumFunction::set(nInSum, 0L);
- SumFunction::set(nOutSum, 0L);
-
- for (long i = 0; i < nDiv; i++)
- {
- pSourcePointer = pReadAccess->GetScanline(pPositionPointer[i]);
-
- pStackPtr = &pStack[nComponentWidth * i];
-
- SumFunction::assignPtr(pStackPtr, pSourcePointer);
-
- nWeight = pWeightPointer[i];
-
- SumFunction::add(nSum, pSourcePointer[0] * nWeight);
-
- if (i - nRadius > 0)
- {
- SumFunction::add(nInSum, pSourcePointer);
- }
- else
- {
- SumFunction::add(nOutSum, pSourcePointer);
- }
- }
-
- nStackIndex = nRadius;
- nXPosition = std::min(nRadius, nLastIndexX);
-
- pSourcePointer = pReadAccess->GetScanline(y) + nComponentWidth * nXPosition;
-
- for (long x = 0; x < nWidth; x++)
- {
- pDestinationPointer = pWriteAccess->GetScanline(y) + nComponentWidth * x;
-
- SumFunction::assignMulAndShr(pDestinationPointer, nSum, nMultiplyValue, nShiftValue);
-
- SumFunction::sub(nSum, nOutSum);
-
- nStackIndexStart = nStackIndex + nDiv - nRadius;
- if (nStackIndexStart >= nDiv)
- {
- nStackIndexStart -= nDiv;
- }
- pStackPtr = &pStack[nComponentWidth * nStackIndexStart];
-
- SumFunction::sub(nOutSum, pStackPtr);
-
- if (nXPosition < nLastIndexX)
- {
- nXPosition++;
- pSourcePointer = pReadAccess->GetScanline(y) + nComponentWidth * nXPosition;
- }
-
- SumFunction::assignPtr(pStackPtr, pSourcePointer);
-
- SumFunction::add(nInSum, pSourcePointer);
-
- SumFunction::add(nSum, nInSum);
-
- nStackIndex++;
- if (nStackIndex >= nDiv)
- {
- nStackIndex = 0;
- }
-
- pStackPtr = &pStack[nStackIndex * nComponentWidth];
-
- SumFunction::add(nOutSum, pStackPtr);
- SumFunction::sub(nInSum, pStackPtr);
- }
- }
-}
-
-template<typename SumFunction>
-void stackBlurVertical(
- BitmapReadAccess* pReadAccess,
- BitmapWriteAccess* pWriteAccess,
- BlurSharedData& rShared)
-{
- long nWidth = pReadAccess->Width();
- long nHeight = pReadAccess->Height();
-
- sal_uInt8* pStack = rShared.maStackBuffer.data();
- sal_uInt8* pStackPtr;
-
- long nLastIndexY = nHeight - 1;
-
- long nMultiplyValue = rShared.getMultiplyValue();
- long nShiftValue = rShared.getShiftValue();
-
- long nRadius = rShared.mnRadius;
- long nComponentWidth = rShared.mnComponentWidth;
- long nDiv = rShared.mnDiv;
-
- Scanline pSourcePointer;
- Scanline pDestinationPointer;
-
- long nYPosition;
- long nStackIndex;
- long nStackIndexStart;
- long nWeight;
-
- long* nSum = rShared.mnSumVector.data();
- long* nInSum = rShared.mnInSumVector.data();
- long* nOutSum = rShared.mnOutSumVector.data();
-
- rShared.calculateWeightAndPositions(nLastIndexY);
- long* pPositionPointer = rShared.maPositionTable.data();
- long* pWeightPointer = rShared.maWeightTable.data();
-
- for (long x = 0; x < nWidth; x++)
- {
- SumFunction::set(nSum, 0L);
- SumFunction::set(nInSum, 0L);
- SumFunction::set(nOutSum, 0L);
-
- for (long i = 0; i < nDiv; i++)
- {
- pSourcePointer = pReadAccess->GetScanline(pPositionPointer[i]);
-
- pStackPtr = &pStack[nComponentWidth * i];
-
- SumFunction::assignPtr(pStackPtr, pSourcePointer);
-
- nWeight = pWeightPointer[i];
-
- SumFunction::add(nSum, pSourcePointer[0] * nWeight);
-
- if (i - nRadius > 0)
- {
- SumFunction::add(nInSum, pSourcePointer);
- }
- else
- {
- SumFunction::add(nOutSum, pSourcePointer);
- }
- }
-
- nStackIndex = nRadius;
- nYPosition = std::min(nRadius, nLastIndexY);
-
- pSourcePointer = pReadAccess->GetScanline(nYPosition) + nComponentWidth * x;
-
- for (long y = 0; y < nHeight; y++)
- {
- pDestinationPointer = pWriteAccess->GetScanline(y) + nComponentWidth * x;
-
- SumFunction::assignMulAndShr(pDestinationPointer, nSum, nMultiplyValue, nShiftValue);
-
- SumFunction::sub(nSum, nOutSum);
-
-
- nStackIndexStart = nStackIndex + nDiv - nRadius;
- if (nStackIndexStart >= nDiv)
- {
- nStackIndexStart -= nDiv;
- }
- pStackPtr = &pStack[nComponentWidth * nStackIndexStart];
-
- SumFunction::sub(nOutSum, pStackPtr);
-
- if (nYPosition < nLastIndexY)
- {
- nYPosition++;
- pSourcePointer = pReadAccess->GetScanline(nYPosition) + nComponentWidth * x;
- }
-
- SumFunction::assignPtr(pStackPtr, pSourcePointer);
-
- SumFunction::add(nInSum, pSourcePointer);
-
- SumFunction::add(nSum, nInSum);
-
- nStackIndex++;
- if (nStackIndex >= nDiv)
- {
- nStackIndex = 0;
- }
-
- pStackPtr = &pStack[nStackIndex * nComponentWidth];
-
- SumFunction::add(nOutSum, pStackPtr);
-
- SumFunction::sub(nInSum, pStackPtr);
- }
- }
-}
-
-void stackBlur24(Bitmap& rBitmap, sal_Int32 nRadius, sal_Int32 nComponentWidth)
-{
- // Limit radius
- nRadius = std::min<sal_Int32>(254, std::max<sal_Int32>(2, nRadius));
- const long nColorChannels = 3; // 3 color channel
- BlurSharedData aData(nRadius, nComponentWidth, nColorChannels);
-
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
-
- stackBlurHorizontal<SumFunction24>(pReadAccess.get(), pWriteAccess.get(), aData);
- }
-
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
-
- stackBlurVertical<SumFunction24>(pReadAccess.get(), pWriteAccess.get(), aData);
- }
-}
-
-void stackBlur8(Bitmap& rBitmap, sal_Int32 nRadius, sal_Int32 nComponentWidth)
-{
- // Limit radius
- nRadius = std::min<sal_Int32>(254, std::max<sal_Int32>(2, nRadius));
- const long nColorChannels = 1; // 1 color channel
- BlurSharedData aData(nRadius, nComponentWidth, nColorChannels);
-
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
-
- stackBlurHorizontal<SumFunction8>(pReadAccess.get(), pWriteAccess.get(), aData);
- }
-
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- Bitmap::ScopedWriteAccess pWriteAccess(rBitmap);
-
- stackBlurVertical<SumFunction8>(pReadAccess.get(), pWriteAccess.get(), aData);
- }
-}
-
-void centerExtendBitmap(Bitmap& rBitmap, sal_Int32 nExtendSize, Color aColor)
-{
- const Size& rSize = rBitmap.GetSizePixel();
- const Size aNewSize(rSize.Width() + nExtendSize * 2,
- rSize.Height() + nExtendSize * 2);
-
- Bitmap aNewBitmap(aNewSize, rBitmap.GetBitCount());
-
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- Bitmap::ScopedWriteAccess pWriteAccess(aNewBitmap);
-
- long nWidthBorder = nExtendSize + rSize.Width();
- long nHeightBorder = nExtendSize + rSize.Height();
-
- for (long y = 0; y < aNewSize.Height(); y++)
- {
- for (long x = 0; x < aNewSize.Width(); x++)
- {
- if (y < nExtendSize || y >= nHeightBorder
- || x < nExtendSize || x >= nWidthBorder)
- {
- pWriteAccess->SetPixel(y, x, aColor);
- }
- else
- {
- pWriteAccess->SetPixel(y, x, pReadAccess->GetPixel(y - nExtendSize, x - nExtendSize));
- }
- }
- }
- }
- rBitmap = aNewBitmap;
-}
-
-} // end anonymous namespace
-
-/**
- * Implementation of stack blur - a fast Gaussian blur approximation.
- * nRadius - blur radious, valid values are between 2 and 254
- * bExtend - extend the bitmap in all directions by the radius
- *
- * Stack Blur Algorithm by Mario Klingemann <mario at quasimondo.com>
- * (http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html)
- *
- * Additionally references and implementations:
- * - Blur.js by Jacob Kelley
- * (http://www.blurjs.com)
- * - BlurEffectForAndroidDesign by Nicolas Pomepuy
- * (https://github.com/PomepuyN/BlurEffectForAndroidDesign)
- * - StackBluriOS by Thomas Landspurg
- * (https://github.com/tomsoft1/StackBluriOS)
- * - stackblur.cpp by Benjamin Yates
- * (https://gist.github.com/benjamin9999/3809142)
- * - stack blur in fog 2D graphic library by Petr Kobalicek
- * (https://code.google.com/p/fog/)
- *
- */
-BitmapFilterStackBlur::BitmapFilterStackBlur(sal_Int32 nRadius, bool bExtend)
- : mnRadius(nRadius)
- , mbExtend(bExtend)
-{}
-
-BitmapFilterStackBlur::~BitmapFilterStackBlur()
-{}
-
-bool BitmapFilterStackBlur::filter(Bitmap& rBitmap)
-{
- sal_uLong nScanlineFormat;
- {
- Bitmap::ScopedReadAccess pReadAccess(rBitmap);
- nScanlineFormat = pReadAccess->GetScanlineFormat();
- }
-
- if (nScanlineFormat == BMP_FORMAT_24BIT_TC_RGB ||
- nScanlineFormat == BMP_FORMAT_24BIT_TC_BGR ||
- nScanlineFormat == BMP_FORMAT_32BIT_TC_MASK)
- {
- int nComponentWidth = (nScanlineFormat == BMP_FORMAT_32BIT_TC_MASK) ? 4 : 3;
-
- if (mbExtend)
- {
- centerExtendBitmap(rBitmap, mnRadius, COL_WHITE);
- }
-
- stackBlur24(rBitmap, mnRadius, nComponentWidth);
- }
- else if (nScanlineFormat == BMP_FORMAT_8BIT_PAL)
- {
- int nComponentWidth = 1;
-
- if (mbExtend)
- {
- centerExtendBitmap(rBitmap, mnRadius, COL_WHITE);
- }
-
- stackBlur8(rBitmap, mnRadius, nComponentWidth);
- }
-
- return true;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list