Cleanup jdenticon code in the same way as blurhashes

pull/850/head
Nicolas Werner 3 years ago
parent 04cccb8283
commit 8edc46dc16
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
  1. 2
      src/BlurhashProvider.h
  2. 95
      src/JdenticonProvider.cpp
  3. 52
      src/JdenticonProvider.h

@ -50,7 +50,7 @@ public:
void handleDone(QImage image) void handleDone(QImage image)
{ {
m_image = image; m_image = std::move(image);
emit finished(); emit finished();
} }
void handleError(QString error) void handleError(QString error)

@ -19,6 +19,35 @@
#include "Utils.h" #include "Utils.h"
#include "jdenticoninterface.h" #include "jdenticoninterface.h"
namespace Jdenticon {
JdenticonInterface *
getJdenticonInterface()
{
static JdenticonInterface *interface = nullptr;
static bool interfaceExists{true};
if (interface == nullptr && interfaceExists) {
QDir pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader("qtjdenticon");
QObject *plugin = pluginLoader.instance();
if (plugin) {
interface = qobject_cast<JdenticonInterface *>(plugin);
if (interface) {
nhlog::ui()->info("Loaded jdenticon plugin.");
}
}
if (!interface) {
nhlog::ui()->info("jdenticon plugin not found.");
interfaceExists = false;
}
}
return interface;
}
}
static QPixmap static QPixmap
clipRadius(QPixmap img, double radius) clipRadius(QPixmap img, double radius)
{ {
@ -39,6 +68,17 @@ clipRadius(QPixmap img, double radius)
} }
JdenticonResponse::JdenticonResponse(const QString &key, JdenticonResponse::JdenticonResponse(const QString &key,
bool crop,
double radius,
const QSize &requestedSize,
QThreadPool *pool)
{
auto runnable = new JdenticonRunnable(key, crop, radius, requestedSize);
connect(runnable, &JdenticonRunnable::done, this, &JdenticonResponse::handleDone);
pool->start(runnable);
}
JdenticonRunnable::JdenticonRunnable(const QString &key,
bool crop, bool crop,
double radius, double radius,
const QSize &requestedSize) const QSize &requestedSize)
@ -46,25 +86,27 @@ JdenticonResponse::JdenticonResponse(const QString &key,
, m_crop{crop} , m_crop{crop}
, m_radius{radius} , m_radius{radius}
, m_requestedSize(requestedSize.isValid() ? requestedSize : QSize(100, 100)) , m_requestedSize(requestedSize.isValid() ? requestedSize : QSize(100, 100))
, m_pixmap{m_requestedSize} {}
, jdenticonInterface_{Jdenticon::getJdenticonInterface()}
{
setAutoDelete(false);
}
void void
JdenticonResponse::run() JdenticonRunnable::run()
{ {
m_pixmap.fill(Qt::transparent); QPixmap pixmap(m_requestedSize);
pixmap.fill(Qt::transparent);
auto jdenticon = Jdenticon::getJdenticonInterface();
if (!jdenticon) {
emit done(pixmap.toImage());
return;
}
QPainter painter; QPainter painter;
painter.begin(&m_pixmap); painter.begin(&pixmap);
painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::SmoothPixmapTransform, true); painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
try { try {
QSvgRenderer renderer{ QSvgRenderer renderer{jdenticon->generate(m_key, m_requestedSize.width()).toUtf8()};
jdenticonInterface_->generate(m_key, m_requestedSize.width()).toUtf8()};
renderer.render(&painter); renderer.render(&painter);
} catch (std::exception &e) { } catch (std::exception &e) {
nhlog::ui()->error( nhlog::ui()->error(
@ -73,36 +115,13 @@ JdenticonResponse::run()
painter.end(); painter.end();
m_pixmap = clipRadius(m_pixmap, m_radius); pixmap = clipRadius(pixmap, m_radius);
emit finished(); emit done(pixmap.toImage());
} }
namespace Jdenticon { bool
JdenticonInterface * JdenticonProvider::isAvailable()
getJdenticonInterface()
{ {
static JdenticonInterface *interface = nullptr; return Jdenticon::getJdenticonInterface() != nullptr;
static bool interfaceExists{true};
if (interface == nullptr && interfaceExists) {
QDir pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader("qtjdenticon");
QObject *plugin = pluginLoader.instance();
if (plugin) {
interface = qobject_cast<JdenticonInterface *>(plugin);
if (interface) {
nhlog::ui()->info("Loaded jdenticon plugin.");
}
}
if (!interface) {
nhlog::ui()->info("jdenticon plugin not found.");
interfaceExists = false;
}
}
return interface;
}
} }

@ -13,31 +13,47 @@
#include "jdenticoninterface.h" #include "jdenticoninterface.h"
namespace Jdenticon { class JdenticonRunnable
JdenticonInterface * : public QObject
getJdenticonInterface();
}
class JdenticonResponse
: public QQuickImageResponse
, public QRunnable , public QRunnable
{ {
Q_OBJECT
public: public:
JdenticonResponse(const QString &key, bool crop, double radius, const QSize &requestedSize); JdenticonRunnable(const QString &key, bool crop, double radius, const QSize &requestedSize);
QQuickTextureFactory *textureFactory() const override
{
return QQuickTextureFactory::textureFactoryForImage(m_pixmap.toImage());
}
void run() override; void run() override;
signals:
void done(QImage img);
private:
QString m_key; QString m_key;
bool m_crop; bool m_crop;
double m_radius; double m_radius;
QSize m_requestedSize; QSize m_requestedSize;
QPixmap m_pixmap; };
JdenticonInterface *jdenticonInterface_ = nullptr;
class JdenticonResponse : public QQuickImageResponse
{
public:
JdenticonResponse(const QString &key,
bool crop,
double radius,
const QSize &requestedSize,
QThreadPool *pool);
QQuickTextureFactory *textureFactory() const override
{
return QQuickTextureFactory::textureFactoryForImage(m_pixmap);
}
void handleDone(QImage img)
{
m_pixmap = std::move(img);
emit finished();
}
QImage m_pixmap;
}; };
class JdenticonProvider class JdenticonProvider
@ -47,7 +63,7 @@ class JdenticonProvider
Q_OBJECT Q_OBJECT
public: public:
static bool isAvailable() { return Jdenticon::getJdenticonInterface() != nullptr; } static bool isAvailable();
public slots: public slots:
QQuickImageResponse * QQuickImageResponse *
@ -70,9 +86,7 @@ public slots:
} }
} }
JdenticonResponse *response = new JdenticonResponse(id_, crop, radius, requestedSize); return new JdenticonResponse(id_, crop, radius, requestedSize, &pool);
pool.start(response);
return response;
} }
private: private:

Loading…
Cancel
Save