From b435c4fe82e77a82fde6464d6722281e5fc4f394 Mon Sep 17 00:00:00 2001 From: A_GAN Date: Mon, 8 Jun 2020 21:36:34 +0200 Subject: Add process function to create the blur shadow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create processShadowPrimitive2D function which uses the blur radius from the shadow primitive to generate mask for the shadow bitmap. Change-Id: Iba86bdbe1728153d866dd559a1b12eb5570ced51 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95859 Tested-by: Jenkins Reviewed-by: Mike Kaganski Reviewed-by: Tomaž Vajngerl --- .../source/processor2d/vclpixelprocessor2d.cxx | 53 ++++++++++++++++++++++ .../source/processor2d/vclpixelprocessor2d.hxx | 2 + 2 files changed, 55 insertions(+) diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx index 3a57695f81e0..864f5ca107b6 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -392,6 +393,12 @@ void VclPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitiv static_cast(rCandidate)); break; } + case PRIMITIVE2D_ID_SHADOWPRIMITIVE2D: + { + processShadowPrimitive2D( + static_cast(rCandidate)); + break; + } default: { SAL_INFO("drawinglayer", "default case for " << drawinglayer::primitive2d::idToString( @@ -1067,6 +1074,52 @@ void VclPixelProcessor2D::processSoftEdgePrimitive2D( SAL_WARN("drawinglayer", "Temporary buffered virtual device is not visible"); } +void VclPixelProcessor2D::processShadowPrimitive2D(const primitive2d::ShadowPrimitive2D& rCandidate) +{ + if (rCandidate.getShadowBlur() == 0) + { + process(rCandidate); + return; + } + + basegfx::B2DRange aRange(rCandidate.getB2DRange(getViewInformation2D())); + aRange.transform(maCurrentTransformation); + basegfx::B2DVector aBlurRadiusVector(rCandidate.getShadowBlur(), 0); + aBlurRadiusVector *= maCurrentTransformation; + const double fBlurRadius = aBlurRadiusVector.getLength(); + + impBufferDevice aBufferDevice(*mpOutputDevice, aRange, true); + if (aBufferDevice.isVisible()) + { + OutputDevice* pLastOutputDevice = mpOutputDevice; + mpOutputDevice = &aBufferDevice.getContent(); + mpOutputDevice->Erase(); + + process(rCandidate); + + const tools::Rectangle aRect(static_cast(std::floor(aRange.getMinX())), + static_cast(std::floor(aRange.getMinY())), + static_cast(std::ceil(aRange.getMaxX())), + static_cast(std::ceil(aRange.getMaxY()))); + + BitmapEx bitmapEx = mpOutputDevice->GetBitmapEx(aRect.TopLeft(), aRect.GetSize()); + + AlphaMask mask = ProcessAndBlurAlphaMask(bitmapEx.GetAlpha(), 0, fBlurRadius, 0); + + const basegfx::BColor aShadowColor( + maBColorModifierStack.getModifiedColor(rCandidate.getShadowColor())); + + Bitmap bitmap = bitmapEx.GetBitmap(); + bitmap.Erase(Color(aShadowColor)); + BitmapEx result(bitmap, mask); + + mpOutputDevice = pLastOutputDevice; + mpOutputDevice->DrawBitmapEx(aRect.TopLeft(), result); + } + else + SAL_WARN("drawinglayer", "Temporary buffered virtual device is not visible"); +} + } // end of namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx index e78d1f08225a..5a23499f9a9b 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx @@ -40,6 +40,7 @@ class FillHatchPrimitive2D; class BackgroundColorPrimitive2D; class BorderLinePrimitive2D; class GlowPrimitive2D; +class ShadowPrimitive2D; class SoftEdgePrimitive2D; } @@ -97,6 +98,7 @@ class VclPixelProcessor2D final : public VclProcessor2D void processMetaFilePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate); void processGlowPrimitive2D(const primitive2d::GlowPrimitive2D& rCandidate); void processSoftEdgePrimitive2D(const primitive2d::SoftEdgePrimitive2D& rCandidate); + void processShadowPrimitive2D(const primitive2d::ShadowPrimitive2D& rCandidate); public: /// constructor/destructor -- cgit v1.2.3