vcl/headless/CairoCommon.cxx                    |   49 ++++++++++++++
 vcl/headless/SvpGraphicsBackend.cxx             |   79 +-----------------------
 vcl/inc/headless/CairoCommon.hxx                |    5 +
 vcl/inc/headless/SvpGraphicsBackend.hxx         |    3 
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx |   12 +++
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx |    2 
 vcl/unx/generic/gdi/gdiimpl.cxx                 |   17 -----
 vcl/unx/generic/gdi/gdiimpl.hxx                 |    2 
 8 files changed, 74 insertions(+), 95 deletions(-)

New commits:
commit b3566864db77effddb243717dd0d9a1c791383e6
Author:     Caolán McNamara <[email protected]>
AuthorDate: Fri Jan 6 09:43:21 2023 +0000
Commit:     Caolán McNamara <[email protected]>
CommitDate: Sat Jan 7 10:56:03 2023 +0000

    move drawRect into CairoCommon and reuse from X11CairoSalGraphicsImpl
    
    Change-Id: I1d9f1dc96788530eb6a226a53a67764918348100
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145139
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index 56293738d508..8ea358cbdc34 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -687,6 +687,55 @@ void CairoCommon::drawLine(cairo_t* cr, basegfx::B2DRange* 
pExtents, const Color
     cairo_stroke(cr);
 }
 
