vcl/headless/CairoCommon.cxx | 35 ++++++++++++++++++++++++ vcl/headless/SvpGraphicsBackend.cxx | 29 ++----------------- vcl/inc/headless/CairoCommon.hxx | 6 ++++ vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx | 14 +++++++++ vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx | 3 ++ vcl/unx/generic/gdi/gdiimpl.cxx | 5 --- vcl/unx/generic/gdi/gdiimpl.hxx | 1 7 files changed, 62 insertions(+), 31 deletions(-)
New commits: commit dcde0b2e640c0fe36dceb49bfed5426842a6fa0a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jan 2 21:29:01 2023 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Wed Jan 4 19:25:42 2023 +0000 move implDrawGradient into CairoCommon and reuse from X11CairoSalGraphicsImpl Change-Id: I341e0b1e3cccd18193c3f9798b875a709fe4871f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144975 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx index b79d942709b6..cfd463da41e3 100644 --- a/vcl/headless/CairoCommon.cxx +++ b/vcl/headless/CairoCommon.cxx @@ -20,6 +20,7 @@ #include <headless/CairoCommon.hxx> #include <dlfcn.h> #include <vcl/BitmapTools.hxx> +#include <SalGradient.hxx> #include <svdata.hxx> #include <tools/helpers.hxx> #include <basegfx/utils/canvastools.hxx> @@ -887,6 +888,40 @@ bool CairoCommon::drawPolyLine(cairo_t* cr, basegfx::B2DRange* pExtents, const C return true; } +bool CairoCommon::implDrawGradient(cairo_t* cr, basegfx::B2DRange* pExtents, bool bAntiAlias, + basegfx::B2DPolyPolygon const& rPolyPolygon, + SalGradient const& rGradient) +{ + basegfx::B2DHomMatrix rObjectToDevice; + + for (auto const& rPolygon : rPolyPolygon) + AddPolygonToPath(cr, rPolygon, rObjectToDevice, !bAntiAlias, false); + + cairo_pattern_t* pattern + = cairo_pattern_create_linear(rGradient.maPoint1.getX(), rGradient.maPoint1.getY(), + rGradient.maPoint2.getX(), rGradient.maPoint2.getY()); + + for (SalGradientStop const& rStop : rGradient.maStops) + { + double r = rStop.maColor.GetRed() / 255.0; + double g = rStop.maColor.GetGreen() / 255.0; + double b = rStop.maColor.GetBlue() / 255.0; + double a = rStop.maColor.GetAlpha() / 255.0; + double offset = rStop.mfOffset; + + cairo_pattern_add_color_stop_rgba(pattern, offset, r, g, b, a); + } + cairo_set_source(cr, pattern); + cairo_pattern_destroy(pattern); + + if (pExtents) + *pExtents = getClippedFillDamage(cr); + + cairo_fill_preserve(cr); + + return true; +} + namespace { basegfx::B2DRange renderWithOperator(cairo_t* cr, const SalTwoRect& rTR, cairo_surface_t* source, diff --git a/vcl/headless/SvpGraphicsBackend.cxx b/vcl/headless/SvpGraphicsBackend.cxx index 63e66d9a31e2..6f527f350760 100644 --- a/vcl/headless/SvpGraphicsBackend.cxx +++ b/vcl/headless/SvpGraphicsBackend.cxx @@ -959,36 +959,15 @@ bool SvpGraphicsBackend::implDrawGradient(basegfx::B2DPolyPolygon const& rPolyPo SalGradient const& rGradient) { cairo_t* cr = m_rCairoCommon.getCairoContext(true, getAntiAlias()); + basegfx::B2DRange extents; m_rCairoCommon.clipRegion(cr); - basegfx::B2DHomMatrix rObjectToDevice; - - for (auto const& rPolygon : rPolyPolygon) - AddPolygonToPath(cr, rPolygon, rObjectToDevice, !getAntiAlias(), false); - - cairo_pattern_t* pattern - = cairo_pattern_create_linear(rGradient.maPoint1.getX(), rGradient.maPoint1.getY(), - rGradient.maPoint2.getX(), rGradient.maPoint2.getY()); - - for (SalGradientStop const& rStop : rGradient.maStops) - { - double r = rStop.maColor.GetRed() / 255.0; - double g = rStop.maColor.GetGreen() / 255.0; - double b = rStop.maColor.GetBlue() / 255.0; - double a = rStop.maColor.GetAlpha() / 255.0; - double offset = rStop.mfOffset; - - cairo_pattern_add_color_stop_rgba(pattern, offset, r, g, b, a); - } - cairo_set_source(cr, pattern); - cairo_pattern_destroy(pattern); - - basegfx::B2DRange extents = getClippedFillDamage(cr); - cairo_fill_preserve(cr); + bool bRetVal( + CairoCommon::implDrawGradient(cr, &extents, getAntiAlias(), rPolyPolygon, rGradient)); m_rCairoCommon.releaseCairoContext(cr, true, extents); - return true; + return bRetVal; } bool SvpGraphicsBackend::supportsOperation(OutDevSupportType eType) const diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx index e232d2167380..dfee58b1a9f2 100644 --- a/vcl/inc/headless/CairoCommon.hxx +++ b/vcl/inc/headless/CairoCommon.hxx @@ -45,6 +45,8 @@ typedef struct _cairo cairo_t; typedef struct _cairo_surface cairo_surface_t; typedef struct _cairo_user_data_key cairo_user_data_key_t; +struct SalGradient; + VCL_DLLPUBLIC void dl_cairo_surface_set_device_scale(cairo_surface_t* surface, double x_scale, double y_scale); VCL_DLLPUBLIC void dl_cairo_surface_get_device_scale(cairo_surface_t* surface, double* x_scale, @@ -159,6 +161,10 @@ struct VCL_DLLPUBLIC CairoCommon basegfx::B2DLineJoin eLineJoin, css::drawing::LineCap eLineCap, double fMiterMinimumAngle, bool bPixelSnapHairline); + static bool implDrawGradient(cairo_t* cr, basegfx::B2DRange* pExtents, bool bAntiAlias, + basegfx::B2DPolyPolygon const& rPolyPolygon, + SalGradient const& rGradient); + void copyWithOperator(const SalTwoRect& rTR, cairo_surface_t* source, cairo_operator_t eOp, bool bAntiAlias); diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx index a4ea13a63079..702e9a9d298e 100644 --- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx +++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx @@ -151,6 +151,20 @@ bool X11CairoSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectT return bRetval; } +bool X11CairoSalGraphicsImpl::implDrawGradient(basegfx::B2DPolyPolygon const& rPolyPolygon, + SalGradient const& rGradient) +{ + cairo_t* cr = mrX11Common.getCairoContext(); + clipRegion(cr); + + const bool bRetval( + CairoCommon::implDrawGradient(cr, nullptr, getAntiAlias(), rPolyPolygon, rGradient)); + + X11Common::releaseCairoContext(cr); + + return bRetval; +} + bool X11CairoSalGraphicsImpl::supportsOperation(OutDevSupportType eType) const { return CairoCommon::supportsOperation(eType); diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx index ae47dc061ae0..20b92ad8bc55 100644 --- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx +++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx @@ -86,6 +86,9 @@ public: css::drawing::LineCap eLineCap, double fMiterMinimumAngle, bool bPixelSnapHairline) override; + bool implDrawGradient(basegfx::B2DPolyPolygon const& rPolyPolygon, + SalGradient const& rGradient) override; + virtual bool supportsOperation(OutDevSupportType eType) const override; }; diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx index 0300a646e352..2bc3bef2eadb 100644 --- a/vcl/unx/generic/gdi/gdiimpl.cxx +++ b/vcl/unx/generic/gdi/gdiimpl.cxx @@ -1979,9 +1979,4 @@ bool X11SalGraphicsImpl::drawGradient(const tools::PolyPolygon& /*rPolygon*/, co return false; } -bool X11SalGraphicsImpl::implDrawGradient(basegfx::B2DPolyPolygon const & /*rPolyPolygon*/, SalGradient const & /*rGradient*/) -{ - return false; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx index 48cde6330041..a57298412752 100644 --- a/vcl/unx/generic/gdi/gdiimpl.hxx +++ b/vcl/unx/generic/gdi/gdiimpl.hxx @@ -286,7 +286,6 @@ public: sal_uInt8 nTransparency ) override; virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) override; - virtual bool implDrawGradient(basegfx::B2DPolyPolygon const & rPolyPolygon, SalGradient const & rGradient) override; public: void Init() override;