vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx | 106 +++++++++++------------- 1 file changed, 49 insertions(+), 57 deletions(-)
New commits: commit 5cc0b3adf6c1550105b2137dd182168a9231bd7a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jan 2 20:43:36 2023 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Wed Jan 4 17:10:56 2023 +0000 enable SAL_ENABLE_USE_CAIRO_FOR_POLYGONS path Change-Id: Id2c8f94986aea0dd7e50b7b3aeaae7770b3e5bbd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144970 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx index 9f2fcb988697..0a1e8fe02200 100644 --- a/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx +++ b/vcl/unx/generic/gdi/X11CairoSalGraphicsImpl.cxx @@ -55,84 +55,76 @@ bool X11CairoSalGraphicsImpl::drawPolyPolygon(const basegfx::B2DHomMatrix& rObje return true; } - // enable by setting to something - static const char* pUseCairoForPolygons(getenv("SAL_ENABLE_USE_CAIRO_FOR_POLYGONS")); + // snap to raster if requested + const bool bSnapPoints(!getAntiAlias()); - if (nullptr != pUseCairoForPolygons && mrX11Common.SupportsCairo()) + if (bSnapPoints) { - // snap to raster if requested - const bool bSnapPoints(!getAntiAlias()); + aPolyPolygon = basegfx::utils::snapPointsOfHorizontalOrVerticalEdges(aPolyPolygon); + } - if (bSnapPoints) - { - aPolyPolygon = basegfx::utils::snapPointsOfHorizontalOrVerticalEdges(aPolyPolygon); - } + cairo_t* cr = mrX11Common.getCairoContext(); + clipRegion(cr); - cairo_t* cr = mrX11Common.getCairoContext(); - clipRegion(cr); + for (auto const& rPolygon : std::as_const(aPolyPolygon)) + { + const sal_uInt32 nPointCount(rPolygon.count()); - for (auto const& rPolygon : std::as_const(aPolyPolygon)) + if (nPointCount) { - const sal_uInt32 nPointCount(rPolygon.count()); + const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nPointCount : nPointCount - 1); - if (nPointCount) + if (nEdgeCount) { - const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nPointCount : nPointCount - 1); + basegfx::B2DCubicBezier aEdge; - if (nEdgeCount) + for (sal_uInt32 b = 0; b < nEdgeCount; ++b) { - basegfx::B2DCubicBezier aEdge; + rPolygon.getBezierSegment(b, aEdge); - for (sal_uInt32 b = 0; b < nEdgeCount; ++b) + if (!b) { - rPolygon.getBezierSegment(b, aEdge); - - if (!b) - { - const basegfx::B2DPoint aStart(aEdge.getStartPoint()); - cairo_move_to(cr, aStart.getX(), aStart.getY()); - } - - const basegfx::B2DPoint aEnd(aEdge.getEndPoint()); - - if (aEdge.isBezier()) - { - const basegfx::B2DPoint aCP1(aEdge.getControlPointA()); - const basegfx::B2DPoint aCP2(aEdge.getControlPointB()); - cairo_curve_to(cr, aCP1.getX(), aCP1.getY(), aCP2.getX(), aCP2.getY(), - aEnd.getX(), aEnd.getY()); - } - else - { - cairo_line_to(cr, aEnd.getX(), aEnd.getY()); - } + const basegfx::B2DPoint aStart(aEdge.getStartPoint()); + cairo_move_to(cr, aStart.getX(), aStart.getY()); } - cairo_close_path(cr); + const basegfx::B2DPoint aEnd(aEdge.getEndPoint()); + + if (aEdge.isBezier()) + { + const basegfx::B2DPoint aCP1(aEdge.getControlPointA()); + const basegfx::B2DPoint aCP2(aEdge.getControlPointB()); + cairo_curve_to(cr, aCP1.getX(), aCP1.getY(), aCP2.getX(), aCP2.getY(), + aEnd.getX(), aEnd.getY()); + } + else + { + cairo_line_to(cr, aEnd.getX(), aEnd.getY()); + } } - } - } - if (SALCOLOR_NONE != mnFillColor) - { - cairo_set_source_rgba(cr, mnFillColor.GetRed() / 255.0, mnFillColor.GetGreen() / 255.0, - mnFillColor.GetBlue() / 255.0, 1.0 - fTransparency); - cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); - cairo_fill_preserve(cr); + cairo_close_path(cr); + } } + } - if (SALCOLOR_NONE != mnPenColor) - { - cairo_set_source_rgba(cr, mnPenColor.GetRed() / 255.0, mnPenColor.GetGreen() / 255.0, - mnPenColor.GetBlue() / 255.0, 1.0 - fTransparency); - cairo_stroke_preserve(cr); - } + if (SALCOLOR_NONE != mnFillColor) + { + cairo_set_source_rgba(cr, mnFillColor.GetRed() / 255.0, mnFillColor.GetGreen() / 255.0, + mnFillColor.GetBlue() / 255.0, 1.0 - fTransparency); + cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill_preserve(cr); + } - X11Common::releaseCairoContext(cr); - return true; + if (SALCOLOR_NONE != mnPenColor) + { + cairo_set_source_rgba(cr, mnPenColor.GetRed() / 255.0, mnPenColor.GetGreen() / 255.0, + mnPenColor.GetBlue() / 255.0, 1.0 - fTransparency); + cairo_stroke_preserve(cr); } - return X11SalGraphicsImpl::drawPolyPolygon(rObjectToDevice, rPolyPolygon, fTransparency); + X11Common::releaseCairoContext(cr); + return true; } bool X11CairoSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDevice,