vcl/headless/CairoCommon.cxx                    |   14 ++++
 vcl/headless/SvpGraphicsBackend.cxx             |   12 ++--
 vcl/inc/headless/CairoCommon.hxx                |    5 +
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx |   10 +++
 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx |    2 
 vcl/unx/generic/gdi/gdiimpl.cxx                 |   72 ------------------------
 vcl/unx/generic/gdi/gdiimpl.hxx                 |    3 -
 7 files changed, 38 insertions(+), 80 deletions(-)

New commits:
commit a6fe91f6e3ddbad65e534907d29243b138258f6c
Author:     Caolán McNamara <[email protected]>
AuthorDate: Fri Jan 6 09:16:33 2023 +0000
Commit:     Caolán McNamara <[email protected]>
CommitDate: Fri Jan 6 16:36:23 2023 +0000

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

diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index b0c7b505f7cc..56293738d508 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -687,6 +687,20 @@ void CairoCommon::drawLine(cairo_t* cr, basegfx::B2DRange* 
pExtents, const Color
     cairo_stroke(cr);
 }
 
+void CairoCommon::drawPolygon(cairo_t* cr, basegfx::B2DRange* pExtents,
+                              const std::optional<Color>& rLineColor,
+                              const std::optional<Color>& rFillColor, bool 
bAntiAlias,
+                              sal_uInt32 nPoints, const Point* pPtAry)
+{
+    basegfx::B2DPolygon aPoly;
+    aPoly.append(basegfx::B2DPoint(pPtAry->getX(), pPtAry->getY()), nPoints);
+    for (sal_uInt32 i = 1; i < nPoints; ++i)
+        aPoly.setB2DPoint(i, basegfx::B2DPoint(pPtAry[i].getX(), 
pPtAry[i].getY()));
+
+    drawPolyPolygon(cr, pExtents, rLineColor, rFillColor, bAntiAlias, 
basegfx::B2DHomMatrix(),
+                    basegfx::B2DPolyPolygon(aPoly), 0.0);
+}
+
 void CairoCommon::drawPolyPolygon(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 134c9fc221e0..87a5a14debd8 100644
--- a/vcl/headless/SvpGraphicsBackend.cxx
+++ b/vcl/headless/SvpGraphicsBackend.cxx
@@ -221,12 +221,14 @@ void SvpGraphicsBackend::drawPolyLine(sal_uInt32 nPoints, 
const Point* pPtAry)
 
 void SvpGraphicsBackend::drawPolygon(sal_uInt32 nPoints, const Point* pPtAry)
 {
-    basegfx::B2DPolygon aPoly;
-    aPoly.append(basegfx::B2DPoint(pPtAry->getX(), pPtAry->getY()), nPoints);
-    for (sal_uInt32 i = 1; i < nPoints; ++i)
-        aPoly.setB2DPoint(i, basegfx::B2DPoint(pPtAry[i].getX(), 
pPtAry[i].getY()));
+    cairo_t* cr = m_rCairoCommon.getCairoContext(true, getAntiAlias());
+    basegfx::B2DRange extents;
+    m_rCairoCommon.clipRegion(cr);
 
-    drawPolyPolygon(basegfx::B2DHomMatrix(), basegfx::B2DPolyPolygon(aPoly), 
0.0);
+    CairoCommon::drawPolygon(cr, &extents, m_rCairoCommon.m_oLineColor, 
m_rCairoCommon.m_oFillColor,
+                             getAntiAlias(), nPoints, pPtAry);
+
+    m_rCairoCommon.releaseCairoContext(cr, true, extents);
 }
 
 void SvpGraphicsBackend::drawPolyPolygon(sal_uInt32 nPoly, const sal_uInt32* 
pPointCounts,
diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx
index 75aec44a4ec7..73a00c54e7e0 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 drawPolygon(cairo_t* cr, basegfx::B2DRange* pExtents,
+                            const std::optional<Color>& rLineColor,
+                            const std::optional<Color>& rFillColor, bool 
bAntiAlias,
+                            sal_uInt32 nPoints, const Point* pPtAry);
+
     static void drawPolyPolygon(cairo_t* cr, basegfx::B2DRange* pExtents,
                                 const std::optional<Color>& rLineColor,
                                 const std::optional<Color>& rFillColor, bool 
bAntiAlias,
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
index b1afbc25350f..1f900d91b688 100644
--- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
+++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx
@@ -30,6 +30,16 @@ 
X11CairoSalGraphicsImpl::X11CairoSalGraphicsImpl(X11SalGraphics& rParent, X11Com
 {
 }
 
+void X11CairoSalGraphicsImpl::drawPolygon(sal_uInt32 nPoints, const Point* 
pPtAry)
+{
+    cairo_t* cr = mrX11Common.getCairoContext(mrParent.GetGeometryProvider());
+    clipRegion(cr);
+
+    CairoCommon::drawPolygon(cr, nullptr, moPenColor, moFillColor, 
getAntiAlias(), nPoints, pPtAry);
+
+    X11Common::releaseCairoContext(cr);
+}
+
 void X11CairoSalGraphicsImpl::drawPolyPolygon(sal_uInt32 nPoly, const 
sal_uInt32* pPoints,
                                               const Point** pPtAry)
 {
diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx 
b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx
index 46b4c74bcc98..e4f63682f0f4 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 drawPolygon(sal_uInt32 nPoints, const Point* pPtAry) override;
+
     void drawPolyPolygon(sal_uInt32 nPoly, const sal_uInt32* pPoints,
                          const Point** pPtAry) override;
 
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index 73d49949e2af..705bc7ccb079 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -1087,12 +1087,6 @@ void X11SalGraphicsImpl::SetXORMode( bool bSet, bool )
     }
 }
 
-void X11SalGraphicsImpl::internalDrawPixel( tools::Long nX, tools::Long nY )
-{
-    if( moPenColor )
-        XDrawPoint( mrParent.GetXDisplay(), mrParent.GetDrawable(), 
SelectPen(), nX, nY );
-}
-
 void X11SalGraphicsImpl::internalDrawLine( tools::Long nX1, tools::Long nY1, 
tools::Long nX2, tools::Long nY2 )
 {
     if( moPenColor )
@@ -1119,72 +1113,6 @@ void X11SalGraphicsImpl::drawRect( tools::Long nX, 
tools::Long nY, tools::Long n
                         nX, nY, nDX-1, nDY-1 );
 }
 
-void X11SalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const Point* pPtAry )
-{
-    if( nPoints == 0 )
-        return;
-
-    if( nPoints < 3 )
-    {
-        if( !mbXORMode )
-        {
-            if( 1 == nPoints  )
-                internalDrawPixel( pPtAry[0].getX(), pPtAry[0].getY() );
-            else
-                internalDrawLine( pPtAry[0].getX(), pPtAry[0].getY(),
-                          pPtAry[1].getX(), pPtAry[1].getY() );
-        }
-        return;
-    }
-
-    SalPolyLine Points( nPoints, pPtAry );
-
-    nPoints++;
-
-    /* WORKAROUND: some Xservers (Xorg, VIA chipset in this case)
-     * do not draw the visible part of a polygon
-     * if it overlaps to the left of screen 0,y.
-     * This happens to be the case in the gradient drawn in the
-     * menubar background. workaround for the special case of
-     * of a rectangle overlapping to the left.
-     */
-    if (nPoints == 5 &&
-        Points[ 0 ].x == Points[ 1 ].x &&
-        Points[ 1 ].y == Points[ 2 ].y &&
-        Points[ 2 ].x == Points[ 3 ].x &&
-        Points[ 0 ].x == Points[ 4 ].x && Points[ 0 ].y == Points[ 4 ].y
-       )
-    {
-        bool bLeft = false;
-        bool bRight = false;
-        for(unsigned int i = 0; i < nPoints; i++ )
-        {
-            if( Points[i].x < 0 )
-                bLeft = true;
-            else
-                bRight= true;
-        }
-        if( bLeft && ! bRight )
-            return;
-        if( bLeft && bRight )
-        {
-            for( unsigned int i = 0; i < nPoints; i++ )
-                if( Points[i].x < 0 )
-                    Points[i].x = 0;
-        }
-    }
-
-    if( moBrushColor )
-        XFillPolygon( mrParent.GetXDisplay(),
-                      mrParent.GetDrawable(),
-                      SelectBrush(),
-                      &Points[0], nPoints,
-                      Complex, CoordModeOrigin );
-
-    if( moPenColor )
-        DrawLines( nPoints, Points, SelectPen(), true );
-}
-
 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 4d18ee032602..57fd369ef4f1 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -98,7 +98,6 @@ private:
                                               const SalBitmap& rSalBitmap,
                                               const SalBitmap& 
rTransparentBitmap );
 
-    void internalDrawPixel( tools::Long nX, tools::Long nY );
     void internalDrawLine( tools::Long nX1, tools::Long nY1, tools::Long nX2, 
tools::Long nY2 );
 
 public:
@@ -147,8 +146,6 @@ public:
 
     virtual void drawRect( tools::Long nX, tools::Long nY, tools::Long nWidth, 
tools::Long nHeight ) override;
 
-    virtual void drawPolygon( sal_uInt32 nPoints, const Point* pPtAry ) 
override;
-
     virtual bool drawPolyLineBezier(
                 sal_uInt32 nPoints,
                 const Point* pPtAry,

Reply via email to