summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2023-01-06 09:16:33 +0000
committerCaolán McNamara <caolanm@redhat.com>2023-01-06 16:36:23 +0000
commita6fe91f6e3ddbad65e534907d29243b138258f6c (patch)
tree058c6ac5d15539f9ccff7ede8c3fcba210b8dd23 /vcl
parent7e07225a1b48f3f987a818213256d3cbb9266d87 (diff)
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 <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/headless/CairoCommon.cxx14
-rw-r--r--vcl/headless/SvpGraphicsBackend.cxx12
-rw-r--r--vcl/inc/headless/CairoCommon.hxx5
-rw-r--r--vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx10
-rw-r--r--vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx2
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.cxx72
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.hxx3
7 files changed, 38 insertions, 80 deletions
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,