diff options
Diffstat (limited to 'drawinglayer')
-rw-r--r-- | drawinglayer/source/processor2d/vclpixelprocessor2d.cxx | 71 | ||||
-rw-r--r-- | drawinglayer/source/processor2d/vclpixelprocessor2d.hxx | 2 |
2 files changed, 73 insertions, 0 deletions
diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx index 716c23028ba6..4314c656c389 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx @@ -53,6 +53,7 @@ #include <drawinglayer/primitive2d/wrongspellprimitive2d.hxx> #include <drawinglayer/primitive2d/controlprimitive2d.hxx> #include <drawinglayer/primitive2d/borderlineprimitive2d.hxx> +#include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx> #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx> #include <drawinglayer/primitive2d/pagepreviewprimitive2d.hxx> #include <drawinglayer/primitive2d/backgroundcolorprimitive2d.hxx> @@ -66,6 +67,13 @@ #include <com/sun/star/awt/XWindow2.hpp> #include <com/sun/star/awt/XControl.hpp> +#include <vcl/window.hxx> +#include <vcl/gradient.hxx> +#include <svtools/borderhelper.hxx> +#include <editeng/borderline.hxx> + +#include <com/sun/star/table/BorderLineStyle.hpp> + using namespace com::sun::star; namespace drawinglayer::processor2d @@ -198,6 +206,30 @@ bool VclPixelProcessor2D::tryDrawPolygonStrokePrimitive2DDirect( /* false bBypassAACheck, default*/); } +namespace +{ +GradientStyle convertGradientStyle(drawinglayer::attribute::GradientStyle eGradientStyle) +{ + switch (eGradientStyle) + { + case drawinglayer::attribute::GradientStyle::Axial: + return GradientStyle::Axial; + case drawinglayer::attribute::GradientStyle::Radial: + return GradientStyle::Radial; + case drawinglayer::attribute::GradientStyle::Elliptical: + return GradientStyle::Elliptical; + case drawinglayer::attribute::GradientStyle::Square: + return GradientStyle::Square; + case drawinglayer::attribute::GradientStyle::Rect: + return GradientStyle::Rect; + case drawinglayer::attribute::GradientStyle::Linear: + default: + return GradientStyle::Linear; + } +} + +} // end anonymous namespace + void VclPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate) { switch (rCandidate.getPrimitive2DID()) @@ -400,6 +432,12 @@ void VclPixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitiv static_cast<const drawinglayer::primitive2d::ShadowPrimitive2D&>(rCandidate)); break; } + case PRIMITIVE2D_ID_FILLGRADIENTPRIMITIVE2D: + { + processFillGradientPrimitive2D( + static_cast<const drawinglayer::primitive2d::FillGradientPrimitive2D&>(rCandidate)); + break; + } default: { SAL_INFO("drawinglayer", "default case for " << drawinglayer::primitive2d::idToString( @@ -1141,6 +1179,39 @@ void VclPixelProcessor2D::processShadowPrimitive2D(const primitive2d::ShadowPrim SAL_WARN("drawinglayer", "Temporary buffered virtual device is not visible"); } +void VclPixelProcessor2D::processFillGradientPrimitive2D( + const primitive2d::FillGradientPrimitive2D& rPrimitive) +{ + const attribute::FillGradientAttribute& rFillGradient = rPrimitive.getFillGradient(); + + if (rFillGradient.getSteps() > 0 + || rFillGradient.getStyle() != drawinglayer::attribute::GradientStyle::Linear) + { + process(rPrimitive); + return; + } + + GradientStyle eGradientStyle = convertGradientStyle(rFillGradient.getStyle()); + + basegfx::B2DRange aRange(rPrimitive.getOutputRange()); + aRange.transform(maCurrentTransformation); + + const tools::Rectangle aRectangle( + sal_Int32(std::floor(aRange.getMinX())), sal_Int32(std::floor(aRange.getMinY())), + sal_Int32(std::ceil(aRange.getMaxX())), sal_Int32(std::ceil(aRange.getMaxY()))); + + Gradient aGradient(eGradientStyle, Color(rFillGradient.getStartColor()), + Color(rFillGradient.getEndColor())); + + aGradient.SetAngle(rFillGradient.getAngle() / F_PI1800); + aGradient.SetBorder(rFillGradient.getBorder() * 100); + aGradient.SetOfsX(rFillGradient.getOffsetX() * 100.0); + aGradient.SetOfsY(rFillGradient.getOffsetY() * 100.0); + aGradient.SetSteps(rFillGradient.getSteps()); + + mpOutputDevice->DrawGradient(aRectangle, aGradient); +} + } // 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 c3bd19141669..480fdcaa6e18 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.hxx @@ -42,6 +42,7 @@ class BorderLinePrimitive2D; class GlowPrimitive2D; class ShadowPrimitive2D; class SoftEdgePrimitive2D; +class FillGradientPrimitive2D; } namespace drawinglayer::processor2d @@ -99,6 +100,7 @@ class VclPixelProcessor2D final : public VclProcessor2D void processGlowPrimitive2D(const primitive2d::GlowPrimitive2D& rCandidate); void processSoftEdgePrimitive2D(const primitive2d::SoftEdgePrimitive2D& rCandidate); void processShadowPrimitive2D(const primitive2d::ShadowPrimitive2D& rCandidate); + void processFillGradientPrimitive2D(const primitive2d::FillGradientPrimitive2D& rPrimitive); public: /// constructor/destructor |