diff options
author | Caolán McNamara <caolanm@redhat.com> | 2023-01-06 09:16:33 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2023-01-06 16:36:23 +0000 |
commit | a6fe91f6e3ddbad65e534907d29243b138258f6c (patch) | |
tree | 058c6ac5d15539f9ccff7ede8c3fcba210b8dd23 /vcl | |
parent | 7e07225a1b48f3f987a818213256d3cbb9266d87 (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.cxx | 14 | ||||
-rw-r--r-- | vcl/headless/SvpGraphicsBackend.cxx | 12 | ||||
-rw-r--r-- | vcl/inc/headless/CairoCommon.hxx | 5 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx | 10 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/gdiimpl.cxx | 72 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/gdiimpl.hxx | 3 |
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, |