From 35f66ba88ef7a2a67c1055bc0731e9c0e0301531 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Wed, 15 Aug 2018 19:55:20 +0800 Subject: [PATCH] Preview: scale SVG via QSvgRenderer --- src/utils/vutils.cpp | 16 ++++++++++++++++ src/utils/vutils.h | 4 ++++ src/vlivepreviewhelper.h | 28 ++++++++++++++++++---------- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index bca5d3f3..1f1c4e4c 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "vorphanfile.h" #include "vnote.h" @@ -1653,3 +1655,17 @@ int VUtils::elapsedTime(bool p_reset) return tm.restart(); } + +QPixmap VUtils::svgToPixmap(const QByteArray &p_content, qreal p_factor) +{ + QSvgRenderer renderer(p_content); + QSize deSz = renderer.defaultSize(); + if (p_factor > 0) { + deSz *= p_factor; + } + + QPixmap pm(deSz); + QPainter painter(&pm); + renderer.render(&painter); + return pm; +} diff --git a/src/utils/vutils.h b/src/utils/vutils.h index f816d979..c9d4492c 100644 --- a/src/utils/vutils.h +++ b/src/utils/vutils.h @@ -359,6 +359,10 @@ public: static int elapsedTime(bool p_reset = false); + // Render SVG to Pixmap. + // @p_factor: < 0 indicates no scaling. + static QPixmap svgToPixmap(const QByteArray &p_content, qreal p_factor); + // Regular expression for image link. // ![image title]( http://github.com/tamlok/vnote.jpg "alt text" =200x100) // Captured texts (need to be trimmed): diff --git a/src/vlivepreviewhelper.h b/src/vlivepreviewhelper.h index e3dda5e9..115aa7c7 100644 --- a/src/vlivepreviewhelper.h +++ b/src/vlivepreviewhelper.h @@ -149,11 +149,15 @@ private: m_image.loadFromData(p_data, p_format.toLocal8Bit().data()); } else { - QPixmap tmpImg; - tmpImg.loadFromData(p_data, - p_format.toLocal8Bit().data()); - m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, - Qt::SmoothTransformation); + if (p_format == "svg") { + m_image = VUtils::svgToPixmap(p_data, p_scaleFactor); + } else { + QPixmap tmpImg; + tmpImg.loadFromData(p_data, + p_format.toLocal8Bit().data()); + m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, + Qt::SmoothTransformation); + } } } } @@ -171,11 +175,15 @@ private: m_image.loadFromData(p_data.toUtf8(), p_format.toLocal8Bit().data()); } else { - QPixmap tmpImg; - tmpImg.loadFromData(p_data.toUtf8(), - p_format.toLocal8Bit().data()); - m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, - Qt::SmoothTransformation); + if (p_format == "svg") { + m_image = VUtils::svgToPixmap(p_data.toUtf8(), p_scaleFactor); + } else { + QPixmap tmpImg; + tmpImg.loadFromData(p_data.toUtf8(), + p_format.toLocal8Bit().data()); + m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, + Qt::SmoothTransformation); + } } } }