From 920fc1a523f63cc08d73af32b354379b29572652 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 14 Apr 2016 13:21:40 +0200 Subject: 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 --- src/gui/painting/qoutlinemapper.cpp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'src') 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; } -- cgit v1.2.3