From 9fe6ae9f61fcc4d565a739c1a56bdb12f4a1ce8c Mon Sep 17 00:00:00 2001 From: zhangkun Date: Thu, 23 Oct 2025 15:13:41 +0800 Subject: [PATCH] feat: improve icon theme generation with scalable support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add SCALABLE_SIZE constant for scalable icon directories 2. Change foundSize return type from uint to int to support scalable detection 3. Modify writeScaledImage to accept baseSize parameter instead of parsing from directory 4. Move directory parsing logic to writeImage function for better organization 5. Add scalable directory detection in size parsing logic 6. Use QImageReader's scaledSize for better image scaling quality 7. Fix error handling to continue processing instead of exiting on first error Log: Improved icon theme generation with better scalable icon support Influence: 1. Test with icon directories containing scalable icons 2. Verify different scale factors work correctly 3. Test error handling when encountering invalid image files 4. Verify image quality at various scales 5. Test with both fixed-size and scalable icon directories feat: 改进图标主题生成,支持可缩放图标 1. 添加 SCALABLE_SIZE 常量用于可缩放图标目录 2. 将 foundSize 返回类型从 uint 改为 int 以支持可缩放检测 3. 修改 writeScaledImage 函数,接受 baseSize 参数而非从目录解析 4. 将目录解析逻辑移至 writeImage 函数以获得更好的代码组织 5. 在尺寸解析逻辑中添加可缩放目录检测 6. 使用 QImageReader 的 scaledSize 获得更好的图像缩放质量 7. 修复错误处理,在遇到错误时继续处理而非立即退出 Log: 改进图标主题生成,提供更好的可缩放图标支持 Influence: 1. 测试包含可缩放图标的目录 2. 验证不同缩放因子是否正确工作 3. 测试遇到无效图像文件时的错误处理 4. 验证各种缩放比例下的图像质量 5. 测试固定尺寸和可缩放图标目录 --- tools/dci-icon-theme/main.cpp | 37 +++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tools/dci-icon-theme/main.cpp b/tools/dci-icon-theme/main.cpp index 74a0293e..3667d941 100644 --- a/tools/dci-icon-theme/main.cpp +++ b/tools/dci-icon-theme/main.cpp @@ -30,6 +30,7 @@ class DciProcessingError : public std::runtime_error { #define MAX_SCALE 10 #define INVALIDE_QUALITY -2 +#define SCALABLE_SIZE 256 static int quality4Scaled[MAX_SCALE] = {}; static inline void initQuality() { for (int i = 0; i < MAX_SCALE; ++i) @@ -44,11 +45,11 @@ static inline void dciChecker(bool result, std::function cb) { } // TODO 应该使用xdg图标查找规范解析index.theme来查找尺寸 -static uint foundSize(const QFileInfo &fileInfo) { +static int foundSize(const QFileInfo &fileInfo) { QDir dir = fileInfo.absoluteDir(); // 解析尺寸 - auto parseSize = [](const QString &dirName) -> uint { + auto parseSize = [](const QString &dirName) -> int { bool ok; if (int size = dirName.toUInt(&ok); ok) { return size; @@ -60,10 +61,14 @@ static uint foundSize(const QFileInfo &fileInfo) { } } + if (dirName == "scalable") { + return SCALABLE_SIZE; + } + return 0; }; - if (uint size = parseSize(dir.dirName())) { + if (int size = parseSize(dir.dirName()); size > 0) { return size; } @@ -83,14 +88,8 @@ static inline QByteArray webpImageData(const QImage &image, int quality) { return data; } -static bool writeScaledImage(DDciFile &dci, const QImage &image, const QString &targetDir, int scale/* = 2*/) +static bool writeScaledImage(DDciFile &dci, const QImage &image, const QString &targetDir, const int baseSize, int scale/* = 2*/) { - QString sizeDir = targetDir.mid(1, targetDir.indexOf("/", 1) - 1); - bool ok = false; - int baseSize = sizeDir.toInt(&ok); - if (!ok) - baseSize = 256; - int size = scale * baseSize; QImage img; if (image.width() == size) { @@ -109,20 +108,28 @@ static bool writeScaledImage(DDciFile &dci, const QImage &image, const QString & static bool writeImage(DDciFile &dci, const QString &imageFile, const QString &targetDir) { + QString sizeDir = targetDir.mid(1, targetDir.indexOf("/", 1) - 1); + bool ok = false; + int baseSize = sizeDir.toInt(&ok); + if (!ok) + baseSize = 256; + QImageReader reader(imageFile); if (!reader.canRead()) { qWarning() << "Ignore the null image file:" << imageFile; return false; } - auto image = reader.read(); for (int i = 0; i < MAX_SCALE; ++i) { if (quality4Scaled[i] == INVALIDE_QUALITY) continue; + int scale = i + 1; - if (!writeScaledImage(dci, image, targetDir, i + 1)) + reader.setScaledSize(QSize(baseSize * scale, baseSize * scale)); + auto image = reader.read(); + if (!writeScaledImage(dci, image, targetDir, baseSize, scale)) return false; - } + } return true; } @@ -504,8 +511,8 @@ int main(int argc, char *argv[]) }); if (hasError.load()) { - qWarning() << "Encountered errors during DCI file writing. Exiting with error code:" << errorCode; - return errorCode; + qWarning() << "Encountered errors during DCI file writing" << errorCode; + continue; } }