diff options
-rw-r--r-- | vcl/headless/CairoCommon.cxx | 49 | ||||
-rw-r--r-- | vcl/headless/SvpGraphicsBackend.cxx | 79 | ||||
-rw-r--r-- | vcl/inc/headless/CairoCommon.hxx | 5 | ||||
-rw-r--r-- | vcl/inc/headless/SvpGraphicsBackend.hxx | 3 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx | 12 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/gdiimpl.cxx | 17 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/gdiimpl.hxx | 2 |
8 files changed, 74 insertions, 95 deletions
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, |