From: Gunnar Sletta Date: Fri, 26 Apr 2013 12:54:04 +0000 (+0200) Subject: Optimize particle mask extruder X-Git-Tag: upstream/5.2.1~798^2~117 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5673fc8b9c0785537d64b1356e47a4574b6b8852;p=platform%2Fupstream%2Fqtdeclarative.git Optimize particle mask extruder Change-Id: Ideed246f49301f826935d3fe4a25a3b593ee6b07 Reviewed-by: Samuel Rødal --- diff --git a/src/particles/qquickmaskextruder.cpp b/src/particles/qquickmaskextruder.cpp index 927cf97..f8ed042 100644 --- a/src/particles/qquickmaskextruder.cpp +++ b/src/particles/qquickmaskextruder.cpp @@ -114,12 +114,18 @@ bool QQuickMaskExtruder::contains(const QRectF &bounds, const QPointF &point) ensureInitialized(bounds);//###Current usage patterns WILL lead to different bounds/r calls. Separate list? if (m_img.isNull()) return false; - QPoint p = point.toPoint() - bounds.topLeft().toPoint(); + + QPointF pt = point - bounds.topLeft(); + QPoint p(pt.x() * m_img.width() / bounds.width(), + pt.y() * m_img.height() / bounds.height()); return m_img.rect().contains(p) && (bool)m_img.pixelIndex(p); } -void QQuickMaskExtruder::ensureInitialized(const QRectF &r) +void QQuickMaskExtruder::ensureInitialized(const QRectF &rf) { + // Convert to integer coords to avoid comparing floats and ints which would + // often result in rounding errors. + QRect r = rf.toRect(); if (m_lastWidth == r.width() && m_lastHeight == r.height()) return;//Same as before if (!m_pix.isReady()) @@ -129,15 +135,22 @@ void QQuickMaskExtruder::ensureInitialized(const QRectF &r) m_mask.clear(); - m_img = m_pix.image().createAlphaMask(); - m_img = m_img.convertToFormat(QImage::Format_Mono);//Else LSB, but I think that's easier - m_img = m_img.scaled(r.size().toSize());//TODO: Do they need aspect ratio stuff? Or tiling? - int w = m_img.width(); - int h = m_img.height(); - for (int i=0; i> 16); + for (int x=0; x> 16] & 0xff000000) + m_mask << QPointF(x, y); } } }