void QPixmapIconEngine::addFile(const QString &fileName, const QSize &size, QIcon::Mode mode, QIcon::State state) { if (fileName.isEmpty()) return; const QString abs = fileName.startsWith(QLatin1Char(':')) ? fileName : QFileInfo(fileName).absoluteFilePath(); const bool ignoreSize = !size.isValid(); ImageReader imageReader(abs); const QByteArray format = imageReader.format(); if (format.isEmpty()) // Device failed to open or unsupported format. return; QImage image; if (format != "ico") { if (ignoreSize) { // No size specified: Add all images. while (imageReader.read(&image)) pixmaps += QPixmapIconEngineEntry(abs, image, mode, state); } else { // Try to match size. If that fails, add a placeholder with the filename and empty pixmap for the size. while (imageReader.read(&image) && image.size() != size) {} pixmaps += image.size() == size ? QPixmapIconEngineEntry(abs, image, mode, state) : QPixmapIconEngineEntry(abs, size, mode, state); } return; } // Special case for reading Windows ".ico" files. Historically (QTBUG-39287), // these files may contain low-resolution images. As this information is lost, // ICOReader sets the original format as an image text key value. Read all matching // images into a list trying to find the highest quality per size. QList<QImage> icoImages; while (imageReader.read(&image)) { if (ignoreSize || image.size() == size) { const int position = findBySize(icoImages, image.size()); if (position >= 0) { // Higher quality available? -> replace. if (origIcoDepth(image) > origIcoDepth(icoImages.at(position))) icoImages[position] = image; } else { icoImages.append(image); } } } foreach (const QImage &i, icoImages) pixmaps += QPixmapIconEngineEntry(abs, i, mode, state); if (icoImages.isEmpty() && !ignoreSize) // Add placeholder with the filename and empty pixmap for the size. pixmaps += QPixmapIconEngineEntry(abs, size, mode, state); }
void QPixmapIconEngine::addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state) { if (!pixmap.isNull()) { QPixmapIconEngineEntry *pe = tryMatch(pixmap.size(), mode, state); if(pe && pe->size == pixmap.size()) { pe->pixmap = pixmap; pe->fileName.clear(); } else { pixmaps += QPixmapIconEngineEntry(pixmap, mode, state); } } }