From 6506e0a6eec67985432427c630b148e825184c5d Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Mon, 12 Dec 2011 12:57:08 +0100 Subject: Improved path filling performance in the raster paint engine. Convert bezier curves to polylines before rasterizing with gray raster. Change-Id: I353debd4338f2a3ce2fa1cfa1bff9dd2e36f05ab Reviewed-by: Gunnar Sletta --- src/gui/painting/qoutlinemapper.cpp | 90 ++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 40 deletions(-) (limited to 'src/gui/painting/qoutlinemapper.cpp') diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp index 8b607b28b8..1aa77592ae 100644 --- a/src/gui/painting/qoutlinemapper.cpp +++ b/src/gui/painting/qoutlinemapper.cpp @@ -42,6 +42,7 @@ #include "qoutlinemapper_p.h" #include #include "qmath.h" +#include #include @@ -74,6 +75,19 @@ static const QRectF boundingRect(const QPointF *points, int pointCount) return QRectF(QPointF(minx, miny), QPointF(maxx, maxy)); } +void QOutlineMapper::curveTo(const QPointF &cp1, const QPointF &cp2, const QPointF &ep) { +#ifdef QT_DEBUG_CONVERT + printf("QOutlineMapper::curveTo() (%f, %f)\n", ep.x(), ep.y()); +#endif + + QBezier bezier = QBezier::fromPoints(m_elements.last(), cp1, cp2, ep); + bezier.addToPolygon(m_elements, m_curve_threshold); + m_element_types.reserve(m_elements.size()); + for (int i = m_elements.size() - m_element_types.size(); i; --i) + m_element_types << QPainterPath::LineToElement; + Q_ASSERT(m_elements.size() == m_element_types.size()); +} + QT_FT_Outline *QOutlineMapper::convertPath(const QPainterPath &path) { @@ -169,51 +183,47 @@ void QOutlineMapper::endOutline() { closeSubpath(); - int element_count = m_elements.size(); - - if (element_count == 0) { + if (m_elements.isEmpty()) { memset(&m_outline, 0, sizeof(m_outline)); return; } - QPointF *elements; + QPointF *elements = m_elements.data(); // Transform the outline if (m_txop == QTransform::TxNone) { - elements = m_elements.data(); - } else { - if (m_txop == QTransform::TxTranslate) { - for (int i=0; i QT_RASTER_COORD_LIMIT)); if (do_clip) { - clipElements(elements, elementTypes(), element_count); + clipElements(elements, elementTypes(), m_elements.size()); } else { - convertElements(elements, elementTypes(), element_count); + convertElements(elements, elementTypes(), m_elements.size()); } } -- cgit v1.2.3