Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
  • abdsaber000/vlc
  • falbrechtskirchinger/vlc
  • b.sullender/vlc
  • hulxv/vlc
  • zyad-ayad/vlc
  • shocknovaa/vlc
  • gremlinflat/vlc
  • Pratham24D/vlc
  • hmaarrfk/vlc
412 results
Show changes
Commits on Source (5)
......@@ -15,8 +15,7 @@ qt6_dep = dependency('qt6',
# Note that Qt < 6.2.5 does not provide pc files!
version: '>=6.2',
modules: [
'Core', 'Gui', 'Widgets', 'Svg', 'Qml', 'QmlModels',
'QuickLayouts', 'QuickTemplates2', 'QmlWorkerScript',
'Core', 'Gui', 'Widgets', 'Qml',
'Quick', 'QuickControls2'
],
private_headers: true,
......
......@@ -53,7 +53,7 @@ Item {
visible: !artwork.visible
sourceSize: Qt.size(width, height)
sourceSize: Qt.size(0, height) // preserve aspect ratio
fillMode: root.fillMode
horizontalAlignment: root.horizontalAlignment
......
TEMPLATE = app
QT = core gui qml svg quick widgets quickcontrols2
QT = core gui qml quick widgets quickcontrols2
QTPLUGIN = qsvgicon qsvg qjpeg qico
CONFIG -= entrypoint
......
......@@ -19,14 +19,16 @@
#include "color_svg_image_provider.hpp"
#include "qt.hpp"
#include "util/asynctask.hpp"
#include "util/imagehelper.hpp"
#include <QSvgRenderer>
#include <QUrl>
#include <QUrlQuery>
#include <QPainter>
#include <QFile>
#include <QQmlFile>
#include <QDebug>
#include <QBuffer>
#include <QImageIOHandler>
static const QMap<QString, QString> predefinedSubst = {
{COLOR1_KEY, "#FF00FF"},
......@@ -88,7 +90,7 @@ public:
QImage execute() override
{
if (m_requestedSize.width() == 0 || m_requestedSize.height() == 0)
if (m_requestedSize.width() < 0 || m_requestedSize.height() < 0)
{
m_error = "invalid size requested";
return {};
......@@ -102,47 +104,70 @@ public:
return {};
}
QColor backgroundColor{Qt::transparent};
const auto svgHandler = QScopedPointer<QImageIOHandler>(ImageHelper::createSvgImageIOHandler());
if (data.second.has_value())
backgroundColor = *data.second;
QImage image;
QSvgRenderer renderer(data.first);
if (!renderer.isValid())
if (svgHandler)
{
m_error = "can't parse SVG content";
return {};
QBuffer buffer;
buffer.setData(data.first);
if (Q_LIKELY(buffer.open(QFile::ReadOnly)))
{
svgHandler->setDevice(&buffer);
if (Q_LIKELY(svgHandler->canRead()))
{
QSize scaledSize;
if ((m_requestedSize.width() == 0 || m_requestedSize.height() == 0))
{
// QImageReader standard behavior, if width or height is 0,
// it is calculated to preserve the aspect ratio:
const QSize naturalSize = svgHandler->option(QImageIOHandler::Size).toSize();
if (m_requestedSize.width() == 0)
scaledSize.setWidth(m_requestedSize.height() * ((qreal)naturalSize.width() / naturalSize.height()));
else if (m_requestedSize.height() == 0)
scaledSize.setHeight(m_requestedSize.width() * ((qreal)naturalSize.height() / naturalSize.width()));
}
else
{
scaledSize = m_requestedSize;
}
if (!scaledSize.isEmpty())
svgHandler->setOption(QImageIOHandler::ScaledSize, scaledSize);
if (data.second.has_value())
svgHandler->setOption(QImageIOHandler::BackgroundColor, *data.second);
svgHandler->read(&image);
}
else
{
m_error = QStringLiteral("Svg Image Provider: svg image handler can not read the svg contents, is the file svg specification compliant?");
}
}
else
{
m_error = QStringLiteral("Svg Image Provider: can not open colorized svg buffer for read.");
}
}
//FIXME QT < 5.15 doesn't support QSvgRenderer::setAspectRatioMode
//scale to fit manually
QRect bounds;
QSize bbox = renderer.defaultSize();
float sourceAR = bbox.width() / (float)bbox.height();
float destAR = m_requestedSize.width() / (float)m_requestedSize.height();
if (qFuzzyCompare(sourceAR, destAR))
bounds = QRect({0,0}, m_requestedSize);
else if (sourceAR < destAR) {
float scaledWidth = m_requestedSize.height() * sourceAR;
bounds = QRect((m_requestedSize.width() - scaledWidth) / 2, 0,
scaledWidth, m_requestedSize.height());
} else {
float scaledHeight = m_requestedSize.width() / sourceAR;
bounds = QRect(0, (m_requestedSize.height() - scaledHeight) / 2,
m_requestedSize.width(), scaledHeight);
else
{
m_error = QStringLiteral("Svg Image Provider: can not found QSvgPlugin, is it installed?");
}
QImage image;
if (backgroundColor.alpha() == 255)
if (Q_UNLIKELY(image.isNull()))
{
if (m_error.isEmpty())
m_error = QStringLiteral("Svg Image Provider: unspecified error.");
image = QImage(m_requestedSize, QImage::Format_RGB32);
else
image = QImage(m_requestedSize, QImage::Format_ARGB32_Premultiplied);
image.fill(backgroundColor);
QPainter painter;
painter.begin(&image);
renderer.render(&painter, bounds);
painter.end();
image.fill(QColor("purple"));
}
return image;
}
......
......@@ -28,25 +28,76 @@
#include <QApplication>
#include <QPainter>
#include <QScreen>
#include <QSvgRenderer>
#include <QImageIOHandler>
#include <QPluginLoader>
#include <QFile>
#include "imagehelper.hpp"
QPixmap ImageHelper::loadSvgToPixmap( const QString &path, qint32 i_width, qint32 i_height )
{
qreal ratio = QApplication::primaryScreen()->devicePixelRatio();
QPixmap pixmap( QSize( i_width, i_height ) * ratio );
const auto svgHandler = QScopedPointer<QImageIOHandler>(createSvgImageIOHandler());
pixmap.fill( Qt::transparent );
QImage image;
const auto size = QSize( i_width, i_height ) * ratio;
QSvgRenderer renderer( path );
QPainter painter;
if (svgHandler)
{
QFile file(path);
painter.begin( &pixmap );
renderer.render( &painter );
painter.end();
if (file.open(QFile::ReadOnly))
{
svgHandler->setDevice(&file);
svgHandler->setOption(QImageIOHandler::ScaledSize, size);
pixmap.setDevicePixelRatio( ratio );
return pixmap;
if (svgHandler->canRead())
svgHandler->read(&image);
else
qWarning() << "ImageHelper: svg image handler can not read file " << path << ".";
}
else
{
qWarning() << "ImageHelper: can not open file " << path << ".";
}
}
if (Q_UNLIKELY(image.isNull()))
{
image = QImage(size, QImage::Format_RGB32);
image.fill(QColor("purple"));
}
image.setDevicePixelRatio(ratio);
return QPixmap::fromImage(image);
}
QImageIOHandler *ImageHelper::createSvgImageIOHandler()
{
static const auto plugin = []() -> QPointer<QImageIOPlugin> {
#ifdef QT_STATIC
const auto& staticPlugins = QPluginLoader::staticInstances();
const auto it = std::find_if(staticPlugins.begin(), staticPlugins.end(), [](QObject *obj) -> bool {
return obj->inherits("QSvgPlugin");
});
if (it != staticPlugins.end())
return qobject_cast<QImageIOPlugin*>(*it);
else
return nullptr;
#else
QPluginLoader loader(QStringLiteral("imageformats/qsvg")); // Official Qt plugin
// No need to check the metadata (or inherits `QSvgPlugin`), a plugin named "qsvg" should already support svg.
return qobject_cast<QImageIOPlugin*>(loader.instance());
#endif
}();
if (!plugin)
{
qWarning() << "ImageHelper: svg image plugin is not found.";
return nullptr;
}
return plugin->create(nullptr);
}
......@@ -31,6 +31,8 @@ class ImageHelper
public:
/* render a Svg to a pixmap with current device pixel ratio */
static QPixmap loadSvgToPixmap(const QString& path, qint32 i_width, qint32 i_height);
static class QImageIOHandler* createSvgImageIOHandler();
};
#endif // IMAGEHELPER_HPP