basegfx/source/polygon/b2dpolypolygontools.cxx | 18 ++++++++++++++++ drawinglayer/source/processor2d/vclpixelprocessor2d.cxx | 10 ++++++++ drawinglayer/source/processor2d/vclprocessor2d.cxx | 10 ++++++++ include/basegfx/polygon/b2dpolygontools.hxx | 3 ++ 4 files changed, 41 insertions(+)
New commits: commit c42b28be2cbeac75c9ea53a2d74ea044fddad468 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu May 9 09:18:00 2019 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri May 10 08:49:28 2019 +0200 drawinglayer: avoid AA for hairline polygons built from hori/vert lines only For one, it seems this was the intention already since commit 85c70f37b56299f6fa02312c0fb73cc55af084ef (CWS-TOOLING: integrate CWS aw063, 2009-03-04): "suppress AntiAliasing for pure horizontal or vertical lines". For another, this fixes the TileCacheTests::testTileWireIDHandling() testcase in online.git, which assumes that the indicators at the corners of the Writer body frame (paragraph marks hidden / default case) can be painted multiple times, producing pixel-by-pixel matching results. But in reality AA breaks that assumption, and we know these indicators are never diagonal lines. (cherry picked from commit f8b4d371eddd27594d549fb00294c01229a9bd24) Conflicts: basegfx/test/B2DPolygonTest.cxx Change-Id: Ib74f823165799991296b64cee58ec106dbdcedcf Reviewed-on: https://gerrit.libreoffice.org/72032 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Miklos Vajna <vmik...@collabora.com> diff --git a/basegfx/source/polygon/b2dpolypolygontools.cxx b/basegfx/source/polygon/b2dpolypolygontools.cxx index 644e08bb6358..046463e8f141 100644 --- a/basegfx/source/polygon/b2dpolypolygontools.cxx +++ b/basegfx/source/polygon/b2dpolypolygontools.cxx @@ -456,6 +456,24 @@ namespace basegfx return aRetval; } + bool containsOnlyHorizontalOrVerticalLines(const basegfx::B2DPolygon& rPolygon) + { + if (rPolygon.count() <= 1) + return false; + + for (size_t i = 1; i < rPolygon.count(); ++i) + { + const basegfx::B2DPoint& rPrevPoint = rPolygon.getB2DPoint(i - 1); + const basegfx::B2DPoint& rPoint = rPolygon.getB2DPoint(i); + if (rPrevPoint.getX() == rPoint.getX() || rPrevPoint.getY() == rPoint.getY()) + continue; + + return false; + } + + return true; + } + B2DPolyPolygon createSevenSegmentPolyPolygon(sal_Char nNumber, bool bLitSegments) { // config here diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx index 9c21c83ee8f8..162f0e27e00f 100644 --- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx @@ -165,6 +165,16 @@ namespace drawinglayer mpOutputDevice->SetLineColor(Color(aLineColor)); aLocalPolygon.transform(maCurrentTransformation); + if (getOptionsDrawinglayer().IsAntiAliasing() && getOptionsDrawinglayer().IsSnapHorVerLinesToDiscrete()) + { + if (basegfx::utils::containsOnlyHorizontalOrVerticalLines(aLocalPolygon)) + { + // DrawPolyLineDirect() only works in AA mode, but pure horizontal or vertical + // lines are better with AA off. + return false; + } + } + // try drawing; if it did not work, use standard fallback return mpOutputDevice->DrawPolyLineDirect( aLocalPolygon, 0.0, fTransparency); } diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index e1cf42b0f42c..74c662f82a12 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -328,6 +328,7 @@ namespace drawinglayer basegfx::B2DPolygon aLocalPolygon(rPolygonCandidate.getB2DPolygon()); aLocalPolygon.transform(maCurrentTransformation); + bool bDisableAA = false; if(bPixelBased && getOptionsDrawinglayer().IsAntiAliasing() && getOptionsDrawinglayer().IsSnapHorVerLinesToDiscrete()) { // #i98289# @@ -336,9 +337,18 @@ namespace drawinglayer // not-AntiAliased such lines look more pleasing to the eye (e.g. 2D chart content). This // NEEDS to be done in discrete coordinates, so only useful for pixel based rendering. aLocalPolygon = basegfx::utils::snapPointsOfHorizontalOrVerticalEdges(aLocalPolygon); + + // Also disable AA, snap would leave the start/end of lines still anti-aliased when + // their coordinates are provided in logic units. + bDisableAA = basegfx::utils::containsOnlyHorizontalOrVerticalLines(aLocalPolygon); } + const AntialiasingFlags nOriginalAA(mpOutputDevice->GetAntialiasing()); + if (bDisableAA && (nOriginalAA & AntialiasingFlags::EnableB2dDraw)) + mpOutputDevice->SetAntialiasing(nOriginalAA & ~AntialiasingFlags::EnableB2dDraw); mpOutputDevice->DrawPolyLine(aLocalPolygon, 0.0); + if (bDisableAA && (nOriginalAA & AntialiasingFlags::EnableB2dDraw)) + mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() | AntialiasingFlags::EnableB2dDraw); } // direct draw of transformed BitmapEx primitive diff --git a/include/basegfx/polygon/b2dpolygontools.hxx b/include/basegfx/polygon/b2dpolygontools.hxx index c20668995d56..cac3dccfe5a6 100644 --- a/include/basegfx/polygon/b2dpolygontools.hxx +++ b/include/basegfx/polygon/b2dpolygontools.hxx @@ -438,6 +438,9 @@ namespace basegfx */ BASEGFX_DLLPUBLIC B2DPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolygon& rCandidate); + /// Determines if rPolygon lacks diagonal lines or not. + BASEGFX_DLLPUBLIC bool containsOnlyHorizontalOrVerticalLines(const basegfx::B2DPolygon& rPolygon); + /// get the tangent with which the given point is entered seen from the previous /// polygon path data. Take into account all stuff like closed state, zero-length edges and others. BASEGFX_DLLPUBLIC B2DVector getTangentEnteringPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits