QPixmap SIconPool::loadIcon( const QString &fileName, const QSize &size, Qt::AspectRatioMode mode, const QColor &color) { QPixmap pm; // SVG? Use QSvgRenderer if (fileName.endsWith(".svg")) { QSvgRenderer *renderer = getSvgRenderer(fileName); if (renderer->isValid()) { QSize renderSize = renderer->defaultSize(); // If given size is valid, scale default size to it using the given aspect ratio mode if (size.isValid()) { renderSize.scale(size, mode); // If only one dimension is valid, scale other dimension keeping the aspect ratio } else if (size.height() > 0) { Qt::AspectRatioMode scaleMode = size.height() > renderSize.height() ? Qt::KeepAspectRatioByExpanding : Qt::KeepAspectRatio; renderSize.scale(renderSize.width(), size.height(), scaleMode); } else if (size.width() > 0) { Qt::AspectRatioMode scaleMode = size.width() > renderSize.width() ? Qt::KeepAspectRatioByExpanding : Qt::KeepAspectRatio; renderSize.scale(size.width(), renderSize.height(), scaleMode); } // Otherwise (-1,-1) was given as size, leave renderSize as icon's default size pm = QPixmap(renderSize); pm.fill(QColor(0, 0, 0, 0)); QPainter painter(&pm); renderer->render(&painter, QRectF(QPointF(), renderSize)); } } else { // Otherwise load with QPixmap pm.load(fileName); if (!pm.isNull()) { pm = pm.scaled(size, mode, Qt::SmoothTransformation); } } if (!pm.isNull() && color.isValid()) { // Colorize the icon QPixmap mask = pm.alphaChannel(); pm.fill(color); pm.setAlphaChannel(mask); } #ifdef Q_DEBUG_ICON if (pm.isNull()) { qDebug() << "Fail to load icon: " << filename; } #endif return pm; }