[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - basegfx/source drawinglayer/source include/basegfx
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Fri May 10 06:50:14 UTC 2019
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 <vmiklos at collabora.com>
AuthorDate: Thu May 9 09:18:00 2019 +0200
Commit: Miklos Vajna <vmiklos at 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 <ashnakash at gmail.com>
Tested-by: Miklos Vajna <vmiklos at 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);
More information about the Libreoffice-commits
mailing list