Enable mipmapping for QSGPaintedItem's texture.
authorYoann Lopes <yoann.lopes@nokia.com>
Mon, 9 May 2011 11:12:35 +0000 (13:12 +0200)
committerYoann Lopes <yoann.lopes@nokia.com>
Mon, 9 May 2011 11:13:24 +0000 (13:13 +0200)
src/declarative/items/qsgpainteditem.cpp
src/declarative/scenegraph/util/qsgpainternode.cpp
src/declarative/scenegraph/util/qsgpainternode_p.h

index b93406a..89cbc5e 100644 (file)
@@ -416,6 +416,7 @@ QSGNode *QSGPaintedItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
     node->setSize(QSize(qRound(br.width()), qRound(br.height())));
     node->setSmoothPainting(d->antialiasing);
     node->setLinearFiltering(d->smooth);
+    node->setMipmapping(d->smooth);
     node->setOpaquePainting(d->opaquePainting);
     node->setFillColor(d->fillColor);
     node->setContentsScale(d->contentsScale);
index 1f38c6a..ee42a38 100644 (file)
@@ -108,6 +108,7 @@ QSGPainterNode::QSGPainterNode(QSGPaintedItem *item)
     , m_dirtyContents(false)
     , m_opaquePainting(false)
     , m_linear_filtering(false)
+    , m_mipmapping(false)
     , m_smoothPainting(false)
     , m_extensionsChecked(false)
     , m_multisamplingSupported(false)
@@ -194,6 +195,7 @@ void QSGPainterNode::update()
 
 void QSGPainterNode::updateTexture()
 {
+    m_texture->setHasMipmaps(m_mipmapping);
     m_texture->setHasAlphaChannel(!m_opaquePainting);
     m_material.setTexture(m_texture);
     m_materialO.setTexture(m_texture);
@@ -293,8 +295,6 @@ void QSGPainterNode::updateRenderTarget()
 
     texture->setTextureSize(m_size);
     m_texture = texture;
-    m_material.setFiltering(m_linear_filtering ? QSGTexture::Linear : QSGTexture::Nearest);
-    m_materialO.setFiltering(m_linear_filtering ? QSGTexture::Linear : QSGTexture::Nearest);
 }
 
 void QSGPainterNode::updateFBOSize()
@@ -361,6 +361,17 @@ void QSGPainterNode::setLinearFiltering(bool linearFiltering)
     markDirty(DirtyMaterial);
 }
 
+void QSGPainterNode::setMipmapping(bool mipmapping)
+{
+    if (mipmapping == m_mipmapping)
+        return;
+
+    m_mipmapping = mipmapping;
+    m_material.setMipmapFiltering(mipmapping ? QSGTexture::Linear : QSGTexture::None);
+    m_materialO.setMipmapFiltering(mipmapping ? QSGTexture::Linear : QSGTexture::None);
+    m_dirtyTexture = true;
+}
+
 void QSGPainterNode::setSmoothPainting(bool s)
 {
     if (s == m_smoothPainting)
index a5f42ca..4174eb2 100644 (file)
@@ -87,6 +87,9 @@ public:
     void setLinearFiltering(bool linearFiltering);
     bool linearFiltering() const { return m_linear_filtering; }
 
+    void setMipmapping(bool mipmapping);
+    bool mipmapping() const { return m_mipmapping; }
+
     void setSmoothPainting(bool s);
     bool smoothPainting() const { return m_smoothPainting; }
 
@@ -126,6 +129,7 @@ private:
     QRect m_dirtyRect;
     bool m_opaquePainting;
     bool m_linear_filtering;
+    bool m_mipmapping;
     bool m_smoothPainting;
     bool m_extensionsChecked;
     bool m_multisamplingSupported;