bb8f8c342f
- Version update to 5.1.3.1: * Various small bugfixes all around 5.1 series - fix bnc#856729 - LO-L3: Double borders in Calc * bnc856729.patch OBS-URL: https://build.opensuse.org/request/show/391705 OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=400
156 lines
7.4 KiB
Diff
156 lines
7.4 KiB
Diff
From a5928a57a53df84cacd2975e227f9e03d50456a6 Mon Sep 17 00:00:00 2001
|
|
From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
Date: Fri, 15 Apr 2016 15:46:06 +0200
|
|
Subject: [PATCH] tdf#99315 VclPixelProcessor2D: fix double border line width
|
|
|
|
Regression from commit 2c91cb08d65cd35fa8ef6eaca3677aa82fb58cbe (better
|
|
drawing support for borders of different width, fdo#33634, 2012-04-04),
|
|
the problem is that previously the width of inner/outer double border
|
|
lines got rounded to integer values quite early, but after the commit
|
|
they are kept at a double precision for much longer, which needs pixel
|
|
correction in VclPixelProcessor2D.
|
|
|
|
Example: if the border with is 1.47, and the line gets moved by 0.2
|
|
pixels, then the inner and outer edge of the line will be 0.2 and 1.67,
|
|
which gets rounded to 0 -> 2 in the pixel processor. Previously the
|
|
input was rounded to 1, so moving by 0.2 resulted in 0.2 -> 1.2, which
|
|
got rounded to 0 -> 1. The result is that sometimes the line width is 1
|
|
pixel wider than expected.
|
|
|
|
Fix the problem by allowing VclPixelProcessor2D to request pixel
|
|
correction from BorderLinePrimitive2D. It wouldn't be possible to do
|
|
pixel correction only in VclPixelProcessor2D, as it has no idea what to
|
|
correct: it only gets polygons, so it has no idea if e.g. the top of a
|
|
polygon is the outer edge of a top border line or an inner edge of a
|
|
bottom border line.
|
|
|
|
Conflicts:
|
|
drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
|
|
|
|
(cherry picked from commits 1ee570a4e625719f8bf270d372926c0d829ae6f0,
|
|
555c9add26e06030402c73f885de98f4b96826f0,
|
|
304f50684d3ac08e973fd27e6acf3e821394d164,
|
|
422f10c5d7ebe6f4b778636c9c1eb6dbdf708a27,
|
|
ce12a5021a080cc1781e0e0256af5e0085e11ef2 and
|
|
cac70559013e575009657aa3c5168b88b1f14691)
|
|
|
|
Change-Id: I1971f3a952fbcdc598ab46c659e12d976c13cbe6
|
|
Reviewed-on: https://gerrit.libreoffice.org/24238
|
|
Tested-by: Jenkins <ci@libreoffice.org>
|
|
Reviewed-by: Eike Rathke <erack@redhat.com>
|
|
Tested-by: Eike Rathke <erack@redhat.com>
|
|
---
|
|
drawinglayer/CppunitTest_drawinglayer_border.mk | 52 +++++++
|
|
drawinglayer/Module_drawinglayer.mk | 4 +
|
|
drawinglayer/qa/unit/border.cxx | 150 +++++++++++++++++++++
|
|
.../source/primitive2d/borderlineprimitive2d.cxx | 28 +++-
|
|
.../source/processor2d/vclpixelprocessor2d.cxx | 7 +-
|
|
.../primitive2d/borderlineprimitive2d.hxx | 2 +
|
|
6 files changed, 239 insertions(+), 4 deletions(-)
|
|
create mode 100644 drawinglayer/CppunitTest_drawinglayer_border.mk
|
|
create mode 100644 drawinglayer/qa/unit/border.cxx
|
|
|
|
diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
|
|
index 30e656d..30e7dcb 100644
|
|
--- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
|
|
+++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
|
|
@@ -28,6 +28,17 @@
|
|
#include <numeric>
|
|
#include <algorithm>
|
|
|
|
+#if defined(ANDROID)
|
|
+namespace std
|
|
+{
|
|
+template<typename T>
|
|
+T round(T x)
|
|
+{
|
|
+ return ::round(x);
|
|
+}
|
|
+}
|
|
+#endif
|
|
+
|
|
namespace drawinglayer {
|
|
|
|
namespace {
|
|
@@ -63,7 +74,7 @@ primitive2d::Primitive2DReference makeSolidLinePrimitive(
|
|
const basegfx::B2DVector& rVector, const basegfx::BColor& rColor, double fLineWidth, double fGap)
|
|
{
|
|
const basegfx::B2DVector aPerpendicular = basegfx::getPerpendicular(rVector);
|
|
- const basegfx::B2DVector aLineWidthOffset = ((fLineWidth + 1.0) * 0.5) * aPerpendicular;
|
|
+ const basegfx::B2DVector aLineWidthOffset = (fLineWidth * 0.5) * aPerpendicular;
|
|
|
|
basegfx::B2DPolygon aPolygon;
|
|
aPolygon.append(rStart + aLineWidthOffset);
|
|
@@ -163,6 +174,11 @@ primitive2d::Primitive2DReference makeSolidLinePrimitive(
|
|
|
|
Primitive2DSequence BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
|
|
{
|
|
+ return createDecomposition(rViewInformation, false);
|
|
+ }
|
|
+
|
|
+ Primitive2DSequence BorderLinePrimitive2D::createDecomposition(const geometry::ViewInformation2D& rViewInformation, bool bPixelCorrection) const
|
|
+ {
|
|
Primitive2DSequence xRetval;
|
|
|
|
if(!getStart().equal(getEnd()) && ( isInsideUsed() || isOutsideUsed() ) )
|
|
@@ -199,8 +215,11 @@ primitive2d::Primitive2DReference makeSolidLinePrimitive(
|
|
xRetval[0] = makeHairLinePrimitive(
|
|
getStart(), getEnd(), aVector, getRGBColorLeft(), 0.0);
|
|
else
|
|
+ {
|
|
+ double fWidth = bPixelCorrection ? std::round(fLeftWidth) : fLeftWidth;
|
|
xRetval[0] = makeSolidLinePrimitive(
|
|
- aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorLeft(), fLeftWidth, -fLeftWidth/2.0);
|
|
+ aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorLeft(), fWidth, -fLeftWidth/2.0);
|
|
+ }
|
|
|
|
// "outside" line
|
|
|
|
@@ -208,8 +227,11 @@ primitive2d::Primitive2DReference makeSolidLinePrimitive(
|
|
xRetval[1] = makeHairLinePrimitive(
|
|
getStart(), getEnd(), aVector, getRGBColorRight(), fLeftWidth+mfDistance);
|
|
else
|
|
+ {
|
|
+ double fWidth = bPixelCorrection ? std::round(fRightWidth) : fRightWidth;
|
|
xRetval[1] = makeSolidLinePrimitive(
|
|
- aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorRight(), fRightWidth, mfDistance+fRightWidth/2.0);
|
|
+ aClipRegion, aTmpStart, aTmpEnd, aVector, getRGBColorRight(), fWidth, mfDistance+fRightWidth/2.0);
|
|
+ }
|
|
}
|
|
else
|
|
{
|
|
diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
|
|
index 8dcd74e..8398573 100644
|
|
--- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
|
|
+++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
|
|
@@ -1232,7 +1232,12 @@ namespace drawinglayer
|
|
static_cast<const drawinglayer::primitive2d::BorderLinePrimitive2D&>(rCandidate);
|
|
|
|
if (!tryDrawBorderLinePrimitive2DDirect(rBorder))
|
|
- process(rCandidate.get2DDecomposition(getViewInformation2D()));
|
|
+ {
|
|
+ if (rBorder.getStyle() == table::BorderLineStyle::DOUBLE)
|
|
+ process(rBorder.createDecomposition(getViewInformation2D(), true));
|
|
+ else
|
|
+ process(rCandidate.get2DDecomposition(getViewInformation2D()));
|
|
+ }
|
|
|
|
mpOutputDevice->SetAntialiasing(nAntiAliasing);
|
|
break;
|
|
diff --git a/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx b/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx
|
|
index 72e04d5..f152f2d 100644
|
|
--- a/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx
|
|
+++ b/include/drawinglayer/primitive2d/borderlineprimitive2d.hxx
|
|
@@ -132,6 +132,8 @@ namespace drawinglayer
|
|
bool hasGapColor( ) const { return mbHasGapColor; }
|
|
short getStyle () const { return mnStyle; }
|
|
double getPatternScale() const { return mfPatternScale; }
|
|
+ /// Same as create2DDecomposition(), but can do pixel correction if requested.
|
|
+ Primitive2DSequence createDecomposition(const geometry::ViewInformation2D& rViewInformation, bool bPixelCorrection) const;
|
|
|
|
/// compare operator
|
|
virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
|
|
--
|
|
2.6.6
|
|
|