vcl/headless/CairoCommon.cxx | 20 ++ vcl/headless/SvpGraphicsBackend.cxx | 13 - vcl/inc/headless/CairoCommon.hxx | 5 vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx | 11 + vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx | 5 vcl/unx/generic/gdi/gdiimpl.cxx | 195 ------------------------ vcl/unx/generic/gdi/gdiimpl.hxx | 20 -- 7 files changed, 44 insertions(+), 225 deletions(-)
New commits: commit cb4cdde132839a232d152b701a147188de8ffc76 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Jan 10 09:27:26 2023 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Jan 10 19:56:43 2023 +0000 move invert into CairoCommon and reuse from X11CairoSalGraphicsImpl Change-Id: I4fb52ed1a9d6d9405a76f5d06ca0770bf9b750e6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145256 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx index 513d94fc4735..fe5f60021aa6 100644 --- a/vcl/headless/CairoCommon.cxx +++ b/vcl/headless/CairoCommon.cxx @@ -1557,6 +1557,26 @@ void CairoCommon::invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, boo releaseCairoContext(cr, false, extents); } +void CairoCommon::invert(tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, + SalInvert nFlags, bool bAntiAlias) +{ + basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect( + basegfx::B2DRectangle(nX, nY, nX + nWidth, nY + nHeight)); + + invert(aRect, nFlags, bAntiAlias); +} + +void CairoCommon::invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags, bool bAntiAlias) +{ + 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())); + aPoly.setClosed(true); + + invert(aPoly, nFlags, bAntiAlias); +} + cairo_format_t getCairoFormat(const BitmapBuffer& rBuffer) { cairo_format_t nFormat; diff --git a/vcl/headless/SvpGraphicsBackend.cxx b/vcl/headless/SvpGraphicsBackend.cxx index 6b63f2509eda..9a4ef1fc734d 100644 --- a/vcl/headless/SvpGraphicsBackend.cxx +++ b/vcl/headless/SvpGraphicsBackend.cxx @@ -348,21 +348,12 @@ Color SvpGraphicsBackend::getPixel(tools::Long nX, tools::Long nY) void SvpGraphicsBackend::invert(tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, SalInvert nFlags) { - basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect( - basegfx::B2DRectangle(nX, nY, nX + nWidth, nY + nHeight)); - - m_rCairoCommon.invert(aRect, nFlags, getAntiAlias()); + m_rCairoCommon.invert(nX, nY, nWidth, nHeight, nFlags, getAntiAlias()); } void SvpGraphicsBackend::invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags) { - 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())); - aPoly.setClosed(true); - - m_rCairoCommon.invert(aPoly, nFlags, getAntiAlias()); + m_rCairoCommon.invert(nPoints, pPtAry, nFlags, getAntiAlias()); } bool SvpGraphicsBackend::drawEPS(tools::Long /*nX*/, tools::Long /*nY*/, tools::Long /*nWidth*/, diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx index df270b217f3a..ea041a91187c 100644 --- a/vcl/inc/headless/CairoCommon.hxx +++ b/vcl/inc/headless/CairoCommon.hxx @@ -204,6 +204,11 @@ struct VCL_DLLPUBLIC CairoCommon void invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, bool bAntiAlias); + void invert(tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, + SalInvert nFlags, bool bAntiAlias); + + void invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags, bool bAntiAlias); + static cairo_surface_t* createCairoSurface(const BitmapBuffer* pBuffer); static bool supportsOperation(OutDevSupportType eType); diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx index da6845c84eea..c6c4af83039b 100644 --- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx +++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx @@ -110,6 +110,17 @@ bool X11CairoSalGraphicsImpl::implDrawGradient(basegfx::B2DPolyPolygon const& rP return mrCairoCommon.implDrawGradient(rPolyPolygon, rGradient, getAntiAlias()); } +void X11CairoSalGraphicsImpl::invert(tools::Long nX, tools::Long nY, tools::Long nWidth, + tools::Long nHeight, SalInvert nFlags) +{ + mrCairoCommon.invert(nX, nY, nWidth, nHeight, nFlags, getAntiAlias()); +} + +void X11CairoSalGraphicsImpl::invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags) +{ + mrCairoCommon.invert(nPoints, pPtAry, nFlags, getAntiAlias()); +} + bool X11CairoSalGraphicsImpl::hasFastDrawTransformedBitmap() const { return CairoCommon::hasFastDrawTransformedBitmap(); diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx index 779e4d7eb796..08704a642659 100644 --- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx +++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx @@ -127,6 +127,11 @@ public: bool implDrawGradient(basegfx::B2DPolyPolygon const& rPolyPolygon, SalGradient const& rGradient) override; + void invert(tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, + SalInvert nFlags) override; + + void invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags) override; + virtual bool hasFastDrawTransformedBitmap() const 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 7f8672f07735..3e2b520bd904 100644 --- a/vcl/unx/generic/gdi/gdiimpl.cxx +++ b/vcl/unx/generic/gdi/gdiimpl.cxx @@ -66,32 +66,6 @@ /* From <X11/Intrinsic.h> */ typedef unsigned long Pixel; -class SalPolyLine -{ - std::vector<XPoint> Points_; -public: - SalPolyLine(sal_uLong nPoints, const Point *p) - : Points_(nPoints+1) - { - for (sal_uLong i = 0; i < nPoints; ++i) - { - Points_[i].x = static_cast<short>(p[i].getX()); - Points_[i].y = static_cast<short>(p[i].getY()); - } - Points_[nPoints] = Points_[0]; // close polyline - } - - const XPoint &operator[](sal_uLong n) const - { - return Points_[n]; - } - - XPoint &operator[](sal_uLong n) - { - return Points_[n]; - } -}; - namespace { void setForeBack(XGCValues& rValues, const SalColormap& rColMap, const SalBitmap& rSalBitmap) @@ -140,9 +114,7 @@ X11SalGraphicsImpl::X11SalGraphicsImpl(X11SalGraphics& rParent): mpCopyGC(nullptr), mpMaskGC(nullptr), mpInvertGC(nullptr), - mpInvert50GC(nullptr), - mpStippleGC(nullptr), - mpTrackingGC(nullptr) + mpStippleGC(nullptr) { } @@ -197,11 +169,9 @@ void X11SalGraphicsImpl::freeResources() freeGC( pDisplay, mpPenGC ); freeGC( pDisplay, mpBrushGC ); freeGC( pDisplay, mpMonoGC ); - freeGC( pDisplay, mpTrackingGC ); freeGC( pDisplay, mpCopyGC ); freeGC( pDisplay, mpMaskGC ); freeGC( pDisplay, mpInvertGC ); - freeGC( pDisplay, mpInvert50GC ); freeGC( pDisplay, mpStippleGC ); mbTrackingGC = mbPenGC = mbBrushGC = mbCopyGC = mbInvertGC = mbInvert50GC = mbStippleGC = false; } @@ -237,36 +207,6 @@ inline GC X11SalGraphicsImpl::GetCopyGC() return mpCopyGC; } -GC X11SalGraphicsImpl::GetTrackingGC() -{ - if( !mpTrackingGC ) - { - XGCValues values; - - values.graphics_exposures = False; - values.foreground = mrParent.GetColormap().GetBlackPixel() - ^ mrParent.GetColormap().GetWhitePixel(); - values.function = GXxor; - values.line_width = 1; - values.line_style = LineOnOffDash; - - mpTrackingGC = XCreateGC( mrParent.GetXDisplay(), mrParent.GetDrawable(), - GCGraphicsExposures | GCForeground | GCFunction - | GCLineWidth | GCLineStyle, - &values ); - const char dash_list[2] = {2, 2}; - XSetDashes( mrParent.GetXDisplay(), mpTrackingGC, 0, dash_list, 2 ); - } - - if( !mbTrackingGC ) - { - mrParent.SetClipRegion( mpTrackingGC ); - mbTrackingGC = true; - } - - return mpTrackingGC; -} - GC X11SalGraphicsImpl::GetInvertGC() { if( !mpInvertGC ) @@ -284,44 +224,6 @@ GC X11SalGraphicsImpl::GetInvertGC() return mpInvertGC; } -GC X11SalGraphicsImpl::GetInvert50GC() -{ - if( !mpInvert50GC ) - { - XGCValues values; - - values.graphics_exposures = False; - values.foreground = mrParent.GetColormap().GetWhitePixel(); - values.background = mrParent.GetColormap().GetBlackPixel(); - values.function = GXinvert; - values.line_width = 1; - values.line_style = LineSolid; - unsigned long const nValueMask = - GCGraphicsExposures - | GCForeground - | GCBackground - | GCFunction - | GCLineWidth - | GCLineStyle - | GCFillStyle - | GCStipple; - - values.fill_style = FillStippled; - values.stipple = mrParent.GetDisplay()->GetInvert50( mrParent.m_nXScreen ); - - mpInvert50GC = XCreateGC( mrParent.GetXDisplay(), mrParent.GetDrawable(), - nValueMask, - &values ); - } - - if( !mbInvert50GC ) - { - mrParent.SetClipRegion( mpInvert50GC ); - mbInvert50GC = true; - } - return mpInvert50GC; -} - inline GC X11SalGraphicsImpl::GetStippleGC() { if( !mpStippleGC ) @@ -407,40 +309,6 @@ GC X11SalGraphicsImpl::SelectPen() return mpPenGC; } -void X11SalGraphicsImpl::DrawLines(sal_uInt32 nPoints, - const SalPolyLine &rPoints, - GC pGC, - bool bClose) -{ - // calculate how many lines XWindow can draw in one go - sal_uLong nMaxLines = (mrParent.GetDisplay()->GetMaxRequestSize() - sizeof(xPolyPointReq)) - / sizeof(xPoint); - if( nMaxLines > nPoints ) nMaxLines = nPoints; - - // print all lines that XWindows can draw - sal_uLong n; - for( n = 0; nPoints - n > nMaxLines; n += nMaxLines - 1 ) - XDrawLines( mrParent.GetXDisplay(), - mrParent.GetDrawable(), - pGC, - const_cast<XPoint*>(&rPoints[n]), - nMaxLines, - CoordModeOrigin ); - - if( n < nPoints ) - XDrawLines( mrParent.GetXDisplay(), - mrParent.GetDrawable(), - pGC, - const_cast<XPoint*>(&rPoints[n]), - nPoints - n, - CoordModeOrigin ); - if( bClose ) - { - if( rPoints[nPoints-1].x != rPoints[0].x || rPoints[nPoints-1].y != rPoints[0].y ) - internalDrawLine( rPoints[nPoints-1].x, rPoints[nPoints-1].y, rPoints[0].x, rPoints[0].y ); - } -} - void X11SalGraphicsImpl::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSSrcGraphics ) { @@ -1087,15 +955,6 @@ void X11SalGraphicsImpl::SetXORMode( bool bSet, bool ) } } -void X11SalGraphicsImpl::internalDrawLine( tools::Long nX1, tools::Long nY1, tools::Long nX2, tools::Long nY2 ) -{ - if( moPenColor ) - { - XDrawLine( mrParent.GetXDisplay(), mrParent.GetDrawable(),SelectPen(), - nX1, nY1, nX2, nY2 ); - } -} - bool X11SalGraphicsImpl::drawPolyLineBezier( sal_uInt32, const Point*, const PolyFlags* ) { return false; @@ -1112,58 +971,6 @@ bool X11SalGraphicsImpl::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*, return false; } -void X11SalGraphicsImpl::invert( tools::Long nX, - tools::Long nY, - tools::Long nDX, - tools::Long nDY, - SalInvert nFlags ) -{ - GC pGC; - if( SalInvert::N50 & nFlags ) - { - pGC = GetInvert50GC(); - XFillRectangle( mrParent.GetXDisplay(), mrParent.GetDrawable(), pGC, nX, nY, nDX, nDY ); - } - else - { - if ( SalInvert::TrackFrame & nFlags ) - { - pGC = GetTrackingGC(); - XDrawRectangle( mrParent.GetXDisplay(), mrParent.GetDrawable(), pGC, nX, nY, nDX, nDY ); - } - else - { - pGC = GetInvertGC(); - XFillRectangle( mrParent.GetXDisplay(), mrParent.GetDrawable(), pGC, nX, nY, nDX, nDY ); - } - } -} - -void X11SalGraphicsImpl::invert( sal_uInt32 nPoints, - const Point* pPtAry, - SalInvert nFlags ) -{ - SalPolyLine Points ( nPoints, pPtAry ); - - GC pGC; - if( SalInvert::N50 & nFlags ) - pGC = GetInvert50GC(); - else - if ( SalInvert::TrackFrame & nFlags ) - pGC = GetTrackingGC(); - else - pGC = GetInvertGC(); - - if( SalInvert::TrackFrame & nFlags ) - DrawLines ( nPoints, Points, pGC, true ); - else - XFillPolygon( mrParent.GetXDisplay(), - mrParent.GetDrawable(), - pGC, - &Points[0], nPoints, - Complex, CoordModeOrigin ); -} - bool X11SalGraphicsImpl::drawEPS( tools::Long,tools::Long,tools::Long,tools::Long,void*,sal_uInt32 ) { return false; diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx index 91564bfccc23..1c7689b641f0 100644 --- a/vcl/unx/generic/gdi/gdiimpl.hxx +++ b/vcl/unx/generic/gdi/gdiimpl.hxx @@ -68,9 +68,7 @@ private: GC mpCopyGC; GC mpMaskGC; GC mpInvertGC; - GC mpInvert50GC; GC mpStippleGC; - GC mpTrackingGC; GC CreateGC( Drawable hDrawable, unsigned long nMask = GCGraphicsExposures ); @@ -79,15 +77,7 @@ private: GC SelectPen(); inline GC GetCopyGC(); inline GC GetStippleGC(); - GC GetTrackingGC(); GC GetInvertGC(); - GC GetInvert50GC(); - - void DrawLines( sal_uInt32 nPoints, - const SalPolyLine &rPoints, - GC pGC, - bool bClose - ); XID GetXRenderPicture(); @@ -97,8 +87,6 @@ private: const SalBitmap& rSalBitmap, const SalBitmap& rTransparentBitmap ); - void internalDrawLine( tools::Long nX1, tools::Long nY1, tools::Long nX2, tools::Long nY2 ); - public: explicit X11SalGraphicsImpl(X11SalGraphics& rParent); @@ -184,14 +172,6 @@ public: virtual std::shared_ptr<SalBitmap> getBitmap( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight ) override; - // invert --> ClipRegion (only Windows or VirDevs) - virtual void invert( - tools::Long nX, tools::Long nY, - tools::Long nWidth, tools::Long nHeight, - SalInvert nFlags) override; - - virtual void invert( sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags ) override; - virtual bool drawEPS( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight,