summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/headless/CairoCommon.cxx49
-rw-r--r--vcl/headless/SvpGraphicsBackend.cxx79
-rw-r--r--vcl/inc/headless/CairoCommon.hxx5
-rw-r--r--vcl/inc/headless/SvpGraphicsBackend.hxx3
-rw-r--r--vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx12
-rw-r--r--vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.hxx2
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.cxx17
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.hxx2
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,