[vlc-commits] commit: qt4: use caching in pictureflow (bring it back) (Ilkka Ollakka )
git at videolan.org
git at videolan.org
Tue Dec 14 22:46:29 CET 2010
vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Tue Dec 14 19:40:57 2010 +0200| [e054f6f0e3aaa3153e7706efca5b8ff36b5dc5ea] | committer: Ilkka Ollakka
qt4: use caching in pictureflow (bring it back)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e054f6f0e3aaa3153e7706efca5b8ff36b5dc5ea
---
modules/gui/qt4/util/pictureflow.cpp | 39 +++++++++++++++++++++++----------
1 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/modules/gui/qt4/util/pictureflow.cpp b/modules/gui/qt4/util/pictureflow.cpp
index 7d4976c..39cf780 100644
--- a/modules/gui/qt4/util/pictureflow.cpp
+++ b/modules/gui/qt4/util/pictureflow.cpp
@@ -40,8 +40,10 @@
#include <QTimer>
#include <QVector>
#include <QWidget>
+#include <QHash>
#include "../components/playlist/playlist_model.hpp" /* getArtPixmap etc */
#include "../components/playlist/sorting.h" /* Columns List */
+#include "input_manager.hpp"
// for fixed-point arithmetic, we need minimum 32-bit long
// long long (64-bit) might be useful for multiplication and division
@@ -199,7 +201,8 @@ private:
void render();
void renderSlides();
QRect renderSlide(const SlideInfo &slide, int col1 = -1, int col2 = -1);
- QImage* surface(int slideIndex);
+ QImage* surface(QModelIndex);
+ QHash<QString, QImage*> cache;
};
// ------------- PictureFlowState ---------------------------------------
@@ -414,6 +417,7 @@ PictureFlowSoftwareRenderer::PictureFlowSoftwareRenderer():
PictureFlowSoftwareRenderer::~PictureFlowSoftwareRenderer()
{
buffer = QImage();
+ cache.clear();
delete blankSurface;
}
@@ -605,19 +609,15 @@ static QImage* prepareSurface(const QImage* slideImage, int w, int h, QRgb bgcol
return result;
}
-QImage* PictureFlowSoftwareRenderer::surface(int slideIndex)
+QImage* PictureFlowSoftwareRenderer::surface(QModelIndex index)
{
- if (!state)
- return 0;
- if (slideIndex < 0)
- return 0;
- if (slideIndex >= state->model->rowCount( state->model->currentIndex().parent() ) )
+ if (!state || !index.isValid())
return 0;
- QImage* img = new QImage(PLModel::getArtPixmap( state->model->index( slideIndex, 0, state->model->currentIndex().parent() ),
+ QImage* img = new QImage(PLModel::getArtPixmap( index,
QSize( state->slideWidth, state->slideHeight ) ).toImage());
- QImage* sr = prepareSurface(img, state->slideWidth, state->slideHeight, bgcolor, state->reflectionEffect, state->model->index( slideIndex, 0, state->model->currentIndex().parent() ) );
+ QImage* sr = prepareSurface(img, state->slideWidth, state->slideHeight, bgcolor, state->reflectionEffect, index );
delete img;
return sr;
@@ -631,7 +631,24 @@ QRect PictureFlowSoftwareRenderer::renderSlide(const SlideInfo &slide, int col1,
if (!blend)
return QRect();
- QImage* src = surface(slide.slideIndex);
+ QModelIndex index;
+
+ index = state->model->index( slide.slideIndex, 0, state->model->currentIndex().parent() );
+ if( !index.isValid() )
+ return QRect();
+
+ PLItem *item = static_cast<PLItem*>( index.internalPointer() );
+
+ QString key = QString("%1%2%3%4").arg(PLModel::getMeta( index, COLUMN_TITLE )).arg( PLModel::getMeta( index, COLUMN_ARTIST ) ).arg(index.data( PLModel::IsCurrentRole ).toBool() ).arg( InputManager::decodeArtURL( item->inputItem() ) );
+
+ QImage* src;
+ if( cache.contains( key ) )
+ src = cache.value( key );
+ else
+ {
+ src = surface( index );
+ cache.insert( key, src );
+ }
if (!src)
return QRect();
@@ -664,7 +681,6 @@ QRect PictureFlowSoftwareRenderer::renderSlide(const SlideInfo &slide, int col1,
int xi = qMax((PFreal)0, (w * PFREAL_ONE / 2) + fdiv(xs * h, dist + ys) >> PFREAL_SHIFT);
if (xi >= w)
{
- delete src;
return rect;
}
@@ -736,7 +752,6 @@ QRect PictureFlowSoftwareRenderer::renderSlide(const SlideInfo &slide, int col1,
rect.setTop(0);
rect.setBottom(h - 1);
- delete src;
return rect;
}
More information about the vlc-commits
mailing list