summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-04-14 13:21:40 +0200
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-04-15 10:54:28 +0000
commit920fc1a523f63cc08d73af32b354379b29572652 (patch)
treebc39bcd75b30631345660e1034878a9c0498449f
parent23ab267c724414de67b0ee5b29eca027bdf23fab (diff)
Fix perspective clipping regression
Undoes part of c327fb79e1a50c825a945e97f2c66d07a1c6d225 so perspective transforms are still handled by QTransform on the path. Change-Id: I4801f24898a401ff93a96a852170ea6b7b70ce1c Reviewed-by: aavit <eirik.aavitsland@theqtcompany.com>
-rw-r--r--src/gui/painting/qoutlinemapper.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp
index 0d10fa18bb..7245b44fc7 100644
--- a/src/gui/painting/qoutlinemapper.cpp
+++ b/src/gui/painting/qoutlinemapper.cpp
@@ -188,9 +188,27 @@ void QOutlineMapper::endOutline()
QPointF *elements = m_elements.data();
// Transform the outline
- if (!m_in_clip_elements) {
+ if (m_transform.isIdentity()) {
+ // Nothing to do
+ } else if (m_transform.type() < QTransform::TxProject) {
for (int i = 0; i < m_elements.size(); ++i)
elements[i] = m_transform.map(elements[i]);
+ } else {
+ const QVectorPath vp((qreal *)elements, m_elements.size(),
+ m_element_types.size() ? m_element_types.data() : 0);
+ QPainterPath path = vp.convertToPainterPath();
+ path = m_transform.map(path);
+ if (!(m_outline.flags & QT_FT_OUTLINE_EVEN_ODD_FILL))
+ path.setFillRule(Qt::WindingFill);
+ if (path.isEmpty()) {
+ m_valid = false;
+ } else {
+ QTransform oldTransform = m_transform;
+ m_transform.reset();
+ convertPath(path);
+ m_transform = oldTransform;
+ }
+ return;
}
controlPointRect = boundingRect(elements, m_elements.size());
@@ -358,10 +376,14 @@ void QOutlineMapper::clipElements(const QPointF *elements,
QPainterPath clipPath;
clipPath.addRect(m_clip_rect);
QPainterPath clippedPath = path.intersected(clipPath);
- if (clippedPath.isEmpty())
+ if (clippedPath.isEmpty()) {
m_valid = false;
- else
+ } else {
+ QTransform oldTransform = m_transform;
+ m_transform.reset();
convertPath(clippedPath);
+ m_transform = oldTransform;
+ }
m_in_clip_elements = false;
}