diff options
author | Christopher Sherlock <chris.sherlock79@gmail.com> | 2024-12-04 21:17:36 +1100 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2024-12-20 07:16:49 +0100 |
commit | 9efbc448876d92d24697fa0eddd4580dcdbb9672 (patch) | |
tree | 775f6e4fc923627076164964564bec0b5908a4d2 /vcl/source/bitmap/BitmapEx.cxx | |
parent | bb7baf41229f2ef6bc7e43a5355a7a32e3ff9276 (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.cxx | 119 |
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, |