[vlc-devel] [PATCH 3/9] qt: generate genre covers in 4x2 grid with blur and dark effects
Prince Gupta
guptaprince8832 at gmail.com
Mon Aug 10 15:20:24 CEST 2020
---
modules/gui/qt/medialibrary/mlgenre.cpp | 88 +++++++++++++++----------
1 file changed, 52 insertions(+), 36 deletions(-)
diff --git a/modules/gui/qt/medialibrary/mlgenre.cpp b/modules/gui/qt/medialibrary/mlgenre.cpp
index aee536fd41..34cb9263d5 100644
--- a/modules/gui/qt/medialibrary/mlgenre.cpp
+++ b/modules/gui/qt/medialibrary/mlgenre.cpp
@@ -23,13 +23,34 @@
#include <QMutex>
#include <QWaitCondition>
#include <QDir>
+#include <QGradient>
+#include <QGraphicsScene>
+#include <QGraphicsPixmapItem>
+#include <QGraphicsBlurEffect>
+#include <algorithm>
#include "mlgenre.hpp"
#include "qt.hpp"
namespace {
-#define THUMBNAIL_WIDTH 512
-#define THUMBNAIL_HEIGHT 512
+#define THUMBNAIL_WIDTH 260
+#define THUMBNAIL_HEIGHT 130
+
+QImage blurImage(const QImage& src)
+{
+ QGraphicsScene scene;
+ QGraphicsPixmapItem item;
+ item.setPixmap(QPixmap::fromImage(src));
+ QGraphicsBlurEffect blurEffect;
+ blurEffect.setBlurRadius(4);
+ blurEffect.setBlurHints(QGraphicsBlurEffect::QualityHint);
+ item.setGraphicsEffect(&blurEffect);
+ scene.addItem(&item);
+ QImage res(src.size(), QImage::Format_ARGB32);
+ QPainter ptr(&res);
+ scene.render(&ptr);
+ return res;
+}
class GenerateCoverTask : public QRunnable
{
@@ -97,21 +118,28 @@ public:
memset(&queryParams, 0, sizeof(vlc_ml_query_params_t));
album_list.reset( vlc_ml_list_genre_albums(m_ml, &queryParams, genreId) );
- QStringList thumnails;
- int count = 0;
+ QStringList thumbnails;
+ thumbnails.reserve(8);
for( const vlc_ml_album_t& media: ml_range_iterate<vlc_ml_album_t>( album_list ) ) {
if (media.thumbnails[VLC_ML_THUMBNAIL_SMALL].b_generated) {
QUrl mediaURL( media.thumbnails[VLC_ML_THUMBNAIL_SMALL].psz_mrl );
//QImage only accept local file
if (mediaURL.isValid() && mediaURL.isLocalFile()) {
- thumnails.append(mediaURL.path());
- count++;
- if (count >= 4)
+ thumbnails.append(mediaURL.path());
+ if (thumbnails.size() == 8)
break;
}
}
}
+ if (thumbnails.empty()) {
+ thumbnails.append(":/noart_album.svg");
+ }
+
+ assert(thumbnails.size() <= 8);
+ std::copy(thumbnails.begin(), ( thumbnails.begin() + ( 8 - thumbnails.size() ) ), std::back_inserter(thumbnails));
+ assert(thumbnails.size() == 8);
+
{
QMutexLocker lock(&m_taskLock);
if (m_canceled) {
@@ -122,41 +150,29 @@ public:
}
QImage image(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, QImage::Format_RGB32);
+ image.fill(Qt::white);
QPainter painter;
painter.begin(&image);
- switch (count) {
- case 0:
- break;
-
- case 1:
- drawRegion(painter, thumnails[0], QRect(0, 0, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT ));
- break;
-
- case 2:
- drawRegion(painter, thumnails[0], QRect(0, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT ));
- drawRegion(painter, thumnails[1], QRect(THUMBNAIL_WIDTH/2, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT ));
- break;
-
- case 3:
- drawRegion(painter, thumnails[0], QRect(0, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT ));
- drawRegion(painter, thumnails[1], QRect(THUMBNAIL_WIDTH/2, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- drawRegion(painter, thumnails[2], QRect(THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- break;
-
- case 4:
- drawRegion(painter, thumnails[0], QRect(0, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- drawRegion(painter, thumnails[1], QRect(THUMBNAIL_WIDTH/2, 0, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- drawRegion(painter, thumnails[2], QRect(THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- drawRegion(painter, thumnails[3], QRect(0, THUMBNAIL_HEIGHT/2, THUMBNAIL_WIDTH/2, THUMBNAIL_HEIGHT/2));
- break;
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 4; j++) {
+ drawRegion(painter, thumbnails[2*j+1], QRect( ( THUMBNAIL_WIDTH / 4 ) * j, ( THUMBNAIL_HEIGHT / 2 ) * i, THUMBNAIL_WIDTH / 4, THUMBNAIL_HEIGHT / 2 ));
+ }
}
painter.end();
- if (count > 0) {
- if (image.save(m_filepath, "jpg"))
- m_genre->setCover(QUrl::fromLocalFile(m_filepath).toString());
- }
+ image = blurImage(image);
+
+ QLinearGradient gradient;
+ gradient.setColorAt(0, QColor(0, 0, 0, 255*.3));
+ gradient.setColorAt(1, QColor(0, 0, 0, 255*.7));
+ painter.begin(&image);
+ painter.setOpacity(.7);
+ painter.fillRect(image.rect(), gradient);
+ painter.end();
+
+ if (image.save(m_filepath, "jpg"))
+ m_genre->setCover(QUrl::fromLocalFile(m_filepath).toString());
{
QMutexLocker lock(&m_taskLock);
--
2.25.1
More information about the vlc-devel
mailing list