desktop/source/lib/init.cxx | 27 ++------------------------- include/vcl/BitmapTools.hxx | 2 ++ vcl/source/bitmap/BitmapTools.cxx | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 25 deletions(-)
New commits: commit df19cc6cddc794eb6e289831707e690bd01eb227 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Wed Aug 7 13:31:50 2024 +0200 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Aug 15 08:09:55 2024 +0200 vcl: add "fillWithData" function to BitmapTools - used in lok Change-Id: Ia143a39d2285bbdebf7fcfe709b0c6418d35585c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171589 Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> Tested-by: Jenkins diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 71f27c395d33..1857275268b1 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -172,7 +172,7 @@ #include <vcl/ITiledRenderable.hxx> #include <vcl/dialoghelper.hxx> #ifdef _WIN32 -#include <vcl/BitmapReadAccess.hxx> +#include <vcl/BitmapTools.hxx> #endif #include <unicode/uchar.h> #include <unotools/securityoptions.hxx> @@ -4391,30 +4391,7 @@ static void doc_paintTile(LibreOfficeKitDocument* pThis, // pBuffer was not used there pDevice->EnableMapMode(false); BitmapEx aBmpEx = pDevice->GetBitmapEx({ 0, 0 }, { nCanvasWidth, nCanvasHeight }); - Bitmap aBmp = aBmpEx.GetBitmap(); - AlphaMask aAlpha = aBmpEx.GetAlphaMask(); - BitmapScopedReadAccess sraBmp(aBmp); - BitmapScopedReadAccess sraAlpha(aAlpha); - - assert(sraBmp->Height() == nCanvasHeight); - assert(sraBmp->Width() == nCanvasWidth); - assert(!sraAlpha || sraBmp->Height() == sraAlpha->Height()); - assert(!sraAlpha || sraBmp->Width() == sraAlpha->Width()); - auto p = pBuffer; - for (tools::Long y = 0; y < sraBmp->Height(); ++y) - { - Scanline dataBmp = sraBmp->GetScanline(y); - Scanline dataAlpha = sraAlpha ? sraAlpha->GetScanline(y) : nullptr; - for (tools::Long x = 0; x < sraBmp->Width(); ++x) - { - BitmapColor color = sraBmp->GetPixelFromData(dataBmp, x); - sal_uInt8 alpha = dataAlpha ? sraAlpha->GetPixelFromData(dataAlpha, x).GetBlue() : 255; - *p++ = color.GetBlue(); - *p++ = color.GetGreen(); - *p++ = color.GetRed(); - *p++ = alpha; - } - } + vcl::bitmap::fillWithData(pBuffer, aBmpEx); #endif #endif diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx index 83c003296d61..5e5a48ad6fae 100644 --- a/include/vcl/BitmapTools.hxx +++ b/include/vcl/BitmapTools.hxx @@ -55,6 +55,8 @@ BitmapEx VCL_DLLPUBLIC CreateFromData(sal_uInt8 const *pData, sal_Int8 nBitsPerPixel, bool bReversColors = false, bool bReverseAlpha = false); +void VCL_DLLPUBLIC fillWithData(sal_uInt8* pData, BitmapEx const& rBitmapEx); + BitmapEx VCL_DLLPUBLIC CreateFromData( RawBitmap && data ); #if ENABLE_CAIRO_CANVAS diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index 060f391f3e18..3fa06d54019a 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -287,6 +287,36 @@ BitmapEx CreateFromData( RawBitmap&& rawBitmap ) return BitmapEx(aBmp); } +void fillWithData(sal_uInt8* pData, BitmapEx const& rBitmapEx) +{ + Bitmap aBitmap = rBitmapEx.GetBitmap(); + AlphaMask aAlphaMask = rBitmapEx.GetAlphaMask(); + BitmapScopedReadAccess aReadAccessBitmap(aBitmap); + BitmapScopedReadAccess aReadAccessAlpha(aAlphaMask); + + assert(!aReadAccessAlpha || aReadAccessBitmap->Height() == aReadAccessAlpha->Height()); + assert(!aReadAccessAlpha || aReadAccessBitmap->Width() == aReadAccessAlpha->Width()); + + sal_uInt8* p = pData; + + for (tools::Long y = 0; y < aReadAccessBitmap->Height(); ++y) + { + Scanline dataBitmap = aReadAccessBitmap->GetScanline(y); + Scanline dataAlpha = aReadAccessAlpha ? aReadAccessAlpha->GetScanline(y) : nullptr; + + for (tools::Long x = 0; x < aReadAccessBitmap->Width(); ++x) + { + BitmapColor aColor = aReadAccessBitmap->GetPixelFromData(dataBitmap, x); + sal_uInt8 aAlpha = dataAlpha ? aReadAccessAlpha->GetPixelFromData(dataAlpha, x).GetBlue() : 255; + *p++ = aColor.GetBlue(); + *p++ = aColor.GetGreen(); + *p++ = aColor.GetRed(); + *p++ = aAlpha; + } + } +} + + #if ENABLE_CAIRO_CANVAS BitmapEx* CreateFromCairoSurface(Size aSize, cairo_surface_t * pSurface) {