diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-29 14:17:46 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-29 14:17:46 +0200 |
commit | 7224dd977163335d61ed4297341e6161bf1dbcf7 (patch) | |
tree | 1674bfdd872ba45908437c9cbc67ba98f5f3b534 /src/particles | |
parent | c704226b6815df4d989142729bae9fadd14f6f9d (diff) | |
parent | f3973cbd077d2d92250958f8bda57fea30827f00 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I35f07a1725af104952f822274763dd7a96a9d560
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/qquickmaskextruder.cpp | 33 | ||||
-rw-r--r-- | src/particles/qquickparticlepainter.cpp | 2 |
2 files changed, 25 insertions, 10 deletions
diff --git a/src/particles/qquickmaskextruder.cpp b/src/particles/qquickmaskextruder.cpp index 3153e2b7d0..f8ed042a9b 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,13 +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? - for (int i=0; i<r.width(); i++){ - for (int j=0; j<r.height(); j++){ - if (m_img.pixelIndex(i,j))//Direct bit manipulation is presumably more efficient - m_mask << QPointF(i,j); + m_img = m_pix.image(); + // Image will in all likelyhood be in this format already, so + // no extra memory or conversion takes place + if (m_img.format() != QImage::Format_ARGB32 && m_img.format() != QImage::Format_ARGB32_Premultiplied) + m_img = m_img.convertToFormat(QImage::Format_ARGB32_Premultiplied); + + // resample on the fly using 16-bit + int sx = (m_img.width() << 16) / r.width(); + int sy = (m_img.height() << 16) / r.height(); + int w = r.width(); + int h = r.height(); + for (int y=0; y<h; ++y) { + const uint *sl = (const uint *) m_img.constScanLine((y * sy) >> 16); + for (int x=0; x<w; ++x) { + if (sl[(x * sx) >> 16] & 0xff000000) + m_mask << QPointF(x, y); } } } diff --git a/src/particles/qquickparticlepainter.cpp b/src/particles/qquickparticlepainter.cpp index a84f4a66f4..694391a701 100644 --- a/src/particles/qquickparticlepainter.cpp +++ b/src/particles/qquickparticlepainter.cpp @@ -80,8 +80,8 @@ void QQuickParticlePainter::itemChange(ItemChange change, const ItemChangeData & m_window = data.window; if (m_window) connect(m_window, SIGNAL(sceneGraphInvalidated()), this, SLOT(sceneGraphInvalidated()), Qt::DirectConnection); - } + QQuickItem::itemChange(change, data); } void QQuickParticlePainter::componentComplete() |