+void CairoCommon::drawRect(cairo_t* cr, basegfx::B2DRange* pExtents,
+                           const std::optional<Color>& rLineColor,
+                           const std::optional<Color>& rFillColor, bool 
bAntiAlias, double nX,
+                           double nY, double nWidth, double nHeight)
+{
+    // fast path for the common case of simply creating a solid block of color
+    if (rFillColor && rLineColor && rFillColor == rLineColor)
+    {
+        double fTransparency = 0;
+        // don't bother trying to draw stuff which is effectively invisible
+        if (nWidth < 0.1 || nHeight < 0.1)
+            return;
+        bool bPixelSnap = !bAntiAlias;
+        if (bPixelSnap)
+        {
+            // snap by rounding
+            nX = basegfx::fround(nX);
+            nY = basegfx::fround(nY);
+            nWidth = basegfx::fround(nWidth);
+            nHeight = basegfx::fround(nHeight);
+        }
+        cairo_rectangle(cr, nX, nY, nWidth, nHeight);
+        CairoCommon::applyColor(cr, *rFillColor, fTransparency);
+        if (pExtents)
+        {
+            // Get FillDamage
+            *pExtents = getClippedFillDamage(cr);
+        }
+        cairo_fill(cr);
+        return;
+    }
+    // because of the -1 hack we have to do fill and draw separately
+    if (rFillColor)
+    {
+        basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(
+            basegfx::B2DRectangle(nX, nY, nX + nWidth, nY + nHeight));
+        drawPolyPolygon(cr, pExtents, std::nullopt, rFillColor, bAntiAlias, 
basegfx::B2DHomMatrix(),
+                        basegfx::B2DPolyPolygon(aRect), 0.0);
+    }
+    if (rLineColor)
+    {
+        // need same -1 hack as X11SalGraphicsImpl::drawRect
+        basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(
+            basegfx::B2DRectangle(nX, nY, nX + nWidth - 1, nY + nHeight - 1));
+        drawPolyPolygon(cr, pExtents, rLineColor, std::nullopt, bAntiAlias, 
basegfx::B2DHomMatrix(),
+                        basegfx::B2DPolyPolygon(aRect), 0.0);
+    }
+}
+
 void CairoCommon::drawPolygon(cairo_t* cr, basegfx::B2DRange* pExtents,
                               const std::optional<Color>& rLineColor,
                               const std::optional<Color>& rFillColor, bool 
bAntiAlias,
diff --git a/vcl/headless/SvpGraphicsBackend.cxx 
b/vcl/headless/SvpGraphicsBackend.cxx
index 87a5a14debd8..1d2f17c44747 100644
--- a/vcl/headless/SvpGraphicsBackend.cxx
+++ b/vcl/headless/SvpGraphicsBackend.cxx
@@ -130,81 +130,14 @@ void SvpGraphicsBackend::drawLine(tools::Long nX1, 
tools::Long nY1, tools::Long
 void SvpGraphicsBackend::drawRect(tools::Long nX, tools::Long nY, tools::Long 
nWidth,
                                   tools::Long nHeight)
 {
-    implDrawRect(nX, nY, nWidth, nHeight);
-}
-
-void SvpGraphicsBackend::implDrawRect(double nX, double nY, double nWidth, 
double nHeight)
-{
-    // fast path for the common case of simply creating a solid block of color
-    if (m_rCairoCommon.m_oFillColor && m_rCairoCommon.m_oLineColor
-        && m_rCairoCommon.m_oFillColor == m_rCairoCommon.m_oLineColor)
-    {
-        double fTransparency = 0;
-
-        // don't bother trying to draw stuff which is effectively invisible
-        if (nWidth < 0.1 || nHeight < 0.1)
-            return;
-
-        cairo_t* cr = m_rCairoCommon.getCairoContext(true, getAntiAlias());
-        m_rCairoCommon.clipRegion(cr);
-
-        // To make releaseCairoContext work, use empty extents
-        basegfx::B2DRange extents;
-
-        bool bPixelSnap = !getAntiAlias();
-        if (bPixelSnap)
-        {
-            // snap by rounding
-            nX = basegfx::fround(nX);
-            nY = basegfx::fround(nY);
-            nWidth = basegfx::fround(nWidth);
-            nHeight = basegfx::fround(nHeight);
-        }
-
-        cairo_rectangle(cr, nX, nY, nWidth, nHeight);
-
-        CairoCommon::applyColor(cr, *m_rCairoCommon.m_oFillColor, 
fTransparency);
-        // Get FillDamage (will be extended for LineDamage below)
-        extents = getClippedFillDamage(cr);
-
-        cairo_fill(cr);
-
-        m_rCairoCommon.releaseCairoContext(cr, true, extents);
-
-        return;
-    }
-
-    // because of the -1 hack we have to do fill and draw separately
-    std::optional<Color> aOrigFillColor = m_rCairoCommon.m_oFillColor;
-    std::optional<Color> aOrigLineColor = m_rCairoCommon.m_oLineColor;
-    m_rCairoCommon.m_oFillColor = std::nullopt;
-    m_rCairoCommon.m_oLineColor = std::nullopt;
-
-    if (aOrigFillColor)
-    {
-        basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(
-            basegfx::B2DRectangle(nX, nY, nX + nWidth, nY + nHeight));
-        m_rCairoCommon.m_oFillColor = aOrigFillColor;
-
-        drawPolyPolygon(basegfx::B2DHomMatrix(), 
basegfx::B2DPolyPolygon(aRect), 0.0);
-
-        m_rCairoCommon.m_oFillColor = std::nullopt;
-    }
-
-    if (aOrigLineColor)
-    {
-        // need same -1 hack as X11SalGraphicsImpl::drawRect
-        basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(
-            basegfx::B2DRectangle(nX, nY, nX + nWidth - 1, nY + nHeight - 1));
-        m_rCairoCommon.m_oLineColor = aOrigLineColor;
-
-        drawPolyPolygon(basegfx::B2DHomMatrix(), 
basegfx::B2DPolyPolygon(aRect), 0.0);
+    cairo_t* cr = m_rCairoCommon.getCairoContext(true, getAntiAlias());
+    basegfx::B2DRange extents;
+    m_rCairoCommon.clipRegion(cr);
 
-        m_rCairoCommon.m_oLineColor = std::nullopt;
-    }
+    CairoCommon::drawRect(cr, &extents, m_rCairoCommon.m_oLineColor, 
m_rCairoCommon.m_oFillColor,
+                          getAntiAlias(), nX, nY, nWidth, nHeight);
 
-    m_rCairoCommon.m_oFillColor = aOrigFillColor;
-    m_rCairoCommon.m_oLineColor = aOrigLineColor;
+    m_rCairoCommon.releaseCairoContext(cr, true, extents);
 }
 
 void SvpGraphicsBackend::drawPolyLine(sal_uInt32 nPoints, const Point* pPtAry)
diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx
index 73a00c54e7e0..30e699a49982 100644
--- a/vcl/inc/headless/CairoCommon.hxx
+++ b/vcl/inc/headless/CairoCommon.hxx
@@ -162,6 +162,11 @@ struct VCL_DLLPUBLIC CairoCommon
                          bool bAntiAlias, tools::Long nX1, tools::Long nY1, 
tools::Long nX2,
                          tools::Long nY2);
 
+    static void drawRect(cairo_t* cr, basegfx::B2DRange* pExtents,
+                         const std::optional<Color>& rLineColor,
+                         const std::optional<Color>& rFillColor, bool 
bAntiAlias, double nX,
+                         double nY, double nWidth, double nHeight);
+
     static void drawPolygon(cairo_t* cr, basegfx::B2DRange* pExtents,
                             const std::optional<Color>& rLineColor,
                             const std::optional<Color>& rFillColor, bool 
bAntiAlias,
diff --git a/vcl/inc/headless/SvpGraphicsBackend.hxx 
b/vcl/inc/headless/SvpGraphicsBackend.hxx
index 7bd78118f6f4..e6f86617eba3 100644
--- a/vcl/inc/headless/SvpGraphicsBackend.hxx
+++ b/vcl/inc/headless/SvpGraphicsBackend.hxx
@@ -134,9 +134,6 @@ public:
 
     void drawBitmapBuffer(const SalTwoRect& rPosAry, const BitmapBuffer* 
pBuffer,
                           cairo_operator_t eOp);
-
-private:
-    void implDrawRect(double nX, double nY, double nWidth, double nHeight);
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
index 1f900d91b688..2af798bb3d33 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
@@ -30,6 +30,18 @@ 
X11CairoSalGraphicsImpl::X11CairoSalGraphicsImpl(X11SalGraphics& rParent, X11Com
 {
 }
 
+void X11CairoSalGraphicsImpl::drawRect(tools::Long nX, tools::Long nY, 
tools::Long nWidth,
+                                       tools::Long nHeight)
+{
+    cairo_t* cr = mrX11Common.getCairoContext(mrParent.GetGeometryProvider());
+    clipRegion(cr);
+
+    CairoCommon::drawRect(cr, nullptr, moPenColor, moFillColor, 
getAntiAlias(), nX, nY, nWidth,
+                          nHeight);
+
+    X11Common::releaseCairoContext(cr);
+}
+
 void X11CairoSalGraphicsImpl::drawPolygon(sal_uInt32 nPoints, const Point* 
pPtAry)
 {
     cairo_t* cr = mrX11Common.getCairoContext(mrParent.GetGeometryProvider());
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
index e4f63682f0f4..9e94b0dff7ea 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
@@ -79,6 +79,8 @@ public:
 
     void drawLine(tools::Long nX1, tools::Long nY1, tools::Long nX2, 
tools::Long nY2) override;
 
+    void drawRect(tools::Long nX, tools::Long nY, tools::Long nWidth, 
tools::Long nHeight) override;
+
     void drawPolygon(sal_uInt32 nPoints, const Point* pPtAry) override;
 
     void drawPolyPolygon(sal_uInt32 nPoly, const sal_uInt32* pPoints,
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index 705bc7ccb079..4b3b128b7442 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -1096,23 +1096,6 @@ void X11SalGraphicsImpl::internalDrawLine( tools::Long 
nX1, tools::Long nY1, too
     }
 }
 
-void X11SalGraphicsImpl::drawRect( tools::Long nX, tools::Long nY, tools::Long 
nDX, tools::Long nDY )
-{
-    if( moBrushColor )
-    {
-        XFillRectangle( mrParent.GetXDisplay(),
-                        mrParent.GetDrawable(),
-                        SelectBrush(),
-                        nX, nY, nDX, nDY );
-    }
-    // description DrawRect is wrong; thus -1
-    if( moPenColor )
-        XDrawRectangle( mrParent.GetXDisplay(),
-                        mrParent.GetDrawable(),
-                        SelectPen(),
-                        nX, nY, nDX-1, nDY-1 );
-}
-
 bool X11SalGraphicsImpl::drawPolyLineBezier( sal_uInt32, const Point*, const 
PolyFlags* )
 {
     return false;
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 57fd369ef4f1..d47b0082f860 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -144,8 +144,6 @@ public:
     // set fill color for raster operations
     virtual void SetROPFillColor( SalROPColor nROPColor ) override;
 
-    virtual void drawRect( tools::Long nX, tools::Long nY, tools::Long nWidth, 
tools::Long nHeight ) override;
-
     virtual bool drawPolyLineBezier(
                 sal_uInt32 nPoints,
                 const Point* pPtAry,

Reply via email to