All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Liu <net147@gmail.com>
To: openembedded-core@lists.openembedded.org
Subject: [PATCH] qt4: add upstream QTBUG-31579 patch to fix polyline drawing regression
Date: Fri,  5 Jul 2013 13:41:23 +1000	[thread overview]
Message-ID: <1372995683-12459-1-git-send-email-net147@gmail.com> (raw)

Signed-off-by: Jonathan Liu <net147@gmail.com>
---
 meta/recipes-qt/qt4/qt4-4.8.5.inc                  |   1 +
 ...-of-0-width-polylines-from-outside-the-de.patch | 148 +++++++++++++++++++++
 2 files changed, 149 insertions(+)
 create mode 100644 meta/recipes-qt/qt4/qt4-4.8.5/0022-Fix-drawing-of-0-width-polylines-from-outside-the-de.patch

diff --git a/meta/recipes-qt/qt4/qt4-4.8.5.inc b/meta/recipes-qt/qt4/qt4-4.8.5.inc
index 184261a..709e3a8 100644
--- a/meta/recipes-qt/qt4/qt4-4.8.5.inc
+++ b/meta/recipes-qt/qt4/qt4-4.8.5.inc
@@ -21,6 +21,7 @@ SRC_URI = "http://download.qt-project.org/official_releases/qt/4.8/${PV}/qt-ever
            file://0018-configure-make-pulseaudio-a-configurable-option.patch \
            file://0019-Fixes-for-gcc-4.7.0-particularly-on-qemux86.patch \
            file://0020-webkit-disable-the-fuse-ld-gold-flag.patch \
+           file://0022-Fix-drawing-of-0-width-polylines-from-outside-the-de.patch \
            file://g++.conf \
            file://linux.conf \
            "
