include/vcl/BitmapTools.hxx | 2 svx/source/svdraw/svdfmtf.cxx | 83 -------------------------------------- vcl/source/bitmap/BitmapTools.cxx | 70 ++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 81 deletions(-)
New commits: commit 14d49662d32fa2fcf2916682dbf1f974a8eecb08 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Wed Mar 14 17:13:42 2018 +0200 move some GDI import code from svx to vcl part of making ScopedWriteAccess an internal detail of vcl Change-Id: I916f2ca05c9d7c17b62c91e113df6d8454bb4351 Reviewed-on: https://gerrit.libreoffice.org/51283 Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx index d7525869320f..7dde62788a53 100644 --- a/include/vcl/BitmapTools.hxx +++ b/include/vcl/BitmapTools.hxx @@ -92,6 +92,8 @@ VCL_DLLPUBLIC BitmapEx CanvasTransformBitmap( const BitmapEx& rBitmap, ::basegfx::B2DRectangle const & rDestRect, ::basegfx::B2DHomMatrix const & rLocalTransform ); +VCL_DLLPUBLIC void DrawAlphaBitmapAndAlphaGradient(BitmapEx & rBitmapEx, bool bFixedTransparence, float fTransparence, AlphaMask & rNewMask); + }} // end vcl::bitmap #endif // INCLUDED_VCL_BITMAP_TOOLS_HXX diff --git a/svx/source/svdraw/svdfmtf.cxx b/svx/source/svdraw/svdfmtf.cxx index 457095f6adc0..f3806362aba6 100644 --- a/svx/source/svdraw/svdfmtf.cxx +++ b/svx/source/svdraw/svdfmtf.cxx @@ -71,6 +71,7 @@ #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <svx/svditer.hxx> #include <svx/svdogrp.hxx> +#include <vcl/BitmapTools.hxx> using namespace com::sun::star; @@ -1557,87 +1558,7 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction const & rAct) } else { - // mix existing and new alpha mask - AlphaMask aOldMask; - - if(aBitmapEx.IsAlpha()) - { - aOldMask = aBitmapEx.GetAlpha(); - } - else if(TransparentType::Bitmap == aBitmapEx.GetTransparentType()) - { - aOldMask = aBitmapEx.GetMask(); - } - else if(TransparentType::Color == aBitmapEx.GetTransparentType()) - { - aOldMask = aBitmapEx.GetBitmap().CreateMask(aBitmapEx.GetTransparentColor()); - } - - AlphaMask::ScopedWriteAccess pOld(aOldMask); - - if(pOld) - { - const double fFactor(1.0 / 255.0); - - if(bFixedTransparence) - { - const double fOpNew(1.0 - fTransparence); - - for(long y(0); y < pOld->Height(); y++) - { - Scanline pScanline = pOld->GetScanline( y ); - for(long x(0); x < pOld->Width(); x++) - { - const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline, x) * fFactor)); - const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0)); - - pOld->SetPixelOnData(pScanline, x, BitmapColor(aCol)); - } - } - } - else - { - AlphaMask::ScopedReadAccess pNew(aNewMask); - - if(pNew) - { - if(pOld->Width() == pNew->Width() && pOld->Height() == pNew->Height()) - { - for(long y(0); y < pOld->Height(); y++) - { - Scanline pScanline = pOld->GetScanline( y ); - for(long x(0); x < pOld->Width(); x++) - { - const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline, x) * fFactor)); - const double fOpNew(1.0 - (pNew->GetIndexFromData(pScanline, x) * fFactor)); - const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0)); - - pOld->SetPixelOnData(pScanline, x, BitmapColor(aCol)); - } - } - } - else - { - OSL_ENSURE(false, "Alpha masks have different sizes (!)"); - } - - pNew.reset(); - } - else - { - OSL_ENSURE(false, "Got no access to new alpha mask (!)"); - } - } - - pOld.reset(); - } - else - { - OSL_ENSURE(false, "Got no access to old alpha mask (!)"); - } - - // apply combined bitmap as mask - aBitmapEx = BitmapEx(aBitmapEx.GetBitmap(), aOldMask); + vcl::bitmap::DrawAlphaBitmapAndAlphaGradient(aBitmapEx, bFixedTransparence, fTransparence, aNewMask); } } diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index 6e1ed624a049..f29989b9cab2 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -467,6 +467,76 @@ BitmapEx CanvasTransformBitmap( const BitmapEx& rBitmap, } +void DrawAlphaBitmapAndAlphaGradient(BitmapEx & rBitmapEx, bool bFixedTransparence, float fTransparence, AlphaMask & rNewMask) +{ + // mix existing and new alpha mask + AlphaMask aOldMask; + + if(rBitmapEx.IsAlpha()) + { + aOldMask = rBitmapEx.GetAlpha(); + } + else if(TransparentType::Bitmap == rBitmapEx.GetTransparentType()) + { + aOldMask = rBitmapEx.GetMask(); + } + else if(TransparentType::Color == rBitmapEx.GetTransparentType()) + { + aOldMask = rBitmapEx.GetBitmap().CreateMask(rBitmapEx.GetTransparentColor()); + } + + { + AlphaMask::ScopedWriteAccess pOld(aOldMask); + + assert(pOld && "Got no access to old alpha mask (!)"); + + const double fFactor(1.0 / 255.0); + + if(bFixedTransparence) + { + const double fOpNew(1.0 - fTransparence); + + for(long y(0); y < pOld->Height(); y++) + { + Scanline pScanline = pOld->GetScanline( y ); + for(long x(0); x < pOld->Width(); x++) + { + const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline, x) * fFactor)); + const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0)); + + pOld->SetPixelOnData(pScanline, x, BitmapColor(aCol)); + } + } + } + else + { + AlphaMask::ScopedReadAccess pNew(rNewMask); + + assert(pNew && "Got no access to new alpha mask (!)"); + + assert(pOld->Width() == pNew->Width() && pOld->Height() == pNew->Height() && + "Alpha masks have different sizes (!)"); + + for(long y(0); y < pOld->Height(); y++) + { + Scanline pScanline = pOld->GetScanline( y ); + for(long x(0); x < pOld->Width(); x++) + { + const double fOpOld(1.0 - (pOld->GetIndexFromData(pScanline, x) * fFactor)); + const double fOpNew(1.0 - (pNew->GetIndexFromData(pScanline, x) * fFactor)); + const sal_uInt8 aCol(basegfx::fround((1.0 - (fOpOld * fOpNew)) * 255.0)); + + pOld->SetPixelOnData(pScanline, x, BitmapColor(aCol)); + } + } + } + + } + + // apply combined bitmap as mask + rBitmapEx = BitmapEx(rBitmapEx.GetBitmap(), aOldMask); +} + }} // end vcl::bitmap /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits