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;

Reply via email to