diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-04-14 13:21:40 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-04-15 10:54:28 +0000 |
commit | 920fc1a523f63cc08d73af32b354379b29572652 (patch) | |
tree | bc39bcd75b30631345660e1034878a9c0498449f | |
parent | 23ab267c724414de67b0ee5b29eca027bdf23fab (diff) | |
download | qtbase-920fc1a523f63cc08d73af32b354379b29572652.tar.gz |
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.cpp | 28 |
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; } |