summaryrefslogtreecommitdiff
path: root/vcl/source/bitmap/BitmapEx.cxx
diff options
context:
space:
mode:
authorChristopher Sherlock <chris.sherlock79@gmail.com>2024-12-04 21:17:36 +1100
committerMichael Weghorn <m.weghorn@posteo.de>2024-12-20 07:16:49 +0100
commit9efbc448876d92d24697fa0eddd4580dcdbb9672 (patch)
tree775f6e4fc923627076164964564bec0b5908a4d2 /vcl/source/bitmap/BitmapEx.cxx
parentbb7baf41229f2ef6bc7e43a5355a7a32e3ff9276 (diff)
vcl: BlendFrameCache refactor
- split off BlendFrameCache.hxx to own header - move functionality into constructor Much of the functionality in createAlphaBlendFrame() just updates the BlendFrameCache's bitmap frame. Really, this should be done when a BlendFrameCache is instantiated, so functionality has been moved out of createAlphaBlendFrame() and into the BlendFrameCache constructor. Change-Id: Ia53a6f1c058ccb5f0ee4314b7a6e0b02ad7db376 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177802 Reviewed-by: Michael Weghorn <m.weghorn@posteo.de> Tested-by: Jenkins
Diffstat (limited to 'vcl/source/bitmap/BitmapEx.cxx')
-rw-r--r--vcl/source/bitmap/BitmapEx.cxx119
1 files changed, 11 insertions, 108 deletions
diff --git a/vcl/source/bitmap/BitmapEx.cxx b/vcl/source/bitmap/BitmapEx.cxx
index d20954b270dc..0d734eaa1831 100644
--- a/vcl/source/bitmap/BitmapEx.cxx
+++ b/vcl/source/bitmap/BitmapEx.cxx
@@ -40,6 +40,7 @@
#include <svdata.hxx>
#include <vcl/BitmapWriteAccess.hxx>
#include <bitmap/BitmapMaskToAlphaFilter.hxx>
+#include <bitmap/BlendFrameCache.hxx>
#include <o3tl/any.hxx>
#include <tools/stream.hxx>
@@ -1056,7 +1057,14 @@ BitmapEx createAlphaBlendFrame(
const Color& rColorBottomRight,
const Color& rColorBottomLeft)
{
- BlendFrameCache* pBlendFrameCache = ImplGetBlendFrameCache();
+ ImplSVData* pSVData = ImplGetSVData();
+ if (!pSVData->mpBlendFrameCache)
+ {
+ pSVData->mpBlendFrameCache.reset(new BlendFrameCache(rSize, nAlpha, rColorTopLeft, rColorTopRight, rColorBottomRight, rColorBottomLeft));
+ return pSVData->mpBlendFrameCache->m_aLastResult;
+ }
+
+ BlendFrameCache* pBlendFrameCache = pSVData->mpBlendFrameCache.get();
if(pBlendFrameCache->m_aLastSize == rSize
&& pBlendFrameCache->m_nLastAlpha == nAlpha
@@ -1068,113 +1076,8 @@ BitmapEx createAlphaBlendFrame(
return pBlendFrameCache->m_aLastResult;
}
- pBlendFrameCache->m_aLastSize = rSize;
- pBlendFrameCache->m_nLastAlpha = nAlpha;
- pBlendFrameCache->m_aLastColorTopLeft = rColorTopLeft;
- pBlendFrameCache->m_aLastColorTopRight = rColorTopRight;
- pBlendFrameCache->m_aLastColorBottomRight = rColorBottomRight;
- pBlendFrameCache->m_aLastColorBottomLeft = rColorBottomLeft;
- pBlendFrameCache->m_aLastResult.Clear();
-
- const tools::Long nW(rSize.Width());
- const tools::Long nH(rSize.Height());
-
- if(nW > 1 && nH > 1)
- {
- sal_uInt8 aEraseTrans(0xff);
- Bitmap aContent(rSize, vcl::PixelFormat::N24_BPP);
- AlphaMask aAlpha(rSize, &aEraseTrans);
-
- aContent.Erase(COL_BLACK);
-
- BitmapScopedWriteAccess pContent(aContent);
- BitmapScopedWriteAccess pAlpha(aAlpha);
-
- if(pContent && pAlpha)
- {
- tools::Long x(0);
- tools::Long y(0);
- Scanline pScanContent = pContent->GetScanline( 0 );
- Scanline pScanAlpha = pContent->GetScanline( 0 );
-
- // x == 0, y == 0, top-left corner
- pContent->SetPixelOnData(pScanContent, 0, rColorTopLeft);
- pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha));
-
- // y == 0, top line left to right
- for(x = 1; x < nW - 1; x++)
- {
- Color aMix(rColorTopLeft);
-
- aMix.Merge(rColorTopRight, 255 - sal_uInt8((x * 255) / nW));
- pContent->SetPixelOnData(pScanContent, x, aMix);
- pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha));
- }
-
- // x == nW - 1, y == 0, top-right corner
- // #i123690# Caution! When nW is 1, x == nW is possible (!)
- if(x < nW)
- {
- pContent->SetPixelOnData(pScanContent, x, rColorTopRight);
- pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha));
- }
-
- // x == 0 and nW - 1, left and right line top-down
- for(y = 1; y < nH - 1; y++)
- {
- pScanContent = pContent->GetScanline( y );
- pScanAlpha = pContent->GetScanline( y );
- Color aMixA(rColorTopLeft);
-
- aMixA.Merge(rColorBottomLeft, 255 - sal_uInt8((y * 255) / nH));
- pContent->SetPixelOnData(pScanContent, 0, aMixA);
- pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha));
-
- // #i123690# Caution! When nW is 1, x == nW is possible (!)
- if(x < nW)
- {
- Color aMixB(rColorTopRight);
-
- aMixB.Merge(rColorBottomRight, 255 - sal_uInt8((y * 255) / nH));
- pContent->SetPixelOnData(pScanContent, x, aMixB);
- pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha));
- }
- }
-
- // #i123690# Caution! When nH is 1, y == nH is possible (!)
- if(y < nH)
- {
- // x == 0, y == nH - 1, bottom-left corner
- pContent->SetPixelOnData(pScanContent, 0, rColorBottomLeft);
- pAlpha->SetPixelOnData(pScanAlpha, 0, BitmapColor(nAlpha));
-
- // y == nH - 1, bottom line left to right
- for(x = 1; x < nW - 1; x++)
- {
- Color aMix(rColorBottomLeft);
-
- aMix.Merge(rColorBottomRight, 255 - sal_uInt8(((x - 0)* 255) / nW));
- pContent->SetPixelOnData(pScanContent, x, aMix);
- pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha));
- }
-
- // x == nW - 1, y == nH - 1, bottom-right corner
- // #i123690# Caution! When nW is 1, x == nW is possible (!)
- if(x < nW)
- {
- pContent->SetPixelOnData(pScanContent, x, rColorBottomRight);
- pAlpha->SetPixelOnData(pScanAlpha, x, BitmapColor(nAlpha));
- }
- }
-
- pContent.reset();
- pAlpha.reset();
-
- pBlendFrameCache->m_aLastResult = BitmapEx(aContent, aAlpha);
- }
- }
-
- return pBlendFrameCache->m_aLastResult;
+ pSVData->mpBlendFrameCache.reset(new BlendFrameCache(rSize, nAlpha, rColorTopLeft, rColorTopRight, rColorBottomRight, rColorBottomLeft));
+ return pSVData->mpBlendFrameCache->m_aLastResult;
}
void BitmapEx::Replace(const Color& rSearchColor,