summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drawinglayer/source/processor2d/vclpixelprocessor2d.cxx53
-rw-r--r--drawinglayer/source/processor2d/vclpixelprocessor2d.hxx2
2 files changed, 55 insertions, 0 deletions
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 <drawinglayer/primitive2d/fillhatchprimitive2d.hxx>
#include <drawinglayer/primitive2d/epsprimitive2d.hxx>
#include <drawinglayer/primitive2d/softedgeprimitive2d.hxx>
+#include <drawinglayer/primitive2d/shadowprimitive2d.hxx>
#include <com/sun/star/awt/XWindow2.hpp>
#include <com/sun/star/awt/XControl.hpp>
@@ -392,6 +393,12 @@ void VclPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitiv
static_cast<const drawinglayer::primitive2d::SoftEdgePrimitive2D&>(rCandidate));
break;
}
+ case PRIMITIVE2D_ID_SHADOWPRIMITIVE2D:
+ {
+ processShadowPrimitive2D(
+ static_cast<const drawinglayer::primitive2d::ShadowPrimitive2D&>(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<long>(std::floor(aRange.getMinX())),
+ static_cast<long>(std::floor(aRange.getMinY())),
+ static_cast<long>(std::ceil(aRange.getMaxX())),
+ static_cast<long>(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