libreoffice/bnc856729.patch
Tomáš Chvátal bb8f8c342f Accepting request 391705 from LibreOffice:5.1
- 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
2016-04-27 11:29:21 +00:00

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