diff --git a/meta/recipes-qt/qt4/qt4-4.8.5/0022-Fix-drawing-of-0-width-polylines-from-outside-the-de.patch b/meta/recipes-qt/qt4/qt4-4.8.5/0022-Fix-drawing-of-0-width-polylines-from-outside-the-de.patch
new file mode 100644
index 0000000..ad45dd0
--- /dev/null
+++ b/meta/recipes-qt/qt4/qt4-4.8.5/0022-Fix-drawing-of-0-width-polylines-from-outside-the-de.patch
@@ -0,0 +1,148 @@
+From b7029fbd12c32e851ed7d81b692197176eb71d9e Mon Sep 17 00:00:00 2001
+From: Gunnar Sletta <gunnar.sletta@digia.com>
+Date: Thu, 4 Jul 2013 16:20:40 +1000
+Subject: [PATCH] Fix drawing of 0-width polylines from outside the devicerect.
+
+This was broken by a previous fix which aimed to fix gaps in
+polylines with tiny line segments. The result was that we
+skipped updating the origin point when stroke() didn't produce
+pixels which accidentally included the case of the line
+being completely outside the deviceRect. I fixed this
+by returning the value of clipLine in drawLine to the caller
+so we could still update the origin for this case.
+
+Upstream-Status: Accepted [https://codereview.qt-project.org/#change,60427]
+Signed-off-by: Jonathan Liu <net147@gmail.com>
+
+Task-number: QTBUG-31579
+Change-Id: Iac29436f042da7658bbeaf9370351dc6f2c95065
+(cherry picked from qtbase/900cccfd459fcbdbc4aa3d313afe12cfbf68fd87)
+---
+ src/gui/painting/qcosmeticstroker.cpp | 42 ++++++++++++++++++++++-------------
+ src/gui/painting/qcosmeticstroker_p.h |  2 +-
+ 2 files changed, 27 insertions(+), 17 deletions(-)
+
+diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp
+index 0061ecb..4413170 100644
+--- a/src/gui/painting/qcosmeticstroker.cpp
++++ b/src/gui/painting/qcosmeticstroker.cpp
+@@ -133,10 +133,15 @@ struct NoDasher {
+ 
+ };
+ 
++/*
++ * The return value is the result of the clipLine() call performed at the start
++ * of each of the two functions, aka "false" means completely outside the devices
++ * rect.
++ */
+ template<DrawPixel drawPixel, class Dasher>
+-static void drawLine(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
++static bool drawLine(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
+ template<DrawPixel drawPixel, class Dasher>
+-static void drawLineAA(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
++static bool drawLineAA(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
+ 
+ inline void drawPixel(QCosmeticStroker *stroker, int x, int y, int coverage)
+ {
+@@ -602,17 +607,20 @@ void QCosmeticStroker::drawPath(const QVectorPath &path)
+                 caps |= CapEnd;
+ 
+             QCosmeticStroker::Point last = this->lastPixel;
+-            stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps);
++            bool unclipped = stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps);
+ 
+             /* fix for gaps in polylines with fastpen and aliased in a sequence
+                of points with small distances: if current point p2 has been dropped
+-               out, keep last non dropped point p. */
+-            if (fastPenAliased) {
+-                if (last.x != lastPixel.x || last.y != lastPixel.y ||
+-                    points == begin + 2 || points == end - 2 ) {
+-                    {
+-                        p = p2;
+-                    }
++               out, keep last non dropped point p.
++
++               However, if the line was completely outside the devicerect, we
++               still need to update p to avoid drawing the line after this one from
++               a bad starting position.
++            */
++            if (fastPenAliased && unclipped) {
++                if (last.x != lastPixel.x || last.y != lastPixel.y
++                    || points == begin + 2 || points == end - 2) {
++                    p = p2;
+                 }
+             } else {
+                 p = p2;
+@@ -720,10 +728,10 @@ static inline void capAdjust(int caps, int &x1, int &x2, int &y, int yinc)
+   the drawing shifts from horizontal to vertical or back.
+   */
+ template<DrawPixel drawPixel, class Dasher>
+-static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps)
++static bool drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps)
+ {
+     if (stroker->clipLine(rx1, ry1, rx2, ry2))
+-        return;
++        return false;
+ 
+     static const int half = 31;
+     int x1 = toF26Dot6(rx1) + half;
+@@ -813,7 +821,7 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
+     } else {
+         // horizontal
+         if (!dx)
+-            return;
++            return true;
+ 
+         QCosmeticStroker::Direction dir = QCosmeticStroker::LeftToRight;
+ 
+@@ -886,14 +894,15 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
+         }
+     }
+     stroker->lastPixel = last;
++    return true;
+ }
+ 
+ 
+ template<DrawPixel drawPixel, class Dasher>
+-static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps)
++static bool drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps)
+ {
+     if (stroker->clipLine(rx1, ry1, rx2, ry2))
+-        return;
++        return false;
+ 
+     int x1 = toF26Dot6(rx1);
+     int y1 = toF26Dot6(ry1);
+@@ -967,7 +976,7 @@ static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx
+     } else {
+         // horizontal
+         if (!dx)
+-            return;
++            return true;
+ 
+         int yinc = F16Dot16FixedDiv(dy, dx);
+ 
+@@ -1029,6 +1038,7 @@ static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx
+             drawPixel(stroker, x, (y>>16) + 1, alpha * alphaEnd >> 6);
+         }
+     }
++    return true;
+ }
+ 
+ QT_END_NAMESPACE
+diff --git a/src/gui/painting/qcosmeticstroker_p.h b/src/gui/painting/qcosmeticstroker_p.h
+index 870738b..3216856 100644
+--- a/src/gui/painting/qcosmeticstroker_p.h
++++ b/src/gui/painting/qcosmeticstroker_p.h
+@@ -56,7 +56,7 @@ QT_MODULE(Gui)
+ class QCosmeticStroker;
+ 
+ 
+-typedef void (*StrokeLine)(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
++typedef bool (*StrokeLine)(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps);
+ 
+ class QCosmeticStroker
+ {
+-- 
+1.8.3.2
+
-- 
1.8.3.2



                 reply	other threads:[~2013-07-05  3:25 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1372995683-12459-1-git-send-email-net147@gmail.com \
    --to=net147@gmail.com \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.